@tapthrough/expo 0.0.0-stage → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +105 -2
- package/app.plugin.d.ts +37 -0
- package/app.plugin.js +79 -0
- package/dist/Annotator.d.ts +14 -0
- package/dist/Annotator.d.ts.map +1 -0
- package/dist/Annotator.js +160 -0
- package/dist/Annotator.js.map +1 -0
- package/dist/Bubble.d.ts +27 -0
- package/dist/Bubble.d.ts.map +1 -0
- package/dist/Bubble.js +234 -0
- package/dist/Bubble.js.map +1 -0
- package/dist/Feedback.d.ts +14 -0
- package/dist/Feedback.d.ts.map +1 -0
- package/dist/Feedback.js +977 -0
- package/dist/Feedback.js.map +1 -0
- package/dist/Overlay.d.ts +13 -0
- package/dist/Overlay.d.ts.map +1 -0
- package/dist/Overlay.js +44 -0
- package/dist/Overlay.js.map +1 -0
- package/dist/Popover.d.ts +98 -0
- package/dist/Popover.d.ts.map +1 -0
- package/dist/Popover.js +531 -0
- package/dist/Popover.js.map +1 -0
- package/dist/Tapthrough.d.ts +27 -0
- package/dist/Tapthrough.d.ts.map +1 -0
- package/dist/Tapthrough.js +111 -0
- package/dist/Tapthrough.js.map +1 -0
- package/dist/core/annotations.d.ts +63 -0
- package/dist/core/annotations.d.ts.map +1 -0
- package/dist/core/annotations.js +76 -0
- package/dist/core/annotations.js.map +1 -0
- package/dist/core/bubble.d.ts +21 -0
- package/dist/core/bubble.d.ts.map +1 -0
- package/dist/core/bubble.js +25 -0
- package/dist/core/bubble.js.map +1 -0
- package/dist/core/controller.d.ts +46 -0
- package/dist/core/controller.d.ts.map +1 -0
- package/dist/core/controller.js +103 -0
- package/dist/core/controller.js.map +1 -0
- package/dist/core/diagnostics.d.ts +47 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +101 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/feedback.d.ts +302 -0
- package/dist/core/feedback.d.ts.map +1 -0
- package/dist/core/feedback.js +345 -0
- package/dist/core/feedback.js.map +1 -0
- package/dist/core/flags.d.ts +13 -0
- package/dist/core/flags.d.ts.map +1 -0
- package/dist/core/flags.js +25 -0
- package/dist/core/flags.js.map +1 -0
- package/dist/core/ideas.d.ts +166 -0
- package/dist/core/ideas.d.ts.map +1 -0
- package/dist/core/ideas.js +159 -0
- package/dist/core/ideas.js.map +1 -0
- package/dist/core/launch.d.ts +43 -0
- package/dist/core/launch.d.ts.map +1 -0
- package/dist/core/launch.js +81 -0
- package/dist/core/launch.js.map +1 -0
- package/dist/core/reset.d.ts +17 -0
- package/dist/core/reset.d.ts.map +1 -0
- package/dist/core/reset.js +19 -0
- package/dist/core/reset.js.map +1 -0
- package/dist/core/review.d.ts +49 -0
- package/dist/core/review.d.ts.map +1 -0
- package/dist/core/review.js +92 -0
- package/dist/core/review.js.map +1 -0
- package/dist/core/url.d.ts +9 -0
- package/dist/core/url.d.ts.map +1 -0
- package/dist/core/url.js +23 -0
- package/dist/core/url.js.map +1 -0
- package/dist/hooks.d.ts +6 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +13 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/native-intent.d.ts +18 -0
- package/dist/native-intent.d.ts.map +1 -0
- package/dist/native-intent.js +32 -0
- package/dist/native-intent.js.map +1 -0
- package/dist/runtime.d.ts +24 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +17 -0
- package/dist/runtime.js.map +1 -0
- package/dist/screenshot.d.ts +7 -0
- package/dist/screenshot.d.ts.map +1 -0
- package/dist/screenshot.js +48 -0
- package/dist/screenshot.js.map +1 -0
- package/dist/supabase.d.ts +20 -0
- package/dist/supabase.d.ts.map +1 -0
- package/dist/supabase.js +18 -0
- package/dist/supabase.js.map +1 -0
- package/dist/ui/native.d.ts +34 -0
- package/dist/ui/native.d.ts.map +1 -0
- package/dist/ui/native.js +76 -0
- package/dist/ui/native.js.map +1 -0
- package/dist/ui/parts.d.ts +62 -0
- package/dist/ui/parts.d.ts.map +1 -0
- package/dist/ui/parts.js +110 -0
- package/dist/ui/parts.js.map +1 -0
- package/dist/ui/theme.d.ts +90 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +61 -0
- package/dist/ui/theme.js.map +1 -0
- package/package.json +82 -3
- package/src/Annotator.tsx +279 -0
- package/src/Bubble.tsx +331 -0
- package/src/Feedback.tsx +1739 -0
- package/src/Overlay.tsx +61 -0
- package/src/Popover.tsx +1393 -0
- package/src/Tapthrough.tsx +171 -0
- package/src/core/annotations.ts +116 -0
- package/src/core/bubble.ts +45 -0
- package/src/core/controller.ts +119 -0
- package/src/core/diagnostics.ts +128 -0
- package/src/core/feedback.ts +589 -0
- package/src/core/flags.ts +31 -0
- package/src/core/ideas.ts +337 -0
- package/src/core/launch.ts +119 -0
- package/src/core/reset.ts +28 -0
- package/src/core/review.ts +148 -0
- package/src/core/url.ts +21 -0
- package/src/hooks.ts +15 -0
- package/src/index.ts +8 -0
- package/src/native-intent.ts +36 -0
- package/src/runtime.ts +30 -0
- package/src/screenshot.ts +64 -0
- package/src/supabase.ts +27 -0
- package/src/ui/native.ts +116 -0
- package/src/ui/parts.tsx +249 -0
- package/src/ui/theme.ts +75 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The update group of the running EAS update, from `Constants.manifest2`.
|
|
3
|
+
* A development build has it however the update was opened (QR code, Orbit
|
|
4
|
+
* or a Tapthrough link); an embedded or local build has none.
|
|
5
|
+
*/
|
|
6
|
+
export function previewContextFromManifest(manifest) {
|
|
7
|
+
const m = manifest;
|
|
8
|
+
const metadata = m?.metadata;
|
|
9
|
+
const projectId = m?.extra?.eas?.projectId;
|
|
10
|
+
if (typeof metadata?.updateGroup !== 'string' || metadata.updateGroup === '')
|
|
11
|
+
return null;
|
|
12
|
+
if (typeof projectId !== 'string')
|
|
13
|
+
return null;
|
|
14
|
+
return {
|
|
15
|
+
updateGroupId: metadata.updateGroup,
|
|
16
|
+
projectId,
|
|
17
|
+
branch: typeof metadata.branchName === 'string' ? metadata.branchName : undefined,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** A link token's payload, read without verification (the seed hook and server verify). */
|
|
21
|
+
export function decodeTokenClaims(token) {
|
|
22
|
+
const payload = token.split('.')[1];
|
|
23
|
+
if (!payload)
|
|
24
|
+
return undefined;
|
|
25
|
+
try {
|
|
26
|
+
const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');
|
|
27
|
+
const json = JSON.parse(globalThis.atob(base64.padEnd(Math.ceil(base64.length / 4) * 4, '=')));
|
|
28
|
+
return json && typeof json === 'object' ? json : undefined;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The scenario ID (`scn`) from a link token, for attributing reports. The
|
|
36
|
+
* server checks the ID belongs to the same PR.
|
|
37
|
+
*/
|
|
38
|
+
export function scenarioIdFromToken(token) {
|
|
39
|
+
const scn = decodeTokenClaims(token)?.scn;
|
|
40
|
+
return typeof scn === 'string' ? scn : undefined;
|
|
41
|
+
}
|
|
42
|
+
/** Markdown reasons from the server, as plain text for the app. */
|
|
43
|
+
export function plainReason(reason) {
|
|
44
|
+
return reason.replace(/`([^`]*)`/g, '$1').replace(/\*\*/g, '');
|
|
45
|
+
}
|
|
46
|
+
/** Posts a report to Tapthrough, which comments it on the PR. Never throws. */
|
|
47
|
+
export async function sendFeedback(input, options) {
|
|
48
|
+
const doFetch = options.fetch ?? fetch;
|
|
49
|
+
let response;
|
|
50
|
+
try {
|
|
51
|
+
response = await doFetch(`${options.apiUrl.replace(/\/$/, '')}/api/v1/feedback`, {
|
|
52
|
+
method: 'POST',
|
|
53
|
+
headers: { 'Content-Type': 'application/json' },
|
|
54
|
+
body: JSON.stringify({
|
|
55
|
+
apiVersion: 1,
|
|
56
|
+
updateGroupId: input.preview.updateGroupId,
|
|
57
|
+
projectId: input.preview.projectId,
|
|
58
|
+
platform: input.platform,
|
|
59
|
+
body: input.body,
|
|
60
|
+
...(input.reporterName ? { reporterName: input.reporterName } : {}),
|
|
61
|
+
...(input.route ? { route: input.route } : {}),
|
|
62
|
+
...(input.scenarioId ? { scenarioId: input.scenarioId } : {}),
|
|
63
|
+
...(input.device ? { device: input.device } : {}),
|
|
64
|
+
...(input.screenshot ? { screenshot: input.screenshot } : {}),
|
|
65
|
+
...(input.diagnostics ? { diagnostics: input.diagnostics } : {}),
|
|
66
|
+
...(input.screenshot && input.annotations?.length
|
|
67
|
+
? { annotations: input.annotations }
|
|
68
|
+
: {}),
|
|
69
|
+
...(input.cause ? { cause: input.cause } : {}),
|
|
70
|
+
}),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return { ok: false, message: "Couldn't reach Tapthrough. Check your connection and try again." };
|
|
75
|
+
}
|
|
76
|
+
const body = (await response.json().catch(() => undefined));
|
|
77
|
+
if (response.ok && body?.commentUrl) {
|
|
78
|
+
return {
|
|
79
|
+
ok: true,
|
|
80
|
+
commentUrl: body.commentUrl,
|
|
81
|
+
...(body.findingId ? { findingId: body.findingId } : {}),
|
|
82
|
+
// Older servers don't triage; the app then just asks.
|
|
83
|
+
cause: body.cause ?? 'unknown',
|
|
84
|
+
causeSource: body.causeSource ?? 'guess',
|
|
85
|
+
reasons: (body.reasons ?? []).map(plainReason),
|
|
86
|
+
...(body.issueUrl ? { issueUrl: body.issueUrl } : {}),
|
|
87
|
+
...(body.issueFix === 'auto' || body.issueFix === 'label' ? { issueFix: body.issueFix } : {}),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return { ok: false, message: body?.error?.message ?? `Tapthrough returned ${response.status}.` };
|
|
91
|
+
}
|
|
92
|
+
/** Why the checklist started over, for a reviewer. */
|
|
93
|
+
export function resetMessage(reset) {
|
|
94
|
+
const checks = reset.cleared === 1 ? '1 check' : `${reset.cleared} checks`;
|
|
95
|
+
const why = reset.reason === 'code'
|
|
96
|
+
? 'this push changed the code they cover'
|
|
97
|
+
: reset.reason === 'config'
|
|
98
|
+
? 'this push changed dependencies or app config, which can affect any screen'
|
|
99
|
+
: 'Tapthrough couldn’t tell what this push changed';
|
|
100
|
+
return `${checks} from ${reset.fromSha.slice(0, 7)} ${reset.cleared === 1 ? 'was' : 'were'} cleared because ${why}. Checks on screens it didn’t touch were kept.`;
|
|
101
|
+
}
|
|
102
|
+
/** Whether the Review sheet has anything to show. */
|
|
103
|
+
export function hasReviewItems(checklist) {
|
|
104
|
+
return Boolean(checklist &&
|
|
105
|
+
(checklist.scenarios.some((s) => s.steps.length > 0) ||
|
|
106
|
+
(checklist.recheck?.length ?? 0) > 0 ||
|
|
107
|
+
checklist.library?.some((entry) => !entry.picked) ||
|
|
108
|
+
checklist.newerBuild));
|
|
109
|
+
}
|
|
110
|
+
/** Step results across the plan, keyed `scenario:index` like the Review sheet. */
|
|
111
|
+
export function checklistProgress(checklist, results = {}) {
|
|
112
|
+
const progress = { total: 0, passed: 0, failed: 0 };
|
|
113
|
+
for (const scenario of checklist.scenarios) {
|
|
114
|
+
for (const step of scenario.steps) {
|
|
115
|
+
progress.total += 1;
|
|
116
|
+
const result = results[`${scenario.key}:${step.index}`] ?? step.result?.result;
|
|
117
|
+
if (result === 'pass')
|
|
118
|
+
progress.passed += 1;
|
|
119
|
+
if (result === 'fail')
|
|
120
|
+
progress.failed += 1;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return progress;
|
|
124
|
+
}
|
|
125
|
+
/** One line for the sheet's header, e.g. `1 of 3 checked` or `3 of 3 passed`. */
|
|
126
|
+
export function progressLabel({ total, passed, failed }) {
|
|
127
|
+
if (total === 0)
|
|
128
|
+
return 'No steps to check';
|
|
129
|
+
if (passed === total)
|
|
130
|
+
return `${total} of ${total} passed`;
|
|
131
|
+
const label = `${passed + failed} of ${total} checked`;
|
|
132
|
+
return failed ? `${label} · ${failed} failed` : label;
|
|
133
|
+
}
|
|
134
|
+
/** What the floating Review button shows: a new build wins, then failures, then steps left. */
|
|
135
|
+
export function reviewBadge(checklist) {
|
|
136
|
+
if (!checklist)
|
|
137
|
+
return null;
|
|
138
|
+
if (checklist.newerBuild)
|
|
139
|
+
return { kind: 'new-build' };
|
|
140
|
+
const progress = checklistProgress(checklist);
|
|
141
|
+
if (progress.total === 0)
|
|
142
|
+
return null;
|
|
143
|
+
if (progress.failed)
|
|
144
|
+
return { kind: 'failed' };
|
|
145
|
+
const count = progress.total - progress.passed;
|
|
146
|
+
return count === 0 ? { kind: 'done' } : { kind: 'remaining', count };
|
|
147
|
+
}
|
|
148
|
+
/** Marks an earlier report fixed or still broken on this build. Never throws. */
|
|
149
|
+
export async function sendRecheck(input, options) {
|
|
150
|
+
const doFetch = options.fetch ?? fetch;
|
|
151
|
+
try {
|
|
152
|
+
const response = await doFetch(`${options.apiUrl.replace(/\/$/, '')}/api/v1/findings/${encodeURIComponent(input.findingId)}/check`, {
|
|
153
|
+
method: 'POST',
|
|
154
|
+
headers: { 'Content-Type': 'application/json' },
|
|
155
|
+
body: JSON.stringify({
|
|
156
|
+
apiVersion: 1,
|
|
157
|
+
updateGroupId: input.preview.updateGroupId,
|
|
158
|
+
projectId: input.preview.projectId,
|
|
159
|
+
platform: input.platform,
|
|
160
|
+
result: input.result,
|
|
161
|
+
...(input.reporterName ? { reporterName: input.reporterName } : {}),
|
|
162
|
+
}),
|
|
163
|
+
});
|
|
164
|
+
if (response.ok)
|
|
165
|
+
return { ok: true };
|
|
166
|
+
const body = (await response.json().catch(() => undefined));
|
|
167
|
+
return { ok: false, message: body?.error?.message ?? `Tapthrough returned ${response.status}.` };
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return { ok: false, message: "Couldn't reach Tapthrough. Check your connection and try again." };
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/** The reporter saying whether the PR caused a report. Never throws. */
|
|
174
|
+
export async function sendCause(input, options) {
|
|
175
|
+
const doFetch = options.fetch ?? fetch;
|
|
176
|
+
try {
|
|
177
|
+
const response = await doFetch(`${options.apiUrl.replace(/\/$/, '')}/api/v1/findings/${encodeURIComponent(input.findingId)}/cause`, {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
headers: { 'Content-Type': 'application/json' },
|
|
180
|
+
body: JSON.stringify({
|
|
181
|
+
apiVersion: 1,
|
|
182
|
+
updateGroupId: input.preview.updateGroupId,
|
|
183
|
+
projectId: input.preview.projectId,
|
|
184
|
+
platform: input.platform,
|
|
185
|
+
cause: input.cause,
|
|
186
|
+
}),
|
|
187
|
+
});
|
|
188
|
+
if (response.ok)
|
|
189
|
+
return { ok: true };
|
|
190
|
+
const body = (await response.json().catch(() => undefined));
|
|
191
|
+
return { ok: false, message: body?.error?.message ?? `Tapthrough returned ${response.status}.` };
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return { ok: false, message: "Couldn't reach Tapthrough. Check your connection and try again." };
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/** Asks Claude to fix a report on the PR's branch, in the repo's own Actions. Never throws. */
|
|
198
|
+
export async function requestFix(input, options) {
|
|
199
|
+
const doFetch = options.fetch ?? fetch;
|
|
200
|
+
try {
|
|
201
|
+
const response = await doFetch(`${options.apiUrl.replace(/\/$/, '')}/api/v1/findings/${encodeURIComponent(input.findingId)}/fix`, {
|
|
202
|
+
method: 'POST',
|
|
203
|
+
headers: { 'Content-Type': 'application/json' },
|
|
204
|
+
body: JSON.stringify({
|
|
205
|
+
apiVersion: 1,
|
|
206
|
+
updateGroupId: input.preview.updateGroupId,
|
|
207
|
+
projectId: input.preview.projectId,
|
|
208
|
+
platform: input.platform,
|
|
209
|
+
...(input.reporterName ? { reporterName: input.reporterName } : {}),
|
|
210
|
+
}),
|
|
211
|
+
});
|
|
212
|
+
const body = (await response.json().catch(() => undefined));
|
|
213
|
+
if (response.ok && body?.status)
|
|
214
|
+
return { ok: true, status: body.status };
|
|
215
|
+
return { ok: false, message: body?.error?.message ?? `Tapthrough returned ${response.status}.` };
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return { ok: false, message: "Couldn't reach Tapthrough. Check your connection and try again." };
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Files a report as a GitHub issue through Tapthrough, so the reporter doesn't
|
|
223
|
+
* need to sign in to GitHub on the phone. Never throws.
|
|
224
|
+
*/
|
|
225
|
+
export async function fileIssue(input, options) {
|
|
226
|
+
const doFetch = options.fetch ?? fetch;
|
|
227
|
+
try {
|
|
228
|
+
const response = await doFetch(`${options.apiUrl.replace(/\/$/, '')}/api/v1/findings/${encodeURIComponent(input.findingId)}/issue`, {
|
|
229
|
+
method: 'POST',
|
|
230
|
+
headers: { 'Content-Type': 'application/json' },
|
|
231
|
+
body: JSON.stringify({
|
|
232
|
+
apiVersion: 1,
|
|
233
|
+
updateGroupId: input.preview.updateGroupId,
|
|
234
|
+
projectId: input.preview.projectId,
|
|
235
|
+
platform: input.platform,
|
|
236
|
+
}),
|
|
237
|
+
});
|
|
238
|
+
const body = (await response.json().catch(() => undefined));
|
|
239
|
+
if (response.ok && body?.issueNumber && body.issueUrl) {
|
|
240
|
+
const fix = ['started', 'not_set_up', 'refused', 'off'].includes(String(body.fix))
|
|
241
|
+
? body.fix
|
|
242
|
+
: null;
|
|
243
|
+
return { ok: true, issueNumber: body.issueNumber, issueUrl: body.issueUrl, fix };
|
|
244
|
+
}
|
|
245
|
+
// A server from before this endpoint answers 404 with no error code.
|
|
246
|
+
const openInBrowser = body?.error?.code === 'github_denied' || (response.status === 404 && !body?.error?.code);
|
|
247
|
+
return {
|
|
248
|
+
ok: false,
|
|
249
|
+
message: body?.error?.message ?? `Tapthrough returned ${response.status}.`,
|
|
250
|
+
openInBrowser,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
return {
|
|
255
|
+
ok: false,
|
|
256
|
+
message: "Couldn't reach Tapthrough. Check your connection and try again.",
|
|
257
|
+
openInBrowser: false,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Asks Tapthrough for a launch link into one of the PR's scenarios, so the
|
|
263
|
+
* app can set itself up for it without leaving. Never throws.
|
|
264
|
+
*/
|
|
265
|
+
export async function requestLaunch(input, options) {
|
|
266
|
+
const doFetch = options.fetch ?? fetch;
|
|
267
|
+
try {
|
|
268
|
+
const response = await doFetch(`${options.apiUrl.replace(/\/$/, '')}/api/v1/checklist/launch`, {
|
|
269
|
+
method: 'POST',
|
|
270
|
+
headers: { 'Content-Type': 'application/json' },
|
|
271
|
+
body: JSON.stringify({
|
|
272
|
+
apiVersion: 1,
|
|
273
|
+
updateGroupId: input.preview.updateGroupId,
|
|
274
|
+
projectId: input.preview.projectId,
|
|
275
|
+
platform: input.platform,
|
|
276
|
+
scenario: input.scenarioKey,
|
|
277
|
+
}),
|
|
278
|
+
});
|
|
279
|
+
const body = (await response.json().catch(() => undefined));
|
|
280
|
+
if (response.ok && typeof body?.launchUrl === 'string') {
|
|
281
|
+
return { ok: true, launchUrl: body.launchUrl };
|
|
282
|
+
}
|
|
283
|
+
if (response.status === 404 && !body?.error) {
|
|
284
|
+
return { ok: false, message: 'This version of Tapthrough can’t set the app up yet.' };
|
|
285
|
+
}
|
|
286
|
+
return { ok: false, message: body?.error?.message ?? `Tapthrough returned ${response.status}.` };
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
return { ok: false, message: "Couldn't reach Tapthrough. Check your connection and try again." };
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/** The PR's test plan and current results for the running build, or null if there isn't one. */
|
|
293
|
+
export async function fetchChecklist(preview, platform, options) {
|
|
294
|
+
const doFetch = options.fetch ?? fetch;
|
|
295
|
+
const query = new URLSearchParams({
|
|
296
|
+
updateGroupId: preview.updateGroupId,
|
|
297
|
+
projectId: preview.projectId,
|
|
298
|
+
platform,
|
|
299
|
+
});
|
|
300
|
+
try {
|
|
301
|
+
const response = await doFetch(`${options.apiUrl.replace(/\/$/, '')}/api/v1/checklist?${query}`);
|
|
302
|
+
if (!response.ok)
|
|
303
|
+
return null;
|
|
304
|
+
return (await response.json());
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/** Records a pass, fail or skip for one step. Never throws. */
|
|
311
|
+
export async function sendStepResult(input, options) {
|
|
312
|
+
const doFetch = options.fetch ?? fetch;
|
|
313
|
+
try {
|
|
314
|
+
const response = await doFetch(`${options.apiUrl.replace(/\/$/, '')}/api/v1/step-results`, {
|
|
315
|
+
method: 'POST',
|
|
316
|
+
headers: { 'Content-Type': 'application/json' },
|
|
317
|
+
body: JSON.stringify({
|
|
318
|
+
apiVersion: 1,
|
|
319
|
+
updateGroupId: input.preview.updateGroupId,
|
|
320
|
+
projectId: input.preview.projectId,
|
|
321
|
+
platform: input.platform,
|
|
322
|
+
scenarioKey: input.scenarioKey,
|
|
323
|
+
stepIndex: input.stepIndex,
|
|
324
|
+
result: input.result,
|
|
325
|
+
...(input.reporterName ? { reporterName: input.reporterName } : {}),
|
|
326
|
+
...(input.findingId ? { findingId: input.findingId } : {}),
|
|
327
|
+
}),
|
|
328
|
+
});
|
|
329
|
+
if (response.ok)
|
|
330
|
+
return { ok: true };
|
|
331
|
+
const body = (await response.json().catch(() => undefined));
|
|
332
|
+
return { ok: false, message: body?.error?.message ?? `Tapthrough returned ${response.status}.` };
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
return { ok: false, message: "Couldn't reach Tapthrough. Check your connection and try again." };
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/** The report body for a failed step: the step and its expectation, then the reviewer's note. */
|
|
339
|
+
export function failedStepBody(step, note) {
|
|
340
|
+
const parts = [`Step failed: ${step.action}`, `Expected: ${step.expect}`];
|
|
341
|
+
if (note.trim())
|
|
342
|
+
parts.push('', note.trim());
|
|
343
|
+
return parts.join('\n');
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/core/feedback.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAAiB;IAC1D,MAAM,CAAC,GAAG,QAGF,CAAA;IACR,MAAM,QAAQ,GAAG,CAAC,EAAE,QAAQ,CAAA;IAC5B,MAAM,SAAS,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,CAAA;IAC1C,IAAI,OAAO,QAAQ,EAAE,WAAW,KAAK,QAAQ,IAAI,QAAQ,CAAC,WAAW,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA;IACzF,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC9C,OAAO;QACL,aAAa,EAAE,QAAQ,CAAC,WAAW;QACnC,SAAS;QACT,MAAM,EAAE,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;KAClF,CAAA;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC5D,MAAM,IAAI,GAAY,IAAI,CAAC,KAAK,CAC9B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CACtE,CAAA;QACD,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAgC,CAAC,CAAC,CAAC,SAAS,CAAA;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,EAAE,GAAG,CAAA;IACzC,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;AAClD,CAAC;AAoCD,mEAAmE;AACnE,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AAChE,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAoB,EACpB,OAAiD;IAEjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACtC,IAAI,QAAkB,CAAA;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,EAAE;YAC/E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa;gBAC1C,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;gBAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9C,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,MAAM;oBAC/C,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE;oBACpC,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/C,CAAC;SACH,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iEAAiE,EAAE,CAAA;IAClG,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAE7C,CAAA;IACb,IAAI,QAAQ,CAAC,EAAE,IAAI,IAAI,EAAE,UAAU,EAAE,CAAC;QACpC,OAAO;YACL,EAAE,EAAE,IAAI;YACR,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,sDAAsD;YACtD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,OAAO;YACxC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9F,CAAA;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,uBAAuB,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAA;AAClG,CAAC;AAwBD,sDAAsD;AACtD,MAAM,UAAU,YAAY,CAAC,KAAqB;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,SAAS,CAAA;IAC1E,MAAM,GAAG,GACP,KAAK,CAAC,MAAM,KAAK,MAAM;QACrB,CAAC,CAAC,uCAAuC;QACzC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ;YACzB,CAAC,CAAC,2EAA2E;YAC7E,CAAC,CAAC,iDAAiD,CAAA;IACzD,OAAO,GAAG,MAAM,SAAS,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,oBAAoB,GAAG,gDAAgD,CAAA;AACnK,CAAC;AAmED,qDAAqD;AACrD,MAAM,UAAU,cAAc,CAAC,SAA2B;IACxD,OAAO,OAAO,CACZ,SAAS;QACP,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAClD,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;YACpC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;YACjD,SAAS,CAAC,UAAU,CAAC,CAC1B,CAAA;AACH,CAAC;AAQD,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAC/B,SAAoB,EACpB,UAAuD,EAAE;IAEzD,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;IACnD,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAA;YACnB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,CAAA;YAC9E,IAAI,MAAM,KAAK,MAAM;gBAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAA;YAC3C,IAAI,MAAM,KAAK,MAAM;gBAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAY;IAC/D,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,mBAAmB,CAAA;IAC3C,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,GAAG,KAAK,OAAO,KAAK,SAAS,CAAA;IAC1D,MAAM,KAAK,GAAG,GAAG,MAAM,GAAG,MAAM,OAAO,KAAK,UAAU,CAAA;IACtD,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,MAAM,SAAS,CAAC,CAAC,CAAC,KAAK,CAAA;AACvD,CAAC;AAUD,+FAA+F;AAC/F,MAAM,UAAU,WAAW,CAAC,SAA2B;IACrD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAC3B,IAAI,SAAS,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;IACtD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAA;IAC7C,IAAI,QAAQ,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACrC,IAAI,QAAQ,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAA;IAC9C,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;AACtE,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAMC,EACD,OAAiD;IAEjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EACnG;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa;gBAC1C,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;gBAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpE,CAAC;SACH,CACF,CAAA;QACD,IAAI,QAAQ,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QACpC,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAE7C,CAAA;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,uBAAuB,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAA;IAClG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iEAAiE,EAAE,CAAA;IAClG,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAKC,EACD,OAAiD;IAEjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EACnG;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa;gBAC1C,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;gBAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC;SACH,CACF,CAAA;QACD,IAAI,QAAQ,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QACpC,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAE7C,CAAA;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,uBAAuB,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAA;IAClG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iEAAiE,EAAE,CAAA;IAClG,CAAC;AACH,CAAC;AAMD,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAKC,EACD,OAAiD;IAEjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EACjG;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa;gBAC1C,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;gBAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpE,CAAC;SACH,CACF,CAAA;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAE7C,CAAA;QACb,IAAI,QAAQ,CAAC,EAAE,IAAI,IAAI,EAAE,MAAM;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAA;QACzE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,uBAAuB,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAA;IAClG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iEAAiE,EAAE,CAAA;IAClG,CAAC;AACH,CAAC;AAUD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAyE,EACzE,OAAiD;IAEjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EACnG;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa;gBAC1C,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;gBAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC;SACH,CACF,CAAA;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAO7C,CAAA;QACb,IAAI,QAAQ,CAAC,EAAE,IAAI,IAAI,EAAE,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChF,CAAC,CAAE,IAAI,CAAC,GAAgB;gBACxB,CAAC,CAAC,IAAI,CAAA;YACR,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAA;QAClF,CAAC;QACD,qEAAqE;QACrE,MAAM,aAAa,GACjB,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,eAAe,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;QAC1F,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,uBAAuB,QAAQ,CAAC,MAAM,GAAG;YAC1E,aAAa;SACd,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,iEAAiE;YAC1E,aAAa,EAAE,KAAK;SACrB,CAAA;IACH,CAAC;AACH,CAAC;AAID;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAA2E,EAC3E,OAAiD;IAEjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,0BAA0B,EAAE;YAC7F,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa;gBAC1C,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;gBAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,KAAK,CAAC,WAAW;aAC5B,CAAC;SACH,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAE7C,CAAA;QACb,IAAI,QAAQ,CAAC,EAAE,IAAI,OAAO,IAAI,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAA;QAChD,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;YAC5C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,sDAAsD,EAAE,CAAA;QACvF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,uBAAuB,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAA;IAClG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iEAAiE,EAAE,CAAA;IAClG,CAAC;AACH,CAAC;AAED,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAuB,EACvB,QAAkB,EAClB,OAAiD;IAEjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACtC,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC;QAChC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ;KACT,CAAC,CAAA;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAA;QAChG,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QAC7B,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAc,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAQC,EACD,OAAiD;IAEjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,sBAAsB,EAAE;YACzF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa;gBAC1C,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;gBAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D,CAAC;SACH,CAAC,CAAA;QACF,IAAI,QAAQ,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QACpC,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAE7C,CAAA;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,uBAAuB,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAA;IAClG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iEAAiE,EAAE,CAAA;IAClG,CAAC;AACH,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,cAAc,CAAC,IAAwC,EAAE,IAAY;IACnF,MAAM,KAAK,GAAG,CAAC,gBAAgB,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IACzE,IAAI,IAAI,CAAC,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Flags } from '@tapthrough/protocol';
|
|
2
|
+
type Listener = () => void;
|
|
3
|
+
/**
|
|
4
|
+
* Feature flags a scenario forces on or off. Your flag lookup should check
|
|
5
|
+
* these first: `getFlagOverride('newEditor') ?? yourFlags.newEditor`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getFlagOverride(name: string): boolean | string | undefined;
|
|
8
|
+
export declare function getFlagOverrides(): Readonly<Flags>;
|
|
9
|
+
/** Replaces all overrides. Called by the launch sequence. */
|
|
10
|
+
export declare function setFlagOverrides(next: Flags): void;
|
|
11
|
+
export declare function subscribeToFlagOverrides(listener: Listener): () => void;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/core/flags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAEjD,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAA;AAK1B;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,gBAAgB,IAAI,QAAQ,CAAC,KAAK,CAAC,CAElD;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAGlD;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI,CAKvE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
let overrides = {};
|
|
2
|
+
const listeners = new Set();
|
|
3
|
+
/**
|
|
4
|
+
* Feature flags a scenario forces on or off. Your flag lookup should check
|
|
5
|
+
* these first: `getFlagOverride('newEditor') ?? yourFlags.newEditor`.
|
|
6
|
+
*/
|
|
7
|
+
export function getFlagOverride(name) {
|
|
8
|
+
return Object.hasOwn(overrides, name) ? overrides[name] : undefined;
|
|
9
|
+
}
|
|
10
|
+
export function getFlagOverrides() {
|
|
11
|
+
return overrides;
|
|
12
|
+
}
|
|
13
|
+
/** Replaces all overrides. Called by the launch sequence. */
|
|
14
|
+
export function setFlagOverrides(next) {
|
|
15
|
+
overrides = Object.freeze({ ...next });
|
|
16
|
+
for (const listener of listeners)
|
|
17
|
+
listener();
|
|
18
|
+
}
|
|
19
|
+
export function subscribeToFlagOverrides(listener) {
|
|
20
|
+
listeners.add(listener);
|
|
21
|
+
return () => {
|
|
22
|
+
listeners.delete(listener);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/core/flags.ts"],"names":[],"mappings":"AAIA,IAAI,SAAS,GAAoB,EAAE,CAAA;AACnC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAY,CAAA;AAErC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,gBAAgB,CAAC,IAAW;IAC1C,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;IACtC,KAAK,MAAM,QAAQ,IAAI,SAAS;QAAE,QAAQ,EAAE,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAkB;IACzD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACvB,OAAO,GAAG,EAAE;QACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC5B,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import type { Platform } from '@tapthrough/protocol';
|
|
2
|
+
import type { PreviewContext } from './feedback.js';
|
|
3
|
+
export type IdeaStatus = 'grooming' | 'needs_answers' | 'ready' | 'building' | 'built' | 'ready_to_test' | 'approved' | 'merged' | 'closed' | 'declined' | 'failed' | 'not_set_up';
|
|
4
|
+
export type IdeaAction = 'answer' | 'build' | 'approve' | 'retry';
|
|
5
|
+
/** One step from sent to merged: done, in progress, not reached yet, or where it stopped. */
|
|
6
|
+
export interface IdeaStage {
|
|
7
|
+
key: 'sent' | 'written' | 'built' | 'preview' | 'merged';
|
|
8
|
+
title: string;
|
|
9
|
+
state: 'done' | 'active' | 'waiting' | 'failed';
|
|
10
|
+
detail: string | null;
|
|
11
|
+
at: string | null;
|
|
12
|
+
}
|
|
13
|
+
/** An idea someone sent from the app, as Tapthrough reports it. */
|
|
14
|
+
export interface Idea {
|
|
15
|
+
id: string;
|
|
16
|
+
status: IdeaStatus;
|
|
17
|
+
body: string;
|
|
18
|
+
title: string | null;
|
|
19
|
+
summary: string | null;
|
|
20
|
+
questions: string[];
|
|
21
|
+
steps: {
|
|
22
|
+
action: string;
|
|
23
|
+
expect: string;
|
|
24
|
+
}[];
|
|
25
|
+
authorName: string | null;
|
|
26
|
+
issueNumber: number | null;
|
|
27
|
+
issueUrl: string | null;
|
|
28
|
+
prNumber: number | null;
|
|
29
|
+
prUrl: string | null;
|
|
30
|
+
previewUrl: string | null;
|
|
31
|
+
note: string | null;
|
|
32
|
+
/** e.g. "Claude has a question", from the server so wording can change without an app update. */
|
|
33
|
+
statusLine: string;
|
|
34
|
+
/** Older servers send none; the app then shows the status line only. */
|
|
35
|
+
stages?: IdeaStage[];
|
|
36
|
+
/** Something looks stuck or slow; null when all is well. */
|
|
37
|
+
warning?: string | null;
|
|
38
|
+
runUrl?: string | null;
|
|
39
|
+
actionsUrl?: string;
|
|
40
|
+
createdAt: string;
|
|
41
|
+
actions: IdeaAction[];
|
|
42
|
+
}
|
|
43
|
+
/** An open PR with a preview, for switching builds without going back to GitHub. */
|
|
44
|
+
export interface OpenPr {
|
|
45
|
+
number: number;
|
|
46
|
+
title: string;
|
|
47
|
+
author: string | null;
|
|
48
|
+
draft: boolean;
|
|
49
|
+
current: boolean;
|
|
50
|
+
openUrl: string | null;
|
|
51
|
+
needsNewBuild: boolean;
|
|
52
|
+
fromIdea: boolean;
|
|
53
|
+
updatedAt: string;
|
|
54
|
+
}
|
|
55
|
+
export type ApproveOutcome = 'review' | 'auto_merge' | 'merged';
|
|
56
|
+
type Result<T> = ({
|
|
57
|
+
ok: true;
|
|
58
|
+
} & T) | {
|
|
59
|
+
ok: false;
|
|
60
|
+
message: string;
|
|
61
|
+
};
|
|
62
|
+
interface Options {
|
|
63
|
+
apiUrl: string;
|
|
64
|
+
fetch?: typeof fetch;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Who's asking: a PR build, proved by its running update, or a staging or
|
|
68
|
+
* TestFlight build, proved by the repo's app key.
|
|
69
|
+
*/
|
|
70
|
+
export type Caller = {
|
|
71
|
+
kind: 'build';
|
|
72
|
+
preview: PreviewContext;
|
|
73
|
+
} | {
|
|
74
|
+
kind: 'key';
|
|
75
|
+
appKey: string;
|
|
76
|
+
};
|
|
77
|
+
export interface IdeaDraft {
|
|
78
|
+
body: string;
|
|
79
|
+
authorName?: string;
|
|
80
|
+
authorEmail?: string;
|
|
81
|
+
route?: string;
|
|
82
|
+
device?: {
|
|
83
|
+
os?: string;
|
|
84
|
+
osVersion?: string;
|
|
85
|
+
model?: string;
|
|
86
|
+
};
|
|
87
|
+
screenshot?: {
|
|
88
|
+
contentType: 'image/jpeg' | 'image/png';
|
|
89
|
+
base64: string;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** Sends an idea; Claude starts writing it up in the repo's fix workflow. Never throws. */
|
|
93
|
+
export declare function submitIdea(input: {
|
|
94
|
+
caller: Caller;
|
|
95
|
+
platform: Platform;
|
|
96
|
+
draft: IdeaDraft;
|
|
97
|
+
}, options: Options): Promise<Result<{
|
|
98
|
+
idea: Idea;
|
|
99
|
+
}>>;
|
|
100
|
+
/** The app's recent ideas, newest first; an empty list when Tapthrough can't say. */
|
|
101
|
+
export declare function fetchIdeas(caller: Caller, platform: Platform, options: Options): Promise<Idea[]>;
|
|
102
|
+
/** The repo's open PRs with previews; null when Tapthrough can't say. */
|
|
103
|
+
export declare function fetchOpenPrs(preview: PreviewContext, platform: Platform, options: Options): Promise<OpenPr[] | null>;
|
|
104
|
+
/** Answers Claude's questions; it writes the idea up again with them. Never throws. */
|
|
105
|
+
export declare function answerIdea(input: {
|
|
106
|
+
caller: Caller;
|
|
107
|
+
platform: Platform;
|
|
108
|
+
id: string;
|
|
109
|
+
answers: string[];
|
|
110
|
+
by?: string;
|
|
111
|
+
}, options: Options): Promise<Result<{
|
|
112
|
+
idea: Idea;
|
|
113
|
+
}>>;
|
|
114
|
+
/** Build It, Retry or Approve on one idea. Never throws. */
|
|
115
|
+
export declare function ideaAction(input: {
|
|
116
|
+
caller: Caller;
|
|
117
|
+
platform: Platform;
|
|
118
|
+
id: string;
|
|
119
|
+
action: 'build' | 'retry' | 'approve';
|
|
120
|
+
by?: string;
|
|
121
|
+
}, options: Options): Promise<Result<{
|
|
122
|
+
approve: ApproveOutcome | null;
|
|
123
|
+
idea: Idea;
|
|
124
|
+
}>>;
|
|
125
|
+
/** Ideas waiting on a person: questions to answer, or a build to test. */
|
|
126
|
+
export declare function ideasNeedingYou(ideas: Idea[]): number;
|
|
127
|
+
/** What Approve did, in plain words. */
|
|
128
|
+
export declare function approveMessage(outcome: ApproveOutcome | null): string;
|
|
129
|
+
/** Grooming, building or waiting on a preview: worth refreshing often while someone watches. */
|
|
130
|
+
export declare function isMoving(idea: Idea): boolean;
|
|
131
|
+
/** "2:41 PM" today, "Nov 10" before, for a timeline step. */
|
|
132
|
+
export declare function stepTime(iso: string | null, now?: Date): string | null;
|
|
133
|
+
export interface StaffReport {
|
|
134
|
+
body: string;
|
|
135
|
+
reporterName?: string;
|
|
136
|
+
route?: string;
|
|
137
|
+
device?: {
|
|
138
|
+
os?: string;
|
|
139
|
+
osVersion?: string;
|
|
140
|
+
model?: string;
|
|
141
|
+
};
|
|
142
|
+
app?: {
|
|
143
|
+
version?: string;
|
|
144
|
+
build?: string;
|
|
145
|
+
};
|
|
146
|
+
screenshot?: {
|
|
147
|
+
contentType: 'image/jpeg' | 'image/png';
|
|
148
|
+
base64: string;
|
|
149
|
+
};
|
|
150
|
+
annotations?: unknown[];
|
|
151
|
+
diagnostics?: unknown;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Files a report from a staging or TestFlight build. There's no PR to comment
|
|
155
|
+
* on, so Tapthrough opens a GitHub issue. Never throws.
|
|
156
|
+
*/
|
|
157
|
+
export declare function sendStaffReport(input: {
|
|
158
|
+
appKey: string;
|
|
159
|
+
platform: Platform;
|
|
160
|
+
report: StaffReport;
|
|
161
|
+
}, options: Options): Promise<Result<{
|
|
162
|
+
issueNumber: number;
|
|
163
|
+
issueUrl: string;
|
|
164
|
+
}>>;
|
|
165
|
+
export {};
|
|
166
|
+
//# sourceMappingURL=ideas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ideas.d.ts","sourceRoot":"","sources":["../../src/core/ideas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,eAAe,GACf,OAAO,GACP,UAAU,GACV,OAAO,GACP,eAAe,GACf,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,YAAY,CAAA;AAEhB,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;AAEjE,6FAA6F;AAC7F,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAA;IACxD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAA;IAC/C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CAClB;AAED,mEAAmE;AACnE,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC3C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,iGAAiG;IACjG,UAAU,EAAE,MAAM,CAAA;IAClB,wEAAwE;IACxE,MAAM,CAAC,EAAE,SAAS,EAAE,CAAA;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,UAAU,EAAE,CAAA;CACtB;AAED,oFAAoF;AACpF,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,aAAa,EAAE,OAAO,CAAA;IACtB,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAA;AAE/D,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,CAAC,CAAC,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpE,UAAU,OAAO;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CACrB;AAID;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AA0DjG,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5D,UAAU,CAAC,EAAE;QAAE,WAAW,EAAE,YAAY,GAAG,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CACzE;AAED,2FAA2F;AAC3F,wBAAgB,UAAU,CACxB,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,EAC/D,OAAO,EAAE,OAAO;UAdkD,IAAI;IAkCvE;AAED,qFAAqF;AACrF,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,EAAE,CAAC,CAMjB;AAED,yEAAyE;AACzE,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAM1B;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CACxB,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ,EACD,OAAO,EAAE,OAAO;UAvEkD,IAAI;IAsFvE;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CACxB,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;IACrC,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ,EACD,OAAO,EAAE,OAAO;;UAjGkD,IAAI;IAuHvE;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAGrD;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,MAAM,CAIrE;AAED,gGAAgG;AAChG,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAE5C;AAED,6DAA6D;AAC7D,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,OAAa,GAAG,MAAM,GAAG,IAAI,CAQ5E;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5D,GAAG,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,UAAU,CAAC,EAAE;QAAE,WAAW,EAAE,YAAY,GAAG,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACxE,WAAW,CAAC,EAAE,OAAO,EAAE,CAAA;IACvB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,EAClE,OAAO,EAAE,OAAO;;;IA6BjB"}
|