Skip to content

Commit 4aed9f5

Browse files
committed
add unit test
1 parent 94fcd09 commit 4aed9f5

File tree

2 files changed

+100
-0
lines changed

2 files changed

+100
-0
lines changed

tests/__snapshots__/index.test.js.snap

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,3 +285,94 @@ export default function MarkdocComponent(props) {
285285
}
286286
"
287287
`;
288+
289+
exports[`import as frontend component 1`] = `
290+
"import React from 'react';
291+
import yaml from 'js-yaml';
292+
// renderers is imported separately so Markdoc isn't sent to the client
293+
import Markdoc, {renderers} from '@markdoc/markdoc'
294+
295+
import {getSchema, defaultObject} from './src/runtime.js';
296+
/**
297+
* Schema is imported like this so end-user's code is compiled using build-in babel/webpack configs.
298+
* This enables typescript/ESnext support
299+
*/
300+
const schema = {};
301+
302+
const tokenizer = new Markdoc.Tokenizer({\\"allowComments\\":true});
303+
304+
/**
305+
* Source will never change at runtime, so parse happens at the file root
306+
*/
307+
const source = \\"---\\\\ntitle: Custom title\\\\n---\\\\n\\\\n# {% $markdoc.frontmatter.title %}\\\\n\\\\n{% tag /%}\\\\n\\";
308+
const filepath = undefined;
309+
const tokens = tokenizer.tokenize(source);
310+
const parseOptions = {\\"slots\\":false};
311+
const ast = Markdoc.parse(tokens, parseOptions);
312+
313+
/**
314+
* Like the AST, frontmatter won't change at runtime, so it is loaded at file root.
315+
* This unblocks future features, such a per-page dataFetchingFunction.
316+
*/
317+
const frontmatter = ast.attributes.frontmatter
318+
? yaml.load(ast.attributes.frontmatter)
319+
: {};
320+
321+
const {components, ...rest} = getSchema(schema)
322+
323+
function getMarkdocData(context = {}) {
324+
const partials = {};
325+
326+
// Ensure Node.transformChildren is available
327+
Object.keys(partials).forEach((key) => {
328+
const tokens = tokenizer.tokenize(partials[key]);
329+
partials[key] = Markdoc.parse(tokens, parseOptions);
330+
});
331+
332+
const cfg = {
333+
...rest,
334+
variables: {
335+
...(rest ? rest.variables : {}),
336+
// user can't override this namespace
337+
markdoc: {frontmatter},
338+
// Allows users to eject from Markdoc rendering and pass in dynamic variables via getServerSideProps
339+
...(context.variables || {})
340+
},
341+
partials,
342+
source,
343+
};
344+
345+
/**
346+
* transform must be called in dataFetchingFunction to support server-side rendering while
347+
* accessing variables on the server
348+
*/
349+
const content = Markdoc.transform(ast, cfg);
350+
351+
// Removes undefined
352+
return JSON.parse(
353+
JSON.stringify({
354+
content,
355+
frontmatter,
356+
file: {
357+
path: filepath,
358+
},
359+
})
360+
);
361+
}
362+
363+
364+
365+
export const markdoc = {frontmatter};
366+
export default function MarkdocComponent(props) {
367+
const markdoc = getMarkdocData();
368+
// Only execute HMR code in development
369+
return renderers.react(markdoc.content, React, {
370+
components: {
371+
...components,
372+
// Allows users to override default components at runtime, via their _app
373+
...props.components,
374+
},
375+
});
376+
}
377+
"
378+
`;

tests/index.test.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,3 +255,12 @@ test('mode="server"', async () => {
255255
},
256256
});
257257
});
258+
259+
test('import as frontend component', async () => {
260+
const o = options();
261+
// Use a non-page pathway
262+
o.resourcePath = o.resourcePath.replace('pages/test/index.md', 'components/table.md');
263+
const output = await callLoader(o, source);
264+
265+
expect(normalizeOperatingSystemPaths(output)).toMatchSnapshot();
266+
});

0 commit comments

Comments
 (0)