Integrate @hashicorp/react-search/tools script

This commit is contained in:
Kevin Pruett 2020-09-08 17:27:55 -04:00
parent ffa45c4e96
commit 575ef7db96
3 changed files with 96 additions and 222 deletions

View File

@ -5,118 +5,118 @@
"requires": true,
"dependencies": {
"@algolia/cache-browser-local-storage": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.3.0.tgz",
"integrity": "sha512-91Cf3IPUk84PF2wvR8ys8XO42FqaJEtIh/dyR0WvwMdv0x13GORkAvoBJgkFI2wofZqUY86jNimvHWfsWzPQ+g==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.4.0.tgz",
"integrity": "sha512-2AiKgN7DpFypkRCRkpqH7waXXyFdcnsPWzmN8sLHrB/FfXqgmsQb3pGft+9YHZIDQ0vAnfgMxSGgMhMGW+0Qnw==",
"requires": {
"@algolia/cache-common": "4.3.0"
"@algolia/cache-common": "4.4.0"
}
},
"@algolia/cache-common": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.3.0.tgz",
"integrity": "sha512-AHTbOn9lk0f5IkjssXXmDgnaZfsUJVZ61sqOH1W3LyJdAscDzCj0KtwijELn8FHlLXQak7+K93/O3Oct0uHncQ=="
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.4.0.tgz",
"integrity": "sha512-PrIgoMnXaDWUfwOekahro543pgcJfgRu/nd/ZQS5ffem3+Ow725eZY6HDpPaQ1k3cvLii9JH6V2sNJConjqUKA=="
},
"@algolia/cache-in-memory": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.3.0.tgz",
"integrity": "sha512-8BZS5IFEtiSFkA6vNQUXJXIWABDbSanQdkGX5LArlhbCjuykZqF68yaCjXWG10EZTySnkZLmKc+5ozYVOktJaQ==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.4.0.tgz",
"integrity": "sha512-9+XlUB0baDU/Dp9URRHPp6Q37YmTO0QmgPWt9+n+wqZrRL0jR3Jezr4jCT7RemqGMxBiR+YpnqaUv0orpb0ptw==",
"requires": {
"@algolia/cache-common": "4.3.0"
"@algolia/cache-common": "4.4.0"
}
},
"@algolia/client-account": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.3.0.tgz",
"integrity": "sha512-8LJSvWooc+fe+XZXeu+h4dhpo9lsu3sb7rV9cpPhymYSHgEJAHaDkZEcPM1u/PBMvFe0mZXaW6nabeb3jeIRcw==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.4.0.tgz",
"integrity": "sha512-Kynu3cMEs0clTLf674rtrCF+FWR/JwlQxKlIWsPzvLBRmNXdvYej9YBcNaOr4OTQFCCZn9JVE8ib91Z7J4IL1Q==",
"requires": {
"@algolia/client-common": "4.3.0",
"@algolia/client-search": "4.3.0",
"@algolia/transporter": "4.3.0"
"@algolia/client-common": "4.4.0",
"@algolia/client-search": "4.4.0",
"@algolia/transporter": "4.4.0"
}
},
"@algolia/client-analytics": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.3.0.tgz",
"integrity": "sha512-BFH4ddyrqI2pE3bUctn5KtJgYqgvO0Ap9vJEHBNj6mjSKqFbTnZeVEPG3yWrOuWRCqPHR3ewcWRisNwJHG3+Mw==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.4.0.tgz",
"integrity": "sha512-GQyjQimKAc9sZbafxln9Wk7j4pEYiORv28MZkZ+0Bjt7WNXIeO7OgOOECVpQHm9buyV6hCKpNtJcbb5/syRzdQ==",
"requires": {
"@algolia/client-common": "4.3.0",
"@algolia/client-search": "4.3.0",
"@algolia/requester-common": "4.3.0",
"@algolia/transporter": "4.3.0"
"@algolia/client-common": "4.4.0",
"@algolia/client-search": "4.4.0",
"@algolia/requester-common": "4.4.0",
"@algolia/transporter": "4.4.0"
}
},
"@algolia/client-common": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.3.0.tgz",
"integrity": "sha512-8Ohj6zXZkpwDKc8ZWVTZo2wPO4+LT5D258suGg/C6nh4UxOrFOp6QaqeQo8JZ1eqMqtfb3zv5SHgW4fZ00NCLQ==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.4.0.tgz",
"integrity": "sha512-a3yr6UhzjWPHDG/8iGp9UvrDOm1aeHVWJIf0Nj/cIvqX5tNCEIo4IMe59ovApkDgLOIpt/cLsyhn9/FiPXRhJA==",
"requires": {
"@algolia/requester-common": "4.3.0",
"@algolia/transporter": "4.3.0"
"@algolia/requester-common": "4.4.0",
"@algolia/transporter": "4.4.0"
}
},
"@algolia/client-recommendation": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.3.0.tgz",
"integrity": "sha512-jCMIAWPA2hsxc5CCtoTtQAcohaG+10CxXK122Tc47t4w1K8qzSJnCjC2cHvM4UNJO+k7NrmjOYW0EXp9RKc7SQ==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.4.0.tgz",
"integrity": "sha512-sBszbQH46rko6w2fdEG77ma8+fAg0SDkLZGxWhv4trgcnYGUBFl2dcpEPt/6koto9b4XYlf+eh+qi6iGvYqRPg==",
"requires": {
"@algolia/client-common": "4.3.0",
"@algolia/requester-common": "4.3.0",
"@algolia/transporter": "4.3.0"
"@algolia/client-common": "4.4.0",
"@algolia/requester-common": "4.4.0",
"@algolia/transporter": "4.4.0"
}
},
"@algolia/client-search": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.3.0.tgz",
"integrity": "sha512-KCgcIsNMW1/0F5OILiFTddbTAKduJHRvXQS4NxY1H9gQWMTVeWJS7VZQ/ukKBiUMLatwUQHJz2qpYm9fmqOjkQ==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.4.0.tgz",
"integrity": "sha512-jqWcxCUyPPHnHreoMb2PnN9iHTP+V/nL62R84XuTRDE3VgTnhm4ZnqyuRdzZQqaz+gNy5znav64TmQ9FN9WW5g==",
"requires": {
"@algolia/client-common": "4.3.0",
"@algolia/requester-common": "4.3.0",
"@algolia/transporter": "4.3.0"
"@algolia/client-common": "4.4.0",
"@algolia/requester-common": "4.4.0",
"@algolia/transporter": "4.4.0"
}
},
"@algolia/logger-common": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.3.0.tgz",
"integrity": "sha512-vQ+aukjZkRAyO9iyINBefT366UtF/B9QoA1Kw8PlY67T6fYmklFgYp3LNH/e7h/gz0py5LYY/HIwSsaTKk8/VQ=="
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.4.0.tgz",
"integrity": "sha512-2vjmSENLaKNuF+ytRDysfWxxgFG95WXCHwHbueThdPMCK3hskkwqJ0Y/pugKfzl+54mZxegb4BYfgcCeuaHVUw=="
},
"@algolia/logger-console": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.3.0.tgz",
"integrity": "sha512-7pWtcv1cSSa7F48gRBOZLcEWN073+WbnKjbpRrIGej+abZppw/h+22jtVZZORC8EIjFffGqz2/2e6bZiX+Jg7A==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.4.0.tgz",
"integrity": "sha512-st/GUWyKvr6YM72OOfF+RmpdVGda3BPXbQ+chpntUq1WyVkyZXGjSmH1IcBVlua27GzxabwOUYON39cF3x10/g==",
"requires": {
"@algolia/logger-common": "4.3.0"
"@algolia/logger-common": "4.4.0"
}
},
"@algolia/requester-browser-xhr": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.3.0.tgz",
"integrity": "sha512-CpUwgQhXZsnZmjEd5DTwQv1BKQNCt83bzyVdUqvljsFxZOsNQacS6lOYs0B1eD18tKHCwVMuwbYqTaLPGBXTKQ==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.4.0.tgz",
"integrity": "sha512-V3a4hXlNch355GnWaT1f5QfXhROpsjT6sd0Znq29gAhwLqfBExhLW6Khdkv5pENC0Qy7ClVhdXFrBL9QCQer1g==",
"requires": {
"@algolia/requester-common": "4.3.0"
"@algolia/requester-common": "4.4.0"
}
},
"@algolia/requester-common": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.3.0.tgz",
"integrity": "sha512-1v73KyspJBiTzfyXupjHxikxTYjh5MoxI6mOIvAtQxRqc4ehUPAEdPCNHEvvLiCK96iKWzZaULmV0U7pj3yvTw=="
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.4.0.tgz",
"integrity": "sha512-jPinHlFJEFokxQ5b3JWyjQKKn+FMy0hH99PApzOgQAYOSiFRXiPEZp6LeIexDeLLu7Y3eRt/3nHvjPKa6PmRRw=="
},
"@algolia/requester-node-http": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.3.0.tgz",
"integrity": "sha512-Hg9Y8sUeSGQgoO1FpoL5jbkDzCtXI/8HXHybU6bimsX93DAz3HZWaoQFKmIpQDNhQ8G9FLgAtzDAxS6eckDxzg==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.4.0.tgz",
"integrity": "sha512-b7HC9C/GHxiV4+0GpCRTtjscvwarPr3dGm4CAhb6AkNjgjRcFUNr1NfsF75w3WVmzmt79/7QZihddztDdVMGjw==",
"requires": {
"@algolia/requester-common": "4.3.0"
"@algolia/requester-common": "4.4.0"
}
},
"@algolia/transporter": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.3.0.tgz",
"integrity": "sha512-BTKHAtdQdfOJ0xzZkiyEK/2QVQJTiVgBZlOBfXp2gBtztjV26OqfW4n6Xz0o7eBRzLEwY1ot3mHF5QIVUjAsMg==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.4.0.tgz",
"integrity": "sha512-Xxzq91DEEeKIzT3DU46n4LEyTGAKZNtSHc2H9wvIY5MYwhZwEribmXXZ6k8W1FvBvzggv3juu0SP+xwGoR7F0w==",
"requires": {
"@algolia/cache-common": "4.3.0",
"@algolia/logger-common": "4.3.0",
"@algolia/requester-common": "4.3.0"
"@algolia/cache-common": "4.4.0",
"@algolia/logger-common": "4.4.0",
"@algolia/requester-common": "4.4.0"
}
},
"@ampproject/toolbox-core": {
@ -1605,14 +1605,20 @@
}
},
"@hashicorp/react-search": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@hashicorp/react-search/-/react-search-2.0.0.tgz",
"integrity": "sha512-nMH0pUPNEOEcuIcQ/NRiqlZOXJkK7XnIs+KcwFoRxX6UyWSUUkhHPUU+TGy4Wgs8T65tFl5y4Ksnv+za+3CdPQ==",
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@hashicorp/react-search/-/react-search-2.1.0.tgz",
"integrity": "sha512-vaTht+2G9ipsVyusK3b3TtUpuy9ccsxj3NMSWXJyGsoT39K1Oovb8aLiIlbUU5Ll72KEi5yq5OS3WAJDdSqW+g==",
"requires": {
"@hashicorp/react-inline-svg": "^1.0.2",
"@hashicorp/remark-plugins": "^3.0.0",
"algoliasearch": "^4.4.0",
"dotenv": "^8.2.0",
"glob": "^7.1.6",
"gray-matter": "^4.0.2",
"react-instantsearch-dom": "^6.7.0",
"search-insights": "^1.6.0"
"remark": "^12.0.1",
"search-insights": "^1.6.0",
"unist-util-visit": "^2.0.3"
},
"dependencies": {
"@hashicorp/react-inline-svg": {
@ -2525,24 +2531,24 @@
"integrity": "sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA=="
},
"algoliasearch": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.3.0.tgz",
"integrity": "sha512-H2woXyqmd1nFYDrQKLZXgghNkLBTcBXJ7Q/bxQ+F9WWS4H0Kb7IlQvNi7bDzHyldhDhIthImaUwcKqr5iiyMFQ==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.4.0.tgz",
"integrity": "sha512-Ag3wxe/nSodNl/1KbHibtkh7TNLptKE300/wnGVtszRjXivaWD6333nUpCumrYObHym/fHMHyLcmQYezXbAIWQ==",
"requires": {
"@algolia/cache-browser-local-storage": "4.3.0",
"@algolia/cache-common": "4.3.0",
"@algolia/cache-in-memory": "4.3.0",
"@algolia/client-account": "4.3.0",
"@algolia/client-analytics": "4.3.0",
"@algolia/client-common": "4.3.0",
"@algolia/client-recommendation": "4.3.0",
"@algolia/client-search": "4.3.0",
"@algolia/logger-common": "4.3.0",
"@algolia/logger-console": "4.3.0",
"@algolia/requester-browser-xhr": "4.3.0",
"@algolia/requester-common": "4.3.0",
"@algolia/requester-node-http": "4.3.0",
"@algolia/transporter": "4.3.0"
"@algolia/cache-browser-local-storage": "4.4.0",
"@algolia/cache-common": "4.4.0",
"@algolia/cache-in-memory": "4.4.0",
"@algolia/client-account": "4.4.0",
"@algolia/client-analytics": "4.4.0",
"@algolia/client-common": "4.4.0",
"@algolia/client-recommendation": "4.4.0",
"@algolia/client-search": "4.4.0",
"@algolia/logger-common": "4.4.0",
"@algolia/logger-console": "4.4.0",
"@algolia/requester-browser-xhr": "4.4.0",
"@algolia/requester-common": "4.4.0",
"@algolia/requester-node-http": "4.4.0",
"@algolia/transporter": "4.4.0"
}
},
"algoliasearch-helper": {

View File

@ -15,23 +15,17 @@
"@hashicorp/react-image": "2.0.1",
"@hashicorp/react-mega-nav": "4.0.1-2",
"@hashicorp/react-product-downloader": "4.0.2",
"@hashicorp/react-search": "^2.0.0",
"@hashicorp/react-search": "^2.1.0",
"@hashicorp/react-section-header": "2.0.0",
"@hashicorp/react-subnav": "3.2.3",
"@hashicorp/react-vertical-text-block-list": "2.0.1",
"algoliasearch": "^4.3.0",
"babel-plugin-import-glob-array": "0.2.0",
"dotenv": "8.2.0",
"glob": "^7.1.6",
"gray-matter": "4.0.2",
"imagemin-mozjpeg": "9.0.0",
"imagemin-optipng": "8.0.0",
"imagemin-svgo": "8.0.0",
"next": "9.4.4",
"react": "16.13.1",
"react-dom": "16.13.1",
"remark": "^12.0.1",
"unist-util-visit": "^2.0.3"
"react-dom": "16.13.1"
},
"devDependencies": {
"dart-linkcheck": "2.0.15",

View File

@ -1,129 +1,3 @@
require('dotenv').config()
const { indexDocsContent } = require('@hashicorp/react-search/tools')
const algoliasearch = require('algoliasearch')
const glob = require('glob')
const matter = require('gray-matter')
const path = require('path')
const remark = require('remark')
const visit = require('unist-util-visit')
// In addition to the content of the page,
// define additional front matter attributes that will be search-indexable
const SEARCH_DIMENSIONS = ['page_title', 'description']
main()
async function main() {
const pagesFolder = path.join(__dirname, '../pages')
// Grab all search-indexable content and format for Algolia
const searchObjects = await Promise.all(
glob
.sync(path.join(pagesFolder, '**/*.mdx'), {
ignore: path.join(pagesFolder, 'partials/**/*'),
})
.map(async (fullPath) => {
const { content, data } = matter.read(fullPath)
const searchableDimensions = SEARCH_DIMENSIONS.reduce(
(acc, dimension) => {
return { ...acc, [dimension]: data[dimension] }
},
{}
)
const headings = await collectHeadings(content)
// Get path relative to `pages`
const __resourcePath = fullPath.replace(`${pagesFolder}/`, '')
// Use clean URL for Algolia id
const objectID = __resourcePath.replace('.mdx', '')
return {
...searchableDimensions,
headings,
objectID,
}
})
)
try {
await indexSearchContent(searchObjects)
} catch (e) {
console.error(e)
process.exit(1)
}
}
async function indexSearchContent(objects) {
const {
NEXT_PUBLIC_ALGOLIA_APP_ID: appId,
NEXT_PUBLIC_ALGOLIA_INDEX: index,
ALGOLIA_API_KEY: apiKey,
} = process.env
if (!apiKey || !appId || !index) {
throw new Error(
`[*** Algolia Search Indexing Error ***] Received: ALGOLIA_API_KEY=${apiKey} ALGOLIA_APP_ID=${appId} ALGOLIA_INDEX=${index} \n Please ensure all Algolia Search-related environment vars are set in CI settings.`
)
}
console.log(`updating ${objects.length} indices...`)
try {
const searchClient = algoliasearch(appId, apiKey)
const searchIndex = searchClient.initIndex(index)
const { objectIDs } = await searchIndex.partialUpdateObjects(objects, {
createIfNotExists: true,
})
let staleIds = []
await searchIndex.browseObjects({
query: '',
batch: (batch) => {
staleIds = staleIds.concat(
batch
.filter(({ objectID }) => !objectIDs.includes(objectID))
.map(({ objectID }) => objectID)
)
},
})
if (staleIds.length > 0) {
console.log(`deleting ${staleIds.length} stale indices:`)
console.log(staleIds)
await searchIndex.deleteObjects(staleIds)
}
console.log('done')
process.exit(0)
} catch (error) {
throw new Error(error)
}
}
async function collectHeadings(mdxContent) {
const headings = []
const headingMapper = () => (tree) => {
visit(tree, 'heading', (node) => {
const title = node.children.reduce((m, n) => {
if (n.value) m += n.value
return m
}, '')
// Only include level 1 or level 2 headings
if (node.depth < 3) {
headings.push(title)
}
})
}
return remark()
.use(headingMapper)
.process(mdxContent)
.then(() => headings)
}
indexDocsContent()