@rage-against-the-pixel/unity-cli 1.8.3 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +128 -66
- package/dist/cli.js +264 -34
- package/dist/cli.js.map +1 -1
- package/dist/github-actions-ci.d.ts +21 -0
- package/dist/github-actions-ci.js +137 -0
- package/dist/github-actions-ci.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/logger-provider.d.ts +35 -0
- package/dist/logger-provider.js +48 -0
- package/dist/logger-provider.js.map +1 -0
- package/dist/logging.d.ts +89 -4
- package/dist/logging.js +780 -186
- package/dist/logging.js.map +1 -1
- package/dist/unity-editor.d.ts +12 -0
- package/dist/unity-editor.js +75 -16
- package/dist/unity-editor.js.map +1 -1
- package/dist/unity-hub.d.ts +21 -1
- package/dist/unity-hub.js +197 -90
- package/dist/unity-hub.js.map +1 -1
- package/dist/unity-logging.d.ts +23 -1
- package/dist/unity-logging.js +259 -12
- package/dist/unity-logging.js.map +1 -1
- package/dist/upm-cli.d.ts +86 -0
- package/dist/upm-cli.js +469 -0
- package/dist/upm-cli.js.map +1 -0
- package/dist/utilities.d.ts +52 -0
- package/dist/utilities.js +195 -13
- package/dist/utilities.js.map +1 -1
- package/dist/{utp/utp.d.ts → utp.d.ts} +21 -3
- package/dist/{utp/utp.js → utp.js} +25 -12
- package/dist/utp.js.map +1 -0
- package/package.json +20 -9
- package/dist/utp/utp.js.map +0 -1
package/dist/upm-cli.js
ADDED
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.UpmCli = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const os = __importStar(require("os"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const semver_1 = require("semver");
|
|
41
|
+
const logging_1 = require("./logging");
|
|
42
|
+
const utilities_1 = require("./utilities");
|
|
43
|
+
/**
|
|
44
|
+
* Managed Unity Package Manager CLI (unity-cli–installed `UnityPackageManager`), modeled after {@link UnityHub}:
|
|
45
|
+
* parameterless constructor resolves roots and executable preference, {@link Install} manages downloads, {@link Exec} runs the binary.
|
|
46
|
+
*/
|
|
47
|
+
class UpmCli {
|
|
48
|
+
/** Root directory for managed installs (~/.unity-cli/upm), analogous to {@link UnityHub.rootDirectory}. */
|
|
49
|
+
managedRoot;
|
|
50
|
+
logger = logging_1.Logger.instance;
|
|
51
|
+
constructor() {
|
|
52
|
+
this.managedRoot = path.join(os.homedir(), '.unity-cli', 'upm');
|
|
53
|
+
}
|
|
54
|
+
static getCdnBaseUrl() {
|
|
55
|
+
const override = process.env.UPM_CDN_BASE_URL?.trim();
|
|
56
|
+
if (override && override.length > 0) {
|
|
57
|
+
return `${override.replace(/\/$/, '')}/upm-cli`;
|
|
58
|
+
}
|
|
59
|
+
return 'https://cdn.packages.unity.com/upm-cli';
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* HTTPS URL under the UPM CLI CDN for a release file. Caller must validate `tag` (e.g. {@link UpmCli.validateVersionFormat});
|
|
63
|
+
* path segments are encoded to avoid tainted file-derived strings reaching the network unchecked (CodeQL js/file-access-to-http).
|
|
64
|
+
*/
|
|
65
|
+
static buildUpmReleaseAssetUrl(cdnBase, tag, fileName) {
|
|
66
|
+
const root = new URL(`${cdnBase.replace(/\/$/, '')}/`);
|
|
67
|
+
return new URL(`releases/${encodeURIComponent(tag)}/${encodeURIComponent(fileName)}`, root).href;
|
|
68
|
+
}
|
|
69
|
+
static buildUpmLatestTxtUrl(cdnBase) {
|
|
70
|
+
return new URL('latest.txt', new URL(`${cdnBase.replace(/\/$/, '')}/`)).href;
|
|
71
|
+
}
|
|
72
|
+
static normalizeSemver(version) {
|
|
73
|
+
const normalized = (0, semver_1.valid)(version);
|
|
74
|
+
if (normalized) {
|
|
75
|
+
return normalized;
|
|
76
|
+
}
|
|
77
|
+
const coerced = (0, semver_1.coerce)(version);
|
|
78
|
+
return coerced?.version;
|
|
79
|
+
}
|
|
80
|
+
static parseVerifiedSemVerFromLine(line) {
|
|
81
|
+
const t = line.trim();
|
|
82
|
+
if (!t) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
const direct = (0, semver_1.valid)(t);
|
|
86
|
+
if (direct) {
|
|
87
|
+
const parsed = (0, semver_1.parse)(direct, false);
|
|
88
|
+
if (parsed && (0, semver_1.valid)(parsed.version)) {
|
|
89
|
+
return parsed;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const coerced = (0, semver_1.coerce)(t);
|
|
93
|
+
if (coerced && (0, semver_1.valid)(coerced)) {
|
|
94
|
+
return coerced;
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
static parseCliVersionStdout(output) {
|
|
99
|
+
const trimmed = output.trim();
|
|
100
|
+
if (!trimmed) {
|
|
101
|
+
throw new Error('Upm cli --version produced empty output.');
|
|
102
|
+
}
|
|
103
|
+
const lines = trimmed.split(/\r?\n/).map((l) => l.trim()).filter((l) => l.length > 0);
|
|
104
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
105
|
+
const version = UpmCli.parseVerifiedSemVerFromLine(lines[i]);
|
|
106
|
+
if (version) {
|
|
107
|
+
return version;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const fallback = UpmCli.parseVerifiedSemVerFromLine(trimmed);
|
|
111
|
+
if (fallback) {
|
|
112
|
+
return fallback;
|
|
113
|
+
}
|
|
114
|
+
throw new Error(`Failed to parse upm cli version: ${JSON.stringify(trimmed)}`);
|
|
115
|
+
}
|
|
116
|
+
getVersionInstallDir(version) {
|
|
117
|
+
const t = version.trim();
|
|
118
|
+
this.validateVersionFormat(t);
|
|
119
|
+
if (t.includes('..') || path.normalize(t) !== t) {
|
|
120
|
+
throw new Error(`Invalid upm cli release tag for path use: ${version}`);
|
|
121
|
+
}
|
|
122
|
+
const dir = path.join(this.managedRoot, t);
|
|
123
|
+
const resolvedDir = path.resolve(dir);
|
|
124
|
+
const resolvedRoot = path.resolve(this.managedRoot);
|
|
125
|
+
const rootPrefix = resolvedRoot.endsWith(path.sep) ? resolvedRoot : `${resolvedRoot}${path.sep}`;
|
|
126
|
+
if (resolvedDir !== resolvedRoot && !resolvedDir.startsWith(rootPrefix)) {
|
|
127
|
+
throw new Error('Resolved UPM install directory left managed root.');
|
|
128
|
+
}
|
|
129
|
+
return dir;
|
|
130
|
+
}
|
|
131
|
+
getCurrentVersionFilePath() {
|
|
132
|
+
return path.join(this.managedRoot, 'current-version.txt');
|
|
133
|
+
}
|
|
134
|
+
getPlatformId() {
|
|
135
|
+
const plat = process.platform;
|
|
136
|
+
const arch = process.arch;
|
|
137
|
+
if (plat === 'win32') {
|
|
138
|
+
if (arch === 'arm64') {
|
|
139
|
+
return 'windows-arm64';
|
|
140
|
+
}
|
|
141
|
+
return 'windows-x64';
|
|
142
|
+
}
|
|
143
|
+
if (plat === 'darwin') {
|
|
144
|
+
if (arch === 'arm64') {
|
|
145
|
+
return 'macos-arm64';
|
|
146
|
+
}
|
|
147
|
+
return 'macos-x64';
|
|
148
|
+
}
|
|
149
|
+
if (plat === 'linux') {
|
|
150
|
+
if (arch === 'arm64') {
|
|
151
|
+
return 'linux-arm64';
|
|
152
|
+
}
|
|
153
|
+
return 'linux-x64';
|
|
154
|
+
}
|
|
155
|
+
throw new Error(`Unsupported platform for upm cli: ${plat} ${arch}`);
|
|
156
|
+
}
|
|
157
|
+
validateVersionFormat(version) {
|
|
158
|
+
const t = version.trim();
|
|
159
|
+
if (!t.startsWith('v') || !(0, semver_1.valid)(t)) {
|
|
160
|
+
throw new Error(`Invalid upm cli version format: ${version}. Expected a semver release tag with leading v (e.g. v9.27.0).`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
findPrimaryExecutable(installDir) {
|
|
164
|
+
if (process.platform === 'win32') {
|
|
165
|
+
const exe = path.join(installDir, 'UnityPackageManager.exe');
|
|
166
|
+
if (fs.existsSync(exe)) {
|
|
167
|
+
return exe;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
const bin = path.join(installDir, 'UnityPackageManager');
|
|
172
|
+
if (fs.existsSync(bin)) {
|
|
173
|
+
return bin;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
throw new Error(`Could not find UnityPackageManager binary under ${installDir}`);
|
|
177
|
+
}
|
|
178
|
+
/** Optional executable override (mirrors `UNITY_HUB_PATH` for {@link UnityHub}). */
|
|
179
|
+
getExecutablePathOverride() {
|
|
180
|
+
const p = process.env.UPM_CLI_PATH?.trim();
|
|
181
|
+
return p && p.length > 0 ? path.normalize(p) : undefined;
|
|
182
|
+
}
|
|
183
|
+
executableOverrideIsUsable() {
|
|
184
|
+
const p = this.getExecutablePathOverride();
|
|
185
|
+
if (!p) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
fs.accessSync(p, fs.constants.R_OK | fs.constants.X_OK);
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Release tag of the managed install from `current-version.txt`, if present and valid.
|
|
198
|
+
*/
|
|
199
|
+
GetInstalledReleaseTag() {
|
|
200
|
+
const currentFile = this.getCurrentVersionFilePath();
|
|
201
|
+
if (!fs.existsSync(currentFile)) {
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
const version = fs.readFileSync(currentFile, 'utf8').trim();
|
|
206
|
+
if (!version) {
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
this.validateVersionFormat(version);
|
|
210
|
+
return version;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Path to the primary `UnityPackageManager` binary for a managed release, or `undefined` if missing.
|
|
218
|
+
*/
|
|
219
|
+
ResolveManagedPrimaryPath(version) {
|
|
220
|
+
let v = version?.trim() || this.GetInstalledReleaseTag();
|
|
221
|
+
if (!v) {
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
const installDir = this.getVersionInstallDir(v);
|
|
225
|
+
try {
|
|
226
|
+
return this.findPrimaryExecutable(installDir);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Resolved path used to spawn the UPM CLI: `UPM_CLI_PATH` override when set, otherwise the managed primary binary.
|
|
234
|
+
* @throws If nothing usable is installed (mirrors Hub/Editor behavior when the executable cannot be used).
|
|
235
|
+
*/
|
|
236
|
+
GetExecutablePath() {
|
|
237
|
+
const overridePath = this.getExecutablePathOverride();
|
|
238
|
+
if (overridePath) {
|
|
239
|
+
fs.accessSync(overridePath, fs.constants.R_OK | fs.constants.X_OK);
|
|
240
|
+
return overridePath;
|
|
241
|
+
}
|
|
242
|
+
const managed = this.ResolveManagedPrimaryPath();
|
|
243
|
+
if (!managed) {
|
|
244
|
+
throw new Error('Upm cli is not installed. Run `unity-cli upm-install` first.');
|
|
245
|
+
}
|
|
246
|
+
fs.accessSync(managed, fs.constants.R_OK | fs.constants.X_OK);
|
|
247
|
+
return managed;
|
|
248
|
+
}
|
|
249
|
+
/** Same role as {@link UnityHub.executable}: path used to spawn the UPM CLI (may reflect `UPM_CLI_PATH` or the managed install). */
|
|
250
|
+
get executable() {
|
|
251
|
+
return this.GetExecutablePath();
|
|
252
|
+
}
|
|
253
|
+
async GetLatestReleaseTag() {
|
|
254
|
+
const cdn = UpmCli.getCdnBaseUrl();
|
|
255
|
+
const latestUrl = UpmCli.buildUpmLatestTxtUrl(cdn);
|
|
256
|
+
const version = (await (0, utilities_1.HttpsGetText)(latestUrl)).trim();
|
|
257
|
+
this.validateVersionFormat(version);
|
|
258
|
+
return version;
|
|
259
|
+
}
|
|
260
|
+
/** True if `latestTag` is newer than the installed managed release, or nothing is installed yet. */
|
|
261
|
+
IsUpdateAvailable(latestTag) {
|
|
262
|
+
const current = this.GetInstalledReleaseTag();
|
|
263
|
+
if (!current) {
|
|
264
|
+
return true;
|
|
265
|
+
}
|
|
266
|
+
const normalizedCurrent = UpmCli.normalizeSemver(current);
|
|
267
|
+
const normalizedLatest = UpmCli.normalizeSemver(latestTag);
|
|
268
|
+
if (normalizedCurrent && normalizedLatest) {
|
|
269
|
+
return (0, semver_1.compare)(normalizedLatest, normalizedCurrent) > 0;
|
|
270
|
+
}
|
|
271
|
+
return latestTag.trim() !== current.trim();
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Installs or updates the managed UPM CLI (mirrors {@link UnityHub.Install} for the Hub itself).
|
|
275
|
+
* @returns Installed release tag (e.g. v9.27.0).
|
|
276
|
+
*/
|
|
277
|
+
async Install(options) {
|
|
278
|
+
const cdn = UpmCli.getCdnBaseUrl();
|
|
279
|
+
let version = options?.version?.trim();
|
|
280
|
+
if (!version || version.length === 0) {
|
|
281
|
+
version = await this.GetLatestReleaseTag();
|
|
282
|
+
}
|
|
283
|
+
version = version.trim();
|
|
284
|
+
const installDir = this.getVersionInstallDir(version);
|
|
285
|
+
const markerPath = path.join(installDir, '.unity-cli-upm-installed');
|
|
286
|
+
if (options?.skipIfInstalled !== false && fs.existsSync(markerPath)) {
|
|
287
|
+
try {
|
|
288
|
+
this.findPrimaryExecutable(installDir);
|
|
289
|
+
const recordedTag = path.basename(installDir);
|
|
290
|
+
await fs.promises.writeFile(this.getCurrentVersionFilePath(), `${recordedTag}\n`, 'utf8');
|
|
291
|
+
return version;
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// reinstall
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const platform = this.getPlatformId();
|
|
298
|
+
const zipName = `upm-${platform}.zip`;
|
|
299
|
+
const zipUrl = UpmCli.buildUpmReleaseAssetUrl(cdn, version, zipName);
|
|
300
|
+
const checksumUrl = UpmCli.buildUpmReleaseAssetUrl(cdn, version, `${zipName}.sha256`);
|
|
301
|
+
const tempRoot = path.join((0, utilities_1.GetTempDir)(), `unity-cli-upm-${Date.now()}`);
|
|
302
|
+
const resolvedTempRoot = path.resolve(tempRoot);
|
|
303
|
+
const zipPath = path.join(resolvedTempRoot, zipName);
|
|
304
|
+
const checksumPath = path.join(resolvedTempRoot, `${zipName}.sha256`);
|
|
305
|
+
try {
|
|
306
|
+
this.logger.info(`Installing upm cli ${version} (${platform})...`);
|
|
307
|
+
await (0, utilities_1.DownloadFile)(zipUrl, zipPath);
|
|
308
|
+
await (0, utilities_1.DownloadFile)(checksumUrl, checksumPath);
|
|
309
|
+
const checksumContent = (await fs.promises.readFile(checksumPath, 'utf8')).trim();
|
|
310
|
+
const expectedHash = checksumContent.split(/\s+/)[0]?.toLowerCase();
|
|
311
|
+
if (!expectedHash) {
|
|
312
|
+
throw new Error(`Could not read SHA-256 from ${checksumPath}`);
|
|
313
|
+
}
|
|
314
|
+
const actualHash = (await (0, utilities_1.Sha256FileHex)(zipPath)).toLowerCase();
|
|
315
|
+
if (actualHash !== expectedHash) {
|
|
316
|
+
throw new Error(`SHA-256 mismatch for upm cli zip. Expected ${expectedHash}, got ${actualHash}`);
|
|
317
|
+
}
|
|
318
|
+
await (0, utilities_1.DeleteDirectory)(installDir);
|
|
319
|
+
await fs.promises.mkdir(installDir, { recursive: true });
|
|
320
|
+
await (0, utilities_1.extractZipNative)(zipPath, installDir, {
|
|
321
|
+
zipUnder: resolvedTempRoot,
|
|
322
|
+
destUnder: path.resolve(this.managedRoot),
|
|
323
|
+
}, {
|
|
324
|
+
silent: false,
|
|
325
|
+
showCommand: this.logger.logLevel === logging_1.LogLevel.DEBUG
|
|
326
|
+
});
|
|
327
|
+
const primary = this.findPrimaryExecutable(installDir);
|
|
328
|
+
if (process.platform !== 'win32') {
|
|
329
|
+
try {
|
|
330
|
+
fs.chmodSync(primary, 0o755);
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
// ignore
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
const wrapperUnix = path.join(installDir, 'upm');
|
|
337
|
+
if (process.platform !== 'win32' && fs.existsSync(wrapperUnix)) {
|
|
338
|
+
try {
|
|
339
|
+
fs.chmodSync(wrapperUnix, 0o755);
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
// ignore
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
await fs.promises.writeFile(markerPath, `${new Date().toISOString()}\n`, 'utf8');
|
|
346
|
+
const recordedTag = path.basename(installDir);
|
|
347
|
+
await fs.promises.writeFile(this.getCurrentVersionFilePath(), `${recordedTag}\n`, 'utf8');
|
|
348
|
+
return version;
|
|
349
|
+
}
|
|
350
|
+
finally {
|
|
351
|
+
await (0, utilities_1.DeleteDirectory)(tempRoot);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* When running in an interactive terminal, may prompt to install a missing UPM CLI or update to the latest CDN release.
|
|
356
|
+
* When not interactive, logs a warning if the running binary is older than the CDN latest (no install).
|
|
357
|
+
* Compares the running binary ({@link Version}) to {@link GetLatestReleaseTag} (including when {@code UPM_CLI_PATH} overrides the managed install).
|
|
358
|
+
* Call before {@link GetExecutablePath} / {@link Exec} for Hub-style optional install/update (e.g. pack).
|
|
359
|
+
*/
|
|
360
|
+
async PromptInstallOrUpdateWhenInteractive() {
|
|
361
|
+
const overrideUsable = this.executableOverrideIsUsable();
|
|
362
|
+
const managedExe = this.ResolveManagedPrimaryPath();
|
|
363
|
+
const hasExecutable = overrideUsable || managedExe !== undefined;
|
|
364
|
+
if (!hasExecutable) {
|
|
365
|
+
if ((0, utilities_1.isInteractiveTerminalSession)()) {
|
|
366
|
+
const install = await (0, utilities_1.PromptYesNo)('The upm cli is not installed. Download and install it now?', true);
|
|
367
|
+
if (install) {
|
|
368
|
+
await this.Install({ skipIfInstalled: false });
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
try {
|
|
374
|
+
const latestTag = await this.GetLatestReleaseTag();
|
|
375
|
+
const latestSem = UpmCli.parseVerifiedSemVerFromLine(latestTag);
|
|
376
|
+
if (!latestSem) {
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
const installedSem = await this.Version();
|
|
380
|
+
if ((0, semver_1.compare)(latestSem, installedSem) <= 0) {
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
const usingOverride = overrideUsable;
|
|
384
|
+
if (!(0, utilities_1.isInteractiveTerminalSession)()) {
|
|
385
|
+
if (usingOverride) {
|
|
386
|
+
this.logger.warn(`The upm cli (UPM_CLI_PATH) reports ${installedSem.version}, but ${latestTag} is available on the CDN. This run still uses UPM_CLI_PATH; update that binary or unset it and run unity-cli upm-install to use the managed release.`);
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
this.logger.warn(`The upm cli (${installedSem.version}) is older than the latest release (${latestTag}). Run unity-cli upm-install or unity-cli upm-install --auto-update to update.`);
|
|
390
|
+
}
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
const prompt = usingOverride
|
|
394
|
+
? `Your upm cli (UPM_CLI_PATH) reports ${installedSem.version}, but ${latestTag} is available. Install the latest to the managed location now? This run will keep using UPM_CLI_PATH until you unset it or point it at the new binary.`
|
|
395
|
+
: `A newer upm cli version is available (${installedSem.version} -> ${latestTag}). Install it now?`;
|
|
396
|
+
const shouldUpdate = await (0, utilities_1.PromptYesNo)(prompt, !usingOverride);
|
|
397
|
+
if (!shouldUpdate) {
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
await this.Install({
|
|
401
|
+
version: latestTag,
|
|
402
|
+
skipIfInstalled: false,
|
|
403
|
+
});
|
|
404
|
+
if (usingOverride) {
|
|
405
|
+
this.logger.warn(`Installed upm cli ${latestTag} under ${this.managedRoot}. Unset UPM_CLI_PATH (or update it) so subsequent commands use the new install.`);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
this.logger.debug(`Failed to check for upm cli updates: ${error}`);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Executes the UPM CLI with the given arguments (mirrors {@link UnityHub.Exec}).
|
|
414
|
+
*/
|
|
415
|
+
async Exec(args, options = { silent: this.logger.logLevel > logging_1.LogLevel.CI, showCommand: this.logger.logLevel <= logging_1.LogLevel.CI }) {
|
|
416
|
+
const exe = this.GetExecutablePath();
|
|
417
|
+
if (exe.includes(path.sep)) {
|
|
418
|
+
fs.accessSync(exe, fs.constants.R_OK | fs.constants.X_OK);
|
|
419
|
+
}
|
|
420
|
+
return (0, utilities_1.Exec)(exe, args, options);
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Runs `--version` and returns the verified semver from the binary.
|
|
424
|
+
* @param expectedReleaseTag When set (e.g. from {@link Install}), ensures the reported semver matches this CDN release tag.
|
|
425
|
+
*/
|
|
426
|
+
async Version(expectedReleaseTag) {
|
|
427
|
+
const raw = await this.Exec(['--version'], {
|
|
428
|
+
silent: true,
|
|
429
|
+
showCommand: this.logger.logLevel === logging_1.LogLevel.DEBUG,
|
|
430
|
+
});
|
|
431
|
+
const version = UpmCli.parseCliVersionStdout(raw);
|
|
432
|
+
if (expectedReleaseTag !== undefined && expectedReleaseTag.trim().length > 0) {
|
|
433
|
+
const tag = expectedReleaseTag.trim();
|
|
434
|
+
const expected = UpmCli.parseVerifiedSemVerFromLine(tag);
|
|
435
|
+
if (!expected) {
|
|
436
|
+
throw new Error(`Invalid installed upm cli release tag: ${expectedReleaseTag}`);
|
|
437
|
+
}
|
|
438
|
+
if ((0, semver_1.compare)(version, expected) !== 0) {
|
|
439
|
+
throw new Error(`Upm cli binary version mismatch: binary reported ${version.version} (--version), expected ${expected.version} (${expectedReleaseTag}).`);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return version;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Runs the UPM CLI `pack` subcommand (builds argv from {@link UpmPackOptions}, then {@link Exec}).
|
|
446
|
+
*/
|
|
447
|
+
async Pack(options, execOptions) {
|
|
448
|
+
const orgId = options.organizationId.trim();
|
|
449
|
+
if (!orgId) {
|
|
450
|
+
throw new Error('UpmCli.Pack requires a non-empty organizationId.');
|
|
451
|
+
}
|
|
452
|
+
const args = [];
|
|
453
|
+
if (this.logger.logLevel === logging_1.LogLevel.DEBUG) {
|
|
454
|
+
args.push('--log-level', '5', '--console-log-level', '5');
|
|
455
|
+
}
|
|
456
|
+
args.push('pack', '--organization-id', orgId);
|
|
457
|
+
const dest = options.destination?.trim();
|
|
458
|
+
if (dest && dest.length > 0) {
|
|
459
|
+
args.push('--destination', dest);
|
|
460
|
+
}
|
|
461
|
+
const dir = options.packageDirectory?.trim();
|
|
462
|
+
if (dir && dir.length > 0) {
|
|
463
|
+
args.push(dir);
|
|
464
|
+
}
|
|
465
|
+
return this.Exec(args, execOptions);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
exports.UpmCli = UpmCli;
|
|
469
|
+
//# sourceMappingURL=upm-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upm-cli.js","sourceRoot":"","sources":["../src/upm-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/utilities.d.ts
CHANGED
|
@@ -16,10 +16,38 @@ export declare function ResolvePathCandidates(globsList: string[][]): Promise<st
|
|
|
16
16
|
* @returns The user input as a string.
|
|
17
17
|
*/
|
|
18
18
|
export declare function PromptForSecretInput(prompt: string): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Prompts for y/n. Empty input uses `defaultYes` (Y/n vs y/N suffix).
|
|
21
|
+
*/
|
|
22
|
+
export declare function PromptYesNo(prompt: string, defaultYes: boolean): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* True when stdin and stdout are TTYs and the process is not running under CI.
|
|
25
|
+
* Use before interactive prompts (readline).
|
|
26
|
+
*/
|
|
27
|
+
export declare function isInteractiveTerminalSession(): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* True when {@link process.stdout} is a TTY and the process is not running under CI.
|
|
30
|
+
* Use for terminal-only output (e.g. live tables, ANSI) that does not read from stdin.
|
|
31
|
+
* This is not the same as {@link isInteractiveTerminalSession} (which also requires a TTY on stdin for prompts).
|
|
32
|
+
*/
|
|
33
|
+
export declare function isStdoutTTY(): boolean;
|
|
19
34
|
export type ExecOptions = {
|
|
20
35
|
silent?: boolean;
|
|
21
36
|
showCommand?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Merged on top of `process.env` for the child process. When omitted, the child inherits the current environment (default `spawn` behavior).
|
|
39
|
+
*/
|
|
40
|
+
env?: NodeJS.ProcessEnv;
|
|
41
|
+
/**
|
|
42
|
+
* Substrings replaced with `*****` in streamed lines, captured output, and the logged command line.
|
|
43
|
+
* Only values with length >= 4 are applied (avoids noisy replacements). Longer literals are applied first.
|
|
44
|
+
*/
|
|
45
|
+
redactLiterals?: readonly string[];
|
|
22
46
|
};
|
|
47
|
+
/** Dedupes, trims, drops short values, longest-first (so one secret cannot leak via another). */
|
|
48
|
+
export declare function orderedRedactionSecrets(literals: readonly string[] | undefined): string[];
|
|
49
|
+
/** Replaces each configured literal with `*****` everywhere it appears in `text`. */
|
|
50
|
+
export declare function redactSensitiveLiterals(text: string, literals: readonly string[] | undefined): string;
|
|
23
51
|
/**
|
|
24
52
|
* Executes a command with arguments and options.
|
|
25
53
|
* @param command The command to execute.
|
|
@@ -29,8 +57,32 @@ export type ExecOptions = {
|
|
|
29
57
|
* @throws An error if the command returns a non-zero exit code.
|
|
30
58
|
*/
|
|
31
59
|
export declare function Exec(command: string, args: string[], options?: ExecOptions): Promise<string>;
|
|
60
|
+
/**
|
|
61
|
+
* Confines archive extraction paths before spawning tools (mitigates CodeQL `js/shell-command-constructed-from-input`).
|
|
62
|
+
* Both paths must resolve under the given roots (e.g. temp download dir and managed UPM root).
|
|
63
|
+
*/
|
|
64
|
+
export interface ZipExtractPathTrust {
|
|
65
|
+
/** Directory tree that must contain `zipPath` (e.g. resolved temp root for this download). */
|
|
66
|
+
zipUnder: string;
|
|
67
|
+
/** Directory tree that must contain `destDir` (e.g. managed `~/.unity-cli/upm`). */
|
|
68
|
+
destUnder: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extracts a zip archive using OS tools (PowerShell on Windows, `unzip` elsewhere).
|
|
72
|
+
*/
|
|
73
|
+
export declare function extractZipNative(zipPath: string, destDir: string, pathTrust: ZipExtractPathTrust, execOptions?: ExecOptions): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* GET an HTTPS URL and return the response body as UTF-8 text (trimmed).
|
|
76
|
+
* @throws If the response status is not 200 or the request fails.
|
|
77
|
+
*/
|
|
78
|
+
export declare function HttpsGetText(url: string): Promise<string>;
|
|
79
|
+
/**
|
|
80
|
+
* Computes the SHA-256 digest of a file as a lowercase hex string.
|
|
81
|
+
*/
|
|
82
|
+
export declare function Sha256FileHex(filePath: string): Promise<string>;
|
|
32
83
|
/**
|
|
33
84
|
* Downloads a file from a URL to a specified path.
|
|
85
|
+
* Requires HTTP status 200 before writing. Verifies the file is readable after download.
|
|
34
86
|
* @param url The URL to download from.
|
|
35
87
|
* @param downloadPath The path to save the downloaded file.
|
|
36
88
|
* @throws An error if the download fails or the file is not accessible after download.
|