forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathNpmRegistry.js
More file actions
1 lines (1 loc) · 4.37 KB
/
Copy pathNpmRegistry.js
File metadata and controls
1 lines (1 loc) · 4.37 KB
1
define(function(require,exports,module){const NodeUtils=require("utils/NodeUtils"),NodeConnector=require("NodeConnector"),SEARCH_URL="https://registry.npmjs.org/-/v1/search",PACKAGE_URL="https://registry.npmjs.org/",ADVISORY_BULK_URL="https://registry.npmjs.org/-/npm/v1/security/advisories/bulk",NODE_NPM_INTEL_MODULE="./npm-intel",NPM_INTEL_CONNECTOR_ID="ph-npm-intel",SEARCH_TTL_MS=3e5,VERSIONS_TTL_MS=6e5,ADVISORY_TTL_MS=36e5,SEARCH_CACHE_MAX=50,SEARCH_RESULT_SIZE=20,realFetch=window.fetch.bind(window);let _fetchJson=function(url,options){return realFetch(url,options).then(function(response){if(!response.ok)throw new Error("npm registry request failed: "+response.status);return response.json()})},_now=function(){return Date.now()},_fetcherInjected=!1;const _searchCache=new Map,_versionsCache=new Map,_advisoryCache=new Map;function _cacheGet(cache,key,ttl){const entry=cache.get(key);return entry&&_now()-entry.ts<ttl?entry.value:(cache.delete(key),null)}function _cacheSet(cache,key,value,maxEntries){maxEntries&&cache.size>=maxEntries&&cache.delete(cache.keys().next().value),cache.set(key,{ts:_now(),value:value})}function searchPackages(query){const cached=_cacheGet(_searchCache,query,SEARCH_TTL_MS);if(cached)return Promise.resolve(cached);const url=SEARCH_URL+"?text="+encodeURIComponent(query)+"&size="+SEARCH_RESULT_SIZE;return _fetchJson(url).then(function(json){const results=(json&&json.objects||[]).map(function(entry){return{name:entry.package.name,version:entry.package.version,description:entry.package.description||""}});return _cacheSet(_searchCache,query,results,SEARCH_CACHE_MAX),results})}function getVersions(name){const cached=_cacheGet(_versionsCache,name,VERSIONS_TTL_MS);if(cached)return Promise.resolve(cached);const url=PACKAGE_URL+encodeURIComponent(name).replace(/^%40/,"@");return _fetchJson(url,{headers:{Accept:"application/vnd.npm.install-v1+json"}}).then(function(json){const result={versions:Object.keys(json&&json.versions||{}),latest:json&&json["dist-tags"]&&json["dist-tags"].latest||null};return _cacheSet(_versionsCache,name,result),result})}const _packageInfoCache=new Map;function getPackageInfo(name){const cached=_cacheGet(_packageInfoCache,name,VERSIONS_TTL_MS);if(cached)return Promise.resolve(cached);const url=PACKAGE_URL+encodeURIComponent(name).replace(/^%40/,"@")+"/latest";return _fetchJson(url).then(function(json){const info={name:json&&json.name||name,version:json&&json.version||"",description:json&&json.description||"",homepage:json&&json.homepage||"",license:json&&"string"==typeof json.license&&json.license||""};return _cacheSet(_packageInfoCache,name,info),info})}let _nodeConnectorPromise=null;function _getNodeIntelConnector(){return _nodeConnectorPromise||(_nodeConnectorPromise=async function(){return await NodeUtils._loadNodeExtensionModule(NODE_NPM_INTEL_MODULE),NodeConnector.createNodeConnector(NPM_INTEL_CONNECTOR_ID,{})}()),_nodeConnectorPromise}function _browserFetchAdvisories(body){return _fetchJson(ADVISORY_BULK_URL,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(body)})}function _fetchAdvisoriesRaw(body){return _fetcherInjected||!Phoenix.isNativeApp?_browserFetchAdvisories(body):_getNodeIntelConnector().then(function(conn){return conn.execPeer("fetchAdvisoriesBulk",{body:body})})}function getAdvisoriesBulk(pairs){const result={},uncached=[];if(pairs.forEach(function(pair){const key=pair.name+"@"+pair.version,cached=_cacheGet(_advisoryCache,key,ADVISORY_TTL_MS);cached?cached.length&&(result[pair.name]=cached):uncached.push(pair)}),!uncached.length)return Promise.resolve(result);const body={};return uncached.forEach(function(pair){body[pair.name]=(body[pair.name]||[]).concat(pair.version)}),_fetchAdvisoriesRaw(body).then(function(json){return uncached.forEach(function(pair){const advisories=json&&json[pair.name]||[];_cacheSet(_advisoryCache,pair.name+"@"+pair.version,advisories),advisories.length&&(result[pair.name]=advisories)}),result}).catch(function(){return result})}function _setFetcherForTests(fetchJsonFn){_fetchJson=fetchJsonFn,_fetcherInjected=!0,_searchCache.clear(),_versionsCache.clear(),_advisoryCache.clear(),_packageInfoCache.clear()}function _setNowForTests(nowFn){_now=nowFn}exports.searchPackages=searchPackages,exports.getVersions=getVersions,exports.getPackageInfo=getPackageInfo,exports.getAdvisoriesBulk=getAdvisoriesBulk,exports._setFetcherForTests=_setFetcherForTests,exports._setNowForTests=_setNowForTests});