UNPKG

@mintlify/previewing

Version:

Preview Mintlify docs locally

81 lines (80 loc) 4.22 kB
import { findAndRemoveImports, stringifyTree } from '@mintlify/common'; import { preparseMdxTree } from '@mintlify/prebuild'; import fse from 'fs-extra'; import { mkdtemp, rm } from 'fs/promises'; import { tmpdir } from 'os'; import { join } from 'path'; import { resolveImportsFromImportClosure } from '../local-preview/listener/resolve-imports-from-import-closure.js'; const testPaths = vi.hoisted(() => ({ cmd: '', public: '', })); vi.mock('../constants.js', () => ({ get CMD_EXEC_PATH() { return testPaths.cmd; }, get NEXT_PUBLIC_PATH() { return testPaths.public; }, })); vi.mock('../local-preview/listener/utils.js', () => ({ getCurrentVariables: vi.fn(async () => ({ name: 'Ada' })), handleParseError: vi.fn(), })); describe('resolveImportsFromImportClosure', () => { let root; beforeEach(async () => { root = await mkdtemp(join(tmpdir(), 'resolve-imports-from-import-closure-')); testPaths.cmd = join(root, 'docs'); testPaths.public = join(root, 'public'); await fse.ensureDir(testPaths.cmd); await fse.ensureDir(testPaths.public); }); afterEach(async () => { await rm(root, { recursive: true, force: true }); }); it('resolves newly imported source snippets with variables and nested imports', async () => { await fse.outputFile(join(testPaths.cmd, 'nested.mdx'), 'export const Nested = () => <span>{{name}}</span>;'); await fse.outputFile(join(testPaths.cmd, 'snippet.mdx'), "import { Nested } from './nested.mdx';\n\n<Nested />"); const pageContent = "import Snippet from './snippet.mdx';\n\n<Snippet />"; const tree = await preparseMdxTree(pageContent, testPaths.cmd, join(testPaths.cmd, 'page.mdx'), vi.fn()); const importsResponse = await findAndRemoveImports(tree); const resolvedTree = await resolveImportsFromImportClosure({ ...importsResponse, filename: 'page.mdx', }); const resolvedContent = stringifyTree(resolvedTree); expect(resolvedContent).toContain('Ada'); expect(resolvedContent).not.toContain('{{name}}'); expect(resolvedContent).not.toContain("import { Nested } from './nested.mdx'"); }); it('resolves explicit snippet imports with parent-directory nested imports', async () => { await fse.outputFile(join(testPaths.cmd, 'shared/nested.mdx'), 'export const Nested = () => <span>{{name}}</span>;'); await fse.outputFile(join(testPaths.cmd, 'snippets/foundry/card.mdx'), "import { Nested } from '../../shared/nested.mdx';\n\n<Nested />"); const pageContent = "import Card from '/snippets/foundry/card.mdx';\n\n<Card />"; const tree = await preparseMdxTree(pageContent, testPaths.cmd, join(testPaths.cmd, 'docs/page.mdx'), vi.fn()); const importsResponse = await findAndRemoveImports(tree); const resolvedTree = await resolveImportsFromImportClosure({ ...importsResponse, filename: 'docs/page.mdx', }); const resolvedContent = stringifyTree(resolvedTree); expect(resolvedContent).toContain('Ada'); expect(resolvedContent).not.toContain('{{name}}'); expect(resolvedContent).not.toContain("import { Nested } from '../../shared/nested.mdx'"); }); it('resolves named imports from explicit snippets', async () => { await fse.outputFile(join(testPaths.cmd, 'snippets/badge.mdx'), 'export const Badge = () => <span>{{name}}</span>;'); const pageContent = "import { Badge } from '/snippets/badge.mdx';\n\n<Badge />"; const tree = await preparseMdxTree(pageContent, testPaths.cmd, join(testPaths.cmd, 'docs/page.mdx'), vi.fn()); const importsResponse = await findAndRemoveImports(tree); const resolvedTree = await resolveImportsFromImportClosure({ ...importsResponse, filename: 'docs/page.mdx', }); const resolvedContent = stringifyTree(resolvedTree); expect(resolvedContent).toContain('Ada'); expect(resolvedContent).not.toContain('{{name}}'); expect(resolvedContent).not.toContain("import { Badge } from '/snippets/badge.mdx'"); }); });