@rage-against-the-pixel/unity-cli 1.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.
@@ -0,0 +1,333 @@
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.UnityEditor = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const logging_1 = require("./logging");
40
+ const utilities_1 = require("./utilities");
41
+ const child_process_1 = require("child_process");
42
+ class UnityEditor {
43
+ editorPath;
44
+ editorRootPath;
45
+ procInfo;
46
+ pidFile;
47
+ logger = logging_1.Logger.instance;
48
+ autoAddNoGraphics;
49
+ constructor(editorPath) {
50
+ this.editorPath = editorPath;
51
+ if (!fs.existsSync(editorPath)) {
52
+ throw new Error(`The Unity Editor path does not exist: ${editorPath}`);
53
+ }
54
+ fs.accessSync(editorPath, fs.constants.X_OK);
55
+ this.editorRootPath = UnityEditor.GetEditorRootPath(editorPath);
56
+ this.pidFile = path.join(process.env.RUNNER_TEMP || process.env.USERPROFILE || '.', '.unity', 'unity-editor-process-id.txt');
57
+ const match = editorPath.match(/(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/);
58
+ if (!match) {
59
+ throw Error(`Invalid Unity Editor Path: ${editorPath}`);
60
+ }
61
+ const unityMajorVersion = match.groups?.major;
62
+ if (!unityMajorVersion) {
63
+ throw Error(`Invalid Unity Major Version: ${editorPath}`);
64
+ }
65
+ this.autoAddNoGraphics = parseInt(unityMajorVersion, 10) > 2018;
66
+ }
67
+ /**
68
+ * Get the full path to a Unity project template based on the provided template name or regex pattern.
69
+ * @param template The name or regex pattern of the template to find.
70
+ * @returns The full path to the matching template file.
71
+ * @throws Error if the template directory does not exist, no templates are found, or no matching template is found.
72
+ */
73
+ GetTemplatePath(template) {
74
+ let templateDir;
75
+ let editorRoot = path.dirname(this.editorPath);
76
+ if (process.platform === 'darwin') {
77
+ templateDir = path.join(path.dirname(editorRoot), 'Resources', 'PackageManager', 'ProjectTemplates');
78
+ }
79
+ else {
80
+ templateDir = path.join(editorRoot, 'Data', 'Resources', 'PackageManager', 'ProjectTemplates');
81
+ }
82
+ // Check if the template directory exists
83
+ if (!fs.existsSync(templateDir) ||
84
+ !fs.statSync(templateDir).isDirectory()) {
85
+ throw new Error(`Template directory not found: ${templateDir}`);
86
+ }
87
+ // Find all .tgz files in the template directory
88
+ const files = fs.readdirSync(templateDir)
89
+ .filter(f => f.endsWith('.tgz'))
90
+ .map(f => path.join(templateDir, f));
91
+ if (files.length === 0) {
92
+ throw new Error(`No templates found in ${templateDir}`);
93
+ }
94
+ this.logger.ci(`Available templates:`);
95
+ files.forEach(f => this.logger.ci(` > ${path.basename(f)}`));
96
+ // Build a regex to match the template name and version (e.g., com.unity.template.3d.*[0-9]+\.[0-9]+\.[0-9]+\.tgz)
97
+ // Accepts either a full regex or a simple string
98
+ let regex;
99
+ try {
100
+ regex = new RegExp(template + ".*[0-9]+\\.[0-9]+\\.[0-9]+\\.tgz");
101
+ }
102
+ catch (e) {
103
+ throw new Error(`Invalid template regex: ${template}`);
104
+ }
105
+ // Filter files by regex
106
+ const matches = files.filter(f => regex.test(path.basename(f)));
107
+ if (matches.length === 0) {
108
+ throw new Error(`${template} path not found in ${templateDir}!`);
109
+ }
110
+ // Pick the longest match (as in the shell script: sort by length descending)
111
+ matches.sort((a, b) => b.length - a.length);
112
+ const templatePath = matches[0];
113
+ if (!templatePath) {
114
+ throw new Error('No matching template path found.');
115
+ }
116
+ return path.normalize(templatePath);
117
+ }
118
+ async Run(command) {
119
+ let isCancelled = false;
120
+ const onCancel = async () => {
121
+ isCancelled = true;
122
+ await this.tryKillEditorProcess();
123
+ };
124
+ process.once('SIGINT', onCancel);
125
+ process.once('SIGTERM', onCancel);
126
+ let exitCode;
127
+ try {
128
+ const commandStr = `\x1b[34m${this.editorPath} ${command.args.join(' ')}\x1b[0m`;
129
+ this.logger.startGroup(commandStr);
130
+ exitCode = await this.exec(command, pInfo => { this.procInfo = pInfo; });
131
+ }
132
+ catch (error) {
133
+ if (error instanceof Error) {
134
+ this.logger.error(error.toString());
135
+ }
136
+ if (!exitCode) {
137
+ exitCode = 1;
138
+ }
139
+ }
140
+ finally {
141
+ this.logger.endGroup();
142
+ if (!isCancelled) {
143
+ await this.tryKillEditorProcess();
144
+ if (exitCode !== 0) {
145
+ throw Error(`Unity failed with exit code ${exitCode}`);
146
+ }
147
+ }
148
+ }
149
+ }
150
+ GetLogsDirectory(projectPath) {
151
+ const logsDir = projectPath !== undefined
152
+ ? path.join(projectPath, 'Builds', 'Logs')
153
+ : path.join(process.env.GITHUB_WORKSPACE || process.cwd(), 'Logs');
154
+ try {
155
+ fs.accessSync(logsDir, fs.constants.R_OK);
156
+ }
157
+ catch (error) {
158
+ this.logger.debug(`Creating Logs Directory:\n > "${logsDir}"`);
159
+ fs.mkdirSync(logsDir, { recursive: true });
160
+ }
161
+ return logsDir;
162
+ }
163
+ GenerateLogFilePath(projectPath, prefix = undefined) {
164
+ const logsDir = this.GetLogsDirectory(projectPath);
165
+ const timestamp = new Date().toISOString().replace(/[-:]/g, ``).replace(/\..+/, ``);
166
+ return path.join(logsDir, `${prefix ? prefix + '-' : ''}Unity-${timestamp}.log`);
167
+ }
168
+ async exec(command, onPid) {
169
+ if (!command.args || command.args.length === 0) {
170
+ throw Error('No command arguments provided for Unity execution');
171
+ }
172
+ if (!command.args.includes(`-automated`)) {
173
+ command.args.push(`-automated`);
174
+ }
175
+ if (!command.args.includes(`-batchmode`)) {
176
+ command.args.push(`-batchmode`);
177
+ }
178
+ if (this.autoAddNoGraphics &&
179
+ !command.args.includes(`-nographics`) &&
180
+ !command.args.includes(`-force-graphics`)) {
181
+ command.args.push(`-nographics`);
182
+ }
183
+ if (!command.args.includes('-logFile')) {
184
+ command.args.push('-logFile', this.GenerateLogFilePath(command.projectPath));
185
+ }
186
+ const logPath = (0, utilities_1.getArgumentValueAsString)('-logFile', command.args);
187
+ let unityProcess;
188
+ if (process.platform === 'linux' && !command.args.includes('-nographics')) {
189
+ unityProcess = (0, child_process_1.spawn)('xvfb-run', [this.editorPath, ...command.args], {
190
+ stdio: ['ignore', 'ignore', 'ignore'],
191
+ detached: true,
192
+ env: {
193
+ ...process.env,
194
+ DISPLAY: ':99',
195
+ UNITY_THISISABUILDMACHINE: '1'
196
+ }
197
+ });
198
+ }
199
+ else {
200
+ unityProcess = (0, child_process_1.spawn)(this.editorPath, command.args, {
201
+ stdio: ['ignore', 'ignore', 'ignore'],
202
+ detached: true,
203
+ env: {
204
+ ...process.env,
205
+ UNITY_THISISABUILDMACHINE: '1'
206
+ }
207
+ });
208
+ }
209
+ const processId = unityProcess.pid;
210
+ if (!processId) {
211
+ throw new Error('Failed to start Unity process!');
212
+ }
213
+ onPid({ pid: processId, ppid: process.pid, name: this.editorPath });
214
+ this.logger.debug(`Unity process started with pid: ${processId}`);
215
+ // make sure the directory for the PID file exists
216
+ const pidDir = path.dirname(this.pidFile);
217
+ if (!fs.existsSync(pidDir)) {
218
+ fs.mkdirSync(pidDir, { recursive: true });
219
+ }
220
+ else {
221
+ try {
222
+ var existingProcInfo = await (0, utilities_1.readPidFile)(this.pidFile);
223
+ if (existingProcInfo) {
224
+ const killedPid = await (0, utilities_1.tryKillProcess)(existingProcInfo);
225
+ if (killedPid) {
226
+ this.logger.warn(`Killed existing Unity process with pid: ${killedPid}`);
227
+ }
228
+ }
229
+ }
230
+ catch {
231
+ // PID file does not exist, continue
232
+ }
233
+ }
234
+ // Write the PID to the PID file
235
+ fs.writeFileSync(this.pidFile, String(processId));
236
+ const logPollingInterval = 100; // milliseconds
237
+ // Wait for log file to appear
238
+ while (!fs.existsSync(logPath)) {
239
+ await new Promise(res => setTimeout(res, logPollingInterval));
240
+ }
241
+ // Start tailing the log file
242
+ let lastSize = 0;
243
+ let logEnded = false;
244
+ const tailLog = async () => {
245
+ while (!logEnded) {
246
+ try {
247
+ const stats = fs.statSync(logPath);
248
+ if (stats.size > lastSize) {
249
+ const fd = fs.openSync(logPath, 'r');
250
+ const buffer = Buffer.alloc(stats.size - lastSize);
251
+ fs.readSync(fd, buffer, 0, buffer.length, lastSize);
252
+ process.stdout.write(buffer.toString('utf8'));
253
+ fs.closeSync(fd);
254
+ lastSize = stats.size;
255
+ }
256
+ }
257
+ catch (error) {
258
+ // ignore read errors
259
+ }
260
+ await new Promise(res => setTimeout(res, logPollingInterval));
261
+ }
262
+ // Write a newline at the end of the log tail
263
+ // prevents appending logs from being printed on the same line
264
+ process.stdout.write('\n');
265
+ };
266
+ const timeout = 10000; // 10 seconds
267
+ // Start log tailing in background
268
+ const tailPromise = tailLog();
269
+ const exitCode = await new Promise((resolve, reject) => {
270
+ unityProcess.on('exit', (code) => {
271
+ setTimeout(() => {
272
+ logEnded = true;
273
+ resolve(code ?? 1);
274
+ }, timeout);
275
+ });
276
+ unityProcess.on('error', (error) => {
277
+ setTimeout(() => {
278
+ logEnded = true;
279
+ reject(error);
280
+ }, timeout);
281
+ });
282
+ });
283
+ // Wait for log tailing to finish
284
+ await tailPromise;
285
+ // Wait for log file to be unlocked
286
+ const start = Date.now();
287
+ let fileLocked = true;
288
+ while (fileLocked && Date.now() - start < timeout) {
289
+ try {
290
+ if (fs.existsSync(logPath)) {
291
+ const fd = fs.openSync(logPath, 'r+');
292
+ fs.closeSync(fd);
293
+ fileLocked = false;
294
+ }
295
+ else {
296
+ fileLocked = false;
297
+ }
298
+ }
299
+ catch {
300
+ fileLocked = true;
301
+ await new Promise(r => setTimeout(r, logPollingInterval));
302
+ }
303
+ }
304
+ return exitCode;
305
+ }
306
+ async tryKillEditorProcess() {
307
+ if (this.procInfo) {
308
+ await (0, utilities_1.tryKillProcess)(this.procInfo);
309
+ await (0, utilities_1.killChildProcesses)(this.procInfo);
310
+ }
311
+ else {
312
+ this.logger.debug('No Unity process info available to kill.');
313
+ }
314
+ }
315
+ static GetEditorRootPath(editorPath) {
316
+ let editorRootPath = editorPath;
317
+ switch (process.platform) {
318
+ case 'darwin':
319
+ editorRootPath = path.join(editorPath, '../../../../');
320
+ break;
321
+ case 'linux':
322
+ editorRootPath = path.join(editorPath, '../../');
323
+ break;
324
+ case 'win32':
325
+ editorRootPath = path.join(editorPath, '../../');
326
+ break;
327
+ }
328
+ fs.accessSync(editorRootPath, fs.constants.R_OK);
329
+ return editorRootPath;
330
+ }
331
+ }
332
+ exports.UnityEditor = UnityEditor;
333
+ //# sourceMappingURL=unity-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unity-editor.js","sourceRoot":"","sources":["../src/unity-editor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { ExecOptions } from './utilities';
2
+ import { UnityVersion } from './unity-version';
3
+ export declare class UnityHub {
4
+ executable: string;
5
+ rootDirectory: string;
6
+ editorInstallationDirectory: string;
7
+ editorFileExtension: string;
8
+ private logger;
9
+ constructor();
10
+ /**
11
+ * Executes the Unity Hub command with the specified arguments.
12
+ * @param args Arguments to pass to the Unity Hub executable.
13
+ * @param silent If true, suppresses output logging.
14
+ * @returns The output from the command.
15
+ */
16
+ Exec(args: string[], options?: ExecOptions): Promise<string>;
17
+ /**
18
+ * Prints the installed Unity Hub version.
19
+ */
20
+ Version(): Promise<string>;
21
+ /**
22
+ * Installs or updates the Unity Hub.
23
+ * If the Unity Hub is already installed, it will be updated to the latest version.
24
+ */
25
+ Install(): Promise<string>;
26
+ private installHub;
27
+ private getInstalledHubVersion;
28
+ private getLatestHubVersion;
29
+ /**
30
+ * Returns the path where the Unity editors will be installed.
31
+ * @returns {Promise<string>} The install path.
32
+ */
33
+ GetInstallPath(): Promise<string>;
34
+ /**
35
+ * Sets the path where Unity editors will be installed.
36
+ * @param installPath The path to set.
37
+ */
38
+ SetInstallPath(installPath: string): Promise<void>;
39
+ /**
40
+ * Locate and associate an installed editor from a stipulated path.
41
+ * @param editorPath
42
+ */
43
+ AddEditor(editorPath: string): Promise<void>;
44
+ /**
45
+ * Attempts to find or install the specified Unity Editor version with the requested modules.
46
+ * @param unityVersion The Unity version to find or install.
47
+ * @param modules The modules to install alongside the editor.
48
+ * @returns The path to the Unity Editor executable.
49
+ */
50
+ GetEditor(unityVersion: UnityVersion, modules: string[]): Promise<string>;
51
+ /**
52
+ * Lists the installed Unity Editors.
53
+ * @returns A list of installed Unity Editor versions and their paths.
54
+ */
55
+ ListInstalledEditors(): Promise<string[]>;
56
+ private checkInstalledEditors;
57
+ private getLatestHubReleases;
58
+ /**
59
+ * Patches the Bee Backend for Unity Linux Editor.
60
+ * https://discussions.unity.com/t/linux-editor-stuck-on-loading-because-of-bee-backend-w-workaround/854480
61
+ * @param editorPath The path to the Unity Editor executable.
62
+ */
63
+ private patchBeeBackend;
64
+ private getEditorReleaseInfo;
65
+ private fallbackVersionLookup;
66
+ private checkEditorModules;
67
+ private getModulesContent;
68
+ private installUnity;
69
+ private installUnity4x;
70
+ static GetPlatformTargetModuleMap(): {
71
+ [key: string]: string;
72
+ };
73
+ }