const searchIndex = require('./searchIndex') const getAssetPaths = require('./getAssetPaths') function enhanceHit(hit) { return new Promise((resolve, reject) => { const assetPaths = getAssetPaths(hit.name, hit.version) if (assetPaths) { // TODO: Double check the package metadata to ensure the files // haven't moved from the paths in the index? hit.assets = assetPaths.map( path => `https://unpkg.com/${hit.name}@${hit.version}${path}` ) resolve(hit) } else { // We don't have any global paths for this package yet. Try // using the "bare" URL. hit.assets = [`https://unpkg.com/${hit.name}@${hit.version}`] resolve(hit) } }) } // add concatenated name for more relevance for people spelling without spaces // think: createreactnative instead of create-react-native-app function concat(string) { return string.replace(/[-/@_.]+/g, '') } function search(query, page) { return new Promise((resolve, reject) => { const hitsPerPage = 10 const params = { // typoTolerance: 'min', // optionalFacetFilters: `concatenatedName:${concat(query)}`, facets: ['keywords'], attributesToHighlight: null, attributesToRetrieve: [ 'description', 'githubRepo', 'keywords', 'license', 'name', 'owner', 'version' ], // restrictSearchableAttributes: [ // 'name', // 'description', // 'keywords' // ], hitsPerPage, page } searchIndex.search(query, params, function(error, value) { if (error) { reject(error) } else { resolve( Promise.all(value.hits.map(enhanceHit)).then(hits => { const totalHits = value.nbHits const totalPages = value.nbPages return { query, page, hitsPerPage, totalHits, totalPages, hits } }) ) } }) }) } module.exports = search