82 lines
2.0 KiB
JavaScript
82 lines
2.0 KiB
JavaScript
|
#!/usr/bin/env node
|
||
|
|
||
|
const path = require('path')
|
||
|
const fs = require('fs')
|
||
|
|
||
|
const SN_API_URL = process.env.SN_API_URL ?? 'http://localhost:3000'
|
||
|
const SN_API_KEY = process.env.SN_API_KEY
|
||
|
|
||
|
const parseFrontMatter = (content) => {
|
||
|
const lines = content.split('\n')
|
||
|
if (lines[0] !== '---') {
|
||
|
throw new Error('failed to parse front matter: start delimiter not found')
|
||
|
}
|
||
|
|
||
|
const endIndex = lines.findIndex((line, i) => i > 0 && line === '---')
|
||
|
if (endIndex === -1) {
|
||
|
throw new Error('failed to parse front matter: end delimiter not found')
|
||
|
}
|
||
|
|
||
|
const meta = {}
|
||
|
for (let i = 1; i < endIndex; i++) {
|
||
|
const line = lines[i]
|
||
|
const [key, ...valueParts] = line.split(':')
|
||
|
if (key && valueParts.length) {
|
||
|
meta[key.trim()] = valueParts.join(':').trim()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return meta
|
||
|
}
|
||
|
|
||
|
const readItem = (name) => {
|
||
|
const content = fs.readFileSync(path.join(__dirname, name), 'utf8')
|
||
|
const lines = content.split('\n')
|
||
|
const startIndex = lines.findIndex((line, i) => i > 0 && line.startsWith('---')) + 1
|
||
|
return {
|
||
|
...parseFrontMatter(content),
|
||
|
text: lines.slice(startIndex).join('\n')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async function upsertDiscussion (variables) {
|
||
|
if (!SN_API_KEY) {
|
||
|
throw new Error('SN_API_KEY is not set')
|
||
|
}
|
||
|
|
||
|
const response = await fetch(`${SN_API_URL}/api/graphql`, {
|
||
|
method: 'POST',
|
||
|
headers: {
|
||
|
'Content-Type': 'application/json',
|
||
|
'X-API-Key': SN_API_KEY
|
||
|
},
|
||
|
body: JSON.stringify({
|
||
|
query: `
|
||
|
mutation upsertDiscussion($id: ID!, $sub: String!, $title: String!, $text: String!) {
|
||
|
upsertDiscussion(id: $id, sub: $sub, title: $title, text: $text) {
|
||
|
result {
|
||
|
id
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
`,
|
||
|
variables
|
||
|
})
|
||
|
})
|
||
|
|
||
|
if (response.status !== 200) {
|
||
|
throw new Error(`failed to upsert discussion: ${response.statusText}`)
|
||
|
}
|
||
|
|
||
|
const json = await response.json()
|
||
|
if (json.errors) {
|
||
|
throw new Error(json.errors[0].message)
|
||
|
}
|
||
|
|
||
|
return json.data
|
||
|
}
|
||
|
|
||
|
const faq = readItem('../docs/user/faq.md')
|
||
|
|
||
|
upsertDiscussion(faq)
|