39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|   | /** | ||
|  |  * Checks if the object contains only valid types. | ||
|  |  */ | ||
|  | function isValidFrontmatterObject(obj: Record<string, any>): boolean { | ||
|  |   return Object.values(obj).every( | ||
|  |     (value) => | ||
|  |       value == null || // null or undefined
 | ||
|  |       typeof value === "string" || | ||
|  |       typeof value === "boolean" || | ||
|  |       typeof value === "number" || | ||
|  |       (Array.isArray(value) && value.every((item) => typeof item === "string")), // valid string array
 | ||
|  |   ); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Converts a valid object into YAML-like frontmatter string. | ||
|  |  * Throws error if object contains invalid types. | ||
|  |  */ | ||
|  | export function stringifyFrontmatter(obj: Record<string, any>): string { | ||
|  |   if (!isValidFrontmatterObject(obj)) { | ||
|  |     throw new Error("Invalid frontmatter"); | ||
|  |   } | ||
|  | 
 | ||
|  |   return `---\n${Object.entries(obj) | ||
|  |     .map(([key, value]) => { | ||
|  |       if (value == null) { | ||
|  |         return `${key}: null`; // Handle null values explicitly
 | ||
|  |       } | ||
|  |       if (Array.isArray(value)) { | ||
|  |         return `${key}: ${JSON.stringify(value)}`; // Handle arrays
 | ||
|  |       } | ||
|  |       if (typeof value === "string") { | ||
|  |         return `${key}: ${JSON.stringify(value)}`; // Wrap strings with quotes
 | ||
|  |       } | ||
|  |       return `${key}: ${value}`; // Handle numbers and booleans
 | ||
|  |     }) | ||
|  |     .join("\n")}\n---`;
 | ||
|  | } |