import { RenderServices } from "../command/render/types.ts";
import { Metadata, PandocFlags } from "../config/types.ts";
import { Format, FormatExtras } from "../config/types.ts";
import {
Brand,
LightDarkBrand,
LightDarkBrandDarkFlag,
} from "../core/brand/brand.ts";
import { MappedString } from "../core/mapped-text.ts";
import { PartitionedMarkdown } from "../core/pandoc/types.ts";
import {
ExecutionEngineDiscovery,
ExecutionEngineInstance,
ExecutionTarget,
} from "../execute/types.ts";
import { InspectedMdCell } from "../inspect/inspect-types.ts";
import { NotebookContext } from "../render/notebook/notebook-types.ts";
import {
LogoLightDarkSpecifier,
NavigationItem as NavItem,
NavigationItemObject,
NavigationItemObject as SidebarTool,
ProjectConfig as ProjectConfig_Project,
} from "../resources/types/schema-types.ts";
import { ProjectEnvironment } from "./project-environment-types.ts";
import { ProjectCache } from "../core/cache/cache-types.ts";
import { TempContext } from "../core/temp-types.ts";
import { Cloneable } from "../core/safe-clone-deep.ts";
export {
type NavigationItem as NavItem,
type NavigationItemObject,
type NavigationItemObject as SidebarTool,
type PageFooter as NavigationFooter,
type ProjectPreview,
} from "../resources/types/schema-types.ts";
export const kProjectType = "type";
export const kProjectTitle = "title";
export const kProjectRender = "render";
export const kProjectPreRender = "pre-render";
export const kProjectPostRender = "post-render";
export const kProjectExecuteDir = "execute-dir";
export const kProjectOutputDir = "output-dir";
export const kProjectLibDir = "lib-dir";
export const kProjectResources = "resources";
export const kProjectWatchInputs = "watch-inputs";
export type FileInclusion = {
source: string;
target: string;
};
export type FileInformation = {
fullMarkdown?: MappedString;
includeMap?: FileInclusion[];
codeCells?: InspectedMdCell[];
engine?: ExecutionEngineInstance;
target?: ExecutionTarget;
metadata?: Metadata;
brand?: LightDarkBrandDarkFlag;
};
export interface ProjectContext extends Cloneable<ProjectContext> {
dir: string;
engines: string[];
files: ProjectFiles;
config?: ProjectConfig;
notebookContext: NotebookContext;
outputNameIndex?: Map<string, { file: string; format: Format } | undefined>;
fileInformationCache: Map<string, FileInformation>;
brandCache?: { brand?: LightDarkBrandDarkFlag };
resolveBrand: (
fileName?: string,
) => Promise<
undefined | LightDarkBrandDarkFlag
>;
resolveFullMarkdownForFile: (
engine: ExecutionEngineInstance | undefined,
file: string,
markdown?: MappedString,
force?: boolean,
) => Promise<MappedString>;
fileExecutionEngineAndTarget: (
file: string,
force?: boolean,
) => Promise<{ engine: ExecutionEngineInstance; target: ExecutionTarget }>;
fileMetadata: (
file: string,
force?: boolean,
) => Promise<Metadata>;
formatExtras?: (
source: string,
flags: PandocFlags,
format: Format,
services: RenderServices,
) => Promise<FormatExtras>;
renderFormats: (
file: string,
services: RenderServices,
to: string | undefined,
project: ProjectContext,
) => Promise<Record<string, Format>>;
environment: () => Promise<ProjectEnvironment>;
isSingleFile: boolean;
previewServer?: boolean;
diskCache: ProjectCache;
temp: TempContext;
cleanup: () => void;
}
export interface ProjectFiles {
input: string[];
resources?: string[];
config?: string[];
configResources?: string[];
}
export interface ProjectConfig {
project: ProjectConfig_Project;
[key: string]: unknown;
}
export const kProject404File = "404.html";
export type LayoutBreak = "" | "sm" | "md" | "lg" | "xl" | "xxl";
export interface EngineProjectContext {
dir: string;
isSingleFile: boolean;
config?: {
engines?: string[];
project?: {
[kProjectOutputDir]?: string;
};
[key: string]: unknown;
};
fileInformationCache: Map<string, FileInformation>;
getOutputDirectory: () => string;
resolveFullMarkdownForFile: (
engine: ExecutionEngineInstance | undefined,
file: string,
markdown?: MappedString,
force?: boolean,
) => Promise<MappedString>;
}
export const kAriaLabel = "aria-label";
export const kCollapseLevel = "collapse-level";
export const kCollapseBelow = "collapse-below";
export const kToolsCollapse = "tools-collapse";
export const kLogoAlt = "logo-alt";
export const kLogoHref = "logo-href";
export const kSidebarMenus = "sidebar-menus";
export interface Navbar {
title?: string | false;
logo?: LogoLightDarkSpecifier;
[kLogoAlt]?: string;
[kLogoHref]?: string;
background:
| "primary"
| "secondary"
| "success"
| "danger"
| "warning"
| "info"
| "light"
| "dark";
search?: boolean | string;
left?: NavItem[];
right?: NavItem[];
collapse?: boolean;
tools?: SidebarTool[];
pinned?: boolean;
[kCollapseBelow]?: LayoutBreak;
[kSidebarMenus]?: boolean;
darkToggle?: boolean;
readerToggle?: boolean;
[kToolsCollapse]?: boolean;
}
export interface Sidebar {
id?: string;
title?: string;
subtitle?: string;
logo?: LogoLightDarkSpecifier;
[kLogoAlt]?: string;
[kLogoHref]?: string;
alignment?: "left" | "right" | "center";
align?: "left" | "right" | "center";
background?:
| "none"
| "primary"
| "secondary"
| "success"
| "danger"
| "warning"
| "info"
| "light"
| "dark"
| "white";
search?: boolean | string;
[kCollapseLevel]?: number;
contents: SidebarItem[];
tools: SidebarTool[];
style: "docked" | "floating";
pinned?: boolean;
header?: Array<string> | string;
footer?: Array<string> | string;
}
export type SidebarItem = NavigationItemObject & {
section?: string;
sectionId?: string;
contents?: SidebarItem[];
expanded?: boolean;
active?: boolean;
auto?: boolean | string | string[];
};
export interface InputTargetIndex extends Metadata {
title?: string;
markdown: PartitionedMarkdown;
formats: Record<string, Format>;
draft?: boolean;
}
export interface InputTarget {
input: string;
title?: string;
outputHref: string;
draft: boolean;
}