@goliapkg/sentori-cli 0.2.1 → 0.4.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,56 +1,141 @@
1
1
  #!/usr/bin/env node
2
2
  import { parseArgs } from 'node:util';
3
+ import { formatIssueLine, issueList, issuePatch } from './issue.js';
4
+ import { reactNativeUpload } from './react-native.js';
3
5
  import { uploadSourcemaps } from './upload.js';
4
- const HELP = `sentori-cli — upload release artifacts to Sentori
6
+ const HELP = `sentori-cli — Sentori command-line interface
5
7
 
6
- Usage:
8
+ Source-map upload:
7
9
  sentori-cli upload sourcemap [options] <path...>
10
+ Upload one or more files or directories. A directory is scanned
11
+ (one level) for *.map / *.js / *.jsbundle / *.bundle / *.hbc;
12
+ a file given explicitly is uploaded as-is. Use this for web
13
+ bundlers (point at the build dir) or for already-composed RN maps.
8
14
 
9
- <path> one or more files or directories. A directory is scanned
10
- (one level) for *.map and *.js / *.bundle / *.hbc files.
11
- A file given explicitly is uploaded as-is.
15
+ sentori-cli react-native upload [options]
16
+ Compose a Metro packager map + a Hermes map into one source map
17
+ and upload it (plus the bundle). Use this for a Hermes release
18
+ build. Requires --metro-map and --hermes-map.
12
19
 
13
- Options:
20
+ CI triage:
21
+ sentori-cli issue list --project <uuid> [--status active|silenced|resolved|closed] [--limit N] [--error-type <t>]
22
+ sentori-cli issue resolve <issue-uuid> --project <uuid> [--in-release <r>]
23
+ sentori-cli issue silence <issue-uuid> --project <uuid>
24
+
25
+ Options (upload commands):
14
26
  --release <r> release identifier — MUST equal the value the SDK
15
- reports via init({ release }). Required. A mismatch
16
- means the dashboard silently can't symbolicate.
27
+ reports via init({ release }). Required.
17
28
  --token <t> Sentori token (or set $SENTORI_TOKEN).
18
29
  --api-url <url> Sentori API base (default https://api.sentori.golia.jp,
19
30
  or $SENTORI_API_URL). For a self-hosted instance, your
20
31
  host. (Accepts --ingest-url as an alias.)
21
- --dry-run list what would be uploaded; don't upload.
32
+ --dry-run describe what would be uploaded; don't upload.
22
33
  -h, --help show this help.
23
34
 
24
- React Native / Hermes: in a release build the *minified* map (Metro)
25
- and the *bytecode* map (Hermes) must be composed first —
26
- npx react-native bundle --platform ios --dev false \\
27
- --entry-file index.js --bundle-output main.jsbundle \\
28
- --sourcemap-output main.jsbundle.packager.map
29
- node node_modules/react-native/scripts/compose-source-maps.js \\
30
- main.jsbundle.packager.map main.jsbundle.hbc.map -o main.jsbundle.map
31
- then \`sentori-cli upload sourcemap --release "<app>@<version>+<build>" main.jsbundle.map main.jsbundle\`.
32
- (Web bundlers emit a usable .map directly just point at the build dir.)
35
+ Options (react-native upload):
36
+ --metro-map <p> the *.packager.map Metro emits (--sourcemap-output).
37
+ --hermes-map <p> the *.hbc.map the Hermes compiler emits.
38
+ --bundle <p> optional: also upload the bundle (.jsbundle / .bundle).
39
+
40
+ Options (issue commands):
41
+ --project <uuid> project id (or set $SENTORI_PROJECT_ID).
42
+ --token <t> admin token, sk_… prefix (or $SENTORI_ADMIN_TOKEN /
43
+ $SENTORI_TOKEN). The ingest st_pk_ token may also work
44
+ on a self-hosted instance.
45
+ --api-url <url> Sentori API base (same as above).
46
+ --in-release <r> (resolve only) mark this release as where the fix
47
+ landed; the regression detector flips the issue back
48
+ to "regressed" if a matching event lands later.
49
+
50
+ Hermes release build, by hand:
51
+ npx react-native bundle --platform ios --dev false --entry-file index.js \\
52
+ --bundle-output main.jsbundle --sourcemap-output main.jsbundle.packager.map
53
+ # (the iOS/Android build compiles to Hermes and writes main.jsbundle.hbc.map)
54
+ npx @goliapkg/sentori-cli react-native upload \\
55
+ --release "<app>@<version>+<build>" --token "$SENTORI_TOKEN" \\
56
+ --metro-map main.jsbundle.packager.map --hermes-map main.jsbundle.hbc.map \\
57
+ --bundle main.jsbundle
33
58
  `;
