hookcatch 0.1.0 → 0.3.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/README.md +229 -78
- package/dist/commands/bin.d.ts +3 -0
- package/dist/commands/bin.d.ts.map +1 -0
- package/dist/commands/bin.js +188 -0
- package/dist/commands/bin.js.map +1 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +82 -51
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/token.d.ts +3 -0
- package/dist/commands/token.d.ts.map +1 -0
- package/dist/commands/token.js +102 -0
- package/dist/commands/token.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +14 -1
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +39 -1
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +6 -4
- package/dist/lib/config.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# HookCatch CLI
|
|
2
2
|
|
|
3
|
-
Official CLI tool for
|
|
3
|
+
Official CLI tool for webhook testing and localhost tunneling with HookCatch.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -13,156 +13,307 @@ npm install -g hookcatch
|
|
|
13
13
|
hookcatch tunnel 3000
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
##
|
|
16
|
+
## Quick Start
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
```bash
|
|
19
|
+
# 1. Login with email/password
|
|
20
|
+
hookcatch login
|
|
21
|
+
# Enter your email and password
|
|
22
|
+
|
|
23
|
+
# 2. (Optional) Generate long-lived API token for automation
|
|
24
|
+
hookcatch token generate
|
|
25
|
+
export HOOKCATCH_API_KEY="hc_live_..."
|
|
26
|
+
|
|
27
|
+
# 3. Create a webhook bin
|
|
28
|
+
hookcatch bin create --name "Test Stripe"
|
|
29
|
+
# Returns: https://hookcatch.dev/b/abc123xyz
|
|
30
|
+
|
|
31
|
+
# 4. View captured requests
|
|
32
|
+
hookcatch bin requests abc123xyz
|
|
33
|
+
|
|
34
|
+
# 5. Tunnel your localhost
|
|
35
|
+
hookcatch tunnel 3000
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Commands
|
|
39
|
+
|
|
40
|
+
### Authentication
|
|
19
41
|
|
|
20
|
-
|
|
42
|
+
#### `login`
|
|
43
|
+
Authenticate with your HookCatch account (email/password or API token).
|
|
21
44
|
|
|
22
45
|
```bash
|
|
23
|
-
|
|
24
|
-
|
|
46
|
+
# Login with email/password (interactive)
|
|
47
|
+
hookcatch login
|
|
48
|
+
|
|
49
|
+
# Or login with API token directly
|
|
50
|
+
hookcatch login --token hc_live_xxx
|
|
25
51
|
```
|
|
26
52
|
|
|
27
|
-
|
|
53
|
+
**For automation (OpenClaw, CI/CD):**
|
|
54
|
+
```bash
|
|
55
|
+
# Generate a long-lived API token
|
|
56
|
+
hookcatch token generate
|
|
57
|
+
|
|
58
|
+
# Then use it via environment variable
|
|
59
|
+
export HOOKCATCH_API_KEY="hc_live_..."
|
|
60
|
+
|
|
61
|
+
# Or login directly
|
|
62
|
+
hookcatch login --token hc_live_...
|
|
63
|
+
```
|
|
28
64
|
|
|
29
|
-
|
|
65
|
+
#### `logout`
|
|
66
|
+
Remove stored credentials.
|
|
30
67
|
|
|
31
68
|
```bash
|
|
32
|
-
|
|
69
|
+
hookcatch logout
|
|
70
|
+
```
|
|
33
71
|
|
|
34
|
-
|
|
35
|
-
|
|
72
|
+
### Bin Management (NEW!)
|
|
73
|
+
|
|
74
|
+
#### `bin create`
|
|
75
|
+
Create a new webhook bin.
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
hookcatch bin create [options]
|
|
36
79
|
|
|
37
|
-
#
|
|
38
|
-
|
|
80
|
+
# Options:
|
|
81
|
+
# --name <name> Bin name
|
|
82
|
+
# --private Create private bin (PLUS+ tier)
|
|
83
|
+
# --password <password> Password for private bin
|
|
84
|
+
|
|
85
|
+
# Examples:
|
|
86
|
+
hookcatch bin create --name "Stripe Webhooks"
|
|
87
|
+
hookcatch bin create --private --password secret123
|
|
39
88
|
```
|
|
40
89
|
|
|
41
|
-
|
|
90
|
+
#### `bin list`
|
|
91
|
+
List all your bins.
|
|
42
92
|
|
|
43
|
-
|
|
93
|
+
```bash
|
|
94
|
+
hookcatch bin list
|
|
95
|
+
```
|
|
44
96
|
|
|
45
|
-
|
|
97
|
+
#### `bin requests <binId>`
|
|
98
|
+
Get captured requests for a bin.
|
|
46
99
|
|
|
47
100
|
```bash
|
|
48
|
-
|
|
101
|
+
hookcatch bin requests <binId> [options]
|
|
49
102
|
|
|
50
|
-
#
|
|
51
|
-
|
|
103
|
+
# Options:
|
|
104
|
+
# --limit <number> Number of requests (default: 50)
|
|
105
|
+
# --format <type> Output format: json|table (default: table)
|
|
106
|
+
# --method <method> Filter by HTTP method (GET, POST, etc.)
|
|
52
107
|
|
|
53
|
-
#
|
|
54
|
-
|
|
108
|
+
# Examples:
|
|
109
|
+
hookcatch bin requests abc123xyz --limit 10
|
|
110
|
+
hookcatch bin requests abc123xyz --format json --method POST
|
|
55
111
|
```
|
|
56
112
|
|
|
57
|
-
|
|
113
|
+
#### `bin delete <binId>`
|
|
114
|
+
Delete a bin.
|
|
58
115
|
|
|
59
116
|
```bash
|
|
60
|
-
|
|
61
|
-
|
|
117
|
+
hookcatch bin delete <binId> --yes
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### API Token Management (NEW!)
|
|
62
121
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
});
|
|
122
|
+
#### `token generate`
|
|
123
|
+
Generate a long-lived API token for automation.
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
hookcatch token generate
|
|
127
|
+
# Store the token securely - it won't be shown again!
|
|
128
|
+
# Use it with: export HOOKCATCH_API_KEY="hc_live_..."
|
|
71
129
|
```
|
|
72
130
|
|
|
73
|
-
|
|
131
|
+
#### `token status`
|
|
132
|
+
Check your API token status.
|
|
74
133
|
|
|
75
|
-
|
|
134
|
+
```bash
|
|
135
|
+
hookcatch token status
|
|
136
|
+
```
|
|
76
137
|
|
|
77
|
-
|
|
138
|
+
#### `token revoke`
|
|
139
|
+
Revoke your API token.
|
|
78
140
|
|
|
79
141
|
```bash
|
|
80
|
-
|
|
142
|
+
hookcatch token revoke --yes
|
|
81
143
|
```
|
|
82
144
|
|
|
83
|
-
|
|
84
|
-
- **OUTBOUND**: Your app → proxy (localhost:8081) → captured in bin
|
|
145
|
+
### Localhost Tunneling
|
|
85
146
|
|
|
86
|
-
|
|
147
|
+
#### `tunnel <port>`
|
|
148
|
+
Create a tunnel to your localhost.
|
|
87
149
|
|
|
88
150
|
```bash
|
|
89
|
-
|
|
151
|
+
hookcatch tunnel <port> [options]
|
|
152
|
+
|
|
153
|
+
# Options:
|
|
154
|
+
# --password <password> Password-protect tunnel (PRO+ tier)
|
|
155
|
+
# --subdomain <name> Custom subdomain (ENTERPRISE tier)
|
|
156
|
+
# --capture <binId> Capture outbound requests to bin
|
|
157
|
+
# --proxy-port <port> Local proxy port (default: 8081)
|
|
158
|
+
|
|
159
|
+
# Examples:
|
|
160
|
+
hookcatch tunnel 3000
|
|
161
|
+
hookcatch tunnel 8080 --password secret123
|
|
162
|
+
hookcatch tunnel 3000 --capture abc123
|
|
90
163
|
```
|
|
91
164
|
|
|
92
|
-
|
|
165
|
+
#### `list`
|
|
166
|
+
Show all your active tunnels.
|
|
93
167
|
|
|
94
168
|
```bash
|
|
95
|
-
|
|
169
|
+
hookcatch list
|
|
96
170
|
```
|
|
97
171
|
|
|
98
|
-
|
|
172
|
+
#### `stop <tunnelId>`
|
|
173
|
+
Stop a specific tunnel.
|
|
99
174
|
|
|
100
|
-
|
|
101
|
-
|
|
175
|
+
```bash
|
|
176
|
+
hookcatch stop abc123xyz
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Usage Examples
|
|
180
|
+
|
|
181
|
+
### Test Stripe Webhooks
|
|
102
182
|
|
|
103
183
|
```bash
|
|
104
|
-
|
|
184
|
+
# Create a bin
|
|
185
|
+
hookcatch bin create --name "Stripe Test"
|
|
186
|
+
# Use the URL in Stripe dashboard
|
|
187
|
+
|
|
188
|
+
# View captured webhooks
|
|
189
|
+
hookcatch bin requests abc123xyz --format json
|
|
105
190
|
```
|
|
106
191
|
|
|
107
|
-
###
|
|
108
|
-
|
|
192
|
+
### Expose Local API
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
# Start your local server
|
|
196
|
+
# python -m http.server 8000 &
|
|
197
|
+
|
|
198
|
+
# Expose it via tunnel
|
|
199
|
+
hookcatch tunnel 8000
|
|
200
|
+
# Public URL: https://hookcatch.dev/tunnel/xyz789
|
|
201
|
+
```
|
|
109
202
|
|
|
110
|
-
|
|
111
|
-
- `--password <password>` - Password-protect the tunnel (PRO+ tier)
|
|
112
|
-
- `--subdomain <name>` - Custom subdomain (ENTERPRISE tier)
|
|
203
|
+
### Capture Outbound Requests
|
|
113
204
|
|
|
114
|
-
**Example:**
|
|
115
205
|
```bash
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
#
|
|
120
|
-
|
|
121
|
-
# Press Ctrl+C to stop
|
|
206
|
+
# Start tunnel with capture
|
|
207
|
+
hookcatch tunnel 3000 --capture my-bin-id
|
|
208
|
+
|
|
209
|
+
# Configure your app to use proxy
|
|
210
|
+
HTTP_PROXY=http://localhost:8081 node app.js
|
|
122
211
|
```
|
|
123
212
|
|
|
124
|
-
###
|
|
125
|
-
Show all your active tunnels.
|
|
213
|
+
### Automation with API Tokens
|
|
126
214
|
|
|
127
215
|
```bash
|
|
128
|
-
|
|
216
|
+
# Generate token
|
|
217
|
+
hookcatch token generate
|
|
218
|
+
export HOOKCATCH_API_KEY="hc_live_..."
|
|
219
|
+
|
|
220
|
+
# Use in scripts
|
|
221
|
+
hookcatch bin create --name "CI Test" --format json | jq -r '.url'
|
|
129
222
|
```
|
|
130
223
|
|
|
131
|
-
|
|
132
|
-
|
|
224
|
+
## OpenClaw Integration
|
|
225
|
+
|
|
226
|
+
HookCatch has a dedicated OpenClaw skill for AI-powered webhook testing:
|
|
133
227
|
|
|
134
228
|
```bash
|
|
135
|
-
|
|
229
|
+
# Install via ClawHub
|
|
230
|
+
clawhub install hookcatch
|
|
136
231
|
```
|
|
137
232
|
|
|
138
|
-
|
|
139
|
-
|
|
233
|
+
See [skills/hookcatch/README.md](../../skills/hookcatch/README.md) for details.
|
|
234
|
+
|
|
235
|
+
## Environment Variables
|
|
236
|
+
|
|
237
|
+
Configure the CLI using environment variables:
|
|
140
238
|
|
|
141
239
|
```bash
|
|
142
|
-
|
|
240
|
+
# API Token (for authentication)
|
|
241
|
+
export HOOKCATCH_TOKEN="hc_live_..."
|
|
242
|
+
|
|
243
|
+
# API URL (defaults to https://api.hookcatch.dev)
|
|
244
|
+
export HOOKCATCH_API_URL="https://api.hookcatch.dev"
|
|
245
|
+
|
|
246
|
+
# For local development
|
|
247
|
+
export HOOKCATCH_API_URL="http://localhost:3002"
|
|
143
248
|
```
|
|
144
249
|
|
|
250
|
+
**Priority order:**
|
|
251
|
+
1. Environment variables (`HOOKCATCH_TOKEN`, `HOOKCATCH_API_URL`)
|
|
252
|
+
2. Config file (`~/.config/hookcatch/config.json`)
|
|
253
|
+
3. Default values (production API)
|
|
254
|
+
|
|
145
255
|
## Features
|
|
146
256
|
|
|
257
|
+
### Webhook Bins
|
|
258
|
+
- ✅ Create unlimited bins (tier-dependent)
|
|
259
|
+
- ✅ Capture HTTP requests in real-time
|
|
260
|
+
- ✅ Private bins with password protection (PLUS+)
|
|
261
|
+
- ✅ JSON output for automation
|
|
262
|
+
- ✅ Request filtering by method
|
|
263
|
+
|
|
264
|
+
### Localhost Tunnels
|
|
147
265
|
- ✅ Zero-config tunnel creation
|
|
148
266
|
- ✅ Real-time request forwarding
|
|
149
|
-
- ✅ Automatic reconnection
|
|
150
|
-
- ✅ Password protection (PRO+
|
|
151
|
-
- ✅ Custom subdomains (ENTERPRISE
|
|
152
|
-
|
|
153
|
-
|
|
267
|
+
- ✅ Automatic reconnection
|
|
268
|
+
- ✅ Password protection (PRO+)
|
|
269
|
+
- ✅ Custom subdomains (ENTERPRISE)
|
|
270
|
+
|
|
271
|
+
### API Tokens
|
|
272
|
+
- ✅ Long-lived tokens for automation
|
|
273
|
+
- ✅ Secure bcrypt hashing
|
|
274
|
+
- ✅ Easy revocation
|
|
275
|
+
- ✅ No expiration (until regenerated)
|
|
154
276
|
|
|
155
277
|
## Tiers
|
|
156
278
|
|
|
157
|
-
|
|
158
|
-
-
|
|
159
|
-
-
|
|
160
|
-
-
|
|
279
|
+
### FREE
|
|
280
|
+
- 3 bins
|
|
281
|
+
- 1,000 requests/month
|
|
282
|
+
- 24h retention
|
|
283
|
+
- 1 tunnel (5 min/session, 3 sessions/day)
|
|
284
|
+
- Public bins only
|
|
285
|
+
|
|
286
|
+
### PLUS
|
|
287
|
+
- 25 bins
|
|
288
|
+
- 25,000 requests/month
|
|
289
|
+
- 14-day retention
|
|
290
|
+
- 2 tunnels (1h/session, unlimited)
|
|
291
|
+
- Private bins with passwords
|
|
292
|
+
|
|
293
|
+
### PRO
|
|
294
|
+
- Unlimited bins
|
|
295
|
+
- 150,000 requests/month
|
|
296
|
+
- 90-day retention
|
|
297
|
+
- 5 tunnels (unlimited time)
|
|
298
|
+
- Team features
|
|
299
|
+
|
|
300
|
+
### ENTERPRISE (Custom)
|
|
301
|
+
- Unlimited bins
|
|
302
|
+
- 750,000 requests/month
|
|
303
|
+
- 180-day retention
|
|
304
|
+
- 20 tunnels (unlimited time)
|
|
305
|
+
- Custom subdomains
|
|
306
|
+
- SSO & SLA
|
|
307
|
+
|
|
308
|
+
## Environment Variables
|
|
309
|
+
|
|
310
|
+
- `HOOKCATCH_API_KEY` - API token for authentication
|
|
311
|
+
- `HOOKCATCH_API_URL` - Override API URL (default: https://api.hookcatch.dev)
|
|
161
312
|
|
|
162
313
|
## Support
|
|
163
314
|
|
|
164
|
-
- Documentation: https://hookcatch.dev
|
|
165
|
-
-
|
|
315
|
+
- Documentation: https://docs.hookcatch.dev
|
|
316
|
+
- GitHub: https://github.com/hookcatch/cli
|
|
166
317
|
- Email: support@hookcatch.dev
|
|
167
318
|
|
|
168
319
|
## License
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/commands/bin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,UAAU,SAKU,CAAC"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { api } from '../lib/api.js';
|
|
5
|
+
import { hasApiToken } from '../lib/config.js';
|
|
6
|
+
import Table from 'cli-table3';
|
|
7
|
+
export const binCommand = new Command('bin')
|
|
8
|
+
.description('Manage webhook bins')
|
|
9
|
+
.addCommand(createBinCommand())
|
|
10
|
+
.addCommand(listBinsCommand())
|
|
11
|
+
.addCommand(requestsCommand())
|
|
12
|
+
.addCommand(deleteBinCommand());
|
|
13
|
+
function createBinCommand() {
|
|
14
|
+
return new Command('create')
|
|
15
|
+
.description('Create a new webhook bin')
|
|
16
|
+
.option('--name <name>', 'Bin name')
|
|
17
|
+
.option('--private', 'Create a private bin (PLUS+ tier)')
|
|
18
|
+
.option('--password <password>', 'Password for private bin')
|
|
19
|
+
.action(async (options) => {
|
|
20
|
+
if (!hasApiToken()) {
|
|
21
|
+
console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const spinner = ora('Creating bin...').start();
|
|
25
|
+
try {
|
|
26
|
+
const bin = await api.createBin({
|
|
27
|
+
name: options.name,
|
|
28
|
+
isPrivate: options.private,
|
|
29
|
+
password: options.password,
|
|
30
|
+
});
|
|
31
|
+
spinner.succeed('Bin created');
|
|
32
|
+
console.log(chalk.green.bold('\n✓ Webhook bin created'));
|
|
33
|
+
console.log(chalk.cyan(`\nBin ID: ${bin.binId}`));
|
|
34
|
+
console.log(chalk.cyan(`Webhook URL: ${bin.url || `https://hookcatch.dev/b/${bin.binId}`}`));
|
|
35
|
+
console.log(chalk.cyan(`View URL: https://hookcatch.dev/bin/${bin.binId}/view`));
|
|
36
|
+
if (options.name) {
|
|
37
|
+
console.log(chalk.gray(`Name: ${options.name}`));
|
|
38
|
+
}
|
|
39
|
+
if (options.private) {
|
|
40
|
+
console.log(chalk.yellow('🔒 Private bin (password required to view)'));
|
|
41
|
+
}
|
|
42
|
+
console.log();
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
spinner.fail('Failed to create bin');
|
|
46
|
+
console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function listBinsCommand() {
|
|
52
|
+
return new Command('list')
|
|
53
|
+
.description('List your webhook bins')
|
|
54
|
+
.action(async () => {
|
|
55
|
+
if (!hasApiToken()) {
|
|
56
|
+
console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
const spinner = ora('Fetching bins...').start();
|
|
60
|
+
try {
|
|
61
|
+
const bins = await api.listBins();
|
|
62
|
+
spinner.stop();
|
|
63
|
+
if (bins.length === 0) {
|
|
64
|
+
console.log(chalk.yellow('\nNo bins found. Create one with:'));
|
|
65
|
+
console.log(chalk.cyan(' hookcatch bin create\n'));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
console.log(chalk.bold(`\n📦 Your bins (${bins.length}):\n`));
|
|
69
|
+
const table = new Table({
|
|
70
|
+
head: ['Bin ID', 'Name', 'Status', 'Requests', 'Created'],
|
|
71
|
+
style: {
|
|
72
|
+
head: ['cyan'],
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
for (const bin of bins) {
|
|
76
|
+
const status = bin.isPrivate ? '🔒 Private' : '🌐 Public';
|
|
77
|
+
const requestCount = bin.requestCount || 0;
|
|
78
|
+
const created = new Date(bin.createdAt).toLocaleDateString();
|
|
79
|
+
table.push([
|
|
80
|
+
bin.binId,
|
|
81
|
+
bin.name || '-',
|
|
82
|
+
status,
|
|
83
|
+
requestCount.toString(),
|
|
84
|
+
created,
|
|
85
|
+
]);
|
|
86
|
+
}
|
|
87
|
+
console.log(table.toString());
|
|
88
|
+
console.log();
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
spinner.fail('Failed to fetch bins');
|
|
92
|
+
console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
function requestsCommand() {
|
|
98
|
+
return new Command('requests')
|
|
99
|
+
.description('Get requests for a bin')
|
|
100
|
+
.argument('<binId>', 'Bin ID')
|
|
101
|
+
.option('--limit <number>', 'Number of requests to fetch', '50')
|
|
102
|
+
.option('--format <format>', 'Output format (json|table)', 'table')
|
|
103
|
+
.option('--method <method>', 'Filter by HTTP method')
|
|
104
|
+
.action(async (binId, options) => {
|
|
105
|
+
if (!hasApiToken()) {
|
|
106
|
+
console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
const spinner = ora('Fetching requests...').start();
|
|
110
|
+
try {
|
|
111
|
+
const data = await api.getBinRequests(binId, {
|
|
112
|
+
limit: parseInt(options.limit, 10),
|
|
113
|
+
});
|
|
114
|
+
spinner.stop();
|
|
115
|
+
let requests = data.requests || [];
|
|
116
|
+
// Filter by method if specified
|
|
117
|
+
if (options.method) {
|
|
118
|
+
const method = options.method.toUpperCase();
|
|
119
|
+
requests = requests.filter((r) => r.method === method);
|
|
120
|
+
}
|
|
121
|
+
if (requests.length === 0) {
|
|
122
|
+
console.log(chalk.yellow('\n No requests found for this bin.\n'));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (options.format === 'json') {
|
|
126
|
+
console.log(JSON.stringify(requests, null, 2));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
// Table format
|
|
130
|
+
console.log(chalk.bold(`\n📥 Requests (${requests.length}):\n`));
|
|
131
|
+
const table = new Table({
|
|
132
|
+
head: ['ID', 'Method', 'Path', 'IP', 'Time'],
|
|
133
|
+
style: {
|
|
134
|
+
head: ['cyan'],
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
for (const req of requests) {
|
|
138
|
+
const method = req.method || 'GET';
|
|
139
|
+
const path = req.path || '/';
|
|
140
|
+
const ip = req.ip || '-';
|
|
141
|
+
const time = new Date(req.timestamp).toLocaleTimeString();
|
|
142
|
+
table.push([
|
|
143
|
+
req.id.substring(0, 8),
|
|
144
|
+
method,
|
|
145
|
+
path.substring(0, 30),
|
|
146
|
+
ip,
|
|
147
|
+
time,
|
|
148
|
+
]);
|
|
149
|
+
}
|
|
150
|
+
console.log(table.toString());
|
|
151
|
+
console.log(chalk.gray(`\nView full details: https://hookcatch.dev/bin/${binId}/view\n`));
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
spinner.fail('Failed to fetch requests');
|
|
155
|
+
console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
function deleteBinCommand() {
|
|
161
|
+
return new Command('delete')
|
|
162
|
+
.description('Delete a webhook bin')
|
|
163
|
+
.argument('<binId>', 'Bin ID to delete')
|
|
164
|
+
.option('--yes', 'Skip confirmation')
|
|
165
|
+
.action(async (binId, options) => {
|
|
166
|
+
if (!hasApiToken()) {
|
|
167
|
+
console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
if (!options.yes) {
|
|
171
|
+
console.log(chalk.yellow(`⚠️ Are you sure you want to delete bin ${binId}?`));
|
|
172
|
+
console.log(chalk.gray('Run with --yes to skip this confirmation.\n'));
|
|
173
|
+
process.exit(0);
|
|
174
|
+
}
|
|
175
|
+
const spinner = ora('Deleting bin...').start();
|
|
176
|
+
try {
|
|
177
|
+
await api.deleteBin(binId);
|
|
178
|
+
spinner.succeed(`Bin ${binId} deleted`);
|
|
179
|
+
console.log();
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
spinner.fail('Failed to delete bin');
|
|
183
|
+
console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=bin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/commands/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,YAAY,SAarB,CAAC"}
|
package/dist/commands/login.js
CHANGED
|
@@ -2,82 +2,113 @@ import { Command } from 'commander';
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import ora from 'ora';
|
|
4
4
|
import * as readline from 'readline';
|
|
5
|
-
import { setApiToken, getApiUrl
|
|
5
|
+
import { setApiToken, getApiUrl } from '../lib/config.js';
|
|
6
6
|
import axios from 'axios';
|
|
7
7
|
export const loginCommand = new Command('login')
|
|
8
|
-
.description('Authenticate with your HookCatch
|
|
9
|
-
.
|
|
8
|
+
.description('Authenticate with your HookCatch account')
|
|
9
|
+
.option('--token <token>', 'Login with an API token directly')
|
|
10
|
+
.action(async (options) => {
|
|
10
11
|
console.log(chalk.blue.bold('\n🔐 HookCatch Login\n'));
|
|
11
|
-
|
|
12
|
+
// If token provided via flag, use it directly
|
|
13
|
+
if (options.token) {
|
|
14
|
+
return await loginWithToken(options.token);
|
|
15
|
+
}
|
|
16
|
+
// Otherwise, prompt for email/password
|
|
17
|
+
await loginWithCredentials();
|
|
18
|
+
});
|
|
19
|
+
async function loginWithToken(token) {
|
|
20
|
+
token = token.trim();
|
|
21
|
+
if (!token.startsWith('hc_') && !token.startsWith('eyJ')) {
|
|
22
|
+
console.log(chalk.red('\n✗ Invalid token format'));
|
|
23
|
+
console.log(chalk.gray('API tokens start with "hc_", JWT tokens start with "eyJ"\n'));
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const spinner = ora('Validating token...').start();
|
|
27
|
+
try {
|
|
28
|
+
// Test token by calling /api/user/token (requires auth)
|
|
29
|
+
const response = await axios.get(`${getApiUrl()}/api/user/token`, {
|
|
30
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
31
|
+
timeout: 10000,
|
|
32
|
+
});
|
|
33
|
+
spinner.succeed('Token validated');
|
|
34
|
+
setApiToken(token);
|
|
35
|
+
console.log(chalk.green('\n✓ Successfully authenticated!'));
|
|
36
|
+
console.log(chalk.gray('Token saved to ~/.hookcatch/config.json\n'));
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
spinner.fail('Token validation failed');
|
|
40
|
+
if (error.response?.status === 401) {
|
|
41
|
+
console.log(chalk.red('\n✗ Invalid token\n'));
|
|
42
|
+
}
|
|
43
|
+
else if (error.code === 'ECONNREFUSED') {
|
|
44
|
+
console.log(chalk.red('\n✗ Cannot connect to HookCatch API'));
|
|
45
|
+
console.log(chalk.gray(` Make sure the API is running at ${getApiUrl()}\n`));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.log(chalk.red('\n✗ ' + error.message + '\n'));
|
|
49
|
+
}
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function loginWithCredentials() {
|
|
12
54
|
const rl = readline.createInterface({
|
|
13
55
|
input: process.stdin,
|
|
14
56
|
output: process.stdout,
|
|
15
57
|
});
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
58
|
+
const prompt = (question) => {
|
|
59
|
+
return new Promise((resolve) => {
|
|
60
|
+
rl.question(question, (answer) => {
|
|
61
|
+
resolve(answer.trim());
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
try {
|
|
66
|
+
const email = await prompt('Email: ');
|
|
67
|
+
const password = await prompt('Password: ');
|
|
68
|
+
if (!email || !password) {
|
|
69
|
+
console.log(chalk.red('\n✗ Email and password are required\n'));
|
|
25
70
|
rl.close();
|
|
26
71
|
process.exit(1);
|
|
27
72
|
}
|
|
28
|
-
|
|
29
|
-
const spinner = ora('Validating token...').start();
|
|
73
|
+
const spinner = ora('Authenticating...').start();
|
|
30
74
|
try {
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
Authorization: `Bearer ${token}`,
|
|
36
|
-
},
|
|
37
|
-
timeout: 10000,
|
|
38
|
-
});
|
|
39
|
-
let response;
|
|
40
|
-
try {
|
|
41
|
-
response = await requestToken(fullUrl);
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
if (error.response?.status === 404 && apiUrl === 'http://localhost:3001') {
|
|
45
|
-
const fallbackUrl = 'http://localhost:3002';
|
|
46
|
-
spinner.text = 'Validating token (retrying on port 3002)...';
|
|
47
|
-
response = await requestToken(`${fallbackUrl}/api/user/api-token`);
|
|
48
|
-
setApiUrl(fallbackUrl);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
throw error;
|
|
52
|
-
}
|
|
75
|
+
const response = await axios.post(`${getApiUrl()}/api/auth/login`, { email, password }, { timeout: 10000 });
|
|
76
|
+
const { token, user } = response.data;
|
|
77
|
+
if (!token) {
|
|
78
|
+
throw new Error('No token returned from server');
|
|
53
79
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
80
|
+
spinner.succeed('Authenticated');
|
|
81
|
+
setApiToken(token);
|
|
82
|
+
console.log(chalk.green('\n✓ Successfully logged in!'));
|
|
83
|
+
console.log(chalk.gray(` Welcome, ${user.email}`));
|
|
84
|
+
console.log(chalk.gray(' Token saved to ~/.hookcatch/config.json'));
|
|
85
|
+
if (!user.emailVerified) {
|
|
86
|
+
console.log(chalk.yellow('\n⚠️ Your email is not verified.'));
|
|
87
|
+
console.log(chalk.gray(' Some features may be limited until you verify your email.\n'));
|
|
59
88
|
}
|
|
60
89
|
else {
|
|
61
|
-
|
|
62
|
-
console.log(chalk.
|
|
63
|
-
process.exit(1);
|
|
90
|
+
console.log(chalk.gray('\n💡 Tip: Generate a long-lived API token with:'));
|
|
91
|
+
console.log(chalk.cyan(' hookcatch token generate\n'));
|
|
64
92
|
}
|
|
65
93
|
}
|
|
66
94
|
catch (error) {
|
|
67
|
-
spinner.fail('
|
|
95
|
+
spinner.fail('Authentication failed');
|
|
68
96
|
if (error.response?.status === 401) {
|
|
69
|
-
console.log(chalk.red('\n✗ Invalid
|
|
97
|
+
console.log(chalk.red('\n✗ Invalid email or password\n'));
|
|
70
98
|
}
|
|
71
99
|
else if (error.code === 'ECONNREFUSED') {
|
|
72
100
|
console.log(chalk.red('\n✗ Cannot connect to HookCatch API'));
|
|
73
|
-
console.log(chalk.gray(` Make sure the API is running at ${getApiUrl()}`));
|
|
101
|
+
console.log(chalk.gray(` Make sure the API is running at ${getApiUrl()}\n`));
|
|
74
102
|
}
|
|
75
103
|
else {
|
|
76
|
-
console.log(chalk.red('\n✗
|
|
104
|
+
console.log(chalk.red('\n✗ ' + (error.response?.data?.error || error.message) + '\n'));
|
|
77
105
|
}
|
|
106
|
+
rl.close();
|
|
78
107
|
process.exit(1);
|
|
79
108
|
}
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
80
111
|
rl.close();
|
|
81
|
-
}
|
|
82
|
-
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
83
114
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,YAAY,SAIK,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { api } from '../lib/api.js';
|
|
5
|
+
import { hasApiToken, getApiToken } from '../lib/config.js';
|
|
6
|
+
export const tokenCommand = new Command('token')
|
|
7
|
+
.description('Manage API tokens')
|
|
8
|
+
.addCommand(generateCommand())
|
|
9
|
+
.addCommand(statusCommand())
|
|
10
|
+
.addCommand(revokeCommand());
|
|
11
|
+
function generateCommand() {
|
|
12
|
+
return new Command('generate')
|
|
13
|
+
.description('Generate a new API token for CLI authentication')
|
|
14
|
+
.action(async () => {
|
|
15
|
+
if (!hasApiToken()) {
|
|
16
|
+
console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const spinner = ora('Generating API token...').start();
|
|
20
|
+
try {
|
|
21
|
+
// Call backend to generate token
|
|
22
|
+
const response = await api.client.post('/api/user/token', {}, { headers: { Authorization: `Bearer ${getApiToken()}` } });
|
|
23
|
+
const { token, createdAt } = response.data;
|
|
24
|
+
spinner.succeed('API token generated');
|
|
25
|
+
console.log(chalk.green.bold('\n✓ New API token generated'));
|
|
26
|
+
console.log(chalk.yellow('\n⚠️ Store this token securely. It will not be shown again.\n'));
|
|
27
|
+
console.log(chalk.cyan('Token:'));
|
|
28
|
+
console.log(chalk.white.bold(token));
|
|
29
|
+
console.log(chalk.gray(`\nCreated: ${new Date(createdAt).toLocaleString()}`));
|
|
30
|
+
console.log(chalk.gray('Expires: Never (until regenerated or revoked)'));
|
|
31
|
+
// Ask if they want to save it as the default token
|
|
32
|
+
console.log(chalk.yellow('\n💡 To use this token in CLI, save it with:'));
|
|
33
|
+
console.log(chalk.cyan(` export HOOKCATCH_TOKEN="${token}"`));
|
|
34
|
+
console.log(chalk.gray('\nOr save the current JWT token by default.\n'));
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
spinner.fail('Failed to generate token');
|
|
38
|
+
console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function statusCommand() {
|
|
44
|
+
return new Command('status')
|
|
45
|
+
.description('Check API token status')
|
|
46
|
+
.action(async () => {
|
|
47
|
+
if (!hasApiToken()) {
|
|
48
|
+
console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
const spinner = ora('Checking token status...').start();
|
|
52
|
+
try {
|
|
53
|
+
const response = await api.client.get('/api/user/token', { headers: { Authorization: `Bearer ${getApiToken()}` } });
|
|
54
|
+
const data = response.data;
|
|
55
|
+
spinner.stop();
|
|
56
|
+
if (data.hasToken) {
|
|
57
|
+
console.log(chalk.green('\n✓ API token exists'));
|
|
58
|
+
console.log(chalk.gray(`Created: ${new Date(data.createdAt).toLocaleString()}`));
|
|
59
|
+
console.log(chalk.gray('\nNote: Token value is hidden for security.'));
|
|
60
|
+
console.log(chalk.gray('Use "hookcatch token generate" to create a new token.\n'));
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.log(chalk.yellow('\n⚠️ No API token generated yet'));
|
|
64
|
+
console.log(chalk.gray('Generate one with: hookcatch token generate\n'));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
spinner.fail('Failed to check status');
|
|
69
|
+
console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function revokeCommand() {
|
|
75
|
+
return new Command('revoke')
|
|
76
|
+
.description('Revoke your API token')
|
|
77
|
+
.option('--yes', 'Skip confirmation')
|
|
78
|
+
.action(async (options) => {
|
|
79
|
+
if (!hasApiToken()) {
|
|
80
|
+
console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
if (!options.yes) {
|
|
84
|
+
console.log(chalk.yellow('⚠️ Are you sure you want to revoke your API token?'));
|
|
85
|
+
console.log(chalk.gray('This will invalidate any scripts or integrations using it.'));
|
|
86
|
+
console.log(chalk.gray('Run with --yes to skip this confirmation.\n'));
|
|
87
|
+
process.exit(0);
|
|
88
|
+
}
|
|
89
|
+
const spinner = ora('Revoking API token...').start();
|
|
90
|
+
try {
|
|
91
|
+
await api.client.delete('/api/user/token', { headers: { Authorization: `Bearer ${getApiToken()}` } });
|
|
92
|
+
spinner.succeed('API token revoked');
|
|
93
|
+
console.log(chalk.green('\n✓ API token revoked successfully\n'));
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
spinner.fail('Failed to revoke token');
|
|
97
|
+
console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,8 @@ import { tunnelCommand } from './commands/tunnel.js';
|
|
|
6
6
|
import { listCommand } from './commands/list.js';
|
|
7
7
|
import { stopCommand } from './commands/stop.js';
|
|
8
8
|
import { logoutCommand } from './commands/logout.js';
|
|
9
|
+
import { binCommand } from './commands/bin.js';
|
|
10
|
+
import { tokenCommand } from './commands/token.js';
|
|
9
11
|
const program = new Command();
|
|
10
12
|
program
|
|
11
13
|
.name('hookcatch')
|
|
@@ -21,6 +23,8 @@ console.log(chalk.cyan(`
|
|
|
21
23
|
`));
|
|
22
24
|
// Add commands
|
|
23
25
|
program.addCommand(loginCommand);
|
|
26
|
+
program.addCommand(binCommand);
|
|
27
|
+
program.addCommand(tokenCommand);
|
|
24
28
|
program.addCommand(tunnelCommand);
|
|
25
29
|
program.addCommand(listCommand);
|
|
26
30
|
program.addCommand(stopCommand);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAmB;AACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;;;;;;CAMtB,CAAC,CAAC,CAAC;AAEJ,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,kBAAkB;AAClB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,mCAAmC;AACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
package/dist/lib/api.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
1
2
|
declare class HookCatchAPI {
|
|
2
|
-
|
|
3
|
+
client: AxiosInstance;
|
|
3
4
|
constructor();
|
|
4
5
|
private getHeaders;
|
|
5
6
|
createTunnel(localPort: number, options?: {
|
|
@@ -17,6 +18,18 @@ declare class HookCatchAPI {
|
|
|
17
18
|
headers: Record<string, string>;
|
|
18
19
|
body?: string;
|
|
19
20
|
}): Promise<any>;
|
|
21
|
+
createBin(options?: {
|
|
22
|
+
name?: string;
|
|
23
|
+
isPrivate?: boolean;
|
|
24
|
+
password?: string;
|
|
25
|
+
}): Promise<any>;
|
|
26
|
+
listBins(): Promise<any>;
|
|
27
|
+
getBin(binId: string): Promise<any>;
|
|
28
|
+
getBinRequests(binId: string, options?: {
|
|
29
|
+
limit?: number;
|
|
30
|
+
before?: number;
|
|
31
|
+
}): Promise<any>;
|
|
32
|
+
deleteBin(binId: string): Promise<any>;
|
|
20
33
|
}
|
|
21
34
|
export declare const api: HookCatchAPI;
|
|
22
35
|
export {};
|
package/dist/lib/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG7C,cAAM,YAAY;IACT,MAAM,EAAE,aAAa,CAAC;;IAS7B,OAAO,CAAC,UAAU;IAUZ,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAanF,WAAW;IAOX,SAAS,CAAC,QAAQ,EAAE,MAAM;IAO1B,cAAc;IAOd,YAAY,CAAC,QAAQ,EAAE,MAAM;IAO7B,aAAa;IAOb,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;IA+D9G,SAAS,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAa7E,QAAQ;IAOR,MAAM,CAAC,KAAK,EAAE,MAAM;IAOpB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAW3E,SAAS,CAAC,KAAK,EAAE,MAAM;CAM9B;AAED,eAAO,MAAM,GAAG,cAAqB,CAAC"}
|
package/dist/lib/api.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
2
|
import { getApiToken, getApiUrl } from './config.js';
|
|
3
3
|
class HookCatchAPI {
|
|
4
|
-
client;
|
|
4
|
+
client; // Make public for token commands
|
|
5
5
|
constructor() {
|
|
6
6
|
this.client = axios.create({
|
|
7
7
|
baseURL: getApiUrl(),
|
|
@@ -109,6 +109,44 @@ class HookCatchAPI {
|
|
|
109
109
|
});
|
|
110
110
|
return response.data;
|
|
111
111
|
}
|
|
112
|
+
// Bin management methods
|
|
113
|
+
async createBin(options) {
|
|
114
|
+
const response = await this.client.post('/api/bins', {
|
|
115
|
+
name: options?.name,
|
|
116
|
+
isPrivate: options?.isPrivate,
|
|
117
|
+
accessPassword: options?.password,
|
|
118
|
+
}, { headers: this.getHeaders() });
|
|
119
|
+
return response.data.bin;
|
|
120
|
+
}
|
|
121
|
+
async listBins() {
|
|
122
|
+
const response = await this.client.get('/api/bins', {
|
|
123
|
+
headers: this.getHeaders(),
|
|
124
|
+
});
|
|
125
|
+
return response.data.bins;
|
|
126
|
+
}
|
|
127
|
+
async getBin(binId) {
|
|
128
|
+
const response = await this.client.get(`/api/bins/${binId}`, {
|
|
129
|
+
headers: this.getHeaders(),
|
|
130
|
+
});
|
|
131
|
+
return response.data.bin;
|
|
132
|
+
}
|
|
133
|
+
async getBinRequests(binId, options) {
|
|
134
|
+
const params = new URLSearchParams();
|
|
135
|
+
if (options?.limit)
|
|
136
|
+
params.append('limit', options.limit.toString());
|
|
137
|
+
if (options?.before)
|
|
138
|
+
params.append('before', options.before.toString());
|
|
139
|
+
const response = await this.client.get(`/api/bins/${binId}/requests?${params}`, {
|
|
140
|
+
headers: this.getHeaders(),
|
|
141
|
+
});
|
|
142
|
+
return response.data;
|
|
143
|
+
}
|
|
144
|
+
async deleteBin(binId) {
|
|
145
|
+
const response = await this.client.delete(`/api/bins/${binId}`, {
|
|
146
|
+
headers: this.getHeaders(),
|
|
147
|
+
});
|
|
148
|
+
return response.data;
|
|
149
|
+
}
|
|
112
150
|
}
|
|
113
151
|
export const api = new HookCatchAPI();
|
|
114
152
|
//# sourceMappingURL=api.js.map
|
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,YAAY;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,YAAY;IACT,MAAM,CAAgB,CAAC,iCAAiC;IAE/D;QACE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,SAAS,EAAE;YACpB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAEO,UAAU;QAChB,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,OAAO;YACL,aAAa,EAAE,UAAU,KAAK,EAAE;SACjC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,OAAmD;QACvF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,cAAc,EACd;YACE,SAAS;YACT,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,QAAQ,EAAE,OAAO,EAAE,QAAQ;SAC5B,EACD,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,CAC/B,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE;YACrD,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,QAAQ,EAAE,EAAE;YACjE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE;YACjE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,QAAQ,EAAE,EAAE;YACpE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE;YACjE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,IAAqF;QAClH,0CAA0C;QAC1C,MAAM,YAAY,GAA2B,EAAE,CAAC;QAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YACnC,8FAA8F;YAC9F,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtG,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAE/F,oCAAoC;QACpC,IAAI,WAAW,GAAQ,EAAE,CAAC;QAC1B,IAAI,gBAAgB,GAAG,kBAAkB,CAAC;QAE1C,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,mBAAmB,CAAC,CAAC;QAE3E,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC;oBACH,gEAAgE;oBAChE,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpC,gBAAgB,GAAG,kBAAkB,CAAC;oBACtC,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,WAAW,CAAC,CAAC;gBAC7D,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,iCAAiC;oBACjC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;oBACxB,gBAAgB,GAAG,YAAY,CAAC;oBAChC,OAAO,CAAC,GAAG,CAAC,uDAAuD,EAAE,CAAC,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;gBACxB,gBAAgB,GAAG,mBAAmB,IAAI,YAAY,CAAC;YACzD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,WAAW,GAAG,EAAE,CAAC;YACjB,gBAAgB,GAAG,kBAAkB,CAAC;QACxC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,gBAAgB,CAAC,CAAC;QAEvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,EACxB,WAAW,EACX;YACE,OAAO,EAAE;gBACP,GAAG,YAAY;gBACf,cAAc,EAAE,gBAAgB;gBAChC,YAAY,EAAE,yBAAyB;aACxC;SACF,CACF,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,yBAAyB;IACzB,KAAK,CAAC,SAAS,CAAC,OAAmE;QACjF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,WAAW,EACX;YACE,IAAI,EAAE,OAAO,EAAE,IAAI;YACnB,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,cAAc,EAAE,OAAO,EAAE,QAAQ;SAClC,EACD,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,CAC/B,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE;YAClD,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,KAAK,EAAE,EAAE;YAC3D,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,OAA6C;QAC/E,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,OAAO,EAAE,KAAK;YAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrE,IAAI,OAAO,EAAE,MAAM;YAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAExE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,KAAK,aAAa,MAAM,EAAE,EAAE;YAC9E,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,KAAK,EAAE,EAAE;YAC9D,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC"}
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAcA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,WAAW,IAAI,MAAM,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAcA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,WAAW,IAAI,MAAM,GAAG,SAAS,CAGhD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,WAAW,IAAI,OAAO,CAErC"}
|
package/dist/lib/config.js
CHANGED
|
@@ -2,25 +2,27 @@ import Conf from 'conf';
|
|
|
2
2
|
const config = new Conf({
|
|
3
3
|
projectName: 'hookcatch',
|
|
4
4
|
defaults: {
|
|
5
|
-
apiUrl: '
|
|
5
|
+
apiUrl: process.env.HOOKCATCH_API_URL || 'https://api.hookcatch.dev', // Production default
|
|
6
6
|
},
|
|
7
7
|
});
|
|
8
8
|
export function setApiToken(token) {
|
|
9
9
|
config.set('apiToken', token);
|
|
10
10
|
}
|
|
11
11
|
export function getApiToken() {
|
|
12
|
-
|
|
12
|
+
// Check environment variable first, then config file
|
|
13
|
+
return process.env.HOOKCATCH_TOKEN || config.get('apiToken');
|
|
13
14
|
}
|
|
14
15
|
export function clearApiToken() {
|
|
15
16
|
config.delete('apiToken');
|
|
16
17
|
}
|
|
17
18
|
export function getApiUrl() {
|
|
18
|
-
|
|
19
|
+
// Priority: env var > config file > production default
|
|
20
|
+
return process.env.HOOKCATCH_API_URL || config.get('apiUrl') || 'https://api.hookcatch.dev';
|
|
19
21
|
}
|
|
20
22
|
export function setApiUrl(url) {
|
|
21
23
|
config.set('apiUrl', url);
|
|
22
24
|
}
|
|
23
25
|
export function hasApiToken() {
|
|
24
|
-
return !!config.get('apiToken');
|
|
26
|
+
return !!(process.env.HOOKCATCH_TOKEN || config.get('apiToken'));
|
|
25
27
|
}
|
|
26
28
|
//# sourceMappingURL=config.js.map
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAS;IAC9B,WAAW,EAAE,WAAW;IACxB,QAAQ,EAAE;QACR,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAS;IAC9B,WAAW,EAAE,WAAW;IACxB,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,2BAA2B,EAAE,qBAAqB;KAC5F;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,qDAAqD;IACrD,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,uDAAuD;IACvD,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,2BAA2B,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AACnE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hookcatch",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "CLI tool for creating localhost tunnels and testing webhooks with HookCatch",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"axios": "^1.6.7",
|
|
54
54
|
"chalk": "^5.3.0",
|
|
55
|
+
"cli-table3": "^0.6.3",
|
|
55
56
|
"commander": "^12.0.0",
|
|
56
57
|
"conf": "^12.0.0",
|
|
57
58
|
"ora": "^8.0.1",
|