@goliapkg/sentori-cli 0.3.0 → 0.5.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/lib/index.js CHANGED
@@ -1,10 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { parseArgs } from 'node:util';
3
+ import { formatIssueLine, issueList, issuePatch } from './issue.js';
4
+ import { uploadDsym, uploadMapping } from './native-artifacts.js';
3
5
  import { reactNativeUpload } from './react-native.js';
4
6
  import { uploadSourcemaps } from './upload.js';
5
- const HELP = `sentori-cli — upload release artifacts to Sentori
7
+ const HELP = `sentori-cli — Sentori command-line interface
6
8
 
7
- Usage:
9
+ Source-map upload:
8
10
  sentori-cli upload sourcemap [options] <path...>
9
11
  Upload one or more files or directories. A directory is scanned
10
12
  (one level) for *.map / *.js / *.jsbundle / *.bundle / *.hbc;
@@ -16,14 +18,30 @@ Usage:
16
18
  and upload it (plus the bundle). Use this for a Hermes release
17
19
  build. Requires --metro-map and --hermes-map.
18
20
 
19
- Options (both commands):
21
+ Native artifacts (project-scoped, need --project + admin token):
22
+ sentori-cli upload dsym --project <uuid> [--release <r>] [--object-name <n>] [--debug-id <uuid> --arch <a>] <path>
23
+ Upload iOS dSYM debug info. By default walks a Foo.dSYM bundle
24
+ and uses "dwarfdump --uuid" to enumerate slices, uploading each.
25
+ Pass --debug-id and --arch to upload a single slice without
26
+ dwarfdump (useful in Linux CI where the toolchain isn't there).
27
+
28
+ sentori-cli upload mapping --project <uuid> [--release <r>] [--debug-id <uuid>] <mapping.txt>
29
+ Upload an R8 / ProGuard mapping (raw bytes). If the file starts
30
+ with a "# pg_map_id:" line the server sniffs the debug-id from
31
+ it; otherwise you can pass it explicitly.
32
+
33
+ CI triage:
34
+ sentori-cli issue list --project <uuid> [--status active|silenced|resolved|closed] [--limit N] [--error-type <t>]
35
+ sentori-cli issue resolve <issue-uuid> --project <uuid> [--in-release <r>]
36
+ sentori-cli issue silence <issue-uuid> --project <uuid>
37
+
38
+ Options (upload commands):
20
39
  --release <r> release identifier — MUST equal the value the SDK
21
- reports via init({ release }). Required. A mismatch
22
- means the dashboard silently can't symbolicate.
40
+ reports via init({ release }). Required.
23
41
  --token <t> Sentori token (or set $SENTORI_TOKEN).
24
42
  --api-url <url> Sentori API base (default https://api.sentori.golia.jp,
25
- or $SENTORI_API_URL). For a self-hosted instance,
26
- your host. (Accepts --ingest-url as an alias.)
43
+ or $SENTORI_API_URL). For a self-hosted instance, your
44
+ host. (Accepts --ingest-url as an alias.)
27
45
  --dry-run describe what would be uploaded; don't upload.
28
46
  -h, --help show this help.
29
47
 
@@ -32,6 +50,16 @@ Options (react-native upload):
32
50
  --hermes-map <p> the *.hbc.map the Hermes compiler emits.
33
51
  --bundle <p> optional: also upload the bundle (.jsbundle / .bundle).
34
52
 
53
+ Options (issue commands):
54
+ --project <uuid> project id (or set $SENTORI_PROJECT_ID).
55
+ --token <t> admin token, sk_… prefix (or $SENTORI_ADMIN_TOKEN /
56
+ $SENTORI_TOKEN). The ingest st_pk_ token may also work
57
+ on a self-hosted instance.
58
+ --api-url <url> Sentori API base (same as above).
59
+ --in-release <r> (resolve only) mark this release as where the fix
60
+ landed; the regression detector flips the issue back
61
+ to "regressed" if a matching event lands later.
62
+
35
63
  Hermes release build, by hand:
