@@ -85,7 +85,7 @@ import {
8585import { isJupyterNotebook } from "../../core/jupyter/jupyter.ts" ;
8686import { watchForFileChanges } from "../../core/watch.ts" ;
8787import { previewMonitorResources } from "../../core/quarto.ts" ;
88- import { exitWithCleanup } from "../../core/cleanup.ts" ;
88+ import { exitWithCleanup , onCleanup } from "../../core/cleanup.ts" ;
8989import {
9090 extensionFilesFromDirs ,
9191 inputExtensionDirs ,
@@ -151,11 +151,15 @@ export async function preview(
151151) {
152152 const nbContext = notebookContext ( ) ;
153153 // see if this is project file
154- const project = await projectContext ( file , nbContext ) ;
154+ const project = ( await projectContext ( file , nbContext ) ) ||
155+ ( await singleFileProjectContext ( file , nbContext ) ) ;
156+ onCleanup ( ( ) => {
157+ project . cleanup ( ) ;
158+ } ) ;
155159
156160 // determine the target format if there isn't one in the command line args
157161 // (current we force the use of an html or pdf based format)
158- const format = await previewFormat ( file , flags . to , undefined , project ) ;
162+ const format = await previewFormat ( file , project , flags . to , undefined ) ;
159163 setPreviewFormat ( format , flags , pandocArgs ) ;
160164
161165 // render for preview (create function we can pass to watcher then call it)
@@ -224,6 +228,7 @@ export async function preview(
224228 options . port ! ,
225229 reloader ,
226230 changeHandler . render ,
231+ project ,
227232 )
228233 : project
229234 ? projectHtmlFileRequestHandler (
@@ -241,6 +246,7 @@ export async function preview(
241246 result . format ,
242247 reloader ,
243248 changeHandler . render ,
249+ project ,
244250 ) ;
245251
246252 // open browser if this is a browseable format
@@ -340,17 +346,17 @@ export function previewRenderRequest(
340346
341347export async function previewRenderRequestIsCompatible (
342348 request : PreviewRenderRequest ,
349+ project : ProjectContext ,
343350 format ?: string ,
344- project ?: ProjectContext ,
345351) {
346352 if ( request . version === 1 ) {
347353 return true ; // rstudio manages its own request compatibility state
348354 } else {
349355 const reqFormat = await previewFormat (
350356 request . path ,
357+ project ,
351358 request . format ,
352359 undefined ,
353- project ,
354360 ) ;
355361 return reqFormat === format ;
356362 }
@@ -359,20 +365,20 @@ export async function previewRenderRequestIsCompatible(
359365// determine the format to preview
360366export async function previewFormat (
361367 file : string ,
368+ project : ProjectContext ,
362369 format ?: string ,
363370 formats ?: Record < string , Format > ,
364- project ?: ProjectContext ,
365371) {
366372 if ( format ) {
367373 return format ;
368374 }
369- const nbContext = notebookContext ( ) ;
370- project = project || ( await singleFileProjectContext ( file , nbContext ) ) ;
375+ // const nbContext = notebookContext();
376+ // project = project || (await singleFileProjectContext(file, nbContext));
371377 formats = formats ||
372378 await withRenderServices (
373- nbContext ,
379+ project . notebookContext ,
374380 ( services : RenderServices ) =>
375- renderFormats ( file , services , "all" , project ! ) ,
381+ renderFormats ( file , services , "all" , project ) ,
376382 ) ;
377383 format = Object . keys ( formats ) [ 0 ] || "html" ;
378384 return format ;
@@ -418,15 +424,14 @@ export async function renderForPreview(
418424 pandocArgs : string [ ] ,
419425 project ?: ProjectContext ,
420426) : Promise < RenderForPreviewResult > {
421-
422427 // render
423428 const renderResult = await render ( file , {
424429 services,
425430 flags,
426431 pandocArgs : pandocArgs ,
427432 previewServer : true ,
428433 setProjectDir : project !== undefined ,
429- } ) ;
434+ } , project ) ;
430435 if ( renderResult . error ) {
431436 throw renderResult . error ;
432437 }
@@ -689,6 +694,7 @@ function htmlFileRequestHandler(
689694 format : Format ,
690695 reloader : HttpDevServer ,
691696 renderHandler : ( to ?: string ) => Promise < RenderForPreviewResult | undefined > ,
697+ context : ProjectContext ,
692698) {
693699 return httpFileRequestHandler (
694700 htmlFileRequestHandlerOptions (
@@ -699,6 +705,7 @@ function htmlFileRequestHandler(
699705 format ,
700706 reloader ,
701707 renderHandler ,
708+ context ,
702709 ) ,
703710 ) ;
704711}
@@ -711,7 +718,7 @@ function htmlFileRequestHandlerOptions(
711718 format : Format ,
712719 devserver : HttpDevServer ,
713720 renderHandler : ( to ?: string ) => Promise < RenderForPreviewResult | undefined > ,
714- project ? : ProjectContext ,
721+ project : ProjectContext ,
715722) : HttpFileRequestOptions {
716723 // if we an alternate format on the fly we need to do a full re-render
717724 // to get the correct state back. this flag will be set whenever
@@ -742,7 +749,7 @@ function htmlFileRequestHandlerOptions(
742749 prevReq &&
743750 existsSync ( prevReq . path ) &&
744751 normalizePath ( prevReq . path ) === normalizePath ( inputFile ) &&
745- await previewRenderRequestIsCompatible ( prevReq , flags . to )
752+ await previewRenderRequestIsCompatible ( prevReq , project , flags . to )
746753 ) {
747754 // don't wait for the promise so the
748755 // caller gets an immediate reply
@@ -853,6 +860,7 @@ function pdfFileRequestHandler(
853860 port : number ,
854861 reloader : HttpDevServer ,
855862 renderHandler : ( ) => Promise < RenderForPreviewResult | undefined > ,
863+ project : ProjectContext ,
856864) {
857865 // start w/ the html handler (as we still need it's http reload injection)
858866 const pdfOptions = htmlFileRequestHandlerOptions (
@@ -863,6 +871,7 @@ function pdfFileRequestHandler(
863871 format ,
864872 reloader ,
865873 renderHandler ,
874+ project ,
866875 ) ;
867876
868877 // pdf customizations
0 commit comments