diff --git a/website/package-lock.json b/website/package-lock.json index 8a950720f..8a6374268 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -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": { diff --git a/website/package.json b/website/package.json index 0b3c20815..a364cbcaf 100644 --- a/website/package.json +++ b/website/package.json @@ -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", diff --git a/website/scripts/index_search_content.js b/website/scripts/index_search_content.js index 480c0ca27..f853b4ddf 100644 --- a/website/scripts/index_search_content.js +++ b/website/scripts/index_search_content.js @@ -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()