36
64
  npx react-native bundle --platform ios --dev false --entry-file index.js \\
37
65
  --bundle-output main.jsbundle --sourcemap-output main.jsbundle.packager.map
@@ -172,6 +200,239 @@ function reportUpload(result, c) {
172
200
  console.log(`uploaded ${result.uploaded ?? result.files.length} file(s) for release "${c.release}" — minified stacks on this release will now resolve to source.`);
173
201
  }
174
202
  }
203
+ function parseAdminCfg(values) {
204
+ const projectId = (typeof values.project === 'string' ? values.project : undefined) ??
205
+ process.env.SENTORI_PROJECT_ID;
206
+ if (!projectId) {
207
+ console.error('error: --project <uuid> (or $SENTORI_PROJECT_ID) is required');
208
+ return null;
209
+ }
210
+ const token = (typeof values.token === 'string' ? values.token : undefined) ??
211
+ process.env.SENTORI_ADMIN_TOKEN ??
212
+ process.env.SENTORI_TOKEN;
213
+ if (!token) {
214
+ console.error('error: --token (or $SENTORI_ADMIN_TOKEN / $SENTORI_TOKEN) is required for issue commands');
215
+ return null;
216
+ }
217
+ const apiUrl = (typeof values['api-url'] === 'string' ? values['api-url'] : undefined) ??
218
+ (typeof values['ingest-url'] === 'string' ? values['ingest-url'] : undefined) ??
219
+ process.env.SENTORI_API_URL ??
220
+ 'https://api.sentori.golia.jp';
221
+ return { apiUrl, projectId, token };
222
+ }
223
+ async function cmdIssueList(argv) {
224
+ let parsed;
225
+ try {
226
+ parsed = parseArgs({
227
+ args: argv,
228
+ options: {
229
+ 'api-url': { type: 'string' },
230
+ 'error-type': { type: 'string' },
231
+ help: { short: 'h', type: 'boolean' },
232
+ 'ingest-url': { type: 'string' },
233
+ limit: { type: 'string' },
234
+ project: { type: 'string' },
235
+ status: { type: 'string' },
236
+ token: { type: 'string' },
237
+ },
238
+ });
239
+ }
240
+ catch (e) {
241
+ console.error(`error: ${e.message}\n${HELP}`);
242
+ return 2;
243
+ }
244
+ if (parsed.values.help) {
245
+ console.log(HELP);
246
+ return 0;
247
+ }
248
+ const cfg = parseAdminCfg(parsed.values);
249
+ if (!cfg)
250
+ return 2;
251
+ const status = parsed.values.status;
252
+ if (status && !['active', 'closed', 'resolved', 'silenced'].includes(status)) {
253
+ console.error(`error: --status must be one of: active, silenced, resolved, closed`);
254
+ return 2;
255
+ }
256
+ const limitStr = parsed.values.limit;
257
+ const limit = limitStr ? Number.parseInt(limitStr, 10) : undefined;
258
+ try {
259
+ const rows = await issueList({
260
+ config: cfg,
261
+ errorType: parsed.values['error-type'],
262
+ limit,
263
+ status: status,
264
+ });
265
+ if (rows.length === 0) {
266
+ console.log('(no matching issues)');
267
+ return 0;
268
+ }
269
+ for (const r of rows)
270
+ console.log(formatIssueLine(r));
271
+ return 0;
272
+ }
273
+ catch (e) {
274
+ console.error(`issue list failed: ${e.message}`);
275
+ return 1;
276
+ }
277
+ }
278
+ async function cmdIssuePatch(argv, body, verb) {
279
+ let parsed;
280
+ try {
281
+ parsed = parseArgs({
282
+ allowPositionals: true,
283
+ args: argv,
284
+ options: {
285
+ 'api-url': { type: 'string' },
286
+ help: { short: 'h', type: 'boolean' },
287
+ 'in-release': { type: 'string' },
288
+ 'ingest-url': { type: 'string' },
289
+ project: { type: 'string' },
290
+ token: { type: 'string' },
291
+ },
292
+ });
293
+ }
294
+ catch (e) {
295
+ console.error(`error: ${e.message}\n${HELP}`);
296
+ return 2;
297
+ }
298
+ if (parsed.values.help) {
299
+ console.log(HELP);
300
+ return 0;
301
+ }
302
+ const cfg = parseAdminCfg(parsed.values);
303
+ if (!cfg)
304
+ return 2;
305
+ const issueId = parsed.positionals[0];
306
+ if (!issueId) {
307
+ console.error('error: <issue-uuid> is required');
308
+ return 2;
309
+ }
310
+ if (verb === 'resolved' && typeof parsed.values['in-release'] === 'string') {
311
+ body.resolvedInRelease = parsed.values['in-release'];
312
+ }
313
+ try {
314
+ const updated = await issuePatch(cfg, issueId, body);
315
+ console.log(`${issueId} → ${verb}${body.resolvedInRelease ? ` (in ${body.resolvedInRelease})` : ''}: ${updated.errorType}`);
316
+ return 0;
317
+ }
318
+ catch (e) {
319
+ console.error(`issue ${verb} failed: ${e.message}`);
320
+ return 1;
321
+ }
322
+ }
323
+ // ── native artifact upload ────────────────────────────────────────
324
+ async function cmdUploadDsym(argv) {
325
+ let parsed;
326
+ try {
327
+ parsed = parseArgs({
328
+ allowPositionals: true,
329
+ args: argv,
330
+ options: {
331
+ 'api-url': { type: 'string' },
332
+ arch: { type: 'string' },
333
+ 'debug-id': { type: 'string' },
334
+ help: { short: 'h', type: 'boolean' },
335
+ 'ingest-url': { type: 'string' },
336
+ 'object-name': { type: 'string' },
337
+ project: { type: 'string' },
338
+ release: { type: 'string' },
339
+ token: { type: 'string' },
340
+ },
341
+ });
342
+ }
343
+ catch (e) {
344
+ console.error(`error: ${e.message}\n${HELP}`);
345
+ return 2;
346
+ }
347
+ if (parsed.values.help) {
348
+ console.log(HELP);
349
+ return 0;
350
+ }
351
+ const cfg = parseAdminCfg(parsed.values);
352
+ if (!cfg)
353
+ return 2;
354
+ const path = parsed.positionals[0];
355
+ if (!path) {
356
+ console.error('error: a path to a .dSYM bundle or DWARF binary is required');
357
+ return 2;
358
+ }
359
+ const debugId = parsed.values['debug-id'];
360
+ const arch = parsed.values.arch;
361
+ if ((debugId && !arch) || (arch && !debugId)) {
362
+ console.error('error: --debug-id and --arch must be passed together (or both omitted)');
363
+ return 2;
364
+ }
365
+ try {
366
+ const r = await uploadDsym({
367
+ apiUrl: cfg.apiUrl,
368
+ arch: typeof arch === 'string' ? arch : undefined,
369
+ debugId: typeof debugId === 'string' ? debugId : undefined,
370
+ objectName: typeof parsed.values['object-name'] === 'string' ? parsed.values['object-name'] : undefined,
371
+ path,
372
+ projectId: cfg.projectId,
373
+ release: typeof parsed.values.release === 'string' ? parsed.values.release : undefined,
374
+ token: cfg.token,
375
+ });
376
+ console.log(`uploaded ${r.slices.length} dSYM slice(s):`);
377
+ for (const s of r.slices)
378
+ console.log(` ${s.debugId} (${s.arch})`);
379
+ return 0;
380
+ }
381
+ catch (e) {
382
+ console.error(`dsym upload failed: ${e.message}`);
383
+ return 1;
384
+ }
385
+ }
386
+ async function cmdUploadMapping(argv) {
387
+ let parsed;
388
+ try {
389
+ parsed = parseArgs({
390
+ allowPositionals: true,
391
+ args: argv,
392
+ options: {
393
+ 'api-url': { type: 'string' },
394
+ 'debug-id': { type: 'string' },
395
+ help: { short: 'h', type: 'boolean' },
396
+ 'ingest-url': { type: 'string' },
397
+ project: { type: 'string' },
398
+ release: { type: 'string' },
399
+ token: { type: 'string' },
400
+ },
401
+ });
402
+ }
403
+ catch (e) {
404
+ console.error(`error: ${e.message}\n${HELP}`);
405
+ return 2;
406
+ }
407
+ if (parsed.values.help) {
408
+ console.log(HELP);
409
+ return 0;
410
+ }
411
+ const cfg = parseAdminCfg(parsed.values);
412
+ if (!cfg)
413
+ return 2;
414
+ const path = parsed.positionals[0];
415
+ if (!path) {
416
+ console.error('error: a path to mapping.txt is required');
417
+ return 2;
418
+ }
419
+ try {
420
+ await uploadMapping({
421
+ apiUrl: cfg.apiUrl,
422
+ debugId: typeof parsed.values['debug-id'] === 'string' ? parsed.values['debug-id'] : undefined,
423
+ path,
424
+ projectId: cfg.projectId,
425
+ release: typeof parsed.values.release === 'string' ? parsed.values.release : undefined,
426
+ token: cfg.token,
427
+ });
428
+ console.log(`uploaded mapping for project ${cfg.projectId}${parsed.values.release ? ` / ${parsed.values.release}` : ''}`);
429
+ return 0;
430
+ }
431
+ catch (e) {
432
+ console.error(`mapping upload failed: ${e.message}`);
433
+ return 1;
434
+ }
435
+ }
175
436
  async function main(argv) {
176
437
  if (argv.length === 0 || argv[0] === '-h' || argv[0] === '--help') {
177
438
  console.log(HELP);
@@ -180,8 +441,20 @@ async function main(argv) {
180
441
  const [a, b, ...rest] = argv;
181
442
  if (a === 'upload' && b === 'sourcemap')
182
443
  return cmdUploadSourcemap(rest);
444
+ if (a === 'upload' && b === 'dsym')
445
+ return cmdUploadDsym(rest);
446
+ if (a === 'upload' && b === 'mapping')
447
+ return cmdUploadMapping(rest);
183
448
  if (a === 'react-native' && b === 'upload')
184
449
  return cmdReactNativeUpload(rest);
450
+ if (a === 'issue' && b === 'list')
451
+ return cmdIssueList(rest);
452
+ if (a === 'issue' && b === 'resolve')
453
+ return cmdIssuePatch(rest, { status: 'resolved' }, 'resolved');
454
+ if (a === 'issue' && b === 'silence')
455
+ return cmdIssuePatch(rest, { status: 'silenced' }, 'silenced');
456
+ if (a === 'issue' && b === 'close')
457
+ return cmdIssuePatch(rest, { status: 'closed' }, 'closed');
185
458
  console.error(`unknown command: ${[a, b].filter(Boolean).join(' ') || '(none)'}\n`);
186
459
  console.error(HELP);
187
460
  return 2;
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/lib/issue.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ type Issue = {
2
+ errorType: string;
3
+ eventCount: number;
4
+ id: string;
5
+ lastSeen: string;
6
+ messageSample: string;
7
+ status: 'active' | 'closed' | 'resolved' | 'silenced';
8
+ };
9
+ type AdminConfig = {
10
+ apiUrl: string;
11
+ projectId: string;
12
+ token: string;
13
+ };
14
+ export type IssueListOptions = {
15
+ config: AdminConfig;
16
+ errorType?: string;
17
+ limit?: number;
18
+ status?: 'active' | 'closed' | 'resolved' | 'silenced';
19
+ };
20
+ export declare function issueList(opts: IssueListOptions): Promise<Issue[]>;
21
+ export declare function issuePatch(config: AdminConfig, issueId: string, body: {
22
+ resolvedInRelease?: string;
23
+ status: 'active' | 'closed' | 'resolved' | 'silenced';
24
+ }): Promise<Issue>;
25
+ /** Format one issue for terminal output — short, one line, scannable. */
26
+ export declare function formatIssueLine(i: Issue): string;
27
+ export {};
28
+ //# sourceMappingURL=issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../src/issue.ts"],"names":[],"mappings":"AAEA,KAAK,KAAK,GAAG;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAA;CACtD,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAgCD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,WAAW,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAA;CACvD,CAAA;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAOxE;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAA;CAAE,GAC1F,OAAO,CAAC,KAAK,CAAC,CAKhB;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAKhD"}
package/lib/issue.js ADDED
@@ -0,0 +1,53 @@
1
+ // `sentori-cli issue list / resolve / silence` — CI triage helpers.
2
+ function url(c, path) {
3
+ return `${c.apiUrl.replace(/\/+$/, '')}/admin/api/projects/${c.projectId}${path}`;
4
+ }
5
+ async function adminFetch(c, path, init) {
6
+ const resp = await fetch(url(c, path), {
7
+ ...init,
8
+ headers: {
9
+ Authorization: `Bearer ${c.token}`,
10
+ 'Content-Type': 'application/json',
11
+ ...(init?.headers ?? {}),
12
+ },
13
+ });
14
+ if (!resp.ok) {
15
+ let detail = '';
16
+ try {
17
+ detail = await resp.text();
18
+ }
19
+ catch {
20
+ // ignore
21
+ }
22
+ throw new Error(`${resp.status} ${resp.statusText}${detail ? ` — ${detail.slice(0, 300)}` : ''}`);
23
+ }
24
+ // PATCH /issues/<id> returns the row; some endpoints might return no
25
+ // content — handle both.
26
+ const txt = await resp.text();
27
+ return (txt ? JSON.parse(txt) : null);
28
+ }
29
+ export async function issueList(opts) {
30
+ const q = new URLSearchParams();
31
+ if (opts.status)
32
+ q.set('status', opts.status);
33
+ if (opts.limit)
34
+ q.set('limit', String(opts.limit));
35
+ if (opts.errorType)
36
+ q.set('errorType', opts.errorType);
37
+ const qs = q.toString();
38
+ return adminFetch(opts.config, `/issues${qs ? '?' + qs : ''}`);
39
+ }
40
+ export async function issuePatch(config, issueId, body) {
41
+ return adminFetch(config, `/issues/${encodeURIComponent(issueId)}`, {
42
+ body: JSON.stringify(body),
43
+ method: 'PATCH',
44
+ });
45
+ }
46
+ /** Format one issue for terminal output — short, one line, scannable. */
47
+ export function formatIssueLine(i) {
48
+ const status = i.status.padEnd(9);
49
+ const title = `${i.errorType}${i.messageSample ? `: ${i.messageSample}` : ''}`;
50
+ const events = `${i.eventCount}×`;
51
+ return `${i.id} ${status} ${title.slice(0, 80).padEnd(80)} ${events}`;
52
+ }
53
+ //# sourceMappingURL=issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.js","sourceRoot":"","sources":["../src/issue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ export type AdminUpload = {
2
+ apiUrl: string;
3
+ projectId: string;
4
+ release?: string;
5
+ token: string;
6
+ };
7
+ export type DsymSlice = {
8
+ arch: string;
9
+ debugId: string;
10
+ file: string;
11
+ };
12
+ /**
13
+ * Use `dwarfdump --uuid <path>` to enumerate `(arch, debug_id, file)`
14
+ * for each Mach-O slice. Returns [] if dwarfdump isn't installed or the
15
+ * output couldn't be parsed; callers should fall back to explicit
16
+ * `--debug-id` / `--arch` flags in that case.
17
+ */
18
+ export declare function dsymSlicesFromDwarfdump(path: string): DsymSlice[];
19
+ /** Walk a `.dSYM` bundle and return the DWARF binary files inside
20
+ * `Contents/Resources/DWARF/`. If `path` already points at a binary
21
+ * (not a bundle), returns `[path]`. */
22
+ export declare function dwarfBinariesIn(path: string): string[];
23
+ export type DsymUploadOptions = AdminUpload & {
24
+ /** Explicit overrides when dwarfdump isn't available. */
25
+ arch?: string;
26
+ debugId?: string;
27
+ /** A `Foo.dSYM` bundle or a raw DWARF binary. */
28
+ path: string;
29
+ objectName?: string;
30
+ };
31
+ export type DsymUploadResult = {
32
+ slices: {
33
+ arch: string;
34
+ debugId: string;
35
+ }[];
36
+ };
37
+ export declare function uploadDsym(opts: DsymUploadOptions): Promise<DsymUploadResult>;
38
+ export type MappingUploadOptions = AdminUpload & {
39
+ debugId?: string;
40
+ path: string;
41
+ };
42
+ export declare function uploadMapping(opts: MappingUploadOptions): Promise<void>;
43
+ //# sourceMappingURL=native-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-artifacts.d.ts","sourceRoot":"","sources":["../src/native-artifacts.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAkCD,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAcvE;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAejE;AAED;;wCAEwC;AACxC,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBtD;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAC5C,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAA;AAE9E,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqCnF;AAID,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB7E"}
@@ -0,0 +1,148 @@
1
+ // `sentori-cli upload dsym` (iOS) + `sentori-cli upload mapping` (Android).
2
+ // Both endpoints take the raw artifact bytes (NOT multipart) with a few
3
+ // headers / query params.
4
+ import { spawnSync } from 'node:child_process';
5
+ import { readFile } from 'node:fs/promises';
6
+ import { basename, extname, join } from 'node:path';
7
+ import { statSync, readdirSync } from 'node:fs';
8
+ async function postBytes(url, body, token, headers = {}) {
9
+ const resp = await fetch(url, {
10
+ body,
11
+ headers: {
12
+ Authorization: `Bearer ${token}`,
13
+ 'Content-Type': 'application/octet-stream',
14
+ ...headers,
15
+ },
16
+ method: 'POST',
17
+ });
18
+ if (!resp.ok) {
19
+ let detail = '';
20
+ try {
21
+ detail = await resp.text();
22
+ }
23
+ catch {
24
+ // ignore
25
+ }
26
+ throw new Error(`${resp.status} ${resp.statusText}${detail ? ` — ${detail.slice(0, 300)}` : ''}`);
27
+ }
28
+ const txt = await resp.text();
29
+ return txt ? JSON.parse(txt) : null;
30
+ }
31
+ const ARCHES = new Set([
32
+ 'arm64',
33
+ 'arm64_32',
34
+ 'arm64e',
35
+ 'armv7',
36
+ 'armv7k',
37
+ 'armv7s',
38
+ 'i386',
39
+ 'x86_64',
40
+ 'x86_64h',
41
+ ]);
42
+ /**
43
+ * Use `dwarfdump --uuid <path>` to enumerate `(arch, debug_id, file)`
44
+ * for each Mach-O slice. Returns [] if dwarfdump isn't installed or the
45
+ * output couldn't be parsed; callers should fall back to explicit
46
+ * `--debug-id` / `--arch` flags in that case.
47
+ */
48
+ export function dsymSlicesFromDwarfdump(path) {
49
+ const r = spawnSync('dwarfdump', ['--uuid', path]);
50
+ if (r.status !== 0 || !r.stdout)
51
+ return [];
52
+ const out = [];
53
+ // Output lines look like:
54
+ // UUID: 1234ABCD-... (arm64) /path/to/Foo.dSYM/Contents/Resources/DWARF/Foo
55
+ const re = /^UUID:\s+([0-9A-Fa-f-]{32,36})\s+\(([^)]+)\)\s+(.+)\s*$/m;
56
+ for (const line of r.stdout.toString().split('\n')) {
57
+ const m = re.exec(line);
58
+ if (!m)
59
+ continue;
60
+ const [, debugId, arch, file] = m;
61
+ if (!ARCHES.has(arch))
62
+ continue;
63
+ out.push({ arch, debugId: debugId.toUpperCase(), file: file.trim() });
64
+ }
65
+ return out;
66
+ }
67
+ /** Walk a `.dSYM` bundle and return the DWARF binary files inside
68
+ * `Contents/Resources/DWARF/`. If `path` already points at a binary
69
+ * (not a bundle), returns `[path]`. */
70
+ export function dwarfBinariesIn(path) {
71
+ let st;
72
+ try {
73
+ st = statSync(path);
74
+ }
75
+ catch {
76
+ return [];
77
+ }
78
+ if (st.isFile())
79
+ return [path];
80
+ const dwarfDir = join(path, 'Contents/Resources/DWARF');
81
+ try {
82
+ return readdirSync(dwarfDir)
83
+ .filter((n) => !n.startsWith('.'))
84
+ .map((n) => join(dwarfDir, n));
85
+ }
86
+ catch {
87
+ // not a .dSYM bundle layout — try the top-level path
88
+ return [path];
89
+ }
90
+ }
91
+ export async function uploadDsym(opts) {
92
+ const slices = [];
93
+ if (opts.debugId && opts.arch) {
94
+ // Explicit single-slice upload — no parsing needed.
95
+ const binaries = dwarfBinariesIn(opts.path);
96
+ if (binaries.length === 0)
97
+ throw new Error(`no DWARF binary at: ${opts.path}`);
98
+ slices.push({ arch: opts.arch, debugId: opts.debugId.toUpperCase(), file: binaries[0] });
99
+ }
100
+ else {
101
+ // Auto-discover via dwarfdump.
102
+ const found = dsymSlicesFromDwarfdump(opts.path);
103
+ if (found.length === 0) {
104
+ throw new Error('couldn’t enumerate dSYM slices — install Xcode command-line tools ' +
105
+ '(for `dwarfdump`), or pass --debug-id and --arch explicitly');
106
+ }
107
+ slices.push(...found);
108
+ }
109
+ const base = opts.apiUrl.replace(/\/+$/, '');
110
+ const q = new URLSearchParams();
111
+ if (opts.release)
112
+ q.set('release', opts.release);
113
+ if (opts.objectName ?? basename(opts.path).replace(/\.dSYM$/, ''))
114
+ q.set('objectName', opts.objectName ?? basename(opts.path).replace(/\.dSYM$/, ''));
115
+ const qs = q.toString();
116
+ const url = `${base}/admin/api/projects/${encodeURIComponent(opts.projectId)}/dsyms${qs ? '?' + qs : ''}`;
117
+ const uploaded = [];
118
+ for (const s of slices) {
119
+ const body = await readFile(s.file);
120
+ await postBytes(url, body, opts.token, {
121
+ 'x-sentori-arch': s.arch,
122
+ 'x-sentori-debug-id': s.debugId,
123
+ });
124
+ uploaded.push({ arch: s.arch, debugId: s.debugId });
125
+ }
126
+ return { slices: uploaded };
127
+ }
128
+ export async function uploadMapping(opts) {
129
+ const ext = extname(opts.path).toLowerCase();
130
+ if (ext && ext !== '.txt' && ext !== '.map') {
131
+ // R8 emits `mapping.txt` by default; accept anything but warn.
132
+ console.warn(`[sentori-cli] upload mapping: unexpected extension ${ext} — uploading anyway`);
133
+ }
134
+ const body = await readFile(opts.path);
135
+ if (body.length === 0)
136
+ throw new Error(`empty mapping file: ${opts.path}`);
137
+ const base = opts.apiUrl.replace(/\/+$/, '');
138
+ const q = new URLSearchParams();
139
+ if (opts.release)
140
+ q.set('release', opts.release);
141
+ const qs = q.toString();
142
+ const url = `${base}/admin/api/projects/${encodeURIComponent(opts.projectId)}/mappings${qs ? '?' + qs : ''}`;
143
+ const headers = {};
144
+ if (opts.debugId)
145
+ headers['x-sentori-debug-id'] = opts.debugId;
146
+ await postBytes(url, body, opts.token, headers);
147
+ }
148
+ //# sourceMappingURL=native-artifacts.js.map