import {
kIncludeAfterBody,
kIncludeBeforeBody,
kIncludeInHeader,
} from "../config/constants.ts";
import { Format, FormatPandoc, Metadata } from "../config/types.ts";
import { PartitionedMarkdown } from "../core/pandoc/types.ts";
import { RenderOptions, RenderResultFile } from "../command/render/types.ts";
import { MappedString } from "../core/lib/text-types.ts";
import { HandlerContextResults } from "../core/handlers/types.ts";
import { EngineProjectContext, ProjectContext } from "../project/types.ts";
import { Command } from "cliffy/command/mod.ts";
import type { QuartoAPI } from "../core/api/index.ts";
import type { CheckConfiguration } from "../command/check/check.ts";
export type { EngineProjectContext };
export const kQmdExtensions = [".qmd"];
export const kMarkdownEngine = "markdown";
export const kKnitrEngine = "knitr";
export const kJupyterEngine = "jupyter";
export const kJuliaEngine = "julia";
export interface ExecutionEngineDiscovery {
init?: (quarto: QuartoAPI) => void;
name: string;
defaultExt: string;
defaultYaml: (kernel?: string) => string[];
defaultContent: (kernel?: string) => string[];
validExtensions: () => string[];
claimsFile: (file: string, ext: string) => boolean;
claimsLanguage: (language: string, firstClass?: string) => boolean | number;
canFreeze: boolean;
generatesFigures: boolean;
ignoreDirs?: () => string[] | undefined;
quartoRequired?: string;
populateCommand?: (command: Command) => void;
checkInstallation?: (conf: CheckConfiguration) => Promise<void>;
launch: (context: EngineProjectContext) => ExecutionEngineInstance;
}
export interface ExecutionEngineInstance {
name: string;
canFreeze: boolean;
markdownForFile(file: string): Promise<MappedString>;
target: (
file: string,
quiet?: boolean,
markdown?: MappedString,
) => Promise<ExecutionTarget | undefined>;
partitionedMarkdown: (
file: string,
format?: Format,
) => Promise<PartitionedMarkdown>;
filterFormat?: (
source: string,
options: RenderOptions,
format: Format,
) => Format;
execute: (options: ExecuteOptions) => Promise<ExecuteResult>;
executeTargetSkipped?: (
target: ExecutionTarget,
format: Format,
) => void;
dependencies: (options: DependenciesOptions) => Promise<DependenciesResult>;
postprocess: (options: PostProcessOptions) => Promise<void>;
canKeepSource?: (target: ExecutionTarget) => boolean;
intermediateFiles?: (input: string) => string[] | undefined;
run?: (options: RunOptions) => Promise<void>;
postRender?: (
file: RenderResultFile,
) => Promise<void>;
}
export interface ExecutionTarget {
source: string;
input: string;
markdown: MappedString;
metadata: Metadata;
data?: unknown;
preEngineExecuteResults?: HandlerContextResults;
}
export interface ExecuteOptions {
target: ExecutionTarget;
format: Format;
resourceDir: string;
tempDir: string;
dependencies: boolean;
projectDir?: string;
libDir?: string;
cwd: string;
params?: { [key: string]: unknown };
quiet?: boolean;
previewServer?: boolean;
handledLanguages: string[];
project: ProjectContext;
}
export interface ExecuteResult {
markdown: string;
supporting: string[];
filters: string[];
metadata?: Metadata;
pandoc?: FormatPandoc;
includes?: PandocIncludes;
engine?: string;
engineDependencies?: Record<string, Array<unknown>>;
preserve?: Record<string, string>;
postProcess?: boolean;
resourceFiles?: string[];
}
export interface MappedExecuteResult {
markdown: MappedString;
supporting: string[];
filters: string[];
metadata?: Metadata;
pandoc?: FormatPandoc;
includes?: PandocIncludes;
engineDependencies?: Record<string, Array<unknown>>;
preserve?: Record<string, string>;
postProcess?: boolean;
resourceFiles?: string[];
}
export interface PandocIncludes {
[kIncludeBeforeBody]?: string[];
[kIncludeAfterBody]?: string[];
[kIncludeInHeader]?: string[];
}
export interface DependenciesOptions {
target: ExecutionTarget;
format: Format;
output: string;
resourceDir: string;
tempDir: string;
projectDir?: string;
libDir?: string;
dependencies?: Array<unknown>;
quiet?: boolean;
}
export interface DependenciesResult {
includes: PandocIncludes;
}
export interface PostProcessOptions {
engine: ExecutionEngineInstance;
target: ExecutionTarget;
format: Format;
output: string;
tempDir: string;
projectDir?: string;
preserve?: Record<string, string>;
quiet?: boolean;
}
export interface RunOptions {
input: string;
render: boolean;
browser: boolean;
tempDir: string;
reload?: boolean;
format?: string;
projectDir?: string;
port?: number;
host?: string;
quiet?: boolean;
onReady?: () => Promise<void>;
}