@art-md/constructs 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/factories/constructs/Document/factory/createDocument.test.ts +17 -0
- package/src/factories/constructs/Document/factory/createDocument.ts +11 -0
- package/src/factories/constructs/Document/factory/types.ts +5 -0
- package/src/factories/constructs/Document/index.ts +3 -0
- package/src/factories/constructs/FieldBlock/factory/createFieldBlock.test.ts +26 -0
- package/src/factories/constructs/FieldBlock/factory/createFieldBlock.ts +15 -0
- package/src/factories/constructs/FieldBlock/factory/types.ts +8 -0
- package/src/factories/constructs/FieldBlock/index.ts +4 -0
- package/src/factories/constructs/FieldBlock/types.ts +11 -0
- package/src/factories/constructs/FieldInline/factory/createFieldInline.test.ts +26 -0
- package/src/factories/constructs/FieldInline/factory/createFieldInline.ts +15 -0
- package/src/factories/constructs/FieldInline/factory/types.ts +8 -0
- package/src/factories/constructs/FieldInline/index.ts +4 -0
- package/src/factories/constructs/FieldInline/types.ts +11 -0
- package/src/factories/constructs/NaturalBlock/factory/createNaturalBlock.test.ts +36 -0
- package/src/factories/constructs/NaturalBlock/factory/createNaturalBlock.ts +25 -0
- package/src/factories/constructs/NaturalBlock/factory/types.ts +13 -0
- package/src/factories/constructs/NaturalBlock/index.ts +4 -0
- package/src/factories/constructs/NaturalBlock/types.ts +14 -0
- package/src/factories/constructs/NaturalExpression/factory/createNaturalExpression.test.ts +22 -0
- package/src/factories/constructs/NaturalExpression/factory/createNaturalExpression.ts +13 -0
- package/src/factories/constructs/NaturalExpression/factory/types.ts +8 -0
- package/src/factories/constructs/NaturalExpression/index.ts +4 -0
- package/src/factories/constructs/NaturalExpression/types.ts +9 -0
- package/src/factories/constructs/SectionBlock/factory/createSectionBlock.test.ts +30 -0
- package/src/factories/constructs/SectionBlock/factory/createSectionBlock.ts +15 -0
- package/src/factories/constructs/SectionBlock/factory/types.ts +11 -0
- package/src/factories/constructs/SectionBlock/index.ts +4 -0
- package/src/factories/constructs/SectionBlock/types.ts +12 -0
- package/src/factories/constructs/Tag/factory/createTag.test.ts +10 -0
- package/src/factories/constructs/Tag/factory/createTag.ts +7 -0
- package/src/factories/constructs/Tag/factory/types.ts +3 -0
- package/src/factories/constructs/Tag/index.ts +4 -0
- package/src/factories/constructs/Tag/types.ts +6 -0
- package/src/factories/index.ts +9 -0
- package/src/factories/public.ts +47 -0
- package/src/factories/types.ts +36 -0
- package/src/index.ts +3 -0
- package/src/parser/constructs/FieldBlock/createFieldBlockParser.test.ts +13 -0
- package/src/parser/constructs/FieldBlock/createFieldBlockParser.ts +9 -0
- package/src/parser/constructs/FieldBlock/index.ts +1 -0
- package/src/parser/constructs/FieldBlock/private/helpers/createFieldBlockFromNode.test.ts +63 -0
- package/src/parser/constructs/FieldBlock/private/helpers/createFieldBlockFromNode.ts +33 -0
- package/src/parser/constructs/FieldBlock/private/helpers/onBeforeConstruct.test.ts +30 -0
- package/src/parser/constructs/FieldBlock/private/helpers/onBeforeConstruct.ts +19 -0
- package/src/parser/constructs/FieldBlock/private/index.ts +2 -0
- package/src/parser/constructs/FieldBlock/private/integrator/createFieldBlockIntegrator.test.ts +23 -0
- package/src/parser/constructs/FieldBlock/private/integrator/createFieldBlockIntegrator.ts +13 -0
- package/src/parser/constructs/FieldBlock/private/processor/createFieldBlockProcessor.test.ts +63 -0
- package/src/parser/constructs/FieldBlock/private/processor/createFieldBlockProcessor.ts +21 -0
- package/src/parser/constructs/FieldInline/createFieldInlineParser.test.ts +12 -0
- package/src/parser/constructs/FieldInline/createFieldInlineParser.ts +8 -0
- package/src/parser/constructs/FieldInline/index.ts +1 -0
- package/src/parser/constructs/FieldInline/private/helpers/createFieldInlineFromNode.test.ts +100 -0
- package/src/parser/constructs/FieldInline/private/helpers/createFieldInlineFromNode.ts +51 -0
- package/src/parser/constructs/FieldInline/private/helpers/trimFieldEdges.test.ts +48 -0
- package/src/parser/constructs/FieldInline/private/helpers/trimFieldEdges.ts +18 -0
- package/src/parser/constructs/FieldInline/private/index.ts +1 -0
- package/src/parser/constructs/FieldInline/private/processor/createFieldInlineProcessor.test.ts +57 -0
- package/src/parser/constructs/FieldInline/private/processor/createFieldInlineProcessor.ts +21 -0
- package/src/parser/constructs/NaturalBlock/createNaturalBlockParser.test.ts +12 -0
- package/src/parser/constructs/NaturalBlock/createNaturalBlockParser.ts +8 -0
- package/src/parser/constructs/NaturalBlock/index.ts +1 -0
- package/src/parser/constructs/NaturalBlock/private/helpers/createNaturalBlockFromNode.test.ts +101 -0
- package/src/parser/constructs/NaturalBlock/private/helpers/createNaturalBlockFromNode.ts +51 -0
- package/src/parser/constructs/NaturalBlock/private/index.ts +1 -0
- package/src/parser/constructs/NaturalBlock/private/processor/createNaturalBlockProcessor.test.ts +24 -0
- package/src/parser/constructs/NaturalBlock/private/processor/createNaturalBlockProcessor.ts +10 -0
- package/src/parser/constructs/SectionBlock/createSectionBlockParser.test.ts +13 -0
- package/src/parser/constructs/SectionBlock/createSectionBlockParser.ts +9 -0
- package/src/parser/constructs/SectionBlock/index.ts +1 -0
- package/src/parser/constructs/SectionBlock/private/constants.test.ts +17 -0
- package/src/parser/constructs/SectionBlock/private/constants.ts +1 -0
- package/src/parser/constructs/SectionBlock/private/helpers/createSectionBlockFromNode.test.ts +58 -0
- package/src/parser/constructs/SectionBlock/private/helpers/createSectionBlockFromNode.ts +28 -0
- package/src/parser/constructs/SectionBlock/private/helpers/findParentSection.test.ts +44 -0
- package/src/parser/constructs/SectionBlock/private/helpers/findParentSection.ts +14 -0
- package/src/parser/constructs/SectionBlock/private/index.ts +2 -0
- package/src/parser/constructs/SectionBlock/private/integrator/createSectionBlockIntegrator.test.ts +60 -0
- package/src/parser/constructs/SectionBlock/private/integrator/createSectionBlockIntegrator.ts +31 -0
- package/src/parser/constructs/SectionBlock/private/processor/createSectionBlockProcessor.test.ts +34 -0
- package/src/parser/constructs/SectionBlock/private/processor/createSectionBlockProcessor.ts +15 -0
- package/src/parser/document/createArtDocumentFromNode.test.ts +23 -0
- package/src/parser/document/createArtDocumentFromNode.ts +10 -0
- package/src/parser/document/index.ts +1 -0
- package/src/parser/fields/constants.test.ts +23 -0
- package/src/parser/fields/constants.ts +1 -0
- package/src/parser/fields/index.ts +3 -0
- package/src/parser/fields/isFieldStrong.test.ts +27 -0
- package/src/parser/fields/isFieldStrong.ts +9 -0
- package/src/parser/fields/stripStrong.test.ts +38 -0
- package/src/parser/fields/stripStrong.ts +12 -0
- package/src/parser/index.ts +8 -0
- package/src/parser/mdast/index.ts +1 -0
- package/src/parser/mdast/rawSlice.test.ts +43 -0
- package/src/parser/mdast/rawSlice.ts +8 -0
- package/src/parser/naturalExpression/createNaturalExpressionFromNode.test.ts +40 -0
- package/src/parser/naturalExpression/createNaturalExpressionFromNode.ts +25 -0
- package/src/parser/naturalExpression/index.ts +1 -0
- package/src/parser/public.ts +16 -0
- package/src/parser/tags/extractTags.test.ts +85 -0
- package/src/parser/tags/extractTags.ts +23 -0
- package/src/parser/tags/index.ts +1 -0
- package/src/parser/types.ts +21 -0
- package/src/serializer/constructs/Document/createDocumentToMdast.test.ts +22 -0
- package/src/serializer/constructs/Document/createDocumentToMdast.ts +15 -0
- package/src/serializer/constructs/Document/index.ts +1 -0
- package/src/serializer/constructs/FieldBlock/createFieldBlockToMdast.test.ts +36 -0
- package/src/serializer/constructs/FieldBlock/createFieldBlockToMdast.ts +26 -0
- package/src/serializer/constructs/FieldBlock/index.ts +1 -0
- package/src/serializer/constructs/FieldInline/createFieldInlineToMdast.test.ts +38 -0
- package/src/serializer/constructs/FieldInline/createFieldInlineToMdast.ts +27 -0
- package/src/serializer/constructs/FieldInline/index.ts +1 -0
- package/src/serializer/constructs/NaturalBlock/createNaturalBlockToMdast.test.ts +122 -0
- package/src/serializer/constructs/NaturalBlock/createNaturalBlockToMdast.ts +30 -0
- package/src/serializer/constructs/NaturalBlock/index.ts +1 -0
- package/src/serializer/constructs/NaturalExpression/createNaturalExpressionToMdast.test.ts +29 -0
- package/src/serializer/constructs/NaturalExpression/createNaturalExpressionToMdast.ts +15 -0
- package/src/serializer/constructs/NaturalExpression/index.ts +1 -0
- package/src/serializer/constructs/SectionBlock/createSectionBlockToMdast.test.ts +83 -0
- package/src/serializer/constructs/SectionBlock/createSectionBlockToMdast.ts +29 -0
- package/src/serializer/constructs/SectionBlock/index.ts +1 -0
- package/src/serializer/index.ts +8 -0
- package/src/serializer/public.ts +18 -0
- package/src/serializer/tags/index.ts +2 -0
- package/src/serializer/tags/tagToMdast.test.ts +10 -0
- package/src/serializer/tags/tagToMdast.ts +7 -0
- package/src/serializer/tags/tagsToMdast.test.ts +19 -0
- package/src/serializer/tags/tagsToMdast.ts +10 -0
- package/src/serializer/types.ts +10 -0
- package/src/test/helpers/constructs/FieldBlock/createFieldBlockFromNodeMock.ts +17 -0
- package/src/test/helpers/constructs/FieldBlock/createFieldBlockMock.ts +17 -0
- package/src/test/helpers/constructs/FieldBlock/makeFieldBlockFixture.ts +16 -0
- package/src/test/helpers/constructs/FieldBlock/makeFieldBlockMock.ts +16 -0
- package/src/test/helpers/constructs/FieldInline/createFieldInlineFromNodeMock.ts +17 -0
- package/src/test/helpers/constructs/FieldInline/createFieldInlineMock.ts +17 -0
- package/src/test/helpers/constructs/FieldInline/makeFieldInlineFixture.ts +16 -0
- package/src/test/helpers/constructs/FieldInline/makeFieldInlineMock.ts +16 -0
- package/src/test/helpers/constructs/NaturalBlock/createNaturalBlockFromNodeMock.ts +17 -0
- package/src/test/helpers/constructs/NaturalBlock/createNaturalBlockMock.ts +17 -0
- package/src/test/helpers/constructs/NaturalBlock/makeNaturalBlockFixture.ts +22 -0
- package/src/test/helpers/constructs/NaturalBlock/makeNaturalBlockMock.ts +22 -0
- package/src/test/helpers/constructs/NaturalExpression/makeNaturalExpressionFixture.ts +18 -0
- package/src/test/helpers/constructs/NaturalExpression/makeNaturalExpressionMock.ts +18 -0
- package/src/test/helpers/constructs/SectionBlock/createSectionBlockFromNodeMock.ts +17 -0
- package/src/test/helpers/constructs/SectionBlock/createSectionBlockMock.ts +17 -0
- package/src/test/helpers/constructs/SectionBlock/makeSectionBlockFixture.ts +20 -0
- package/src/test/helpers/constructs/Tag/makeTagFixture.ts +10 -0
- package/src/test/helpers/constructs/index.ts +14 -0
- package/src/test/helpers/index.ts +2 -0
- package/src/test/helpers/parsers/fields/stripStrongMock.ts +11 -0
- package/src/test/helpers/parsers/index.ts +5 -0
- package/src/test/helpers/parsers/mdast/rawSliceMock.ts +9 -0
- package/src/test/helpers/parsers/natural-expression/createNaturalExpressionFromNodeMock.ts +16 -0
- package/src/test/helpers/parsers/tags/extractTagsMock.ts +12 -0
- package/src/test/helpers/parsers/tags/tagToMdastMock.ts +9 -0
- package/dist/esm/index.js +0 -3135
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { makeNaturalExpressionFixture } from '../../../test/helpers';
|
|
4
|
+
|
|
5
|
+
import { createNaturalExpressionToMdast } from './createNaturalExpressionToMdast';
|
|
6
|
+
|
|
7
|
+
describe('createNaturalExpressionToMdast', () => {
|
|
8
|
+
it('WHEN converting a NaturalExpression to an mdast node', () => {
|
|
9
|
+
const toMdast = createNaturalExpressionToMdast();
|
|
10
|
+
|
|
11
|
+
const result = toMdast.toMdast(makeNaturalExpressionFixture() as never, []);
|
|
12
|
+
|
|
13
|
+
expect(result).toEqual({ type: 'text', value: 'hello', children: [] });
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('WHEN converting preserves attributes in the mdast node', () => {
|
|
17
|
+
const toMdast = createNaturalExpressionToMdast();
|
|
18
|
+
|
|
19
|
+
const result = toMdast.toMdast(
|
|
20
|
+
makeNaturalExpressionFixture({
|
|
21
|
+
type: 'inlineCode',
|
|
22
|
+
value: 'code',
|
|
23
|
+
attributes: { lang: 'ts' },
|
|
24
|
+
}) as never,
|
|
25
|
+
[],
|
|
26
|
+
);
|
|
27
|
+
expect(result).toEqual({ type: 'inlineCode', value: 'code', lang: 'ts', children: [] });
|
|
28
|
+
});
|
|
29
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Node } from 'mdast';
|
|
2
|
+
|
|
3
|
+
import type { NaturalExpression } from '../../../factories';
|
|
4
|
+
import type { ConstructSerializer } from '../../types';
|
|
5
|
+
|
|
6
|
+
export function createNaturalExpressionToMdast(): ConstructSerializer {
|
|
7
|
+
return {
|
|
8
|
+
name: 'NaturalExpression',
|
|
9
|
+
toMdast(node, children) {
|
|
10
|
+
const expression = node as unknown as NaturalExpression;
|
|
11
|
+
const attributes = { ...expression.attributes };
|
|
12
|
+
return { type: expression.type, value: expression.value, children, ...attributes } as Node;
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createNaturalExpressionToMdast } from './createNaturalExpressionToMdast';
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { makeSectionBlockFixture, makeTagFixture } from '../../../test/helpers';
|
|
4
|
+
|
|
5
|
+
import { createSectionBlockToMdast } from './createSectionBlockToMdast';
|
|
6
|
+
|
|
7
|
+
function stripPositions(node: unknown): unknown {
|
|
8
|
+
if (node === null || typeof node !== 'object') return node;
|
|
9
|
+
if (Array.isArray(node)) return node.map(stripPositions);
|
|
10
|
+
const obj = node as Record<string, unknown>;
|
|
11
|
+
const rest: Record<string, unknown> = {};
|
|
12
|
+
for (const key of Object.keys(obj)) {
|
|
13
|
+
if (key === 'position') continue;
|
|
14
|
+
rest[key] = stripPositions(obj[key]);
|
|
15
|
+
}
|
|
16
|
+
return rest;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
describe('createSectionBlockToMdast', () => {
|
|
20
|
+
it('WHEN converting a SectionBlock to an mdast heading', () => {
|
|
21
|
+
const toMdast = createSectionBlockToMdast();
|
|
22
|
+
|
|
23
|
+
const result = toMdast.toMdast(
|
|
24
|
+
makeSectionBlockFixture({ name: 'Module', depth: 1 }) as never,
|
|
25
|
+
[],
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
expect(stripPositions(result)).toEqual({
|
|
29
|
+
type: 'heading',
|
|
30
|
+
depth: 1,
|
|
31
|
+
children: [{ type: 'text', value: 'Module' }],
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('WHEN not provided defaults depth to 1', () => {
|
|
36
|
+
const toMdast = createSectionBlockToMdast();
|
|
37
|
+
|
|
38
|
+
const result = toMdast.toMdast(makeSectionBlockFixture({ name: 'Section' }) as never, []);
|
|
39
|
+
|
|
40
|
+
expect(stripPositions(result)).toEqual({
|
|
41
|
+
type: 'heading',
|
|
42
|
+
depth: 1,
|
|
43
|
+
children: [{ type: 'text', value: 'Section' }],
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('WHEN converting preserves inline formatting in heading names', () => {
|
|
48
|
+
const toMdast = createSectionBlockToMdast();
|
|
49
|
+
|
|
50
|
+
const result = toMdast.toMdast(
|
|
51
|
+
makeSectionBlockFixture({ name: 'Hello _World_! How are **you**?', depth: 1 }) as never,
|
|
52
|
+
[],
|
|
53
|
+
);
|
|
54
|
+
expect(stripPositions(result)).toEqual({
|
|
55
|
+
type: 'heading',
|
|
56
|
+
depth: 1,
|
|
57
|
+
children: [
|
|
58
|
+
{ type: 'text', value: 'Hello ' },
|
|
59
|
+
{ type: 'emphasis', children: [{ type: 'text', value: 'World' }] },
|
|
60
|
+
{ type: 'text', value: '! How are ' },
|
|
61
|
+
{ type: 'strong', children: [{ type: 'text', value: 'you' }] },
|
|
62
|
+
{ type: 'text', value: '?' },
|
|
63
|
+
],
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('WHEN present includes tags in the heading text', () => {
|
|
68
|
+
const toMdast = createSectionBlockToMdast();
|
|
69
|
+
|
|
70
|
+
const result = toMdast.toMdast(
|
|
71
|
+
makeSectionBlockFixture({ name: 'Hello', depth: 1, tags: [makeTagFixture()] }) as never,
|
|
72
|
+
[],
|
|
73
|
+
);
|
|
74
|
+
expect(stripPositions(result)).toEqual({
|
|
75
|
+
type: 'heading',
|
|
76
|
+
depth: 1,
|
|
77
|
+
children: [
|
|
78
|
+
{ type: 'text', value: 'Hello' },
|
|
79
|
+
{ type: 'text', value: ' (#test)' },
|
|
80
|
+
],
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Node, RootContent } from 'mdast';
|
|
2
|
+
import { fromMarkdown } from 'mdast-util-from-markdown';
|
|
3
|
+
|
|
4
|
+
import type { SectionBlock } from '../../../factories';
|
|
5
|
+
import { tagsToMdast } from '../../tags';
|
|
6
|
+
import type { ConstructSerializer } from '../../types';
|
|
7
|
+
|
|
8
|
+
export function createSectionBlockToMdast(): ConstructSerializer {
|
|
9
|
+
return {
|
|
10
|
+
name: 'SectionBlock',
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
12
|
+
toMdast(node, _children) {
|
|
13
|
+
const section = node as unknown as SectionBlock;
|
|
14
|
+
const depth = section.depth ?? 1;
|
|
15
|
+
const parsed = fromMarkdown(`# ${section.name}`);
|
|
16
|
+
const heading = parsed.children.find(child => child.type === 'heading');
|
|
17
|
+
const tagNode = section.tags?.length ? tagsToMdast(section.tags) : null;
|
|
18
|
+
const children: RootContent[] =
|
|
19
|
+
heading && 'children' in heading
|
|
20
|
+
? [...heading.children, ...(tagNode ? [tagNode] : [])]
|
|
21
|
+
: [{ type: 'text' as const, value: section.name }, ...(tagNode ? [tagNode] : [])];
|
|
22
|
+
return {
|
|
23
|
+
type: 'heading',
|
|
24
|
+
depth: depth as 1 | 2 | 3 | 4 | 5 | 6,
|
|
25
|
+
children,
|
|
26
|
+
} as Node;
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createSectionBlockToMdast } from './createSectionBlockToMdast';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './constructs/Document';
|
|
2
|
+
export * from './constructs/FieldBlock';
|
|
3
|
+
export * from './constructs/FieldInline';
|
|
4
|
+
export * from './constructs/NaturalBlock';
|
|
5
|
+
export * from './constructs/NaturalExpression';
|
|
6
|
+
export * from './constructs/SectionBlock';
|
|
7
|
+
|
|
8
|
+
export type * from './types';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createDocumentToMdast } from './constructs/Document';
|
|
2
|
+
import { createFieldBlockToMdast } from './constructs/FieldBlock';
|
|
3
|
+
import { createFieldInlineToMdast } from './constructs/FieldInline';
|
|
4
|
+
import { createNaturalBlockToMdast } from './constructs/NaturalBlock';
|
|
5
|
+
import { createNaturalExpressionToMdast } from './constructs/NaturalExpression';
|
|
6
|
+
import { createSectionBlockToMdast } from './constructs/SectionBlock';
|
|
7
|
+
import type { ConstructSerializerFactory } from './types';
|
|
8
|
+
|
|
9
|
+
export const CONSTRUCT_SERIALIZERS: ConstructSerializerFactory[] = [
|
|
10
|
+
createDocumentToMdast,
|
|
11
|
+
createFieldBlockToMdast,
|
|
12
|
+
createFieldInlineToMdast,
|
|
13
|
+
createNaturalBlockToMdast,
|
|
14
|
+
createNaturalExpressionToMdast,
|
|
15
|
+
createSectionBlockToMdast,
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
export type * from './types';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { tagToMdast } from './tagToMdast';
|
|
4
|
+
|
|
5
|
+
describe('tagToMdast', () => {
|
|
6
|
+
it('WHEN called returns a text node with the tag name', () => {
|
|
7
|
+
const result = tagToMdast({ construct: 'Tag', name: 'friend' });
|
|
8
|
+
expect(result).toEqual({ type: 'text', value: '(#friend)' });
|
|
9
|
+
});
|
|
10
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { tagToMdastMock } from '../../test/helpers';
|
|
4
|
+
|
|
5
|
+
import { tagsToMdast } from './tagsToMdast';
|
|
6
|
+
|
|
7
|
+
vi.mock('./tagToMdast', () => {
|
|
8
|
+
return tagToMdastMock();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
describe('tagsToMdast', () => {
|
|
12
|
+
it('WHEN joining tag values into a text node', async () => {
|
|
13
|
+
const result = tagsToMdast([
|
|
14
|
+
{ construct: 'Tag', name: 'a' },
|
|
15
|
+
{ construct: 'Tag', name: 'b' },
|
|
16
|
+
]);
|
|
17
|
+
expect(result).toEqual({ type: 'text', value: ' (#a) (#b)' });
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Text } from 'mdast';
|
|
2
|
+
|
|
3
|
+
import type { Tag } from '../../factories';
|
|
4
|
+
|
|
5
|
+
import { tagToMdast } from './tagToMdast';
|
|
6
|
+
|
|
7
|
+
export function tagsToMdast(tags: Tag[]): Text {
|
|
8
|
+
const value = tags.map(tag => tagToMdast(tag).value).join(' ');
|
|
9
|
+
return { type: 'text', value: ` ${value}` };
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Node } from 'mdast';
|
|
2
|
+
|
|
3
|
+
import type { Construct } from '../factories';
|
|
4
|
+
|
|
5
|
+
export type ConstructSerializer = {
|
|
6
|
+
readonly name: string;
|
|
7
|
+
toMdast(node: Construct, children: Node[]): Node;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type ConstructSerializerFactory = () => ConstructSerializer;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mocks createFieldBlockFromNode() from `src/constructs/FieldBlock/private/helpers`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { vi } from 'vitest';
|
|
6
|
+
|
|
7
|
+
export const createFieldBlockFromNodeMock = (
|
|
8
|
+
name: string = 'Test',
|
|
9
|
+
): {
|
|
10
|
+
createFieldBlockFromNode: ReturnType<typeof vi.fn>;
|
|
11
|
+
} => ({
|
|
12
|
+
createFieldBlockFromNode: vi.fn(() => ({
|
|
13
|
+
construct: 'FieldBlock',
|
|
14
|
+
name,
|
|
15
|
+
children: [],
|
|
16
|
+
})),
|
|
17
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mocks createFieldBlock() from `src/constructs/FieldBlock/private/factory`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { vi } from 'vitest';
|
|
6
|
+
|
|
7
|
+
export const createFieldBlockMock = (
|
|
8
|
+
name: string = 'Test',
|
|
9
|
+
): {
|
|
10
|
+
createFieldBlock: ReturnType<typeof vi.fn>;
|
|
11
|
+
} => ({
|
|
12
|
+
createFieldBlock: vi.fn(() => ({
|
|
13
|
+
construct: 'FieldBlock',
|
|
14
|
+
name,
|
|
15
|
+
children: [],
|
|
16
|
+
})),
|
|
17
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fixture FieldBlock of factory`libs/constructs/src/constructs/FieldBlock/factory/createFieldBlock.ts`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { FieldBlock, Tag } from '../../../../factories';
|
|
6
|
+
|
|
7
|
+
export const makeFieldBlockFixture = (options?: {
|
|
8
|
+
name?: string;
|
|
9
|
+
children?: FieldBlock['children'];
|
|
10
|
+
tags?: Tag[];
|
|
11
|
+
}): FieldBlock => ({
|
|
12
|
+
construct: 'FieldBlock',
|
|
13
|
+
name: options?.name ?? 'Test',
|
|
14
|
+
children: options?.children ?? [],
|
|
15
|
+
...(options?.tags !== undefined ? { tags: options.tags } : {}),
|
|
16
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fixture FieldBlock of factory`libs/constructs/src/constructs/FieldBlock/private/factory/createFieldBlock.ts`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { FieldBlock, Tag } from '../../../../factories';
|
|
6
|
+
|
|
7
|
+
export const makeFieldBlockMock = (options?: {
|
|
8
|
+
name?: string;
|
|
9
|
+
children?: FieldBlock['children'];
|
|
10
|
+
tags?: Tag[];
|
|
11
|
+
}): FieldBlock => ({
|
|
12
|
+
construct: 'FieldBlock',
|
|
13
|
+
name: options?.name ?? 'Test',
|
|
14
|
+
children: options?.children ?? [],
|
|
15
|
+
...(options?.tags !== undefined ? { tags: options.tags } : {}),
|
|
16
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mocks createFieldInlineFromNode() from `src/constructs/FieldInline/private/helpers`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { vi } from 'vitest';
|
|
6
|
+
|
|
7
|
+
export const createFieldInlineFromNodeMock = (
|
|
8
|
+
name: string = 'Test',
|
|
9
|
+
): {
|
|
10
|
+
createFieldInlineFromNode: ReturnType<typeof vi.fn>;
|
|
11
|
+
} => ({
|
|
12
|
+
createFieldInlineFromNode: vi.fn(() => ({
|
|
13
|
+
construct: 'FieldInline',
|
|
14
|
+
name,
|
|
15
|
+
children: [],
|
|
16
|
+
})),
|
|
17
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mocks createFieldInline() from `src/constructs/FieldInline/private/factory`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { vi } from 'vitest';
|
|
6
|
+
|
|
7
|
+
export const createFieldInlineMock = (
|
|
8
|
+
name: string = 'Test',
|
|
9
|
+
): {
|
|
10
|
+
createFieldInline: ReturnType<typeof vi.fn>;
|
|
11
|
+
} => ({
|
|
12
|
+
createFieldInline: vi.fn(() => ({
|
|
13
|
+
construct: 'FieldInline',
|
|
14
|
+
name,
|
|
15
|
+
children: [],
|
|
16
|
+
})),
|
|
17
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fixture FieldInline of factory`libs/constructs/src/constructs/FieldInline/factory/createFieldInline.ts`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { FieldInline, Tag } from '../../../../factories';
|
|
6
|
+
|
|
7
|
+
export const makeFieldInlineFixture = (options?: {
|
|
8
|
+
name?: string;
|
|
9
|
+
children?: FieldInline['children'];
|
|
10
|
+
tags?: Tag[];
|
|
11
|
+
}): FieldInline => ({
|
|
12
|
+
construct: 'FieldInline',
|
|
13
|
+
name: options?.name ?? 'Test',
|
|
14
|
+
children: options?.children ?? [],
|
|
15
|
+
...(options?.tags !== undefined ? { tags: options.tags } : {}),
|
|
16
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fixture FieldInline of factory`libs/constructs/src/constructs/FieldInline/private/factory/createFieldInline.ts`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { FieldInline, Tag } from '../../../../factories';
|
|
6
|
+
|
|
7
|
+
export const makeFieldInlineMock = (options?: {
|
|
8
|
+
name?: string;
|
|
9
|
+
children?: FieldInline['children'];
|
|
10
|
+
tags?: Tag[];
|
|
11
|
+
}): FieldInline => ({
|
|
12
|
+
construct: 'FieldInline',
|
|
13
|
+
name: options?.name ?? 'Test',
|
|
14
|
+
children: options?.children ?? [],
|
|
15
|
+
...(options?.tags !== undefined ? { tags: options.tags } : {}),
|
|
16
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mocks createNaturalBlockFromNode() from `src/constructs/NaturalBlock/private/helpers`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { vi } from 'vitest';
|
|
6
|
+
|
|
7
|
+
export const createNaturalBlockFromNodeMock = (
|
|
8
|
+
value: string = 'hello',
|
|
9
|
+
): {
|
|
10
|
+
createNaturalBlockFromNode: ReturnType<typeof vi.fn>;
|
|
11
|
+
} => ({
|
|
12
|
+
createNaturalBlockFromNode: vi.fn(() => ({
|
|
13
|
+
construct: 'NaturalBlock',
|
|
14
|
+
value,
|
|
15
|
+
children: [],
|
|
16
|
+
})),
|
|
17
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mocks createNaturalBlock() from `src/constructs/NaturalBlock/private/factory`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { vi } from 'vitest';
|
|
6
|
+
|
|
7
|
+
export const createNaturalBlockMock = (
|
|
8
|
+
value: string = 'hello',
|
|
9
|
+
): {
|
|
10
|
+
createNaturalBlock: ReturnType<typeof vi.fn>;
|
|
11
|
+
} => ({
|
|
12
|
+
createNaturalBlock: vi.fn(() => ({
|
|
13
|
+
construct: 'NaturalBlock',
|
|
14
|
+
value,
|
|
15
|
+
children: [],
|
|
16
|
+
})),
|
|
17
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fixture NaturalBlock of factory`libs/constructs/src/constructs/NaturalBlock/factory/createNaturalBlock.ts`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { NaturalBlock, Tag } from '../../../../factories';
|
|
6
|
+
|
|
7
|
+
export const makeNaturalBlockFixture = (options?: {
|
|
8
|
+
value?: string;
|
|
9
|
+
type?: string;
|
|
10
|
+
lang?: string | null;
|
|
11
|
+
meta?: string | null;
|
|
12
|
+
children?: NaturalBlock['children'];
|
|
13
|
+
tags?: Tag[];
|
|
14
|
+
}): NaturalBlock => ({
|
|
15
|
+
construct: 'NaturalBlock',
|
|
16
|
+
value: options?.value ?? 'hello',
|
|
17
|
+
children: options?.children ?? [],
|
|
18
|
+
...(options?.type !== undefined ? { type: options.type } : {}),
|
|
19
|
+
...(options?.lang !== undefined ? { lang: options.lang } : {}),
|
|
20
|
+
...(options?.meta !== undefined ? { meta: options.meta } : {}),
|
|
21
|
+
...(options?.tags !== undefined ? { tags: options.tags } : {}),
|
|
22
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fixture NaturalBlock of factory`libs/constructs/src/constructs/NaturalBlock/private/factory/createNaturalBlock.ts`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { NaturalBlock, Tag } from '../../../../factories';
|
|
6
|
+
|
|
7
|
+
export const makeNaturalBlockMock = (options?: {
|
|
8
|
+
value?: string;
|
|
9
|
+
type?: string;
|
|
10
|
+
lang?: string | null;
|
|
11
|
+
meta?: string | null;
|
|
12
|
+
children?: NaturalBlock['children'];
|
|
13
|
+
tags?: Tag[];
|
|
14
|
+
}): NaturalBlock => ({
|
|
15
|
+
construct: 'NaturalBlock',
|
|
16
|
+
value: options?.value ?? 'hello',
|
|
17
|
+
children: options?.children ?? [],
|
|
18
|
+
...(options?.type !== undefined ? { type: options.type } : {}),
|
|
19
|
+
...(options?.lang !== undefined ? { lang: options.lang } : {}),
|
|
20
|
+
...(options?.meta !== undefined ? { meta: options.meta } : {}),
|
|
21
|
+
...(options?.tags !== undefined ? { tags: options.tags } : {}),
|
|
22
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fixture NaturalExpression of factory`libs/constructs/src/constructs/NaturalExpression/factory/createNaturalExpression.ts`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { NaturalExpression } from '../../../../factories';
|
|
6
|
+
|
|
7
|
+
export const makeNaturalExpressionFixture = (options?: {
|
|
8
|
+
type?: string;
|
|
9
|
+
value?: string;
|
|
10
|
+
attributes?: Record<string, unknown>;
|
|
11
|
+
children?: NaturalExpression['children'];
|
|
12
|
+
}): NaturalExpression => ({
|
|
13
|
+
construct: 'NaturalExpression',
|
|
14
|
+
type: options?.type ?? 'text',
|
|
15
|
+
value: options?.value ?? 'hello',
|
|
16
|
+
children: options?.children ?? [],
|
|
17
|
+
...(options?.attributes !== undefined ? { attributes: options.attributes } : {}),
|
|
18
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fixture NaturalExpression of factory`libs/constructs/src/constructs/NaturalExpression/private/factory/createNaturalExpression.ts`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { NaturalExpression } from '../../../../factories';
|
|
6
|
+
|
|
7
|
+
export const makeNaturalExpressionMock = (options?: {
|
|
8
|
+
type?: string;
|
|
9
|
+
value?: string;
|
|
10
|
+
attributes?: Record<string, unknown>;
|
|
11
|
+
children?: NaturalExpression['children'];
|
|
12
|
+
}): NaturalExpression => ({
|
|
13
|
+
construct: 'NaturalExpression',
|
|
14
|
+
type: options?.type ?? 'text',
|
|
15
|
+
value: options?.value ?? 'hello',
|
|
16
|
+
children: options?.children ?? [],
|
|
17
|
+
...(options?.attributes !== undefined ? { attributes: options.attributes } : {}),
|
|
18
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mocks createSectionBlockFromNode() from `src/constructs/SectionBlock/private/helpers`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { vi } from 'vitest';
|
|
6
|
+
|
|
7
|
+
export const createSectionBlockFromNodeMock = (
|
|
8
|
+
name: string = 'Test',
|
|
9
|
+
): {
|
|
10
|
+
createSectionBlockFromNode: ReturnType<typeof vi.fn>;
|
|
11
|
+
} => ({
|
|
12
|
+
createSectionBlockFromNode: vi.fn(() => ({
|
|
13
|
+
construct: 'SectionBlock',
|
|
14
|
+
name,
|
|
15
|
+
children: [],
|
|
16
|
+
})),
|
|
17
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mocks createSectionBlock() from `src/constructs/SectionBlock/private/factory`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { vi } from 'vitest';
|
|
6
|
+
|
|
7
|
+
export const createSectionBlockMock = (
|
|
8
|
+
name: string = 'Test',
|
|
9
|
+
): {
|
|
10
|
+
createSectionBlock: ReturnType<typeof vi.fn>;
|
|
11
|
+
} => ({
|
|
12
|
+
createSectionBlock: vi.fn(() => ({
|
|
13
|
+
construct: 'SectionBlock',
|
|
14
|
+
name,
|
|
15
|
+
children: [],
|
|
16
|
+
})),
|
|
17
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fixture SectionBlock of factory`libs/constructs/src/constructs/SectionBlock/factory/createSectionBlock.ts`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { SectionBlock, Tag } from '../../../../factories';
|
|
6
|
+
|
|
7
|
+
export const makeSectionBlockFixture = (options?: {
|
|
8
|
+
name?: string;
|
|
9
|
+
depth?: number;
|
|
10
|
+
kind?: string;
|
|
11
|
+
children?: SectionBlock['children'];
|
|
12
|
+
tags?: Tag[];
|
|
13
|
+
}): SectionBlock => ({
|
|
14
|
+
construct: 'SectionBlock',
|
|
15
|
+
name: options?.name ?? 'Test',
|
|
16
|
+
children: options?.children ?? [],
|
|
17
|
+
...(options?.depth !== undefined ? { depth: options.depth } : {}),
|
|
18
|
+
...(options?.kind !== undefined ? { kind: options.kind } : {}),
|
|
19
|
+
...(options?.tags !== undefined ? { tags: options.tags } : {}),
|
|
20
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fixture Tag of factory`libs/constructs/src/constructs/Tag/factory/createTag.ts`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { Tag } from '../../../../factories';
|
|
6
|
+
|
|
7
|
+
export const makeTagFixture = (options?: { name?: string }): Tag => ({
|
|
8
|
+
construct: 'Tag',
|
|
9
|
+
name: options?.name ?? 'test',
|
|
10
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from './FieldBlock/createFieldBlockFromNodeMock';
|
|
2
|
+
export * from './FieldBlock/createFieldBlockMock';
|
|
3
|
+
export * from './FieldBlock/makeFieldBlockFixture';
|
|
4
|
+
export * from './FieldInline/createFieldInlineFromNodeMock';
|
|
5
|
+
export * from './FieldInline/createFieldInlineMock';
|
|
6
|
+
export * from './FieldInline/makeFieldInlineFixture';
|
|
7
|
+
export * from './NaturalBlock/createNaturalBlockFromNodeMock';
|
|
8
|
+
export * from './NaturalBlock/createNaturalBlockMock';
|
|
9
|
+
export * from './NaturalBlock/makeNaturalBlockFixture';
|
|
10
|
+
export * from './NaturalExpression/makeNaturalExpressionFixture';
|
|
11
|
+
export * from './SectionBlock/createSectionBlockFromNodeMock';
|
|
12
|
+
export * from './SectionBlock/createSectionBlockMock';
|
|
13
|
+
export * from './SectionBlock/makeSectionBlockFixture';
|
|
14
|
+
export * from './Tag/makeTagFixture';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mocks stripStrong() from `src/parsers/fields`
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { vi } from 'vitest';
|
|
6
|
+
|
|
7
|
+
export const stripStrongMock = (
|
|
8
|
+
returnValue: string = '',
|
|
9
|
+
): { stripStrong: ReturnType<typeof vi.fn> } => ({
|
|
10
|
+
stripStrong: vi.fn(() => returnValue),
|
|
11
|
+
});
|