@mobilewright/driver-mobilenext 0.0.1

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,47 @@
1
+ import type { AppInfo, ConnectionConfig, DeviceInfo, DeviceType, GestureSequence, HardwareButton, LaunchOptions, ListDevicesOptions, MobilewrightDriver, Orientation, RecordingOptions, RecordingResult, ScreenSize, ScreenshotOptions, Session, SwipeDirection, SwipeOptions, ViewNode } from '@mobilewright/protocol';
2
+ export declare const DEFAULT_URL = "wss://api.mobilenext.ai/ws";
3
+ export interface MobileNextDriverOptions {
4
+ region?: string;
5
+ apiKey?: string;
6
+ }
7
+ export interface MobileNextDeviceInfo {
8
+ model?: string;
9
+ osVersion?: string;
10
+ type?: DeviceType;
11
+ }
12
+ export declare class MobileNextDriver implements MobilewrightDriver {
13
+ private session;
14
+ private readonly options;
15
+ private ownsLease;
16
+ get deviceInfo(): MobileNextDeviceInfo | null;
17
+ constructor(options?: MobileNextDriverOptions);
18
+ connect(config: ConnectionConfig): Promise<Session>;
19
+ private waitForAllocation;
20
+ disconnect(): Promise<void>;
21
+ private buildFilters;
22
+ getViewHierarchy(): Promise<ViewNode[]>;
23
+ tap(x: number, y: number): Promise<void>;
24
+ doubleTap(x: number, y: number): Promise<void>;
25
+ longPress(x: number, y: number, duration?: number): Promise<void>;
26
+ typeText(text: string): Promise<void>;
27
+ swipe(direction: SwipeDirection, opts?: SwipeOptions): Promise<void>;
28
+ gesture(gestures: GestureSequence): Promise<void>;
29
+ pressButton(button: HardwareButton): Promise<void>;
30
+ screenshot(opts?: ScreenshotOptions): Promise<Buffer>;
31
+ getScreenSize(): Promise<ScreenSize>;
32
+ getOrientation(): Promise<Orientation>;
33
+ setOrientation(orientation: Orientation): Promise<void>;
34
+ startRecording(opts: RecordingOptions): Promise<void>;
35
+ stopRecording(): Promise<RecordingResult>;
36
+ launchApp(bundleId: string, opts?: LaunchOptions): Promise<void>;
37
+ terminateApp(bundleId: string): Promise<void>;
38
+ listApps(): Promise<AppInfo[]>;
39
+ getForegroundApp(): Promise<AppInfo>;
40
+ installApp(filePath: string): Promise<void>;
41
+ uninstallApp(bundleId: string): Promise<void>;
42
+ listDevices(opts?: ListDevicesOptions): Promise<DeviceInfo[]>;
43
+ openUrl(url: string): Promise<void>;
44
+ private call;
45
+ private requireSession;
46
+ }
47
+ //# sourceMappingURL=driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"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"}
package/dist/driver.js ADDED
@@ -0,0 +1,355 @@
1
+ import { createReadStream, openSync, readSync, closeSync } from 'node:fs';
2
+ import { stat } from 'node:fs/promises';
3
+ import { basename } from 'node:path';
4
+ import createDebug from 'debug';
5
+ import { RpcClient } from './rpc-client.js';
6
+ export const DEFAULT_URL = 'wss://api.mobilenext.ai/ws';
7
+ const VALID_PLATFORMS = new Set(['ios', 'android']);
8
+ const VALID_DEVICE_TYPES = new Set(['real', 'simulator', 'emulator']);
9
+ const VALID_DEVICE_STATES = new Set(['online', 'offline']);
10
+ function toPlatform(value) {
11
+ return VALID_PLATFORMS.has(value) ? value : undefined;
12
+ }
13
+ function toDeviceType(value) {
14
+ return VALID_DEVICE_TYPES.has(value) ? value : 'real';
15
+ }
16
+ function toDeviceState(value) {
17
+ return VALID_DEVICE_STATES.has(value) ? value : 'offline';
18
+ }
19
+ function elementToViewNode(el) {
20
+ const bounds = el.rect ?? { x: 0, y: 0, width: 0, height: 0 };
21
+ return {
22
+ type: el.type ?? 'Unknown',
23
+ label: el.label || undefined,
24
+ identifier: el.identifier || el.name || undefined,
25
+ value: el.value || undefined,
26
+ text: el.text || undefined,
27
+ placeholder: el.placeholder || undefined,
28
+ isVisible: typeof el.visible === 'boolean' ? el.visible : bounds.width > 0 && bounds.height > 0,
29
+ isEnabled: el.enabled ?? true,
30
+ bounds,
31
+ children: el.children?.map(elementToViewNode) ?? [],
32
+ raw: { ...el },
33
+ };
34
+ }
35
+ function appendQueryParam(url, key, value) {
36
+ const separator = url.includes('?') ? '&' : '?';
37
+ return `${url}${separator}${key}=${encodeURIComponent(value)}`;
38
+ }
39
+ const ZIP_MAGIC = Buffer.from([0x50, 0x4B, 0x03, 0x04]);
40
+ function assertValidZipFile(path) {
41
+ const buf = Buffer.alloc(4);
42
+ const fd = openSync(path, 'r');
43
+ try {
44
+ readSync(fd, buf, { offset: 0, length: 4, position: 0 });
45
+ }
46
+ finally {
47
+ closeSync(fd);
48
+ }
49
+ if (!buf.equals(ZIP_MAGIC)) {
50
+ throw new Error(`"${path}" is not a valid ZIP file`);
51
+ }
52
+ }
53
+ function sanitizeFilename(name) {
54
+ return name.replace(/[^0-9a-zA-Z_.]/g, '_');
55
+ }
56
+ const debug = createDebug('mw:driver-mobilenext');
57
+ export class MobileNextDriver {
58
+ get deviceInfo() {
59
+ if (!this.session) {
60
+ return null;
61
+ }
62
+ return { model: this.session.model, osVersion: this.session.osVersion, type: this.session.type };
63
+ }
64
+ constructor(options = {}) {
65
+ this.session = null;
66
+ this.ownsLease = false;
67
+ this.options = options;
68
+ }
69
+ // ─── Connection ──────────────────────────────────────────────
70
+ async connect(config) {
71
+ const baseUrl = config.url ?? DEFAULT_URL;
72
+ const url = this.options.apiKey
73
+ ? appendQueryParam(baseUrl, 'token', this.options.apiKey)
74
+ : baseUrl;
75
+ debug('connecting to %s', baseUrl);
76
+ const rpc = new RpcClient(url, config.timeout);
77
+ await rpc.connect();
78
+ debug('websocket connected');
79
+ const platform = config.platform;
80
+ // When deviceId is provided the device is already allocated by the pool
81
+ // coordinator. Connect directly without fleet.allocate; this instance
82
+ // does not own the lease and must not call fleet.release on disconnect.
83
+ if (config.deviceId) {
84
+ debug('reusing pre-allocated device %s', config.deviceId);
85
+ this.ownsLease = false;
86
+ this.session = { deviceId: config.deviceId, platform, rpc };
87
+ return { deviceId: config.deviceId, platform };
88
+ }
89
+ this.ownsLease = true;
90
+ const filters = this.buildFilters(config);
91
+ debug('allocating device with filters %o', filters);
92
+ const result = await rpc.call('fleet.allocate', { filters });
93
+ let deviceId;
94
+ let model;
95
+ let osVersion;
96
+ let type;
97
+ if (result?.state === 'allocating' && result.sessionId) {
98
+ debug('device is provisioning, waiting for allocation (session=%s)', result.sessionId);
99
+ const device = await this.waitForAllocation(rpc, result.sessionId, config.timeout);
100
+ debug('allocated device %s (session=%s, model=%s)', device.id, result.sessionId, device.model);
101
+ deviceId = device.id;
102
+ model = device.model;
103
+ osVersion = device.version;
104
+ type = toDeviceType(device.type);
105
+ }
106
+ else if (result?.device?.id) {
107
+ debug('allocated device %s (session=%s, model=%s)', result.device.id, result.sessionId, result.device.model);
108
+ deviceId = result.device.id;
109
+ model = result.device.model;
110
+ osVersion = result.device.version;
111
+ type = toDeviceType(result.device.type);
112
+ }
113
+ else {
114
+ throw new Error(`Device allocation failed: ${JSON.stringify(result)}`);
115
+ }
116
+ this.session = { deviceId, platform, rpc, model, osVersion, type };
117
+ return { deviceId, platform };
118
+ }
119
+ async waitForAllocation(rpc, sessionId, timeout = 300_000) {
120
+ const pollInterval = 5_000;
121
+ const deadline = Date.now() + timeout;
122
+ while (Date.now() < deadline) {
123
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
124
+ const elapsed = Math.round((timeout - (deadline - Date.now())) / 1000);
125
+ debug('waiting for device allocation, session=%s (%ds elapsed)', sessionId, elapsed);
126
+ const result = await rpc.call('devices.list', {});
127
+ const device = result.devices.find((d) => d.provider?.sessionId === sessionId);
128
+ if (!device) {
129
+ continue;
130
+ }
131
+ if (device.state !== 'allocating') {
132
+ return device;
133
+ }
134
+ }
135
+ throw new Error(`Timed out waiting for device allocation after ${timeout / 1000}s (session=${sessionId})`);
136
+ }
137
+ async disconnect() {
138
+ const session = this.requireSession();
139
+ if (this.ownsLease) {
140
+ debug('releasing device %s', session.deviceId);
141
+ await session.rpc.call('fleet.release', { deviceId: session.deviceId });
142
+ }
143
+ await session.rpc.disconnect();
144
+ this.session = null;
145
+ this.ownsLease = false;
146
+ debug('disconnected');
147
+ }
148
+ buildFilters(config) {
149
+ const filters = [
150
+ { attribute: 'platform', operator: 'EQUALS', value: config.platform },
151
+ ];
152
+ if (config.deviceName) {
153
+ const name = typeof config.deviceName === 'string'
154
+ ? config.deviceName
155
+ : config.deviceName.source;
156
+ filters.push({ attribute: 'name', operator: 'CONTAINS', value: name });
157
+ }
158
+ if (config.osVersion) {
159
+ filters.push({ attribute: 'version', operator: 'EQUALS', value: config.osVersion });
160
+ }
161
+ return filters;
162
+ }
163
+ // ─── UI hierarchy ───────────────────────────────────────────
164
+ async getViewHierarchy() {
165
+ const result = await this.call('device.dump.ui');
166
+ return result.elements.map(elementToViewNode);
167
+ }
168
+ // ─── Input ──────────────────────────────────────────────────
169
+ async tap(x, y) {
170
+ await this.call('device.io.tap', { x: Math.round(x), y: Math.round(y) });
171
+ }
172
+ async doubleTap(x, y) {
173
+ await this.call('device.io.tap', { x, y });
174
+ await this.call('device.io.tap', { x, y });
175
+ }
176
+ async longPress(x, y, duration) {
177
+ await this.call('device.io.longpress', { x, y, ...(duration !== undefined && { duration }) });
178
+ }
179
+ async typeText(text) {
180
+ await this.call('device.io.text', { text });
181
+ }
182
+ async swipe(direction, opts) {
183
+ const screen = await this.getScreenSize();
184
+ const centerX = screen.width / 2;
185
+ const centerY = screen.height / 2;
186
+ const startX = opts?.startX ?? centerX;
187
+ const startY = opts?.startY ?? centerY;
188
+ const isHorizontal = direction === 'left' || direction === 'right';
189
+ const defaultDistance = (isHorizontal ? screen.width : screen.height) * 0.5;
190
+ const distance = opts?.distance ?? defaultDistance;
191
+ let endX = startX;
192
+ let endY = startY;
193
+ switch (direction) {
194
+ case 'up':
195
+ endY = startY - distance;
196
+ break;
197
+ case 'down':
198
+ endY = startY + distance;
199
+ break;
200
+ case 'left':
201
+ endX = startX - distance;
202
+ break;
203
+ case 'right':
204
+ endX = startX + distance;
205
+ break;
206
+ }
207
+ await this.call('device.io.swipe', {
208
+ x1: Math.round(startX),
209
+ y1: Math.round(startY),
210
+ x2: Math.round(endX),
211
+ y2: Math.round(endY),
212
+ ...(opts?.duration !== undefined && { duration: opts.duration }),
213
+ });
214
+ }
215
+ async gesture(gestures) {
216
+ await this.call('device.io.gesture', { actions: gestures.pointers });
217
+ }
218
+ async pressButton(button) {
219
+ await this.call('device.io.button', { button });
220
+ }
221
+ // ─── Screen ─────────────────────────────────────────────────
222
+ async screenshot(opts) {
223
+ const result = await this.call('device.screenshot', {
224
+ ...(opts?.format && { format: opts.format }),
225
+ ...(opts?.quality !== undefined && { quality: opts.quality }),
226
+ });
227
+ let b64 = result.data;
228
+ const commaIdx = b64.indexOf(',');
229
+ if (commaIdx !== -1) {
230
+ b64 = b64.slice(commaIdx + 1);
231
+ }
232
+ return Buffer.from(b64, 'base64');
233
+ }
234
+ async getScreenSize() {
235
+ const result = await this.call('device.info');
236
+ const info = result.device;
237
+ return info.screenSize ?? { width: info.screenWidth ?? 0, height: info.screenHeight ?? 0, scale: 1 };
238
+ }
239
+ async getOrientation() {
240
+ const result = await this.call('device.io.orientation.get');
241
+ return result.orientation === 'landscape' ? 'landscape' : 'portrait';
242
+ }
243
+ async setOrientation(orientation) {
244
+ await this.call('device.io.orientation.set', { orientation });
245
+ }
246
+ // ─── Recording ──────────────────────────────────────────────
247
+ async startRecording(opts) {
248
+ await this.call('device.screenrecord', {
249
+ output: opts.output,
250
+ ...(opts.timeLimit !== undefined && { timeLimit: opts.timeLimit }),
251
+ });
252
+ }
253
+ async stopRecording() {
254
+ const result = await this.call('device.screenrecord.stop');
255
+ if (result.url) {
256
+ debug('download screen recording from %s', result.url.split('?')[0]);
257
+ }
258
+ return result;
259
+ }
260
+ // ─── Apps ───────────────────────────────────────────────────
261
+ async launchApp(bundleId, opts) {
262
+ await this.call('device.apps.launch', {
263
+ bundleId,
264
+ ...(opts?.locales && { locales: opts.locales }),
265
+ });
266
+ }
267
+ async terminateApp(bundleId) {
268
+ await this.call('device.apps.terminate', { bundleId });
269
+ }
270
+ async listApps() {
271
+ // iOS returns a flat array, Android returns { apps: [...] }.
272
+ const result = await this.call('device.apps.list');
273
+ const apps = Array.isArray(result) ? result : result.apps;
274
+ return apps.map((app) => ({
275
+ bundleId: app.bundleId ?? app.packageName ?? '',
276
+ name: app.appName,
277
+ version: app.version,
278
+ }));
279
+ }
280
+ async getForegroundApp() {
281
+ const result = await this.call('device.apps.foreground');
282
+ return {
283
+ bundleId: result.bundleId ?? result.packageName ?? '',
284
+ name: result.appName,
285
+ version: result.version,
286
+ };
287
+ }
288
+ async installApp(filePath) {
289
+ assertValidZipFile(filePath);
290
+ const fileInfo = await stat(filePath);
291
+ const filename = sanitizeFilename(basename(filePath));
292
+ debug('creating upload for %s (%d bytes)', filename, fileInfo.size);
293
+ const upload = await this.call('uploads.create', {
294
+ filename,
295
+ filesize: fileInfo.size,
296
+ });
297
+ debug('uploading %s to S3 (uploadId=%s)', filename, upload.uploadId);
298
+ const body = createReadStream(filePath);
299
+ const response = await fetch(upload.uploadUrl, {
300
+ method: 'PUT',
301
+ headers: {
302
+ 'Content-Type': 'application/octet-stream',
303
+ 'Content-Length': String(fileInfo.size),
304
+ },
305
+ body,
306
+ duplex: 'half',
307
+ });
308
+ if (!response.ok) {
309
+ throw new Error(`Upload failed with status ${response.status}`);
310
+ }
311
+ debug('upload complete, installing app (uploadId=%s)', upload.uploadId);
312
+ await this.call('device.apps.install', { uploadId: upload.uploadId });
313
+ debug('app installed successfully: %s', filename);
314
+ }
315
+ async uninstallApp(bundleId) {
316
+ await this.call('device.apps.uninstall', { bundleId });
317
+ }
318
+ // ─── Device ─────────────────────────────────────────────────
319
+ async listDevices(opts) {
320
+ const result = await this.call('device.list');
321
+ let devices = result.data.devices;
322
+ if (opts?.platform) {
323
+ devices = devices.filter((d) => d.platform === opts.platform);
324
+ }
325
+ if (opts?.state) {
326
+ devices = devices.filter((d) => d.state === opts.state);
327
+ }
328
+ return devices
329
+ .filter((d) => toPlatform(d.platform) !== undefined)
330
+ .map((d) => ({
331
+ id: d.id ?? d.udid ?? '',
332
+ name: d.name,
333
+ platform: toPlatform(d.platform),
334
+ type: toDeviceType(d.type),
335
+ state: toDeviceState(d.state),
336
+ model: d.model,
337
+ osVersion: d.version,
338
+ }));
339
+ }
340
+ async openUrl(url) {
341
+ await this.call('device.url', { url });
342
+ }
343
+ // ─── Helpers ────────────────────────────────────────────────
344
+ call(method, params) {
345
+ const session = this.requireSession();
346
+ return session.rpc.call(method, { deviceId: session.deviceId, ...params });
347
+ }
348
+ requireSession() {
349
+ if (!this.session) {
350
+ throw new Error('No active session. Call connect() first.');
351
+ }
352
+ return this.session;
353
+ }
354
+ }
355
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../src/example.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import { writeFileSync } from 'node:fs';
2
+ import { MobileUseDriver } from './driver.js';
3
+ const API_KEY = "mob_Z2WFuDmQR3v7A5HJN1bJ18UjETPr4cDueZEt";
4
+ async function main() {
5
+ const driver = new MobileUseDriver({
6
+ // region: 'us-west-2',
7
+ // apiKey: 'your-api-key',
8
+ apiKey: API_KEY,
9
+ });
10
+ // Connect to a device
11
+ const session = await driver.connect({
12
+ platform: 'ios',
13
+ });
14
+ console.log('Connected:', session);
15
+ // Get screen size
16
+ const screenSize = await driver.getScreenSize();
17
+ console.log('Screen size:', screenSize);
18
+ // Get orientation
19
+ const orientation = await driver.getOrientation();
20
+ console.log('Orientation:', orientation);
21
+ // Take a screenshot and save to file
22
+ const screenshot = await driver.screenshot();
23
+ writeFileSync('screenshot.png', screenshot);
24
+ console.log('Screenshot saved to screenshot.png (%d bytes)', screenshot.length);
25
+ // List elements on screen
26
+ const elements = await driver.getViewHierarchy();
27
+ console.log('Elements on screen:', JSON.stringify(elements, null, 2));
28
+ // Type text
29
+ await driver.typeText('Hello from mobile-use driver!');
30
+ console.log('Typed text on screen');
31
+ // Disconnect
32
+ await driver.disconnect();
33
+ console.log('Disconnected');
34
+ }
35
+ main().catch((err) => {
36
+ console.error(err);
37
+ process.exit(1);
38
+ });
39
+ //# sourceMappingURL=example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.js","sourceRoot":"","sources":["../src/example.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,OAAO,GAAG,0CAA0C,CAAC;AAE3D,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,uBAAuB;QACvB,0BAA0B;QAC1B,MAAM,EAAE,OAAO;KAChB,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACnC,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEnC,kBAAkB;IAClB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAExC,kBAAkB;IAClB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAEzC,qCAAqC;IACrC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7C,aAAa,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,+CAA+C,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAEhF,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEtE,YAAY;IACZ,MAAM,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpC,aAAa;IACb,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC9B,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface GitInfo {
2
+ repoUrl?: string;
3
+ branch?: string;
4
+ commitSha?: string;
5
+ authorName?: string;
6
+ commitMessage?: string;
7
+ }
8
+ export declare function normalizeRepoUrl(url: string): string;
9
+ export declare function getGitInfo(): GitInfo;
10
+ //# sourceMappingURL=git-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-info.d.ts","sourceRoot":"","sources":["../src/git-info.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAcD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUpD;AAoHD,wBAAgB,UAAU,IAAI,OAAO,CAUpC"}
@@ -0,0 +1,142 @@
1
+ import { execSync } from 'node:child_process';
2
+ function runGit(args) {
3
+ try {
4
+ const result = execSync(['git', ...args].join(' '), {
5
+ encoding: 'utf8',
6
+ stdio: ['ignore', 'pipe', 'ignore'],
7
+ }).trim();
8
+ return result || undefined;
9
+ }
10
+ catch {
11
+ return undefined;
12
+ }
13
+ }
14
+ export function normalizeRepoUrl(url) {
15
+ const sshMatch = url.match(/^git@([^:]+):(.+?)(?:\.git)?$/);
16
+ if (sshMatch) {
17
+ return `https://${sshMatch[1]}/${sshMatch[2]}`;
18
+ }
19
+ const sshProtocolMatch = url.match(/^ssh:\/\/(?:[^@]+@)?([^/]+)\/(.+?)(?:\.git)?$/);
20
+ if (sshProtocolMatch) {
21
+ return `https://${sshProtocolMatch[1]}/${sshProtocolMatch[2]}`;
22
+ }
23
+ return url.replace(/\.git$/, '');
24
+ }
25
+ function getGitHubInfo() {
26
+ if (!process.env['GITHUB_ACTIONS']) {
27
+ return undefined;
28
+ }
29
+ const repo = process.env['GITHUB_REPOSITORY'];
30
+ return {
31
+ repoUrl: repo ? `https://github.com/${repo}` : undefined,
32
+ branch: process.env['GITHUB_REF_NAME'],
33
+ commitSha: process.env['GITHUB_SHA'],
34
+ authorName: process.env['GITHUB_ACTOR'],
35
+ commitMessage: process.env['GITHUB_COMMIT_MESSAGE'] ?? runGit(['log', '-1', '--format=%s']),
36
+ };
37
+ }
38
+ function getGitLabInfo() {
39
+ if (!process.env['GITLAB_CI']) {
40
+ return undefined;
41
+ }
42
+ return {
43
+ repoUrl: process.env['CI_PROJECT_URL'],
44
+ branch: process.env['CI_COMMIT_REF_NAME'],
45
+ commitSha: process.env['CI_COMMIT_SHA'],
46
+ authorName: process.env['GITLAB_USER_NAME'] ?? process.env['CI_COMMIT_AUTHOR'],
47
+ commitMessage: process.env['CI_COMMIT_MESSAGE'],
48
+ };
49
+ }
50
+ function getJenkinsInfo() {
51
+ if (!process.env['JENKINS_URL']) {
52
+ return undefined;
53
+ }
54
+ const rawUrl = process.env['GIT_URL'];
55
+ const branch = process.env['GIT_BRANCH'] ?? process.env['BRANCH_NAME'] ?? process.env['GIT_LOCAL_BRANCH'];
56
+ return {
57
+ repoUrl: rawUrl ? normalizeRepoUrl(rawUrl) : undefined,
58
+ branch,
59
+ commitSha: process.env['GIT_COMMIT'],
60
+ authorName: process.env['GIT_AUTHOR_NAME'],
61
+ commitMessage: runGit(['log', '-1', '--format=%s']),
62
+ };
63
+ }
64
+ function getCircleCIInfo() {
65
+ if (!process.env['CIRCLECI']) {
66
+ return undefined;
67
+ }
68
+ const username = process.env['CIRCLE_PROJECT_USERNAME'];
69
+ const reponame = process.env['CIRCLE_PROJECT_REPONAME'];
70
+ const vcsType = process.env['CIRCLE_VCS_TYPE'] ?? 'github';
71
+ const host = vcsType === 'bitbucket' ? 'bitbucket.org' : 'github.com';
72
+ return {
73
+ repoUrl: username && reponame ? `https://${host}/${username}/${reponame}` : undefined,
74
+ branch: process.env['CIRCLE_BRANCH'],
75
+ commitSha: process.env['CIRCLE_SHA1'],
76
+ authorName: process.env['CIRCLE_USERNAME'],
77
+ commitMessage: runGit(['log', '-1', '--format=%s']),
78
+ };
79
+ }
80
+ function getTravisInfo() {
81
+ if (!process.env['TRAVIS']) {
82
+ return undefined;
83
+ }
84
+ const slug = process.env['TRAVIS_REPO_SLUG'];
85
+ return {
86
+ repoUrl: slug ? `https://github.com/${slug}` : undefined,
87
+ branch: process.env['TRAVIS_PULL_REQUEST_BRANCH'] ?? process.env['TRAVIS_BRANCH'],
88
+ commitSha: process.env['TRAVIS_COMMIT'],
89
+ commitMessage: process.env['TRAVIS_COMMIT_MESSAGE'],
90
+ };
91
+ }
92
+ function getAzureDevOpsInfo() {
93
+ if (!process.env['TF_BUILD']) {
94
+ return undefined;
95
+ }
96
+ const rawBranch = process.env['SYSTEM_PULLREQUEST_SOURCEBRANCH'] ?? process.env['BUILD_SOURCEBRANCH'];
97
+ return {
98
+ repoUrl: process.env['BUILD_REPOSITORY_URI'],
99
+ branch: rawBranch?.replace('refs/heads/', ''),
100
+ commitSha: process.env['BUILD_SOURCEVERSION'],
101
+ authorName: process.env['BUILD_REQUESTEDFOR'],
102
+ commitMessage: process.env['BUILD_SOURCEVERSIONMESSAGE'],
103
+ };
104
+ }
105
+ function getBitbucketInfo() {
106
+ if (!process.env['BITBUCKET_PIPELINE_UUID']) {
107
+ return undefined;
108
+ }
109
+ const slug = process.env['BITBUCKET_REPO_FULL_NAME'];
110
+ return {
111
+ repoUrl: slug ? `https://bitbucket.org/${slug}` : undefined,
112
+ branch: process.env['BITBUCKET_BRANCH'],
113
+ commitSha: process.env['BITBUCKET_COMMIT'],
114
+ commitMessage: runGit(['log', '-1', '--format=%s']),
115
+ };
116
+ }
117
+ function getLocalGitInfo() {
118
+ const gitDir = runGit(['rev-parse', '--git-dir']);
119
+ if (!gitDir) {
120
+ return undefined;
121
+ }
122
+ const rawUrl = runGit(['config', '--get', 'remote.origin.url']);
123
+ return {
124
+ repoUrl: rawUrl ? normalizeRepoUrl(rawUrl) : undefined,
125
+ branch: runGit(['rev-parse', '--abbrev-ref', 'HEAD']),
126
+ commitSha: runGit(['rev-parse', 'HEAD']),
127
+ authorName: runGit(['log', '-1', '--format=%an']),
128
+ commitMessage: runGit(['log', '-1', '--format=%s']),
129
+ };
130
+ }
131
+ export function getGitInfo() {
132
+ const info = getGitHubInfo()
133
+ ?? getGitLabInfo()
134
+ ?? getJenkinsInfo()
135
+ ?? getCircleCIInfo()
136
+ ?? getTravisInfo()
137
+ ?? getAzureDevOpsInfo()
138
+ ?? getBitbucketInfo()
139
+ ?? getLocalGitInfo();
140
+ return info ?? {};
141
+ }
142
+ //# sourceMappingURL=git-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-info.js","sourceRoot":"","sources":["../src/git-info.ts"],"names":[],"mappings":"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"}