@@ -203,6 +203,8 @@ import { isWindows } from "../../deno_ral/platform.ts";
203203import { appendToCombinedLuaProfile } from "../../core/performance/perfetto-utils.ts" ;
204204import { makeTimedFunctionAsync } from "../../core/performance/function-times.ts" ;
205205import { walkJson } from "../../core/json.ts" ;
206+ import { safeCloneDeep } from "../../core/safe-clone-deep.ts" ;
207+ import { assert } from "testing/asserts" ;
206208import { call } from "../../deno_ral/process.ts" ;
207209
208210// in case we are running multiple pandoc processes
@@ -323,7 +325,9 @@ export async function runPandoc(
323325 JSON . stringify ( paramsJson ) ,
324326 ) ;
325327
326- const traceFilters = pandocMetadata ?. [ "_quarto" ] ?. [ "trace-filters" ] ||
328+ const traceFilters =
329+ // deno-lint-ignore no-explicit-any
330+ ( pandocMetadata as any ) ?. [ "_quarto" ] ?. [ "trace-filters" ] ||
327331 Deno . env . get ( "QUARTO_TRACE_FILTERS" ) ;
328332
329333 if ( traceFilters ) {
@@ -438,7 +442,7 @@ export async function runPandoc(
438442
439443 // generate defaults and capture defaults to be printed
440444 let allDefaults = ( await generateDefaults ( options ) ) || { } ;
441- let printAllDefaults = ld . cloneDeep ( allDefaults ) as FormatPandoc ;
445+ let printAllDefaults = safeCloneDeep ( allDefaults ) ;
442446
443447 // capture any filterParams in the FormatExtras
444448 const formatFilterParams = { } as Record < string , unknown > ;
@@ -1120,7 +1124,7 @@ export async function runPandoc(
11201124
11211125 // selectively overwrite some resolved metadata (e.g. ensure that metadata
11221126 // computed from inline r expressions gets included @ the bottom).
1123- const pandocMetadata = ld . cloneDeep ( options . format . metadata || { } ) ;
1127+ const pandocMetadata = safeCloneDeep ( options . format . metadata || { } ) ;
11241128 for ( const key of Object . keys ( engineMetadata ) ) {
11251129 const isChapterTitle = key === kTitle && projectIsBook ( options . project ) ;
11261130
@@ -1154,6 +1158,7 @@ export async function runPandoc(
11541158 dateFields . forEach ( ( dateField ) => {
11551159 const date = pandocMetadata [ dateField ] ;
11561160 const format = pandocMetadata [ kDateFormat ] ;
1161+ assert ( format === undefined || typeof format === "string" ) ;
11571162 pandocMetadata [ dateField ] = resolveAndFormatDate (
11581163 options . source ,
11591164 date ,
@@ -1173,15 +1178,19 @@ export async function runPandoc(
11731178 // Expand citation dates into CSL dates
11741179 const citationMetadata = pandocMetadata [ kCitation ] ;
11751180 if ( citationMetadata ) {
1181+ assert ( typeof citationMetadata === "object" ) ;
1182+ // ideally we should be asserting non-arrayness here but that's not very fast.
1183+ // assert(!Array.isArray(citationMetadata));
1184+ const citationMetadataObj = citationMetadata as Record < string , unknown > ;
11761185 const docCSLDate = dateRaw
11771186 ? cslDate ( resolveDate ( options . source , dateRaw ) )
11781187 : undefined ;
11791188 const fields = [ "issued" , "available-date" ] ;
11801189 fields . forEach ( ( field ) => {
1181- if ( citationMetadata [ field ] ) {
1182- citationMetadata [ field ] = cslDate ( citationMetadata [ field ] ) ;
1190+ if ( citationMetadataObj [ field ] ) {
1191+ citationMetadataObj [ field ] = cslDate ( citationMetadataObj [ field ] ) ;
11831192 } else if ( docCSLDate ) {
1184- citationMetadata [ field ] = docCSLDate ;
1193+ citationMetadataObj [ field ] = docCSLDate ;
11851194 }
11861195 } ) ;
11871196 }
@@ -1221,8 +1230,9 @@ export async function runPandoc(
12211230 ! isBeamerOutput ( options . format . pandoc )
12221231 ) {
12231232 const docClass = pandocMetadata [ kDocumentClass ] ;
1233+ assert ( ! docClass || typeof docClass === "string" ) ;
12241234 const isPrintDocumentClass = docClass &&
1225- [ "book" , "scrbook" ] . includes ( docClass ) ;
1235+ [ "book" , "scrbook" ] . includes ( docClass as string ) ;
12261236
12271237 if ( ! isPrintDocumentClass ) {
12281238 if ( pandocMetadata [ kColorLinks ] === undefined ) {
@@ -1274,7 +1284,7 @@ export async function runPandoc(
12741284 prefix : "quarto-metadata" ,
12751285 suffix : ".yml" ,
12761286 } ) ;
1277- const pandocPassedMetadata = ld . cloneDeep ( pandocMetadata ) ;
1287+ const pandocPassedMetadata = safeCloneDeep ( pandocMetadata ) ;
12781288 delete pandocPassedMetadata . format ;
12791289 delete pandocPassedMetadata . project ;
12801290 delete pandocPassedMetadata . website ;
@@ -1673,7 +1683,7 @@ function runPandocMessage(
16731683
16741684 const keys = Object . keys ( metadata ) ;
16751685 if ( keys . length > 0 ) {
1676- const printMetadata = ld . cloneDeep ( metadata ) as Metadata ;
1686+ const printMetadata = safeCloneDeep ( metadata ) ;
16771687 delete printMetadata . format ;
16781688
16791689 // print message
0 commit comments