unpkg/server/npm/search.js

84 lines
2.1 KiB
JavaScript

const searchIndex = require('./searchIndex')
const getAssetPaths = require('./getAssetPaths')
function enhanceHit(hit) {
return new Promise(function(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(function(path) {
return `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(function(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(function(hits) {
const totalHits = value.nbHits
const totalPages = value.nbPages
return {
query,
page,
hitsPerPage,
totalHits,
totalPages,
hits
}
})
)
}
})
})
}
module.exports = search