Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/package/src/common/config.ts
6450 views
1
/*
2
* config.ts
3
*
4
* Copyright (C) 2020-2022 Posit Software, PBC
5
*
6
*/
7
8
import { join } from "../../../src/deno_ral/path.ts";
9
import { info } from "../../../src/deno_ral/log.ts";
10
11
import { getEnv } from "../util/utils.ts";
12
13
import { os as platformOs } from "../../../src/deno_ral/platform.ts"
14
import * as Pandoc from "../../../src/core/pandoc/json.ts";
15
import { fromObjects } from "../../../src/core/pandoc/table.ts";
16
17
// The core configuration for the packaging process
18
export interface Configuration extends PlatformConfiguration {
19
productName: string;
20
version: string;
21
importmap: string;
22
directoryInfo: DirectoryInfo;
23
}
24
25
export interface PlatformConfiguration {
26
os: "windows" | "linux" | "darwin";
27
arch: "x86_64" | "aarch64";
28
}
29
30
// Directories avaialable for step
31
export interface DirectoryInfo {
32
root: string;
33
src: string;
34
pkg: string;
35
dist: string;
36
share: string;
37
bin: string;
38
out: string;
39
tools: string;
40
pkgWorking: {
41
root: string;
42
bin: string;
43
share: string;
44
};
45
}
46
47
export const kValidOS = ["windows", "linux", "darwin"];
48
export const kValidArch = ["x86_64", "aarch64"];
49
50
// Read the configuration fromt the environment
51
export function readConfiguration(
52
version?: string,
53
os?: "windows" | "linux" | "darwin",
54
arch?: "x86_64" | "aarch64",
55
): Configuration {
56
const productName = getEnv("QUARTO_NAME");
57
version = version || getEnv("QUARTO_VERSION");
58
59
const root = getEnv("QUARTO_ROOT");
60
const src = getEnv("QUARTO_SRC_PATH");
61
62
const pkg = getEnv("QUARTO_PACKAGE_PATH") || "package";
63
const out = join(pkg, getEnv("QUARTO_OUT_DIR") || "out");
64
65
const dist = getEnv("QUARTO_DIST_PATH") || "dist";
66
const shareName = getEnv("QUARTO_SHARE_DIR") || "share";
67
const share = getEnv("QUARTO_SHARE_PATH") ||
68
join(dist, shareName);
69
const binName = getEnv("QUARTO_BIN_DIR") || "bin";
70
const bin = getEnv("QUARTO_BIN_PATH") ||
71
join(dist, binName);
72
const pkgWorkingBase = join(pkg, "pkg-working");
73
const toolsName = getEnv("QUARTO_TOOLS_NAME", "tools");
74
const tools = getEnv("QUARTO_TOOLS_PATH", join(root, toolsName));
75
76
const directoryInfo = {
77
root,
78
pkg,
79
dist,
80
share,
81
src,
82
out,
83
bin,
84
tools,
85
pkgWorking: {
86
root: pkgWorkingBase,
87
bin: join(pkgWorkingBase, binName),
88
share: join(pkgWorkingBase, shareName),
89
},
90
};
91
92
93
94
const cmdOs = os || getEnv("QUARTO_OS", platformOs);
95
if (!kValidOS.includes(cmdOs)) {
96
throw new Error(
97
`Invalid OS ${os} provided. Please use one of ${kValidOS.join(",")}`,
98
);
99
}
100
const cmdArch = arch || getEnv("QUARTO_OS", Deno.build.arch);
101
if (!kValidArch.includes(cmdArch)) {
102
throw new Error(
103
`Invalid arch ${arch} provided. Please use one of ${
104
kValidArch.join(",")
105
}`,
106
);
107
}
108
109
const importmap = join(src, "import_map.json");
110
111
return {
112
productName,
113
version,
114
importmap,
115
directoryInfo,
116
os: cmdOs as "windows" | "linux" | "darwin",
117
arch: cmdArch as "x86_64" | "aarch64",
118
};
119
}
120
121
export function configurationAST(config: Configuration): Pandoc.Block[] {
122
const makeObject = (
123
obj: {
124
key: string,
125
value: string
126
},
127
) => ({
128
"key": [Pandoc.plain([Pandoc.str(obj.key)])],
129
"value": [Pandoc.plain([Pandoc.code(obj.value)])]
130
});
131
const configTable = fromObjects([
132
{key: "OS", value: config.os},
133
{key: "Arch", value: config.arch},
134
{key: "Version", value: config.version},
135
{key: "Cwd", value: Deno.cwd()},
136
{key: "Package folder (build source)", value: config.directoryInfo.pkg},
137
{key: "Dist folder (output folder)", value: config.directoryInfo.dist},
138
{key: "Bin folder", value: config.directoryInfo.bin},
139
{key: "Share folder", value: config.directoryInfo.share},
140
{key: "Package working folder", value: config.directoryInfo.pkgWorking.root},
141
].map(makeObject), undefined, [
142
Pandoc.colspec("AlignLeft", {t: "ColWidth", c: 0.3}),
143
Pandoc.colspec("AlignLeft", {t: "ColWidth", c: 0.6}),
144
]);
145
return [
146
Pandoc.header(2, [Pandoc.str("Configuration:")]),
147
configTable,
148
];
149
}
150
151
export function printConfiguration(config: Configuration) {
152
info("");
153
info("******************************************");
154
info("Configuration:");
155
info(` - OS: ${config.os}`);
156
info(` - Arch: ${config.arch}`);
157
info(` - Version: ${config.version}`);
158
info(` - Cwd: ${Deno.cwd()}`);
159
info(` - DENO_DIR: ${Deno.env.get("DENO_DIR")}`);
160
info(` - Directory configuration:`);
161
info(
162
` - Package folder (build source): ${config.directoryInfo.pkg}`,
163
);
164
info(` - Dist folder (output folder): ${config.directoryInfo.dist}`);
165
info(` - bin folder: ${config.directoryInfo.bin}`);
166
info(` - share folder: ${config.directoryInfo.share}`);
167
info(` - Package working folder: ${config.directoryInfo.pkgWorking.root}`);
168
169
info("");
170
info("******************************************");
171
info("");
172
173
}
174
175
// Utility that provides a working directory and cleans it up
176
export async function withWorkingDir(fn: (wkDir: string) => Promise<void>) {
177
const workingDir = Deno.makeTempDirSync();
178
try {
179
await fn(workingDir);
180
} finally {
181
Deno.removeSync(workingDir, { recursive: true });
182
}
183
}
184
185