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
74 lines
2.0 KiB
TypeScript
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)
|
|
}
|
|
}
|