34
- async function main(argv) {
35
- if (argv.length === 0 || argv[0] === '-h' || argv[0] === '--help') {
59
+ /** Parse the shared options, or print an error + return null. */
60
+ function parseCommon(values) {
61
+ const release = typeof values.release === 'string' ? values.release : undefined;
62
+ if (!release) {
63
+ console.error('error: --release is required (must match the SDK’s init({ release }))');
64
+ return null;
65
+ }
66
+ const dryRun = values['dry-run'] === true;
67
+ const token = (typeof values.token === 'string' ? values.token : undefined) ?? process.env.SENTORI_TOKEN;
68
+ if (!token && !dryRun) {
69
+ console.error('error: --token (or $SENTORI_TOKEN) is required');
70
+ return null;
71
+ }
72
+ const apiUrl = (typeof values['api-url'] === 'string' ? values['api-url'] : undefined) ??
73
+ (typeof values['ingest-url'] === 'string' ? values['ingest-url'] : undefined) ??
74
+ process.env.SENTORI_API_URL ??
75
+ 'https://api.sentori.golia.jp';
76
+ return { apiUrl, dryRun, release, token: token ?? '' };
77
+ }
78
+ async function cmdUploadSourcemap(argv) {
79
+ let parsed;
80
+ try {
81
+ parsed = parseArgs({
82
+ allowPositionals: true,
83
+ args: argv,
84
+ options: {
85
+ 'api-url': { type: 'string' },
86
+ 'dry-run': { type: 'boolean' },
87
+ help: { short: 'h', type: 'boolean' },
88
+ 'ingest-url': { type: 'string' },
89
+ release: { type: 'string' },
90
+ token: { type: 'string' },
91
+ },
92
+ });
93
+ }
94
+ catch (e) {
95
+ console.error(`error: ${e.message}\n`);
96
+ console.error(HELP);
97
+ return 2;
98
+ }
99
+ if (parsed.values.help) {
36
100
  console.log(HELP);
37
101
  return 0;
38
102
  }
39
- if (argv[0] !== 'upload' || argv[1] !== 'sourcemap') {
40
- console.error(`unknown command: ${argv.slice(0, 2).join(' ') || '(none)'}\n`);
41
- console.error(HELP);
103
+ const c = parseCommon(parsed.values);
104
+ if (!c)
105
+ return 2;
106
+ if (parsed.positionals.length === 0) {
107
+ console.error('error: at least one path (file or directory) is required');
42
108
  return 2;
43
109
  }
110
+ try {
111
+ const result = await uploadSourcemaps({
112
+ apiUrl: c.apiUrl,
113
+ dryRun: c.dryRun,
114
+ paths: parsed.positionals,
115
+ release: c.release,
116
+ token: c.token,
117
+ });
118
+ reportUpload(result, c);
119
+ return 0;
120
+ }
121
+ catch (e) {
122
+ console.error(`upload failed: ${e.message}`);
123
+ return 1;
124
+ }
125
+ }
126
+ async function cmdReactNativeUpload(argv) {
44
127
  let parsed;
45
128
  try {
46
129
  parsed = parseArgs({
47
- allowPositionals: true,
48
- args: argv.slice(2),
130
+ args: argv,
49
131
  options: {
50
132
  'api-url': { type: 'string' },
133
+ bundle: { type: 'string' },
51
134
  'dry-run': { type: 'boolean' },
52
135
  help: { short: 'h', type: 'boolean' },
53
- 'ingest-url': { type: 'string' }, // alias, kept for older docs
136
+ 'hermes-map': { type: 'string' },
137
+ 'ingest-url': { type: 'string' },
138
+ 'metro-map': { type: 'string' },
54
139
  release: { type: 'string' },
55
140
  token: { type: 'string' },
56
141
  },
@@ -61,56 +146,189 @@ async function main(argv) {
61
146
  console.error(HELP);
62
147
  return 2;
63
148
  }
64
- const { positionals, values } = parsed;
65
- if (values.help) {
149
+ if (parsed.values.help) {
66
150
  console.log(HELP);
67
151
  return 0;
68
152
  }
69
- const release = values.release;
70
- if (!release) {
71
- console.error('error: --release is required (must match the SDK’s init({ release }))');
153
+ const c = parseCommon(parsed.values);
154
+ if (!c)
72
155
  return 2;
73
- }
74
- const dryRun = !!values['dry-run'];
75
- const token = values.token ?? process.env.SENTORI_TOKEN;
76
- if (!token && !dryRun) {
77
- console.error('error: --token (or $SENTORI_TOKEN) is required');
156
+ const metroMap = parsed.values['metro-map'];
157
+ const hermesMap = parsed.values['hermes-map'];
158
+ if (typeof metroMap !== 'string' || typeof hermesMap !== 'string') {
159
+ console.error('error: --metro-map and --hermes-map are both required');
78
160
  return 2;
79
161
  }
80
- const apiUrl = values['api-url'] ??
81
- values['ingest-url'] ??
162
+ try {
163
+ const result = await reactNativeUpload({
164
+ apiUrl: c.apiUrl,
165
+ bundle: typeof parsed.values.bundle === 'string' ? parsed.values.bundle : undefined,
166
+ dryRun: c.dryRun,
167
+ hermesMap,
168
+ metroMap,
169
+ release: c.release,
170
+ token: c.token,
171
+ });
172
+ reportUpload(result, c);
173
+ return 0;
174
+ }
175
+ catch (e) {
176
+ console.error(`react-native upload failed: ${e.message}`);
177
+ return 1;
178
+ }
179
+ }
180
+ function reportUpload(result, c) {
181
+ if (c.dryRun) {
182
+ console.log(`would upload ${result.files.length} file(s) to ${c.apiUrl.replace(/\/+$/, '')}/admin/api/releases/${encodeURIComponent(c.release)}/sourcemaps:`);
183
+ for (const f of result.files)
184
+ console.log(` ${f}`);
185
+ }
186
+ else {
187
+ console.log(`uploaded ${result.uploaded ?? result.files.length} file(s) for release "${c.release}" — minified stacks on this release will now resolve to source.`);
188
+ }
189
+ }
190
+ function parseAdminCfg(values) {
191
+ const projectId = (typeof values.project === 'string' ? values.project : undefined) ??
192
+ process.env.SENTORI_PROJECT_ID;
193
+ if (!projectId) {
194
+ console.error('error: --project <uuid> (or $SENTORI_PROJECT_ID) is required');
195
+ return null;
196
+ }
197
+ const token = (typeof values.token === 'string' ? values.token : undefined) ??
198
+ process.env.SENTORI_ADMIN_TOKEN ??
199
+ process.env.SENTORI_TOKEN;
200
+ if (!token) {
201
+ console.error('error: --token (or $SENTORI_ADMIN_TOKEN / $SENTORI_TOKEN) is required for issue commands');
202
+ return null;
203
+ }
204
+ const apiUrl = (typeof values['api-url'] === 'string' ? values['api-url'] : undefined) ??
205
+ (typeof values['ingest-url'] === 'string' ? values['ingest-url'] : undefined) ??
82
206
  process.env.SENTORI_API_URL ??
83
207
  'https://api.sentori.golia.jp';
84
- if (positionals.length === 0) {
85
- console.error('error: at least one path (file or directory) is required');
208
+ return { apiUrl, projectId, token };
209
+ }
210
+ async function cmdIssueList(argv) {
211
+ let parsed;
212
+ try {
213
+ parsed = parseArgs({
214
+ args: argv,
215
+ options: {
216
+ 'api-url': { type: 'string' },
217
+ 'error-type': { type: 'string' },
218
+ help: { short: 'h', type: 'boolean' },
219
+ 'ingest-url': { type: 'string' },
220
+ limit: { type: 'string' },
221
+ project: { type: 'string' },
222
+ status: { type: 'string' },
223
+ token: { type: 'string' },
224
+ },
225
+ });
226
+ }
227
+ catch (e) {
228
+ console.error(`error: ${e.message}\n${HELP}`);
229
+ return 2;
230
+ }
231
+ if (parsed.values.help) {
232
+ console.log(HELP);
233
+ return 0;
234
+ }
235
+ const cfg = parseAdminCfg(parsed.values);
236
+ if (!cfg)
237
+ return 2;
238
+ const status = parsed.values.status;
239
+ if (status && !['active', 'closed', 'resolved', 'silenced'].includes(status)) {
240
+ console.error(`error: --status must be one of: active, silenced, resolved, closed`);
86
241
  return 2;
87
242
  }
243
+ const limitStr = parsed.values.limit;
244
+ const limit = limitStr ? Number.parseInt(limitStr, 10) : undefined;
88
245
  try {
89
- const result = await uploadSourcemaps({
90
- apiUrl,
91
- dryRun,
92
- paths: positionals,
93
- release,
94
- token: token ?? '',
246
+ const rows = await issueList({
247
+ config: cfg,
248
+ errorType: parsed.values['error-type'],
249
+ limit,
250
+ status: status,
95
251
  });
96
- if (dryRun) {
97
- console.log(`would upload ${result.files.length} file(s) to ${apiUrl.replace(/\/+$/, '')}/admin/api/releases/${encodeURIComponent(release)}/sourcemaps:`);
98
- for (const f of result.files)
99
- console.log(` ${f}`);
100
- }
101
- else {
102
- console.log(`uploaded ${result.uploaded} file(s) for release "${release}"`);
103
- for (const a of result.artifacts ?? [])
104
- console.log(` ${a.name} [${a.kind}]`);
105
- console.log('done — minified stack traces on this release will now resolve to source.');
252
+ if (rows.length === 0) {
253
+ console.log('(no matching issues)');
254
+ return 0;
106
255
  }
256
+ for (const r of rows)
257
+ console.log(formatIssueLine(r));
107
258
  return 0;
108
259
  }
109
260
  catch (e) {
110
- console.error(`upload failed: ${e.message}`);
261
+ console.error(`issue list failed: ${e.message}`);
262
+ return 1;
263
+ }
264
+ }
265
+ async function cmdIssuePatch(argv, body, verb) {
266
+ let parsed;
267
+ try {
268
+ parsed = parseArgs({
269
+ allowPositionals: true,
270
+ args: argv,
271
+ options: {
272
+ 'api-url': { type: 'string' },
273
+ help: { short: 'h', type: 'boolean' },
274
+ 'in-release': { type: 'string' },
275
+ 'ingest-url': { type: 'string' },
276
+ project: { type: 'string' },
277
+ token: { type: 'string' },
278
+ },
279
+ });
280
+ }
281
+ catch (e) {
282
+ console.error(`error: ${e.message}\n${HELP}`);
283
+ return 2;
284
+ }
285
+ if (parsed.values.help) {
286
+ console.log(HELP);
287
+ return 0;
288
+ }
289
+ const cfg = parseAdminCfg(parsed.values);
290
+ if (!cfg)
291
+ return 2;
292
+ const issueId = parsed.positionals[0];
293
+ if (!issueId) {
294
+ console.error('error: <issue-uuid> is required');
295
+ return 2;
296
+ }
297
+ if (verb === 'resolved' && typeof parsed.values['in-release'] === 'string') {
298
+ body.resolvedInRelease = parsed.values['in-release'];
299
+ }
300
+ try {
301
+ const updated = await issuePatch(cfg, issueId, body);
302
+ console.log(`${issueId} → ${verb}${body.resolvedInRelease ? ` (in ${body.resolvedInRelease})` : ''}: ${updated.errorType}`);
303
+ return 0;
304
+ }
305
+ catch (e) {
306
+ console.error(`issue ${verb} failed: ${e.message}`);
111
307
  return 1;
112
308
  }
113
309
  }
310
+ async function main(argv) {
311
+ if (argv.length === 0 || argv[0] === '-h' || argv[0] === '--help') {
312
+ console.log(HELP);
313
+ return 0;
314
+ }
315
+ const [a, b, ...rest] = argv;
316
+ if (a === 'upload' && b === 'sourcemap')
317
+ return cmdUploadSourcemap(rest);
318
+ if (a === 'react-native' && b === 'upload')
319
+ return cmdReactNativeUpload(rest);
320
+ if (a === 'issue' && b === 'list')
321
+ return cmdIssueList(rest);
322
+ if (a === 'issue' && b === 'resolve')
323
+ return cmdIssuePatch(rest, { status: 'resolved' }, 'resolved');
324
+ if (a === 'issue' && b === 'silence')
325
+ return cmdIssuePatch(rest, { status: 'silenced' }, 'silenced');
326
+ if (a === 'issue' && b === 'close')
327
+ return cmdIssuePatch(rest, { status: 'closed' }, 'closed');
328
+ console.error(`unknown command: ${[a, b].filter(Boolean).join(' ') || '(none)'}\n`);
329
+ console.error(HELP);
330
+ return 2;
331
+ }
114
332
  main(process.argv.slice(2)).then((code) => process.exit(code), (e) => {
115
333
  console.error(`fatal: ${e.message}`);
116
334
  process.exit(1);
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,25 @@
1
+ /** Resolve `react-native/scripts/compose-source-maps.js` from the
2
+ * current project's node_modules. Returns null if react-native isn't
3
+ * installed or the version doesn't ship that script. */
4
+ export declare function resolveComposeScript(fromDir?: string): null | string;
5
+ /** Compose a Metro packager source map + a Hermes source map into a
6
+ * single map (a temp file the caller is responsible for deleting).
7
+ * Throws if react-native's compose script can't be found or fails. */
8
+ export declare function composeSourceMaps(metroMap: string, hermesMap: string): string;
9
+ export type RnUploadOptions = {
10
+ apiUrl: string;
11
+ /** Optional bundle file (.jsbundle / .bundle) to upload alongside the map. */
12
+ bundle?: string;
13
+ dryRun?: boolean;
14
+ hermesMap: string;
15
+ metroMap: string;
16
+ release: string;
17
+ token: string;
18
+ };
19
+ /** Compose the Metro + Hermes maps, then upload the result (and the
20
+ * bundle, if given). Cleans up the temp composed map. */
21
+ export declare function reactNativeUpload(opts: RnUploadOptions): Promise<{
22
+ files: string[];
23
+ uploaded?: number;
24
+ }>;
25
+ //# sourceMappingURL=react-native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-native.d.ts","sourceRoot":"","sources":["../src/react-native.ts"],"names":[],"mappings":"AAQA;;yDAEyD;AACzD,wBAAgB,oBAAoB,CAAC,OAAO,SAAgB,GAAG,IAAI,GAAG,MAAM,CAc3E;AAED;;uEAEuE;AACvE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAkB7E;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;0DAC0D;AAC1D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC;IACtE,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAC,CAoBD"}
@@ -0,0 +1,74 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { existsSync, mkdtempSync, rmSync } from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { uploadSourcemaps } from './upload.js';
7
+ /** Resolve `react-native/scripts/compose-source-maps.js` from the
8
+ * current project's node_modules. Returns null if react-native isn't
9
+ * installed or the version doesn't ship that script. */
10
+ export function resolveComposeScript(fromDir = process.cwd()) {
11
+ const req = createRequire(join(fromDir, 'noop.js'));
12
+ for (const id of [
13
+ 'react-native/scripts/compose-source-maps.js',
14
+ '@react-native/community-cli-plugin/dist/utils/composeSourceMaps.js',
15
+ ]) {
16
+ try {
17
+ const p = req.resolve(id);
18
+ if (existsSync(p))
19
+ return p;
20
+ }
21
+ catch {
22
+ // try next
23
+ }
24
+ }
25
+ return null;
26
+ }
27
+ /** Compose a Metro packager source map + a Hermes source map into a
28
+ * single map (a temp file the caller is responsible for deleting).
29
+ * Throws if react-native's compose script can't be found or fails. */
30
+ export function composeSourceMaps(metroMap, hermesMap) {
31
+ for (const p of [metroMap, hermesMap]) {
32
+ if (!existsSync(p))
33
+ throw new Error(`no such file: ${p}`);
34
+ }
35
+ const script = resolveComposeScript();
36
+ if (!script) {
37
+ throw new Error("couldn't find react-native's compose-source-maps.js — install react-native, or " +
38
+ 'compose the maps yourself and use `sentori-cli upload sourcemap <composed.map>`');
39
+ }
40
+ const out = join(mkdtempSync(join(tmpdir(), 'sentori-rn-')), 'composed.map');
41
+ const r = spawnSync('node', [script, metroMap, hermesMap, '-o', out], { stdio: 'inherit' });
42
+ if (r.status !== 0) {
43
+ throw new Error(`compose-source-maps.js exited with ${r.status ?? 'signal'}`);
44
+ }
45
+ if (!existsSync(out))
46
+ throw new Error('compose-source-maps.js produced no output');
47
+ return out;
48
+ }
49
+ /** Compose the Metro + Hermes maps, then upload the result (and the
50
+ * bundle, if given). Cleans up the temp composed map. */
51
+ export async function reactNativeUpload(opts) {
52
+ const composed = composeSourceMaps(opts.metroMap, opts.hermesMap);
53
+ try {
54
+ const paths = [composed, ...(opts.bundle ? [opts.bundle] : [])];
55
+ const r = await uploadSourcemaps({
56
+ apiUrl: opts.apiUrl,
57
+ dryRun: opts.dryRun,
58
+ paths,
59
+ release: opts.release,
60
+ token: opts.token,
61
+ });
62
+ return { files: r.files, uploaded: r.uploaded };
63
+ }
64
+ finally {
65
+ try {
66
+ rmSync(composed, { force: true });
67
+ rmSync(join(composed, '..'), { force: true, recursive: true });
68
+ }
69
+ catch {
70
+ // best-effort cleanup
71
+ }
72
+ }
73
+ }
74
+ //# sourceMappingURL=react-native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-native.js","sourceRoot":"","sources":["../src/react-native.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goliapkg/sentori-cli",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "description": "Sentori CLI \u2014 upload source maps so dashboard stack traces resolve to your original source.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://sentori.golia.jp",