diff --git a/dist/bundle.js b/dist/bundle.js index 598992e..525536d 100644 --- a/dist/bundle.js +++ b/dist/bundle.js @@ -60,26 +60,44 @@ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ return __webpack_require__(__webpack_require__.s = 1); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +const getRepoInfo = url => { + const parsedUrl = new URL(url); + const [, owner, repo] = parsedUrl.pathname.split('/'); + + if (!owner || !repo) { + return null; + } + + return { owner, repo }; +}; + +/* harmony default export */ __webpack_exports__["a"] = (getRepoInfo); + +/***/ }), +/* 1 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -/* WEBPACK VAR INJECTION */(function(process) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__get_repo_info__ = __webpack_require__(2); +/* WEBPACK VAR INJECTION */(function(process) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__get_repo_info__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__get_package_name_get_package_name__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__get_stats_get_stats__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__render_stats__ = __webpack_require__(15); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__get_stats_get_stats__ = __webpack_require__(10); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__render_stats__ = __webpack_require__(16); const run = async () => { - const { owner, repo } = Object(__WEBPACK_IMPORTED_MODULE_0__get_repo_info__["a" /* default */])() || {}; + const { owner, repo } = Object(__WEBPACK_IMPORTED_MODULE_0__get_repo_info__["a" /* default */])(location.href) || {}; if (!owner) return; const packageName = await Object(__WEBPACK_IMPORTED_MODULE_1__get_package_name_get_package_name__["a" /* default */])(owner, repo); @@ -96,10 +114,10 @@ if (!process || !process.env || process.env.NODE_ENV !== 'test') { } /* harmony default export */ __webpack_exports__["default"] = (run); -/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(1))) +/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(2))) /***/ }), -/* 1 */ +/* 2 */ /***/ (function(module, exports) { // shim for using process in browser @@ -288,21 +306,6 @@ process.chdir = function (dir) { process.umask = function() { return 0; }; -/***/ }), -/* 2 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -const getRepoInfo = () => { - const [, owner, repo] = location.pathname.split('/'); - if (!owner || !repo) { - return null; - } - return { owner, repo }; -}; - -/* harmony default export */ __webpack_exports__["a"] = (getRepoInfo); - /***/ }), /* 3 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -407,21 +410,30 @@ const createPackage = async (cacheKey, owner, repo) => { /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -const fetchPackageName = (owner, repo) => { - return fetch(`https://api.github.com/repos/${owner}/${repo}/contents/package.json`).then(response => { - if (response.status === 403) throw new Error('Hourly GitHub api rate limit exceeded'); - if (response.status === 404) return 'N/A'; - return response.json(); - }).then(response => { - if (response === 'N/A') return response; - - const packageJson = JSON.parse(atob(response.content)); - if (packageJson.private) return null; - return packageJson.name; - }).catch(error => { - console.warn(`[github-npm-stats] ${error}`); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__resolve_private_package__ = __webpack_require__(9); + + +const fetchPackageName = async (owner, repo) => { + const response = await fetch(`https://api.github.com/repos/${owner}/${repo}/contents/package.json`); + + if (response.status === 403) { + console.warn('[github-npm-stats] Error: Hourly GitHub api rate limit exceeded'); return null; - }); + } + + if (response.status === 404) { + return 'N/A'; + } + + const responseBody = await response.json(); + const packageJson = JSON.parse(atob(responseBody.content)); + let packageName = packageJson.name; + + if (packageJson.private) { + packageName = await Object(__WEBPACK_IMPORTED_MODULE_0__resolve_private_package__["a" /* default */])(owner, repo, packageName); + } + + return packageName; }; /* harmony default export */ __webpack_exports__["a"] = (fetchPackageName); @@ -431,10 +443,40 @@ const fetchPackageName = (owner, repo) => { /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__get_cache_key__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__get_cached_stats__ = __webpack_require__(11); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__is_fresh__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__create_stats__ = __webpack_require__(13); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__get_repo_info__ = __webpack_require__(0); + + +const resolvePrivatePackage = async (owner, repo, packageName) => { + const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`); + + if (response.status === 404) { + console.warn(`[github-npm-stats] Couldn't find "${packageName}" in npm registry`); + return null; + } + + const responseBody = await response.json(); + + if (responseBody.bugs && responseBody.bugs.url) { + const repoInfo = Object(__WEBPACK_IMPORTED_MODULE_0__get_repo_info__["a" /* default */])(responseBody.bugs.url); + if (repoInfo.owner === owner && repoInfo.repo === repo) { + return packageName; + } + } + + return null; +}; + +/* harmony default export */ __webpack_exports__["a"] = (resolvePrivatePackage); + +/***/ }), +/* 10 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__get_cache_key__ = __webpack_require__(11); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__get_cached_stats__ = __webpack_require__(12); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__is_fresh__ = __webpack_require__(13); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__create_stats__ = __webpack_require__(14); @@ -450,7 +492,7 @@ const getStats = async packageName => { /* harmony default export */ __webpack_exports__["a"] = (getStats); /***/ }), -/* 10 */ +/* 11 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -461,7 +503,7 @@ const getCacheKey = packageName => { /* harmony default export */ __webpack_exports__["a"] = (getCacheKey); /***/ }), -/* 11 */ +/* 12 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -481,7 +523,7 @@ const getCachedStats = cacheKey => { /* harmony default export */ __webpack_exports__["a"] = (getCachedStats); /***/ }), -/* 12 */ +/* 13 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -501,11 +543,11 @@ const isFresh = stats => { /* harmony default export */ __webpack_exports__["a"] = (isFresh); /***/ }), -/* 13 */ +/* 14 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__fetch_stats__ = __webpack_require__(14); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__fetch_stats__ = __webpack_require__(15); const createStats = async (cacheKey, packageName) => { @@ -526,32 +568,37 @@ const createStats = async (cacheKey, packageName) => { /* harmony default export */ __webpack_exports__["a"] = (createStats); /***/ }), -/* 14 */ +/* 15 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; const fetchStats = async packageName => { - return fetch(`https://api.npmjs.org/downloads/range/last-month/${packageName}`).then(response => { - if (response.status === 404) throw new Error('npm stats is not found'); - return response.json(); - }).then(response => { - let { downloads } = response; - - const lastDay = downloads[downloads.length - 1].downloads; - const lastWeek = downloads.slice(downloads.length - 7, downloads.length).reduce((sum, day) => sum + day.downloads, 0); - const lastMonth = downloads.reduce((sum, day) => sum + day.downloads, 0); - - return { apiResponse: response, lastDay, lastWeek, lastMonth }; - }).catch(error => { - console.warn(`[github-npm-stats] ${error}`); + const response = await fetch(`https://api.npmjs.org/downloads/range/last-month/${packageName}`); + + if (response.status === 404) { + console.warn('[github-npm-stats] npm stats is not found'); return null; - }); + } + + const responseBody = await response.json(); + const { downloads } = responseBody; + + const lastDay = downloads[downloads.length - 1].downloads; + const lastWeek = downloads.slice(downloads.length - 7, downloads.length).reduce((sum, day) => sum + day.downloads, 0); + const lastMonth = downloads.reduce((sum, day) => sum + day.downloads, 0); + + return { + apiResponse: responseBody, + lastDay, + lastWeek, + lastMonth + }; }; /* harmony default export */ __webpack_exports__["a"] = (fetchStats); /***/ }), -/* 15 */ +/* 16 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -601,7 +648,7 @@ const renderStats = (packageName, stats) => { li.className = 'npm-stats'; li.innerHTML = `
- + diff --git a/dist/bundle.js.map b/dist/bundle.js.map index f4be96c..cd9dda0 100644 --- a/dist/bundle.js.map +++ b/dist/bundle.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 5678cb1b999eddc54bd2","webpack:///./src/index.js","webpack:///./node_modules/process/browser.js","webpack:///./src/get-repo-info.js","webpack:///./src/get-package-name/get-package-name.js","webpack:///./src/get-package-name/get-cache-key.js","webpack:///./src/get-package-name/get-cached-package.js","webpack:///./src/get-package-name/is-fresh.js","webpack:///./src/get-package-name/create-package.js","webpack:///./src/get-package-name/fetch-package-name.js","webpack:///./src/get-stats/get-stats.js","webpack:///./src/get-stats/get-cache-key.js","webpack:///./src/get-stats/get-cached-stats.js","webpack:///./src/get-stats/is-fresh.js","webpack:///./src/get-stats/create-stats.js","webpack:///./src/get-stats/fetch-stats.js","webpack:///./src/render-stats.js"],"names":["run","owner","repo","getRepoInfo","packageName","getPackageName","stats","getStats","renderStats","process","env","NODE_ENV","location","pathname","split","cacheKey","getCacheKey","pkg","getCachedPackage","isFresh","createPackage","name","Promise","resolve","reject","chrome","storage","local","get","result","runtime","lastError","console","warn","expirationTime","timeCreated","Date","now","fetchPackageName","set","fetch","then","response","status","Error","json","packageJson","JSON","parse","atob","content","private","catch","error","getCachedStats","createStats","timeToday","UTC","getUTCFullYear","getUTCMonth","getUTCDate","timeStats","apiResponse","end","getTime","oneDay","fetchStats","downloads","lastDay","length","lastWeek","slice","reduce","sum","day","lastMonth","renderChart","chartCanvas","ctx","getContext","chart","Chart","type","data","labels","map","d","datasets","label","borderWidth","borderColor","options","legend","display","scales","yAxes","ticks","callback","value","index","values","toLocaleString","pageheadActions","document","querySelector","observer","MutationObserver","mutations","getElementById","disconnect","observe","childList","li","createElement","className","innerHTML","appendChild","availSpace","window","innerWidth","getBoundingClientRect","right","classList","add"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;;AAEA,MAAMA,MAAM,YAAY;AACtB,QAAM,EAAEC,KAAF,EAASC,IAAT,KAAkB,uEAAAC,MAAiB,EAAzC;AACA,MAAI,CAACF,KAAL,EAAY;;AAEZ,QAAMG,cAAc,MAAM,2FAAAC,CAAeJ,KAAf,EAAsBC,IAAtB,CAA1B;AACA,MAAI,CAACE,WAAL,EAAkB;;AAElB,QAAME,QAAQ,MAAM,6EAAAC,CAASH,WAAT,CAApB;AACA,MAAI,CAACE,KAAL,EAAY;;AAEZE,EAAA,sEAAAA,CAAYJ,WAAZ,EAAyBE,KAAzB;AACD,CAXD;;AAaA,IAAI,CAACG,OAAD,IAAY,CAACA,QAAQC,GAArB,IAA4BD,QAAQC,GAAR,CAAYC,QAAZ,KAAyB,MAAzD,EAAiE;AAC/DX;AACD;;AAED,+DAAeA,GAAf,E;;;;;;;ACtBA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;A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","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 5678cb1b999eddc54bd2","import getRepoInfo from './get-repo-info'\nimport getPackageName from './get-package-name/get-package-name'\nimport getStats from './get-stats/get-stats'\nimport renderStats from './render-stats'\n\nconst run = async () => {\n const { owner, repo } = getRepoInfo() || {}\n if (!owner) return\n\n const packageName = await getPackageName(owner, repo)\n if (!packageName) return\n\n const stats = await getStats(packageName)\n if (!stats) return\n\n renderStats(packageName, stats)\n}\n\nif (!process || !process.env || process.env.NODE_ENV !== 'test') {\n run()\n}\n\nexport default run\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/process/browser.js\n// module id = 1\n// module chunks = 0","const getRepoInfo = () => {\n const [, owner, repo ] = location.pathname.split('/')\n if (!owner || !repo) {\n return null\n }\n return { owner, repo }\n}\n\nexport default getRepoInfo\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-repo-info.js","import getCacheKey from './get-cache-key'\nimport getCachedPackage from './get-cached-package'\nimport isFresh from './is-fresh'\nimport createPackage from './create-package'\n\nconst getPackageName = async (owner, repo) => {\n const cacheKey = getCacheKey(owner, repo)\n let pkg = await getCachedPackage(cacheKey)\n if (!isFresh(pkg)) pkg = await createPackage(cacheKey, owner, repo)\n return pkg && pkg.name !== 'N/A' ? pkg.name : null\n}\n\nexport default getPackageName\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/get-package-name.js","const getCacheKey = (owner, repo) => {\n return `github.${owner}/${repo}`\n}\n\nexport default getCacheKey\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/get-cache-key.js","const getCachedPackage = (cacheKey) => {\n return new Promise((resolve, reject) => {\n chrome.storage.local.get(cacheKey, (result) => {\n if (chrome.runtime.lastError) {\n resolve(null)\n console.warn(`[github-npm-stats] ${chrome.runtime.lastError}`)\n } else {\n resolve(result[cacheKey] || null)\n }\n })\n })\n}\n\nexport default getCachedPackage\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/get-cached-package.js","const isFresh = (pkg) => {\n if (!pkg) {\n return false\n }\n\n const expirationTime = 30 * 24 * 60 * 60 * 1000 // 30 days in milliseconds\n const isFresh = pkg.timeCreated > Date.now() - expirationTime\n return isFresh\n}\n\nexport default isFresh\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/is-fresh.js","import fetchPackageName from './fetch-package-name'\n\nconst createPackage = async (cacheKey, owner, repo) => {\n const name = await fetchPackageName(owner, repo)\n if (!name) return null\n\n const timeCreated = Date.now()\n const pkg = { name, timeCreated }\n\n chrome.storage.local.set({\n [cacheKey]: pkg\n }, () => {\n if (chrome.runtime.lastError) {\n console.warn(chrome.runtime.lastError)\n }\n })\n\n return pkg\n}\n\nexport default createPackage\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/create-package.js","const fetchPackageName = (owner, repo) => {\n return fetch(`https://api.github.com/repos/${owner}/${repo}/contents/package.json`)\n .then(response => {\n if (response.status === 403) throw new Error('Hourly GitHub api rate limit exceeded')\n if (response.status === 404) return 'N/A'\n return response.json()\n })\n .then(response => {\n if (response === 'N/A') return response\n\n const packageJson = JSON.parse(atob(response.content))\n if (packageJson.private) return null\n return packageJson.name\n })\n .catch((error) => {\n console.warn(`[github-npm-stats] ${error}`)\n return null\n })\n}\n\nexport default fetchPackageName\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/fetch-package-name.js","import getCacheKey from './get-cache-key'\nimport getCachedStats from './get-cached-stats'\nimport isFresh from './is-fresh'\nimport createStats from './create-stats'\n\nconst getStats = async (packageName) => {\n const cacheKey = getCacheKey(packageName)\n let stats = await getCachedStats(cacheKey)\n if (!isFresh(stats)) stats = await createStats(cacheKey, packageName)\n return stats\n}\n\nexport default getStats\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-stats/get-stats.js","const getCacheKey = (packageName) => {\n return `npm.${packageName}`\n}\n\nexport default getCacheKey\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-stats/get-cache-key.js","const getCachedStats = (cacheKey) => {\n return new Promise((resolve, reject) => {\n chrome.storage.local.get(cacheKey, (result) => {\n if (chrome.runtime.lastError) {\n resolve(null)\n console.warn(`[github-npm-stats] ${chrome.runtime.lastError}`)\n } else {\n resolve(result[cacheKey] || null)\n }\n })\n })\n}\n\nexport default getCachedStats\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-stats/get-cached-stats.js","const isFresh = (stats) => {\n if (!stats) {\n return false\n }\n\n const now = new Date()\n const timeToday = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())\n const timeStats = new Date(stats.apiResponse.end).getTime()\n const oneDay = 24 * 60 * 60 * 1000 // 1 day in milliseconds\n const isFresh = (timeToday - timeStats) / oneDay <= 1\n return isFresh\n}\n\nexport default isFresh\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-stats/is-fresh.js","import fetchStats from './fetch-stats'\n\nconst createStats = async (cacheKey, packageName) => {\n const stats = await fetchStats(packageName)\n if (!stats) return null\n\n chrome.storage.local.set({\n [cacheKey]: stats\n }, () => {\n if (chrome.runtime.lastError) {\n console.error(chrome.runtime.lastError)\n }\n })\n\n return stats\n}\n\nexport default createStats\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-stats/create-stats.js","const fetchStats = async (packageName) => {\n return fetch(`https://api.npmjs.org/downloads/range/last-month/${packageName}`)\n .then(response => {\n if (response.status === 404) throw new Error('npm stats is not found')\n return response.json()\n })\n .then(response => {\n let { downloads } = response\n\n const lastDay = downloads[downloads.length - 1].downloads\n const lastWeek = downloads.slice(downloads.length - 7, downloads.length).reduce((sum, day) => (sum + day.downloads), 0)\n const lastMonth = downloads.reduce((sum, day) => (sum + day.downloads), 0)\n\n return { apiResponse: response, lastDay, lastWeek, lastMonth }\n })\n .catch((error) => {\n console.warn(`[github-npm-stats] ${error}`)\n return null\n })\n}\n\nexport default fetchStats\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-stats/fetch-stats.js","const renderChart = (chartCanvas, stats) => {\n const ctx = chartCanvas.getContext('2d')\n const chart = new Chart(ctx, {\n type: 'line',\n data: {\n labels: stats.apiResponse.downloads.map(d => d.day),\n datasets: [{\n label: \"Downloads\",\n data: stats.apiResponse.downloads.map(d => d.downloads),\n borderWidth: 1,\n borderColor: '#28a745'\n }]\n },\n options: {\n legend: {\n display: false\n },\n scales: {\n yAxes: [{\n ticks: {\n callback (value, index, values) {\n return value.toLocaleString()\n }\n }\n }]\n }\n }\n })\n}\n\nconst renderStats = (packageName, stats) => {\n const pageheadActions = document.querySelector('ul.pagehead-actions')\n\n const observer = new MutationObserver(mutations => {\n const chartCanvas = document.getElementById('npm-stats-chart')\n if (!chartCanvas) return\n observer.disconnect()\n renderChart(chartCanvas, stats)\n })\n\n observer.observe(pageheadActions, { childList: true })\n\n const li = document.createElement('li')\n li.className = 'npm-stats'\n li.innerHTML = `\n
\n \n \n \n \n \n \n \n \n \n ${stats.lastDay.toLocaleString()}\n \n \n
\n
\n
\n Downloads\n
\n
\n
Last day
\n
${stats.lastDay.toLocaleString()}
\n
Last week
\n
${stats.lastWeek.toLocaleString()}
\n
Last month
\n
${stats.lastMonth.toLocaleString()}
\n
\n \n
\n
\n
\n `\n pageheadActions.appendChild(li)\n\n const availSpace = window.innerWidth - li.getBoundingClientRect().right > 300\n if (!availSpace) {\n li.classList.add('npm-stats--inside')\n }\n}\n\nexport default renderStats\n\n\n\n// WEBPACK FOOTER //\n// ./src/render-stats.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 5032d534db9e49e2124b","webpack:///./src/get-repo-info.js","webpack:///./src/index.js","webpack:///./node_modules/process/browser.js","webpack:///./src/get-package-name/get-package-name.js","webpack:///./src/get-package-name/get-cache-key.js","webpack:///./src/get-package-name/get-cached-package.js","webpack:///./src/get-package-name/is-fresh.js","webpack:///./src/get-package-name/create-package.js","webpack:///./src/get-package-name/fetch-package-name.js","webpack:///./src/get-package-name/resolve-private-package.js","webpack:///./src/get-stats/get-stats.js","webpack:///./src/get-stats/get-cache-key.js","webpack:///./src/get-stats/get-cached-stats.js","webpack:///./src/get-stats/is-fresh.js","webpack:///./src/get-stats/create-stats.js","webpack:///./src/get-stats/fetch-stats.js","webpack:///./src/render-stats.js"],"names":["getRepoInfo","url","parsedUrl","URL","owner","repo","pathname","split","run","location","href","packageName","getPackageName","stats","getStats","renderStats","process","env","NODE_ENV","cacheKey","getCacheKey","pkg","getCachedPackage","isFresh","createPackage","name","Promise","resolve","reject","chrome","storage","local","get","result","runtime","lastError","console","warn","expirationTime","timeCreated","Date","now","fetchPackageName","set","response","fetch","status","responseBody","json","packageJson","JSON","parse","atob","content","private","resolvePrivatePackage","bugs","repoInfo","getCachedStats","createStats","timeToday","UTC","getUTCFullYear","getUTCMonth","getUTCDate","timeStats","apiResponse","end","getTime","oneDay","fetchStats","error","downloads","lastDay","length","lastWeek","slice","reduce","sum","day","lastMonth","renderChart","chartCanvas","ctx","getContext","chart","Chart","type","data","labels","map","d","datasets","label","borderWidth","borderColor","options","legend","display","scales","yAxes","ticks","callback","value","index","values","toLocaleString","pageheadActions","document","querySelector","observer","MutationObserver","mutations","getElementById","disconnect","observe","childList","li","createElement","className","innerHTML","appendChild","availSpace","window","innerWidth","getBoundingClientRect","right","classList","add"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;AC7DA,MAAMA,cAAeC,GAAD,IAAS;AAC3B,QAAMC,YAAY,IAAIC,GAAJ,CAAQF,GAAR,CAAlB;AACA,QAAM,GAAGG,KAAH,EAAUC,IAAV,IAAmBH,UAAUI,QAAV,CAAmBC,KAAnB,CAAyB,GAAzB,CAAzB;;AAEA,MAAI,CAACH,KAAD,IAAU,CAACC,IAAf,EAAqB;AACnB,WAAO,IAAP;AACD;;AAED,SAAO,EAAED,KAAF,EAASC,IAAT,EAAP;AACD,CATD;;AAWA,yDAAeL,WAAf,E;;;;;;;;;;;;ACXA;AACA;AACA;AACA;;AAEA,MAAMQ,MAAM,YAAY;AACtB,QAAM,EAAEJ,KAAF,EAASC,IAAT,KAAkB,uEAAAL,CAAYS,SAASC,IAArB,KAA8B,EAAtD;AACA,MAAI,CAACN,KAAL,EAAY;;AAEZ,QAAMO,cAAc,MAAM,2FAAAC,CAAeR,KAAf,EAAsBC,IAAtB,CAA1B;AACA,MAAI,CAACM,WAAL,EAAkB;;AAElB,QAAME,QAAQ,MAAM,6EAAAC,CAASH,WAAT,CAApB;AACA,MAAI,CAACE,KAAL,EAAY;;AAEZE,EAAA,sEAAAA,CAAYJ,WAAZ,EAAyBE,KAAzB;AACD,CAXD;;AAaA,IAAI,CAACG,OAAD,IAAY,CAACA,QAAQC,GAArB,IAA4BD,QAAQC,GAAR,CAAYC,QAAZ,KAAyB,MAAzD,EAAiE;AAC/DV;AACD;;AAED,+DAAeA,GAAf,E;;;;;;;ACtBA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qCAAqC;;AAErC;AACA;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;AACA,4BAA4B,UAAU;;;;;;;;;;;;ACvLtC;AACA;AACA;AACA;;AAEA,MAAMI,iBAAiB,OAAOR,KAAP,EAAcC,IAAd,KAAuB;AAC5C,QAAMc,WAAW,uEAAAC,CAAYhB,KAAZ,EAAmBC,IAAnB,CAAjB;AACA,MAAIgB,MAAM,MAAM,4EAAAC,CAAiBH,QAAjB,CAAhB;AACA,MAAI,CAAC,kEAAAI,CAAQF,GAAR,CAAL,EAAmBA,MAAM,MAAM,wEAAAG,CAAcL,QAAd,EAAwBf,KAAxB,EAA+BC,IAA/B,CAAZ;AACnB,SAAOgB,OAAOA,IAAII,IAAJ,KAAa,KAApB,GAA4BJ,IAAII,IAAhC,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","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 5032d534db9e49e2124b","const getRepoInfo = (url) => {\n const parsedUrl = new URL(url)\n const [, owner, repo ] = parsedUrl.pathname.split('/')\n\n if (!owner || !repo) {\n return null\n }\n\n return { owner, repo }\n}\n\nexport default getRepoInfo\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-repo-info.js","import getRepoInfo from './get-repo-info'\nimport getPackageName from './get-package-name/get-package-name'\nimport getStats from './get-stats/get-stats'\nimport renderStats from './render-stats'\n\nconst run = async () => {\n const { owner, repo } = getRepoInfo(location.href) || {}\n if (!owner) return\n\n const packageName = await getPackageName(owner, repo)\n if (!packageName) return\n\n const stats = await getStats(packageName)\n if (!stats) return\n\n renderStats(packageName, stats)\n}\n\nif (!process || !process.env || process.env.NODE_ENV !== 'test') {\n run()\n}\n\nexport default run\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/process/browser.js\n// module id = 2\n// module chunks = 0","import getCacheKey from './get-cache-key'\nimport getCachedPackage from './get-cached-package'\nimport isFresh from './is-fresh'\nimport createPackage from './create-package'\n\nconst getPackageName = async (owner, repo) => {\n const cacheKey = getCacheKey(owner, repo)\n let pkg = await getCachedPackage(cacheKey)\n if (!isFresh(pkg)) pkg = await createPackage(cacheKey, owner, repo)\n return pkg && pkg.name !== 'N/A' ? pkg.name : null\n}\n\nexport default getPackageName\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/get-package-name.js","const getCacheKey = (owner, repo) => {\n return `github.${owner}/${repo}`\n}\n\nexport default getCacheKey\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/get-cache-key.js","const getCachedPackage = (cacheKey) => {\n return new Promise((resolve, reject) => {\n chrome.storage.local.get(cacheKey, (result) => {\n if (chrome.runtime.lastError) {\n resolve(null)\n console.warn(`[github-npm-stats] ${chrome.runtime.lastError}`)\n } else {\n resolve(result[cacheKey] || null)\n }\n })\n })\n}\n\nexport default getCachedPackage\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/get-cached-package.js","const isFresh = (pkg) => {\n if (!pkg) {\n return false\n }\n\n const expirationTime = 30 * 24 * 60 * 60 * 1000 // 30 days in milliseconds\n const isFresh = pkg.timeCreated > Date.now() - expirationTime\n return isFresh\n}\n\nexport default isFresh\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/is-fresh.js","import fetchPackageName from './fetch-package-name'\n\nconst createPackage = async (cacheKey, owner, repo) => {\n const name = await fetchPackageName(owner, repo)\n if (!name) return null\n\n const timeCreated = Date.now()\n const pkg = { name, timeCreated }\n\n chrome.storage.local.set({\n [cacheKey]: pkg\n }, () => {\n if (chrome.runtime.lastError) {\n console.warn(chrome.runtime.lastError)\n }\n })\n\n return pkg\n}\n\nexport default createPackage\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/create-package.js","import resolvePrivatePackage from './resolve-private-package'\n\nconst fetchPackageName = async (owner, repo) => {\n const response = await fetch(`https://api.github.com/repos/${owner}/${repo}/contents/package.json`)\n\n if (response.status === 403) {\n console.warn('[github-npm-stats] Error: Hourly GitHub api rate limit exceeded')\n return null\n }\n\n if (response.status === 404) {\n return 'N/A'\n }\n\n const responseBody = await response.json()\n const packageJson = JSON.parse(atob(responseBody.content))\n let packageName = packageJson.name\n\n if (packageJson.private) {\n packageName = await resolvePrivatePackage(owner, repo, packageName)\n }\n\n return packageName\n}\n\nexport default fetchPackageName\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/fetch-package-name.js","import getRepoInfo from '../get-repo-info'\n\nconst resolvePrivatePackage = async (owner, repo, packageName) => {\n const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`)\n\n if (response.status === 404) {\n console.warn(`[github-npm-stats] Couldn't find \"${packageName}\" in npm registry`)\n return null\n }\n\n const responseBody = await response.json()\n\n if (responseBody.bugs && responseBody.bugs.url) {\n const repoInfo = getRepoInfo(responseBody.bugs.url)\n if (repoInfo.owner === owner && repoInfo.repo === repo) {\n return packageName\n }\n }\n\n return null\n}\n\nexport default resolvePrivatePackage\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-package-name/resolve-private-package.js","import getCacheKey from './get-cache-key'\nimport getCachedStats from './get-cached-stats'\nimport isFresh from './is-fresh'\nimport createStats from './create-stats'\n\nconst getStats = async (packageName) => {\n const cacheKey = getCacheKey(packageName)\n let stats = await getCachedStats(cacheKey)\n if (!isFresh(stats)) stats = await createStats(cacheKey, packageName)\n return stats\n}\n\nexport default getStats\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-stats/get-stats.js","const getCacheKey = (packageName) => {\n return `npm.${packageName}`\n}\n\nexport default getCacheKey\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-stats/get-cache-key.js","const getCachedStats = (cacheKey) => {\n return new Promise((resolve, reject) => {\n chrome.storage.local.get(cacheKey, (result) => {\n if (chrome.runtime.lastError) {\n resolve(null)\n console.warn(`[github-npm-stats] ${chrome.runtime.lastError}`)\n } else {\n resolve(result[cacheKey] || null)\n }\n })\n })\n}\n\nexport default getCachedStats\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-stats/get-cached-stats.js","const isFresh = (stats) => {\n if (!stats) {\n return false\n }\n\n const now = new Date()\n const timeToday = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())\n const timeStats = new Date(stats.apiResponse.end).getTime()\n const oneDay = 24 * 60 * 60 * 1000 // 1 day in milliseconds\n const isFresh = (timeToday - timeStats) / oneDay <= 1\n return isFresh\n}\n\nexport default isFresh\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-stats/is-fresh.js","import fetchStats from './fetch-stats'\n\nconst createStats = async (cacheKey, packageName) => {\n const stats = await fetchStats(packageName)\n if (!stats) return null\n\n chrome.storage.local.set({\n [cacheKey]: stats\n }, () => {\n if (chrome.runtime.lastError) {\n console.error(chrome.runtime.lastError)\n }\n })\n\n return stats\n}\n\nexport default createStats\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-stats/create-stats.js","const fetchStats = async (packageName) => {\n const response = await fetch(`https://api.npmjs.org/downloads/range/last-month/${packageName}`)\n\n if (response.status === 404) {\n console.warn('[github-npm-stats] npm stats is not found')\n return null\n }\n\n const responseBody = await response.json()\n const { downloads } = responseBody\n\n const lastDay = downloads[downloads.length - 1].downloads\n const lastWeek = downloads.slice(downloads.length - 7, downloads.length).reduce((sum, day) => (sum + day.downloads), 0)\n const lastMonth = downloads.reduce((sum, day) => (sum + day.downloads), 0)\n\n return {\n apiResponse: responseBody,\n lastDay,\n lastWeek,\n lastMonth\n }\n}\n\nexport default fetchStats\n\n\n\n// WEBPACK FOOTER //\n// ./src/get-stats/fetch-stats.js","const renderChart = (chartCanvas, stats) => {\n const ctx = chartCanvas.getContext('2d')\n const chart = new Chart(ctx, {\n type: 'line',\n data: {\n labels: stats.apiResponse.downloads.map(d => d.day),\n datasets: [{\n label: \"Downloads\",\n data: stats.apiResponse.downloads.map(d => d.downloads),\n borderWidth: 1,\n borderColor: '#28a745'\n }]\n },\n options: {\n legend: {\n display: false\n },\n scales: {\n yAxes: [{\n ticks: {\n callback (value, index, values) {\n return value.toLocaleString()\n }\n }\n }]\n }\n }\n })\n}\n\nconst renderStats = (packageName, stats) => {\n const pageheadActions = document.querySelector('ul.pagehead-actions')\n\n const observer = new MutationObserver(mutations => {\n const chartCanvas = document.getElementById('npm-stats-chart')\n if (!chartCanvas) return\n observer.disconnect()\n renderChart(chartCanvas, stats)\n })\n\n observer.observe(pageheadActions, { childList: true })\n\n const li = document.createElement('li')\n li.className = 'npm-stats'\n li.innerHTML = `\n
\n \n \n \n \n \n \n \n \n \n ${stats.lastDay.toLocaleString()}\n \n \n
\n
\n
\n Downloads\n
\n
\n
Last day
\n
${stats.lastDay.toLocaleString()}
\n
Last week
\n
${stats.lastWeek.toLocaleString()}
\n
Last month
\n
${stats.lastMonth.toLocaleString()}
\n
\n \n
\n
\n
\n `\n pageheadActions.appendChild(li)\n\n const availSpace = window.innerWidth - li.getBoundingClientRect().right > 300\n if (!availSpace) {\n li.classList.add('npm-stats--inside')\n }\n}\n\nexport default renderStats\n\n\n\n// WEBPACK FOOTER //\n// ./src/render-stats.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/manifest.json b/dist/manifest.json index e48a8bf..5d54006 100755 --- a/dist/manifest.json +++ b/dist/manifest.json @@ -1,6 +1,6 @@ { "name": "github npm stats", - "version": "1.1.1", + "version": "1.2.0", "manifest_version": 2, "description": "Displays npm package stats on GitHub", "author": "Ahmet Katrancı ", diff --git a/package.json b/package.json index 6680cb6..696cc55 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "1.1.1", + "version": "1.2.0", "devDependencies": { "babel-loader": "7.1.2", "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",