import { writeFileSync } from 'node:fs';
import { resolve } from 'node:path';
import type { Method } from '../../docs/.vitepress/components/api-docs/method';
import type { PageIndex } from './utils';
import {
formatMarkdown,
formatTypescript,
pathDocsDir,
pathOutputDir,
} from './utils';
const pathDocsApiPages = resolve(pathDocsDir, '.vitepress', 'api-pages.ts');
const scriptCommand = 'pnpm run generate:api-docs';
// Moved here because this must not be formatted by prettier
const vitePressInFileOptions = `---
editLink: false
---
`;
/**
* Writes the api page for the given module to the correct location.
*
* @param moduleName The name of the module to write the docs for.
* @param lowerModuleName The lowercase name of the module.
* @param comment The module comments.
*/
export function writeApiDocsModulePage(
moduleName: string,
lowerModuleName: string,
comment: string
): void {
// Write api docs page
let content = `
# ${moduleName}
::: v-pre
${comment}
:::
`.replace(/\n +/g, '\n');
content = vitePressInFileOptions + formatMarkdown(content);
writeFileSync(resolve(pathOutputDir, `${lowerModuleName}.md`), content);
}
/**
* Writes the api page for the given method to the correct location.
*
* @param methodName The name of the method to write the docs for.
*/
export function writeApiDocsDirectPage(methodName: string): void {
let content = `
`.replace(/\n +/g, '\n');
content = vitePressInFileOptions + formatMarkdown(content);
writeFileSync(resolve(pathOutputDir, `${methodName}.md`), content);
}
/**
* Writes the api docs data to correct location.
*
* @param lowerModuleName The lowercase name of the module.
* @param methods The methods data to save.
*/
export function writeApiDocsData(
lowerModuleName: string,
methods: Method[]
): void {
let contentTs = `
import type { Method } from '../.vitepress/components/api-docs/method';
export const ${lowerModuleName}: Method[] = ${JSON.stringify(
methods,
null,
2
)}`;
contentTs = formatTypescript(contentTs);
writeFileSync(resolve(pathOutputDir, `${lowerModuleName}.ts`), contentTs);
}
/**
* Writes the api docs index to correct location.
*
* @param pages The pages to write into the index.
*/
export function writeApiPagesIndex(pages: PageIndex): void {
// Write api-pages.ts
console.log('Updating api-pages.ts');
pages.sort((a, b) => a.text.localeCompare(b.text));
let apiPagesContent = `
// This file is automatically generated.
// Run '${scriptCommand}' to update
export const apiPages = ${JSON.stringify(pages)};
`.replace(/\n +/, '\n');
apiPagesContent = formatTypescript(apiPagesContent);
writeFileSync(pathDocsApiPages, apiPagesContent);
}