Files
supabase/apps/docs/scripts/search/sources/index.ts
T
Charis 8cd5e10038 feat: alternate search index for nimbus (#38662)
* feat: alternate search index for nimbus

Create an alternate search index for Nimbus that filters out
feature-flagged pages (equivalent to setting all feature flags to
false).

Notes:
- Creates two new DB tables, `page_nimbus` and `page_section_nimbus`,
  which are filtered versions of `page` and `page_section`
- Makes `nimbus` versions of all the DB search functions
- Refactored the embedding upload script. Changes to make it faster (got
  annoyed by how slow it was when testing...), incorporate retries, and
  produce better summary logs.
- Upload script, when run with the environment variable
  ENABLED_FEATURES_OVERRIDE_DISABLE_ALL, produces and uploads the
  alternate search index
- Changed all the search calls in frontend/API to check for
  `isFeatureEnabled('search:fullIndex')` to determine whether to search
  the full or alternate index

* ci: produce nimbus search indexes on merge

* fix: turn full search index on
2025-09-16 12:37:53 -04:00

186 lines
5.4 KiB
TypeScript

import { type GuideModel } from '../../../resources/guide/guideModel.js'
import { GuideModelLoader } from '../../../resources/guide/guideModelLoader.js'
import {
GitHubDiscussionLoader,
type GitHubDiscussionSource,
fetchDiscussions,
} from './github-discussion.js'
import { LintWarningsGuideLoader, type LintWarningsGuideSource } from './lint-warnings-guide.js'
import { MarkdownLoader, type MarkdownSource } from './markdown.js'
import { IntegrationLoader, type IntegrationSource, fetchPartners } from './partner-integrations.js'
import {
CliReferenceLoader,
type CliReferenceSource,
ClientLibReferenceLoader,
type ClientLibReferenceSource,
OpenApiReferenceLoader,
type OpenApiReferenceSource,
} from './reference-doc.js'
export type SearchSource =
| MarkdownSource
| OpenApiReferenceSource
| ClientLibReferenceSource
| CliReferenceSource
| GitHubDiscussionSource
| IntegrationSource
| LintWarningsGuideSource
export async function fetchGuideSources() {
const guides = (await GuideModelLoader.allFromFs()).unwrapLeft()
return guides.map((guide: GuideModel) => MarkdownLoader.fromGuideModel('guide', guide))
}
export async function fetchOpenApiReferenceSource() {
return new OpenApiReferenceLoader(
'api',
'/reference/api',
{ title: 'Management API Reference' },
'spec/transforms/api_v1_openapi_deparsed.json',
'spec/common-api-sections.json'
).load()
}
export async function fetchJsLibReferenceSource() {
return new ClientLibReferenceLoader(
'js-lib',
'/reference/javascript',
{ title: 'JavaScript Reference', language: 'JavaScript' },
'spec/supabase_js_v2.yml',
'spec/common-client-libs-sections.json'
).load()
}
export async function fetchDartLibReferenceSource() {
return new ClientLibReferenceLoader(
'dart-lib',
'/reference/dart',
{ title: 'Dart Reference', language: 'Dart' },
'spec/supabase_dart_v2.yml',
'spec/common-client-libs-sections.json'
).load()
}
export async function fetchPythonLibReferenceSource() {
return new ClientLibReferenceLoader(
'python-lib',
'/reference/python',
{ title: 'Python Reference', language: 'Python' },
'spec/supabase_py_v2.yml',
'spec/common-client-libs-sections.json'
).load()
}
export async function fetchCSharpLibReferenceSource() {
return new ClientLibReferenceLoader(
'csharp-lib',
'/reference/csharp',
{ title: 'C# Reference', language: 'C#' },
'spec/supabase_csharp_v0.yml',
'spec/common-client-libs-sections.json'
).load()
}
export async function fetchSwiftLibReferenceSource() {
return new ClientLibReferenceLoader(
'swift-lib',
'/reference/swift',
{ title: 'Swift Reference', language: 'Swift' },
'spec/supabase_swift_v2.yml',
'spec/common-client-libs-sections.json'
).load()
}
export async function fetchKtLibReferenceSource() {
return new ClientLibReferenceLoader(
'kt-lib',
'/reference/kotlin',
{ title: 'Kotlin Reference', language: 'Kotlin' },
'spec/supabase_kt_v1.yml',
'spec/common-client-libs-sections.json'
).load()
}
export async function fetchCliLibReferenceSource() {
return new CliReferenceLoader(
'cli',
'/reference/cli',
{ title: 'CLI Reference', platform: 'cli' },
'spec/cli_v1_commands.yaml',
'spec/common-cli-sections.json'
).load()
}
export async function fetchLintWarningsGuideSources() {
return new LintWarningsGuideLoader(
'guide',
'/guides/database/database-advisors',
'supabase',
'splinter',
'main',
'docs'
).load()
}
/**
* Fetches all the sources we want to index for search
*/
export async function fetchAllSources(fullIndex: boolean) {
const guideSources = fetchGuideSources()
const lintWarningsGuideSources = fetchLintWarningsGuideSources()
const openApiReferenceSource = fetchOpenApiReferenceSource()
const jsLibReferenceSource = fetchJsLibReferenceSource()
const dartLibReferenceSource = fullIndex ? fetchDartLibReferenceSource() : []
const pythonLibReferenceSource = fullIndex ? fetchPythonLibReferenceSource() : []
const cSharpLibReferenceSource = fullIndex ? fetchCSharpLibReferenceSource() : []
const swiftLibReferenceSource = fullIndex ? fetchSwiftLibReferenceSource() : []
const ktLibReferenceSource = fullIndex ? fetchKtLibReferenceSource() : []
const cliReferenceSource = fullIndex ? fetchCliLibReferenceSource() : []
const partnerIntegrationSources = fullIndex
? fetchPartners()
.then((partners) =>
partners
? Promise.all(
partners.map((partner) => new IntegrationLoader(partner.slug, partner).load())
)
: []
)
.then((data) => data.flat())
: []
const githubDiscussionSources = fetchDiscussions(
'supabase',
'supabase',
'DIC_kwDODMpXOc4CUvEr' // 'Troubleshooting' category
)
.then((discussions) =>
Promise.all(
discussions.map((discussion) =>
new GitHubDiscussionLoader('supabase/supabase', discussion).load()
)
)
)
.then((data) => data.flat())
const sources: SearchSource[] = (
await Promise.all([
guideSources,
lintWarningsGuideSources,
openApiReferenceSource,
jsLibReferenceSource,
dartLibReferenceSource,
pythonLibReferenceSource,
cSharpLibReferenceSource,
swiftLibReferenceSource,
ktLibReferenceSource,
cliReferenceSource,
partnerIntegrationSources,
githubDiscussionSources,
])
).flat()
return sources
}