From 527c12e74c17a06e1af42e279bd024fb813e51b8 Mon Sep 17 00:00:00 2001 From: Micha de Vries Date: Tue, 8 Oct 2024 10:55:06 +0200 Subject: [PATCH] Reintroduce crawler --- .gitignore | 3 + astro.config.mjs | 21 ++--- bun.lockb | Bin 381221 -> 385794 bytes netlify.toml | 9 +++ package.json | 4 +- plugins/crawler/index.mjs | 153 +++++++++++++++++++++++++++++++++++ plugins/crawler/manifest.yml | 3 + plugins/crawler/package.json | 9 +++ plugins/crawler/schema.surql | 13 +++ 9 files changed, 201 insertions(+), 14 deletions(-) create mode 100644 netlify.toml create mode 100644 plugins/crawler/index.mjs create mode 100644 plugins/crawler/manifest.yml create mode 100644 plugins/crawler/package.json create mode 100644 plugins/crawler/schema.surql diff --git a/.gitignore b/.gitignore index 81d1daaf0..05b8496cc 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ pnpm-debug.log* # jetbrains setting folder .idea/ + +# Local Netlify folder +.netlify diff --git a/astro.config.mjs b/astro.config.mjs index c55d9dbce..71d98fe04 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -14,6 +14,8 @@ import { rehypeCopyCodePlugin } from './src/util/rehypeCopyCodePlugin.mjs'; import { autolinkConfig } from './src/util/rehypeHeadingsConfig'; import { rehypeNotesPlugin } from './src/util/rehypeNotesPlugin.mjs'; +import sitemap from '@astrojs/sitemap'; + const deployDomain = process.env.DEPLOY_DOMAIN ?? 'surrealdb.com'; const site = `https://${deployDomain}`; @@ -23,18 +25,11 @@ export default defineConfig({ base: '/docs', outDir: './dist/docs', trailingSlash: 'never', - integrations: [ - mdx(), - solidJs({ devtools: true }), - icon(), - tailwind({ - nesting: true, - }), - partytown(), - compress({ - Image: false, - }), - ], + integrations: [mdx(), solidJs({ devtools: true }), icon(), tailwind({ + nesting: true, + }), partytown(), compress({ + Image: false, + }), sitemap()], markdown: { remarkPlugins: [remarkCustomHeadingId], rehypePlugins: [ @@ -46,4 +41,4 @@ export default defineConfig({ ], syntaxHighlight: false, }, -}); +}); \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 5bc5fc2b08117b19713496f153874836935ae4c9..f548a1e1257268d593a613dab77eff1b8ca6995a 100755 GIT binary patch delta 66273 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 EKS{#?`Tzg` delta 63601 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 diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 000000000..7eefe0c85 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,9 @@ +[build] +command = "bun run build" +publish = "dist" + +[dev] +command = "bun run dev" + +[[plugins]] +package = "/plugins/crawler" diff --git a/package.json b/package.json index f5e4cdf2a..194bed40a 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@ark-ui/solid": "^3.12.0", "@astrojs/check": "^0.9.3", "@astrojs/mdx": "^3.1.5", + "@astrojs/sitemap": "^3.2.0", "@astrojs/solid-js": "^4.4.1", "@astrojs/tailwind": "^5.1.0", "@codemirror/lang-sql": "^6.7.1", @@ -73,5 +74,6 @@ "remark-custom-heading-id": "^2.0.0", "sass-embedded": "^1.78.0", "tiny-glob": "^0.2.9" - } + }, + "workspaces": ["plugins/*"] } diff --git a/plugins/crawler/index.mjs b/plugins/crawler/index.mjs new file mode 100644 index 000000000..aacc6a57c --- /dev/null +++ b/plugins/crawler/index.mjs @@ -0,0 +1,153 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { parseStringPromise } from 'xml2js'; +import { parse as parseHTML } from 'node-html-parser'; +import Surreal, { RecordId, surql } from 'surrealdb'; +import { cwd } from 'node:process'; + +export async function onSuccess() { + // const isLocalBuild = process.env.DEPLOY_URL == 'https://0--surrealdb-docs.netlify.app'; + const applyIndexes = + process.env.DEPLOY_PRIME_URL === + 'https://main--surrealdb-docs.netlify.app'; + const jobDate = new Date(); + const db = new Surreal(); + + db.emitter.subscribe('connected', () => + console.log('[DB] Connected to SurrealDB') + ); + db.emitter.subscribe('disconnected', () => + console.log('[DB] Disconnected from SurrealDB') + ); + db.emitter.subscribe('error', (e) => console.log('[DB] Error occurred', e)); + + if (applyIndexes) + await db.connect(process.env.SURREAL_ENDPOINT, { + namespace: process.env.SURREAL_NAMESPACE, + database: process.env.SURREAL_DATABASE, + auth: { + namespace: process.env.SURREAL_NAMESPACE, + database: process.env.SURREAL_DATABASE, + username: process.env.SURREAL_USERNAME, + password: process.env.SURREAL_PASSWORD, + }, + }); + + const buildDir = `${cwd()}/dist`; + const deployUrl = new URL(process.env.DEPLOY_PRIME_URL); + const hostname = deployUrl.hostname; + const sitemapPath = `${buildDir}/docs/sitemap-0.xml`; + console.log(`[CW] Build dir is: "${buildDir}"`); + console.log(`[CW] Deploy URL is: "${deployUrl}"`); + console.log(`[CW] Sitemap path is: "${sitemapPath}"`); + + const sitemapXml = fs.readFileSync(sitemapPath, 'utf8'); + const sitemap = await parseStringPromise(sitemapXml); + const urls = sitemap.urlset.url; + console.log(`[CW] The sitemap contains ${urls.length} url(s)`); + + const pathnames = urls.map((url) => { + let pathname = decodeURI(new URL(url.loc[0]).pathname); + if (pathname.endsWith('/')) pathname = pathname.slice(0, -1); + return pathname; + }); + const chunkSize = 1; + + for (let i = 0; i < pathnames.length; i += chunkSize) { + const chunk = pathnames.slice(i, i + chunkSize); + await Promise.all( + chunk.map(async (pathname, index) => { + console.log( + `[CW] Crawling page ${index + i + 1}/${pathnames.length}: ${pathname}` + ); + + const filePath = path.join(buildDir, pathname, 'index.html'); + const fileContent = fs + .readFileSync(filePath, 'utf-8') + .replace(/\0/g, ''); + + if (!fileContent) + throw new Error(`[CW] Failed to read file "${filePath}"`); + + const document = parseHTML(fileContent, { + blockTextElements: { + script: true, + style: true, + noscript: true, + }, + }); + + const scrapByQuerySelector = (query, blockContent) => + document + .querySelectorAll(query) + .map((el) => { + const block = blockContent?.(el) ?? el.textContent; + if (!block) return; + + const parts = block.split(/\s+/); + const trimmedParts = parts.filter(Boolean); // This removes any empty strings + const trimmedBlock = trimmedParts.join(' '); + if (trimmedBlock.length > 0) return trimmedBlock; + }) + .filter((a) => a); + + const title = document.querySelector('title').textContent; + const h1 = scrapByQuerySelector('h1'); + const h2 = scrapByQuerySelector('h2'); + const h3 = scrapByQuerySelector('h3'); + const h4 = scrapByQuerySelector('h4'); + const code = scrapByQuerySelector('code', (el) => + [...el.childNodes].map((el) => el.textContent).join('\n') + ); + const content = [ + ...scrapByQuerySelector('p,h1,h2,h3,h4,h5,h6,tr,th,td'), + ...code, + ]; + + if (applyIndexes && content.length > 0) { + const start = Date.now(); + const subject = new RecordId('page', [hostname, pathname]); + + console.log(`[IX] Indexing "${subject}"`); + await db.upsert(subject, { + title, + path: pathname, + hostname, + h1, + h2, + h3, + h4, + content, + code, + date: jobDate, + }); + + const elapsed = Date.now() - start; + console.log(`[IX] Took ${elapsed}ms to index "${subject}"`); + } else { + console.log('[IX] Skipping indexing, not on prod'); + } + }) + ); + } + + if (applyIndexes) { + console.log('[CW] Removing stale pages'); + await db.query( + /* surql */ ` + DELETE page WHERE + hostname = $hostname AND + (date IS NONE OR date < $jobDate) + `, + { + jobDate, + hostname: hostname, + } + ); + } else { + console.log('[CW] Skipping stale page removal, not on prod'); + } + + console.log('[CW] Closing connection to SurrealDB'); + await db.close(); +} diff --git a/plugins/crawler/manifest.yml b/plugins/crawler/manifest.yml new file mode 100644 index 000000000..ee9fa5f01 --- /dev/null +++ b/plugins/crawler/manifest.yml @@ -0,0 +1,3 @@ +# manifest.yml + +name: crawler diff --git a/plugins/crawler/package.json b/plugins/crawler/package.json new file mode 100644 index 000000000..0f38a4676 --- /dev/null +++ b/plugins/crawler/package.json @@ -0,0 +1,9 @@ +{ + "name": "crawler-plugin", + "main": "index.mjs", + "dependencies": { + "node-html-parser": "^6.1.11", + "surrealdb": "^1.0.6", + "xml2js": "^0.6.2" + } +} diff --git a/plugins/crawler/schema.surql b/plugins/crawler/schema.surql new file mode 100644 index 000000000..248eca7ee --- /dev/null +++ b/plugins/crawler/schema.surql @@ -0,0 +1,13 @@ +DEFINE TABLE OVERWRITE page SCHEMALESS PERMISSIONS FOR select FULL; +DEFINE ANALYZER OVERWRITE simple TOKENIZERS blank,class,camel,punct FILTERS snowball(english); +DEFINE INDEX OVERWRITE page_hostname ON page FIELDS hostname; +DEFINE INDEX OVERWRITE page_date_indexed ON page FIELDS date; +DEFINE INDEX OVERWRITE unique_page ON page FIELDS hostname, path UNIQUE; +DEFINE INDEX OVERWRITE page_title ON page FIELDS title SEARCH ANALYZER simple BM25(1.2,0.75); +DEFINE INDEX OVERWRITE page_path ON page FIELDS path SEARCH ANALYZER simple BM25(1.2,0.75); +DEFINE INDEX OVERWRITE page_h1 ON page FIELDS h1 SEARCH ANALYZER simple BM25(1.2,0.75); +DEFINE INDEX OVERWRITE page_h2 ON page FIELDS h2 SEARCH ANALYZER simple BM25(1.2,0.75); +DEFINE INDEX OVERWRITE page_h3 ON page FIELDS h3 SEARCH ANALYZER simple BM25(1.2,0.75); +DEFINE INDEX OVERWRITE page_h4 ON page FIELDS h4 SEARCH ANALYZER simple BM25(1.2,0.75); +DEFINE INDEX OVERWRITE page_content ON page FIELDS content SEARCH ANALYZER simple BM25(1.2,0.75) HIGHLIGHTS; +DEFINE INDEX OVERWRITE page_code ON page FIELDS code SEARCH ANALYZER simple BM25(1.2,0.75);