Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/package/src/common/configure.ts
6450 views
1
/*
2
* dependencies.ts
3
*
4
* Copyright (C) 2020-2022 Posit Software, PBC
5
*/
6
import { dirname, join, SEP } from "../../../src/deno_ral/path.ts";
7
import { existsSync, ensureDirSync } from "../../../src/deno_ral/fs.ts";
8
import { info, warning } from "../../../src/deno_ral/log.ts";
9
10
import { expandPath } from "../../../src/core/path.ts";
11
import {
12
createDevConfig,
13
writeDevConfig,
14
} from "../../../src/core/devconfig.ts";
15
16
import { Configuration } from "./config.ts";
17
import {
18
configureDependency,
19
kDependencies,
20
} from "./dependencies/dependencies.ts";
21
import { suggestUserBinPaths } from "../../../src/core/path.ts";
22
import { buildQuartoPreviewJs } from "./previewjs.ts";
23
import { isWindows } from "../../../src/deno_ral/platform.ts";
24
25
export async function configure(
26
config: Configuration,
27
) {
28
// Download dependencies
29
for (const dependency of kDependencies) {
30
const targetDir = join(
31
config.directoryInfo.bin,
32
"tools",
33
);
34
await configureDependency(dependency, targetDir, config);
35
}
36
37
info("Building quarto-preview.js...");
38
const result = buildQuartoPreviewJs(config.directoryInfo.src);
39
if (!result.success) {
40
throw new Error();
41
}
42
info("Build completed.");
43
44
// Move the quarto script into place
45
info("Placing Quarto script");
46
copyQuartoScript(config, config.directoryInfo.bin);
47
48
info("Creating architecture specific Pandoc link");
49
const vendor = Deno.env.get("QUARTO_VENDOR_BINARIES");
50
if (vendor === undefined || vendor === "true") {
51
// Quarto tools may look right in the bin/tools directory for Pandoc
52
// so make a symlink that points to the architecture specific version.
53
// Note that if we are being instructed not to vendor binaries,
54
// Pandoc won't be present in the architecture specific directory, so
55
// just skip this step.
56
copyPandocScript(config, join(config.directoryInfo.bin, "tools"));
57
}
58
59
// record dev config. These are versions as defined in the root configuration file.
60
const devConfig = createDevConfig(
61
Deno.env.get("DENO") || "",
62
Deno.env.get("DENO_DOM") || "",
63
Deno.env.get("PANDOC") || "",
64
Deno.env.get("DARTSASS") || "",
65
Deno.env.get("ESBUILD") || "",
66
Deno.env.get("TYPST") || "",
67
config.directoryInfo.bin,
68
);
69
writeDevConfig(devConfig, config.directoryInfo.bin);
70
info("Wrote dev config to bin directory");
71
72
if (
73
config.os !== "windows" &&
74
Deno.env.get("QUARTO_NO_SYMLINK") === undefined
75
) {
76
info("Creating Quarto Symlink");
77
78
// Set up a symlink (if appropriate)
79
const possibleBinPaths = suggestUserBinPaths();
80
const symlinksFiltered = possibleBinPaths.map((path) =>
81
join(path, "quarto")
82
);
83
84
info(`Found ${symlinksFiltered.length} paths to try.`);
85
86
if (symlinksFiltered.length > 0) {
87
for (let i = 0; i < symlinksFiltered.length; i++) {
88
info(`> Trying ${symlinksFiltered[i]}`);
89
const symlinkPath = expandPath(symlinksFiltered[i]);
90
91
// Remove existing symlink
92
try {
93
if (existsSync(symlinkPath)) {
94
Deno.removeSync(symlinkPath);
95
}
96
} catch (error) {
97
info(error);
98
warning(
99
"\n> Failed to remove existing symlink.\n> Did you previously install with sudo? Run 'which quarto' to test which version will be used.",
100
);
101
}
102
103
// Create new symlink
104
try {
105
ensureDirSync(dirname(symlinkPath) + SEP);
106
107
Deno.symlinkSync(
108
join(config.directoryInfo.bin, "quarto"),
109
symlinkPath,
110
);
111
112
info(`> Symlink created at ${symlinkPath}`);
113
info("> Success");
114
// it worked, just move on
115
break;
116
} catch (_error) {
117
info(`> Didn't create symlink at ${symlinkPath}`);
118
if (i === symlinksFiltered.length - 1) {
119
warning(
120
`\n> Please ensure that ${
121
join(config.directoryInfo.bin, "quarto")
122
} is in your path.`,
123
);
124
}
125
}
126
}
127
} else {
128
// Just warn the user and create a symlink in our last resort
129
warning(
130
`\n> Please ensure that ${
131
join(config.directoryInfo.bin, "quarto")
132
} is in your path.`,
133
);
134
}
135
}
136
}
137
138
export function copyQuartoScript(config: Configuration, targetDir: string) {
139
// Move the quarto script into place
140
if (config.os === "windows") {
141
Deno.copyFileSync(
142
join(config.directoryInfo.pkg, "scripts", "windows", "quarto.cmd"),
143
join(targetDir, "quarto.cmd"),
144
);
145
} else {
146
const out = join(targetDir, "quarto");
147
Deno.copyFileSync(
148
join(config.directoryInfo.pkg, "scripts", "common", "quarto"),
149
out,
150
);
151
Deno.chmodSync(out, 0o755);
152
}
153
}
154
155
export function copyPandocScript(config: Configuration, targetDir: string) {
156
const linkTarget = join(config.arch, "pandoc");
157
158
const pandocFile = join(targetDir, "pandoc");
159
if (existsSync(pandocFile)) {
160
info("> removing existing pandoc link");
161
Deno.removeSync(pandocFile);
162
}
163
164
if (!isWindows) {
165
info("> creating pandoc symlink");
166
Deno.run({
167
cwd: targetDir,
168
cmd: ["ln", "-s", linkTarget, "pandoc"]
169
});
170
}
171
}
172
173
export function copyPandocAliasScript(config: Configuration, toolsDir: string) {
174
// Move the quarto script into place
175
if (config.os === "darwin") {
176
const out = join(toolsDir, "pandoc");
177
Deno.copyFileSync(
178
join(config.directoryInfo.pkg, "scripts", "macos", "pandoc"),
179
out,
180
);
181
Deno.chmodSync(out, 0o755);
182
} else if (config.os === "linux") {
183
const out = join(toolsDir, "pandoc");
184
Deno.copyFileSync(
185
join(config.directoryInfo.pkg, "scripts", "linux", "pandoc"),
186
out,
187
);
188
Deno.chmodSync(out, 0o755);
189
}
190
}
191
192