1
1
/**
2
2
* Copied from https://github.com/mermaid-js/mermaid/blob/4a4e614b646bdb5f91f02d0483a7704b315d09fd/packages/mermaid/src/diagram-api/regexes.ts
3
3
*/
4
-
5
- // The "* as yaml" part is necessary for tree-shaking
6
- import * as yaml from 'js-yaml' ;
4
+ import { parseDocument , type Document , YAMLMap , isMap } from 'yaml' ;
7
5
8
6
const frontMatterRegex = / ^ - { 3 } \s * [ \n \r ] ( .* ?) [ \n \r ] - { 3 } \s * [ \n \r ] + / s;
9
7
@@ -36,20 +34,13 @@ function splitFrontMatter(text: string) {
36
34
}
37
35
}
38
36
39
- function parseFrontMatterYAML ( frontMatterYaml : string ) {
40
- let parsed : FrontMatterMetadata =
41
- // TODO: replace with https://www.npmjs.com/package/yaml so that we can
42
- // read/write comments too
43
- yaml . load ( frontMatterYaml , {
44
- // To support config, we need JSON schema.
45
- // https://www.yaml.org/spec/1.2/spec.html#id2803231
46
- schema : yaml . JSON_SCHEMA ,
47
- } ) ?? { } ;
48
-
49
- // To handle runtime data type changes
50
- parsed = typeof parsed === 'object' && ! Array . isArray ( parsed ) ? parsed : { } ;
37
+ function parseFrontMatterYAML ( frontMatterYaml : string ) : Document < YAMLMap , false > {
38
+ const document : Document = parseDocument ( frontMatterYaml ) ;
39
+ if ( ! isMap ( document . contents ) ) {
40
+ document . contents = new YAMLMap ( ) ;
41
+ }
51
42
52
- return parsed ;
43
+ return document as unknown as Document < YAMLMap , false > ;
53
44
}
54
45
55
46
/**
@@ -62,7 +53,7 @@ function parseFrontMatterYAML(frontMatterYaml: string) {
62
53
export function extractFrontMatter ( text : string ) : FrontMatterResult {
63
54
const { diagramText, frontMatter } = splitFrontMatter ( text ) ;
64
55
65
- const parsed = parseFrontMatterYAML ( frontMatter ) ;
56
+ const parsed = parseFrontMatterYAML ( frontMatter ) . toJSON ( ) ;
66
57
67
58
const metadata : FrontMatterMetadata = { } ;
68
59
@@ -93,16 +84,16 @@ export function extractFrontMatter(text: string): FrontMatterResult {
93
84
* @param newMetadata - The metadata fields to update.
94
85
* @returns The text with the updated YAML frontmatter.
95
86
*/
96
- export function injectFrontMatter ( text : string , newMetadata : Partial < FrontMatterMetadata > ) {
87
+ export function injectFrontMatter ( text : string , newMetadata : Pick < FrontMatterMetadata , 'id' > ) {
97
88
const { diagramText, frontMatter } = splitFrontMatter ( text ) ;
98
89
99
- const parsed = parseFrontMatterYAML ( frontMatter ) ;
90
+ const document = parseFrontMatterYAML ( frontMatter ) ;
100
91
101
- const mergedFrontmatter = { ...parsed , ...newMetadata } ;
92
+ for ( const [ key , value ] of Object . entries ( newMetadata ) ) {
93
+ document . contents . set ( key , value ) ;
94
+ }
102
95
103
- return `---\n${ yaml . dump ( mergedFrontmatter , {
104
- schema : yaml . JSON_SCHEMA ,
105
- } ) } ---\n${ diagramText } `;
96
+ return `---\n${ document . toString ( ) } ---\n${ diagramText } ` ;
106
97
}
107
98
108
99
/**
@@ -115,24 +106,16 @@ export function injectFrontMatter(text: string, newMetadata: Partial<FrontMatter
115
106
export function removeFrontMatterKeys ( text : string , keysToRemove : Set < keyof FrontMatterMetadata > ) {
116
107
const { diagramText, frontMatter } = splitFrontMatter ( text ) ;
117
108
118
- const parsedFrontMatter = parseFrontMatterYAML ( frontMatter ) ;
109
+ const document = parseFrontMatterYAML ( frontMatter ) ;
119
110
120
- const entries = Object . entries ( parsedFrontMatter )
121
- . map ( ( val ) => {
122
- if ( keysToRemove . has ( val [ 0 ] as keyof FrontMatterMetadata ) ) {
123
- return null ;
124
- } else {
125
- return val ;
126
- }
127
- } )
128
- . filter ( ( val ) => val ) as [ string , any ] [ ] ; // eslint-disable-line @typescript-eslint/no-explicit-any
111
+ for ( const key of keysToRemove ) {
112
+ document . contents . delete ( key ) ;
113
+ }
129
114
130
- if ( entries . length === 0 ) {
115
+ if ( document . contents . items . length === 0 ) {
131
116
// skip creating frontmatter if there is no frontmatter
132
117
return diagramText ;
133
118
} else {
134
- return `---\n${ yaml . dump ( Object . fromEntries ( entries ) , {
135
- schema : yaml . JSON_SCHEMA ,
136
- } ) } ---\n${ diagramText } `;
119
+ return `---\n${ document . toString ( ) } ---\n${ diagramText } ` ;
137
120
}
138
121
}
0 commit comments