Files
upstream-tldraw/apps/docs/utils/autoLinkDocs.ts
upstream-mirror a774ac673a
Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
snapshot of https://github.com/tldraw/tldraw.git (main, 2026-09-23; blobs > 131072B omitted)
2026-09-23 16:12:52 +05:00

74 lines
2.0 KiB
TypeScript

import { Database } from 'sqlite'
import sqlite3 from 'sqlite3'
/* eslint-disable no-useless-escape */
import { Article } from '@/types/content-types'
export async function autoLinkDocs(db: Database<sqlite3.Database, sqlite3.Statement>) {
// replace [TLEditor](?) with [TLEditor](/reference/editor/TLEditor)?
// not sure how we would get there but finding an article with the same title
const articles = await db.all(
'SELECT id, content, path FROM articles WHERE sectionId != ?',
'reference'
)
await Promise.all(articles.map((a) => autoLinkDocsForArticle(db, a)))
}
const regex = /\[`?([^\[\]]*?)`?\]\(\?\)/g
export async function autoLinkDocsForArticle(
db: Database<sqlite3.Database, sqlite3.Statement>,
{ id, content, path }: Pick<Article, 'id' | 'content' | 'path'>
) {
if (!content) return
let didChange = false
let result = content
const matches = content.matchAll(regex)
if (!matches) return
for (const match of Array.from(matches)) {
const [hit, _title] = match
const [title, heading] = _title.split('#')
const article = await db.get(
'SELECT id FROM articles WHERE title = ? AND sectionId = ?',
title,
'reference'
)
// Get the LOC of the error
const loc = content.split('\n').reduce((acc, line, i) => {
if (line.includes(hit)) {
acc = i
}
return acc
}, 0)
if (!article) {
throw Error(`💥 Could not find article for ${_title} (${title}) in ${path} at line ${loc}`)
}
let str = ''
if (heading) {
// scoped to the article: the same slug (`children`, `dispose`...) exists on many pages
const headingRow = await db.get(
'SELECT slug FROM headings WHERE articleId = ? AND slug = ?',
article.id,
heading
)
if (!headingRow) throw Error(`Could not find heading for ${_title} (${heading}) in ${id}`)
str = `[\`${title}.${heading}\`](/${article.id}#${headingRow.slug})`
} else {
str = `[\`${title}\`](/${article.id})`
}
result = result.replaceAll(hit, str)
didChange = true
}
if (didChange) {
await db.run('UPDATE articles SET content = ? WHERE id = ?', result, id)
}
}