opencode-mobile 1.1.0 → 1.2.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/bin/audit +31 -0
- package/bin/qr +13 -0
- package/dist/index.d.ts +11 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +545 -5
- package/dist/index.js.map +1 -1
- package/dist/src/cli/endpoint-tester.d.ts +19 -0
- package/dist/src/cli/endpoint-tester.d.ts.map +1 -0
- package/dist/src/cli/endpoint-tester.js +233 -0
- package/dist/src/cli/endpoint-tester.js.map +1 -0
- package/dist/src/cli/index.d.ts +20 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +166 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/push-tester.d.ts +16 -0
- package/dist/src/cli/push-tester.d.ts.map +1 -0
- package/dist/src/cli/push-tester.js +293 -0
- package/dist/src/cli/push-tester.js.map +1 -0
- package/dist/src/cli/qr.d.ts +5 -0
- package/dist/src/cli/qr.d.ts.map +1 -0
- package/dist/src/cli/qr.js +127 -0
- package/dist/src/cli/qr.js.map +1 -0
- package/dist/src/cli/report.d.ts +25 -0
- package/dist/src/cli/report.d.ts.map +1 -0
- package/dist/src/cli/report.js +215 -0
- package/dist/src/cli/report.js.map +1 -0
- package/dist/src/cli/server-manager.d.ts +28 -0
- package/dist/src/cli/server-manager.d.ts.map +1 -0
- package/dist/src/cli/server-manager.js +340 -0
- package/dist/src/cli/server-manager.js.map +1 -0
- package/dist/src/cli/test-runner.d.ts +16 -0
- package/dist/src/cli/test-runner.d.ts.map +1 -0
- package/dist/src/cli/test-runner.js +201 -0
- package/dist/src/cli/test-runner.js.map +1 -0
- package/dist/src/cli/tunnel-qr.d.ts +8 -0
- package/dist/src/cli/tunnel-qr.d.ts.map +1 -0
- package/dist/src/cli/tunnel-qr.js +163 -0
- package/dist/src/cli/tunnel-qr.js.map +1 -0
- package/dist/src/cli/tunnel-tester.d.ts +22 -0
- package/dist/src/cli/tunnel-tester.d.ts.map +1 -0
- package/dist/src/cli/tunnel-tester.js +360 -0
- package/dist/src/cli/tunnel-tester.js.map +1 -0
- package/dist/src/cli/types.d.ts +112 -0
- package/dist/src/cli/types.d.ts.map +1 -0
- package/dist/src/cli/types.js +5 -0
- package/dist/src/cli/types.js.map +1 -0
- package/dist/src/push/index.d.ts +1 -0
- package/dist/src/push/index.d.ts.map +1 -1
- package/dist/src/push/index.js +1 -0
- package/dist/src/push/index.js.map +1 -1
- package/dist/src/push/notification-handler.d.ts +58 -0
- package/dist/src/push/notification-handler.d.ts.map +1 -0
- package/dist/src/push/notification-handler.js +110 -0
- package/dist/src/push/notification-handler.js.map +1 -0
- package/dist/src/tunnel/cloudflare.d.ts +32 -3
- package/dist/src/tunnel/cloudflare.d.ts.map +1 -1
- package/dist/src/tunnel/cloudflare.js +102 -32
- package/dist/src/tunnel/cloudflare.js.map +1 -1
- package/dist/src/tunnel/localtunnel.d.ts +28 -1
- package/dist/src/tunnel/localtunnel.d.ts.map +1 -1
- package/dist/src/tunnel/localtunnel.js +53 -11
- package/dist/src/tunnel/localtunnel.js.map +1 -1
- package/dist/src/tunnel/metadata.d.ts +29 -0
- package/dist/src/tunnel/metadata.d.ts.map +1 -0
- package/dist/src/tunnel/metadata.js +83 -0
- package/dist/src/tunnel/metadata.js.map +1 -0
- package/dist/src/tunnel/ngrok.d.ts +12 -0
- package/dist/src/tunnel/ngrok.d.ts.map +1 -1
- package/dist/src/tunnel/ngrok.js +72 -29
- package/dist/src/tunnel/ngrok.js.map +1 -1
- package/dist/src/tunnel/qrcode.d.ts +8 -0
- package/dist/src/tunnel/qrcode.d.ts.map +1 -1
- package/dist/src/tunnel/qrcode.js +60 -9
- package/dist/src/tunnel/qrcode.js.map +1 -1
- package/package.json +21 -3
- package/dist/push-notifications.d.ts +0 -4
- package/dist/push-notifications.d.ts.map +0 -1
- package/dist/push-notifications.js +0 -260
- package/dist/push-notifications.js.map +0 -1
- package/dist/reverse-proxy.d.ts +0 -9
- package/dist/reverse-proxy.d.ts.map +0 -1
- package/dist/reverse-proxy.js +0 -78
- package/dist/reverse-proxy.js.map +0 -1
- package/dist/sdk-logger.d.ts +0 -19
- package/dist/sdk-logger.d.ts.map +0 -1
- package/dist/sdk-logger.js +0 -103
- package/dist/sdk-logger.js.map +0 -1
- package/dist/src/tunnel/index.d.ts +0 -35
- package/dist/src/tunnel/index.d.ts.map +0 -1
- package/dist/src/tunnel/index.js +0 -191
- package/dist/src/tunnel/index.js.map +0 -1
- package/dist/src/utils/index.d.ts +0 -5
- package/dist/src/utils/index.d.ts.map +0 -1
- package/dist/src/utils/index.js +0 -5
- package/dist/src/utils/index.js.map +0 -1
- package/dist/src/utils/port.d.ts +0 -12
- package/dist/src/utils/port.d.ts.map +0 -1
- package/dist/src/utils/port.js +0 -41
- package/dist/src/utils/port.js.map +0 -1
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Push notification tester - token store and Expo API
|
|
3
|
+
*/
|
|
4
|
+
import { loadTokens, saveTokens } from "../push/token-store.js";
|
|
5
|
+
const EXPO_PUSH_URL = "https://exp.host/--/api/v2/push/send";
|
|
6
|
+
/**
|
|
7
|
+
* Test push notification functionality
|
|
8
|
+
*/
|
|
9
|
+
export async function testPush(_options) {
|
|
10
|
+
const results = [];
|
|
11
|
+
const result = {
|
|
12
|
+
tokenStore: {
|
|
13
|
+
readable: false,
|
|
14
|
+
writable: false,
|
|
15
|
+
initialCount: 0,
|
|
16
|
+
},
|
|
17
|
+
expoApi: {
|
|
18
|
+
reachable: false,
|
|
19
|
+
},
|
|
20
|
+
tokenOperations: {
|
|
21
|
+
register: false,
|
|
22
|
+
retrieve: false,
|
|
23
|
+
delete: false,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
// Test 1: Check token store readability
|
|
27
|
+
const startRead = Date.now();
|
|
28
|
+
try {
|
|
29
|
+
const tokens = loadTokens();
|
|
30
|
+
result.tokenStore.readable = true;
|
|
31
|
+
result.tokenStore.initialCount = tokens.length;
|
|
32
|
+
results.push({
|
|
33
|
+
name: "push: Token Store Readable",
|
|
34
|
+
category: "push",
|
|
35
|
+
status: "pass",
|
|
36
|
+
message: `Found ${tokens.length} token(s)`,
|
|
37
|
+
duration: Date.now() - startRead,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
42
|
+
results.push({
|
|
43
|
+
name: "push: Token Store Readable",
|
|
44
|
+
category: "push",
|
|
45
|
+
status: "fail",
|
|
46
|
+
message: `Failed to read: ${errorMessage}`,
|
|
47
|
+
duration: Date.now() - startRead,
|
|
48
|
+
error: errorMessage,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// Test 2: Check token store writability
|
|
52
|
+
const startWrite = Date.now();
|
|
53
|
+
try {
|
|
54
|
+
const testDeviceId = `audit-test-${Date.now()}`;
|
|
55
|
+
const testToken = "audit-test-token";
|
|
56
|
+
const tokens = loadTokens();
|
|
57
|
+
const idx = tokens.findIndex((t) => t.deviceId === testDeviceId);
|
|
58
|
+
const newToken = {
|
|
59
|
+
token: testToken,
|
|
60
|
+
platform: "ios",
|
|
61
|
+
deviceId: testDeviceId,
|
|
62
|
+
registeredAt: new Date().toISOString(),
|
|
63
|
+
};
|
|
64
|
+
if (idx >= 0)
|
|
65
|
+
tokens[idx] = newToken;
|
|
66
|
+
else
|
|
67
|
+
tokens.push(newToken);
|
|
68
|
+
saveTokens(tokens);
|
|
69
|
+
result.tokenStore.writable = true;
|
|
70
|
+
results.push({
|
|
71
|
+
name: "push: Token Store Writable",
|
|
72
|
+
category: "push",
|
|
73
|
+
status: "pass",
|
|
74
|
+
message: "Successfully wrote test token",
|
|
75
|
+
duration: Date.now() - startWrite,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
80
|
+
results.push({
|
|
81
|
+
name: "push: Token Store Writable",
|
|
82
|
+
category: "push",
|
|
83
|
+
status: "fail",
|
|
84
|
+
message: `Failed to write: ${errorMessage}`,
|
|
85
|
+
duration: Date.now() - startWrite,
|
|
86
|
+
error: errorMessage,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
// Test 3: Token operations - register
|
|
90
|
+
const startRegister = Date.now();
|
|
91
|
+
try {
|
|
92
|
+
const testDeviceId = `audit-register-${Date.now()}`;
|
|
93
|
+
const testToken = "audit-register-token";
|
|
94
|
+
const tokens = loadTokens();
|
|
95
|
+
const newToken = {
|
|
96
|
+
token: testToken,
|
|
97
|
+
platform: "ios",
|
|
98
|
+
deviceId: testDeviceId,
|
|
99
|
+
registeredAt: new Date().toISOString(),
|
|
100
|
+
};
|
|
101
|
+
tokens.push(newToken);
|
|
102
|
+
saveTokens(tokens);
|
|
103
|
+
// Verify it was saved
|
|
104
|
+
const verifyTokens = loadTokens();
|
|
105
|
+
const found = verifyTokens.some((t) => t.deviceId === testDeviceId);
|
|
106
|
+
result.tokenOperations.register = found;
|
|
107
|
+
results.push({
|
|
108
|
+
name: "push: Token Register",
|
|
109
|
+
category: "push",
|
|
110
|
+
status: found ? "pass" : "fail",
|
|
111
|
+
message: found
|
|
112
|
+
? "Token registered successfully"
|
|
113
|
+
: "Token registration verification failed",
|
|
114
|
+
duration: Date.now() - startRegister,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
119
|
+
results.push({
|
|
120
|
+
name: "push: Token Register",
|
|
121
|
+
category: "push",
|
|
122
|
+
status: "fail",
|
|
123
|
+
message: `Failed: ${errorMessage}`,
|
|
124
|
+
duration: Date.now() - startRegister,
|
|
125
|
+
error: errorMessage,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Test 4: Token operations - retrieve
|
|
129
|
+
const startRetrieve = Date.now();
|
|
130
|
+
try {
|
|
131
|
+
const tokens = loadTokens();
|
|
132
|
+
result.tokenOperations.retrieve = tokens.length >= 0;
|
|
133
|
+
results.push({
|
|
134
|
+
name: "push: Token Retrieve",
|
|
135
|
+
category: "push",
|
|
136
|
+
status: "pass",
|
|
137
|
+
message: `Retrieved ${tokens.length} token(s)`,
|
|
138
|
+
duration: Date.now() - startRetrieve,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
143
|
+
results.push({
|
|
144
|
+
name: "push: Token Retrieve",
|
|
145
|
+
category: "push",
|
|
146
|
+
status: "fail",
|
|
147
|
+
message: `Failed: ${errorMessage}`,
|
|
148
|
+
duration: Date.now() - startRetrieve,
|
|
149
|
+
error: errorMessage,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
// Test 5: Token operations - delete
|
|
153
|
+
const startDelete = Date.now();
|
|
154
|
+
try {
|
|
155
|
+
const testDeviceId = `audit-register-${Date.now()}`;
|
|
156
|
+
const tokens = loadTokens();
|
|
157
|
+
const filtered = tokens.filter((t) => t.deviceId !== testDeviceId);
|
|
158
|
+
saveTokens(filtered);
|
|
159
|
+
// Verify deletion
|
|
160
|
+
const verifyTokens = loadTokens();
|
|
161
|
+
const found = verifyTokens.some((t) => t.deviceId === testDeviceId);
|
|
162
|
+
result.tokenOperations.delete = !found;
|
|
163
|
+
results.push({
|
|
164
|
+
name: "push: Token Delete",
|
|
165
|
+
category: "push",
|
|
166
|
+
status: !found ? "pass" : "fail",
|
|
167
|
+
message: !found
|
|
168
|
+
? "Token deleted successfully"
|
|
169
|
+
: "Token deletion verification failed",
|
|
170
|
+
duration: Date.now() - startDelete,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
175
|
+
results.push({
|
|
176
|
+
name: "push: Token Delete",
|
|
177
|
+
category: "push",
|
|
178
|
+
status: "fail",
|
|
179
|
+
message: `Failed: ${errorMessage}`,
|
|
180
|
+
duration: Date.now() - startDelete,
|
|
181
|
+
error: errorMessage,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
// Test 6: Expo API reachability
|
|
185
|
+
const startExpo = Date.now();
|
|
186
|
+
try {
|
|
187
|
+
const controller = new AbortController();
|
|
188
|
+
const timeoutId = setTimeout(() => controller.abort(), 10000);
|
|
189
|
+
const response = await fetch(EXPO_PUSH_URL, {
|
|
190
|
+
method: "POST",
|
|
191
|
+
headers: { "Content-Type": "application/json" },
|
|
192
|
+
body: JSON.stringify([
|
|
193
|
+
{
|
|
194
|
+
to: "ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]",
|
|
195
|
+
title: "Audit Test",
|
|
196
|
+
body: "This is a test - please ignore",
|
|
197
|
+
},
|
|
198
|
+
]),
|
|
199
|
+
signal: controller.signal,
|
|
200
|
+
});
|
|
201
|
+
clearTimeout(timeoutId);
|
|
202
|
+
const responseTime = Date.now() - startExpo;
|
|
203
|
+
result.expoApi.reachable = true;
|
|
204
|
+
result.expoApi.responseTime = responseTime;
|
|
205
|
+
// Check if it's an auth error (token invalid) vs network error
|
|
206
|
+
const text = await response.text();
|
|
207
|
+
const isAuthError = text.includes("DeviceNotRegistered") ||
|
|
208
|
+
text.includes("InvalidCredentials");
|
|
209
|
+
if (response.status === 200 || (response.status === 400 && isAuthError)) {
|
|
210
|
+
results.push({
|
|
211
|
+
name: "push: Expo API",
|
|
212
|
+
category: "push",
|
|
213
|
+
status: "pass",
|
|
214
|
+
message: `API reachable (${response.status}) - ${responseTime}ms`,
|
|
215
|
+
duration: responseTime,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
results.push({
|
|
220
|
+
name: "push: Expo API",
|
|
221
|
+
category: "push",
|
|
222
|
+
status: "warn",
|
|
223
|
+
message: `API returned ${response.status}`,
|
|
224
|
+
duration: responseTime,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
230
|
+
const duration = Date.now() - startExpo;
|
|
231
|
+
result.expoApi.reachable = false;
|
|
232
|
+
result.expoApi.error = errorMessage;
|
|
233
|
+
// Check for specific error types
|
|
234
|
+
if (errorMessage.includes("aborted")) {
|
|
235
|
+
results.push({
|
|
236
|
+
name: "push: Expo API",
|
|
237
|
+
category: "push",
|
|
238
|
+
status: "fail",
|
|
239
|
+
message: "Request timed out (10s)",
|
|
240
|
+
duration,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
else if (errorMessage.includes("ENOTFOUND") || errorMessage.includes("EAI_AGAIN")) {
|
|
244
|
+
results.push({
|
|
245
|
+
name: "push: Expo API",
|
|
246
|
+
category: "push",
|
|
247
|
+
status: "fail",
|
|
248
|
+
message: "DNS resolution failed - check internet connection",
|
|
249
|
+
duration,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
results.push({
|
|
254
|
+
name: "push: Expo API",
|
|
255
|
+
category: "push",
|
|
256
|
+
status: "fail",
|
|
257
|
+
message: `Connection failed: ${errorMessage}`,
|
|
258
|
+
duration,
|
|
259
|
+
error: errorMessage,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return { result, results };
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Generate push notification recommendations
|
|
267
|
+
*/
|
|
268
|
+
export function getPushRecommendations(result) {
|
|
269
|
+
const recommendations = [];
|
|
270
|
+
if (!result.tokenStore.readable) {
|
|
271
|
+
recommendations.push("Token store is not readable. Check file permissions in ~/.config/opencode/");
|
|
272
|
+
}
|
|
273
|
+
if (!result.tokenStore.writable) {
|
|
274
|
+
recommendations.push("Token store is not writable. Check write permissions in ~/.config/opencode/");
|
|
275
|
+
}
|
|
276
|
+
if (!result.expoApi.reachable) {
|
|
277
|
+
recommendations.push("Expo API is not reachable. Check internet connection and firewall settings.");
|
|
278
|
+
}
|
|
279
|
+
else if (result.expoApi.responseTime && result.expoApi.responseTime > 5000) {
|
|
280
|
+
recommendations.push(`Expo API response time is high (${result.expoApi.responseTime}ms). Consider checking network latency.`);
|
|
281
|
+
}
|
|
282
|
+
if (!result.tokenOperations.register) {
|
|
283
|
+
recommendations.push("Token registration is failing. Check token format and device ID.");
|
|
284
|
+
}
|
|
285
|
+
if (!result.tokenOperations.delete) {
|
|
286
|
+
recommendations.push("Token deletion is failing. Check file permissions.");
|
|
287
|
+
}
|
|
288
|
+
if (result.tokenStore.initialCount === 0) {
|
|
289
|
+
recommendations.push("No tokens registered. Register a device before testing push notifications.");
|
|
290
|
+
}
|
|
291
|
+
return recommendations;
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=push-tester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-tester.js","sourceRoot":"","sources":["../../../src/cli/push-tester.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.d.ts","sourceRoot":"","sources":["../../../src/cli/qr.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiHH,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAoChF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI utility to render tunnel QR code from a JSON file
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { generateQRCodeAscii } from '../tunnel/qrcode.js';
|
|
7
|
+
const URL_KEYS = [
|
|
8
|
+
'url',
|
|
9
|
+
'tunnelUrl',
|
|
10
|
+
'tunnel_url',
|
|
11
|
+
'publicUrl',
|
|
12
|
+
'public_url',
|
|
13
|
+
'tunnel',
|
|
14
|
+
'public',
|
|
15
|
+
];
|
|
16
|
+
function parseArgs(args) {
|
|
17
|
+
const result = {};
|
|
18
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
19
|
+
const arg = args[i];
|
|
20
|
+
if (arg === '--help' || arg === '-h') {
|
|
21
|
+
result.help = true;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (arg === '--file' || arg === '-f') {
|
|
25
|
+
if (i + 1 < args.length) {
|
|
26
|
+
i += 1;
|
|
27
|
+
result.filePath = args[i];
|
|
28
|
+
}
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (arg.startsWith('-')) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (!result.filePath) {
|
|
35
|
+
result.filePath = arg;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
function showHelp() {
|
|
41
|
+
console.log(`
|
|
42
|
+
OpenCode Mobile - Tunnel QR Utility
|
|
43
|
+
|
|
44
|
+
USAGE:
|
|
45
|
+
npx opencode-mobile qr <path-to-tunnels.json>
|
|
46
|
+
npx opencode-mobile qr --file <path-to-tunnels.json>
|
|
47
|
+
|
|
48
|
+
OPTIONS:
|
|
49
|
+
-f, --file Path to tunnels.json
|
|
50
|
+
-h, --help Show this help message
|
|
51
|
+
|
|
52
|
+
OUTPUT:
|
|
53
|
+
Prints an ASCII QR code and the tunnel URL.
|
|
54
|
+
`);
|
|
55
|
+
}
|
|
56
|
+
function isUrlString(value) {
|
|
57
|
+
return typeof value === 'string' && value.startsWith('http');
|
|
58
|
+
}
|
|
59
|
+
function findUrlFromValue(value, depth = 0) {
|
|
60
|
+
if (depth > 6) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
if (isUrlString(value)) {
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
if (Array.isArray(value)) {
|
|
67
|
+
for (const item of value) {
|
|
68
|
+
const found = findUrlFromValue(item, depth + 1);
|
|
69
|
+
if (found) {
|
|
70
|
+
return found;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
if (value && typeof value === 'object') {
|
|
76
|
+
const record = value;
|
|
77
|
+
for (const key of URL_KEYS) {
|
|
78
|
+
if (isUrlString(record[key])) {
|
|
79
|
+
return record[key];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
for (const key of Object.keys(record)) {
|
|
83
|
+
const found = findUrlFromValue(record[key], depth + 1);
|
|
84
|
+
if (found) {
|
|
85
|
+
return found;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
export async function main(args = process.argv.slice(2)) {
|
|
92
|
+
const parsed = parseArgs(args);
|
|
93
|
+
if (parsed.help || !parsed.filePath) {
|
|
94
|
+
showHelp();
|
|
95
|
+
process.exit(parsed.help ? 0 : 1);
|
|
96
|
+
}
|
|
97
|
+
const resolvedPath = path.resolve(process.cwd(), parsed.filePath);
|
|
98
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
99
|
+
console.error(`[QR] File not found: ${resolvedPath}`);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
const raw = fs.readFileSync(resolvedPath, 'utf-8');
|
|
104
|
+
const data = JSON.parse(raw);
|
|
105
|
+
const url = findUrlFromValue(data);
|
|
106
|
+
if (!url) {
|
|
107
|
+
console.error('[QR] No tunnel URL found in provided JSON.');
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
const qr = await generateQRCodeAscii(url);
|
|
111
|
+
if (qr) {
|
|
112
|
+
console.log(`${qr}\n${url}`);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.log(url);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
120
|
+
console.error(`[QR] Failed to read tunnel JSON: ${message}`);
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (import.meta.main) {
|
|
125
|
+
main();
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=qr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.js","sourceRoot":"","sources":["../../../src/cli/qr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report generator for audit results
|
|
3
|
+
*/
|
|
4
|
+
import type { AuditReport, TestResult } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Generate console report
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateConsoleReport(report: AuditReport): string;
|
|
9
|
+
/**
|
|
10
|
+
* Generate JSON report
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateJsonReport(report: AuditReport): string;
|
|
13
|
+
/**
|
|
14
|
+
* Save report to file
|
|
15
|
+
*/
|
|
16
|
+
export declare function saveReport(report: AuditReport, format?: "console" | "json", outputPath?: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Print report to console
|
|
19
|
+
*/
|
|
20
|
+
export declare function printReport(report: AuditReport, json?: boolean): void;
|
|
21
|
+
/**
|
|
22
|
+
* Format individual test result for verbose output
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatTestResult(result: TestResult): string;
|
|
25
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/cli/report.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EAKX,MAAM,YAAY,CAAC;AA6BpB;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAyKjE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE9D;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,EACnB,MAAM,GAAE,SAAS,GAAG,MAAkB,EACtC,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAiBR;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,OAAe,GACpB,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAa3D"}
|