markdown-code-example-inserter
Version:
Syncs code examples with markdown documentation.
40 lines (39 loc) • 2.03 kB
JavaScript
import { systemRootPath, toPosixPath } from '@augment-vir/node';
import { dirname, join, posix, relative } from 'node:path';
import { guessPackageIndex } from '../package-parsing/package-index.js';
const languageImportFixMap = {
TypeScript: fixTypescriptImports,
};
export async function fixPackageImports(codeExample, codePath, packageDir, forceIndexPath, language = 'TypeScript',
/** For testing purposes. */
overrideTsConfig,
/** For testing purposes. */
overridePackageJson) {
let newCode = codeExample;
const packageIndex = await guessPackageIndex(packageDir, overrideTsConfig, overridePackageJson);
// fix imports
if (packageIndex.replaceName) {
const forceIndexFullPath = forceIndexPath
? forceIndexPath.startsWith(systemRootPath)
? forceIndexPath
: join(packageDir, forceIndexPath)
: '';
const relativePath = relative(dirname(codePath), forceIndexFullPath || packageIndex.indexPath);
const regExpSafePosixPath = toPosixPath(relativePath.startsWith('.') ? relativePath : `./${relativePath}`).replace(/\./g, String.raw `\.`);
const importFixer = languageImportFixMap[language];
if (importFixer) {
newCode = importFixer(newCode, regExpSafePosixPath, packageIndex.replaceName);
}
}
return newCode;
}
function fixTypescriptImports(code, regExpSafePosixPath, replaceName) {
const indexFileImportRegExpPath = regExpSafePosixPath.replace(/\\\.\w+$/, String.raw `(?:\.[cm]?[jt]s[x]?)?`);
const indexFileImportRegExp = new RegExp(`( from ['"\`])${indexFileImportRegExpPath}(['"\`])`, 'g');
const bareIndexDirImportRegExp = new RegExp(`( from ['"\`])${posix.dirname(regExpSafePosixPath)}/?(['"\`])`, 'g');
let newCode = code.replace(indexFileImportRegExp, `$1${replaceName}$2`);
if (posix.basename(regExpSafePosixPath).startsWith(String.raw `index\.`)) {
newCode = newCode.replace(bareIndexDirImportRegExp, `$1${replaceName}$2`);
}
return newCode;
}