@mintlify/previewing
Version:
Preview Mintlify docs locally
81 lines (80 loc) • 4.22 kB
JavaScript
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'");
});
});