Path: blob/main/package/src/common/dependencies/dependencies.ts
6451 views
/*1* dependencies.ts2*3* Copyright (C) 2020-2022 Posit Software, PBC4*5*/67import { join } from "../../../../src/deno_ral/path.ts";8import { info, warning } from "../../../../src/deno_ral/log.ts";9import { PlatformConfiguration } from "../config.ts";1011import { dartSass } from "./dartsass.ts";12import { deno_dom } from "./deno_dom.ts";13import { esBuild } from "./esbuild.ts";14import { pandoc } from "./pandoc.ts";15import { archiveUrl } from "../archive-binary-dependencies.ts";16import { typst } from "./typst.ts";17import { verapdf } from "./verapdf.ts";1819// The list of binary dependencies for Quarto20export const kDependencies = [21deno_dom(version("DENO_DOM")),22pandoc(version("PANDOC")),23dartSass(version("DARTSASS")),24esBuild(version("ESBUILD")),25typst(version("TYPST")),26verapdf(version("VERAPDF")),27];2829// Defines a binary dependency for Quarto30export interface Dependency {31name: string;32bucket: string;33version: string;34// If true, this dependency is only archived to S3 but not downloaded during configure.35// Use for optional dependencies installed separately via `quarto install`.36archiveOnly?: boolean;37architectureDependencies: Record<38string,39ArchitectureDependency40>;41}4243// Defines the specific Platform dependencies for44// a given architecture45export interface ArchitectureDependency {46"darwin"?: PlatformDependency;47"linux"?: PlatformDependency;48"windows"?: PlatformDependency;49}5051// Defines an individual binary dependency, specific52// to a Platform (and architecture)53export interface PlatformDependency {54filename: string;55url: string;56configure(config: PlatformConfiguration, path: string): Promise<void>;57}5859function version(env: string) {60const version = Deno.env.get(env);61if (!version) {62throw Error(`${env} isn't defined with dependency version`);63} else {64return version;65}66}6768export async function configureDependency(69dependency: Dependency,70targetDir: string,71config: PlatformConfiguration,72) {73// Skip archive-only dependencies (installed separately via `quarto install`)74if (dependency.archiveOnly) {75info(`Skipping ${dependency.name} (archive-only)`);76return;77}7879info(`Preparing ${dependency.name} (${config.os} - ${config.arch})`);80const archDep = dependency.architectureDependencies[config.arch];8182if (archDep) {83const platformDep = archDep[config.os];84const vendor = Deno.env.get("QUARTO_VENDOR_BINARIES");85let targetFile = "";86if (platformDep && (vendor === undefined || vendor === "true")) {87info(`Downloading ${dependency.name}`);8889try {90targetFile = await downloadBinaryDependency(91dependency,92platformDep,93targetDir,94);95} catch (error) {96const msg =97`Failed to Download ${dependency.name}\nAre you sure that version ${dependency.version} of ${dependency.bucket} has been archived using './quarto-bld archive-bin-deps'?\n${error.message}`;98throw new Error(msg);99}100}101102if (platformDep) {103info(`Configuring ${dependency.name}`);104await platformDep.configure(config, targetFile);105}106107if (targetFile) {108info(`Cleaning up`);109Deno.removeSync(targetFile);110}111} else {112throw new Error(113`The architecture ${config.arch} is missing the dependency ${dependency.name}`,114);115}116117info(`${dependency.name} complete.\n`);118}119120async function downloadBinaryDependency(121dependency: Dependency,122platformDependency: PlatformDependency,123targetDir: string,124) {125const targetFile = join(targetDir, platformDependency.filename);126const dlUrl = archiveUrl(dependency, platformDependency);127128info("Downloading " + dlUrl);129info("to " + targetFile);130const response = await fetch(dlUrl);131if (response.status === 200) {132const blob = await response.blob();133134const bytes = await blob.arrayBuffer();135const data = new Uint8Array(bytes);136137Deno.writeFileSync(138targetFile,139data,140);141return targetFile;142} else {143throw new Error(response.statusText);144}145}146147148