@hooklink/cli 0.1.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.
Files changed (62) hide show
  1. package/README.md +235 -0
  2. package/dist/commands/config.d.ts +3 -0
  3. package/dist/commands/config.d.ts.map +1 -0
  4. package/dist/commands/config.js +74 -0
  5. package/dist/commands/config.js.map +1 -0
  6. package/dist/commands/connect.d.ts +3 -0
  7. package/dist/commands/connect.d.ts.map +1 -0
  8. package/dist/commands/connect.js +169 -0
  9. package/dist/commands/connect.js.map +1 -0
  10. package/dist/commands/endpoints.d.ts +3 -0
  11. package/dist/commands/endpoints.d.ts.map +1 -0
  12. package/dist/commands/endpoints.js +58 -0
  13. package/dist/commands/endpoints.js.map +1 -0
  14. package/dist/commands/login.d.ts +3 -0
  15. package/dist/commands/login.d.ts.map +1 -0
  16. package/dist/commands/login.js +82 -0
  17. package/dist/commands/login.js.map +1 -0
  18. package/dist/commands/logout.d.ts +3 -0
  19. package/dist/commands/logout.d.ts.map +1 -0
  20. package/dist/commands/logout.js +17 -0
  21. package/dist/commands/logout.js.map +1 -0
  22. package/dist/commands/logs.d.ts +3 -0
  23. package/dist/commands/logs.d.ts.map +1 -0
  24. package/dist/commands/logs.js +77 -0
  25. package/dist/commands/logs.js.map +1 -0
  26. package/dist/commands/status.d.ts +3 -0
  27. package/dist/commands/status.d.ts.map +1 -0
  28. package/dist/commands/status.js +43 -0
  29. package/dist/commands/status.js.map +1 -0
  30. package/dist/core/http-forwarder.d.ts +10 -0
  31. package/dist/core/http-forwarder.d.ts.map +1 -0
  32. package/dist/core/http-forwarder.js +98 -0
  33. package/dist/core/http-forwarder.js.map +1 -0
  34. package/dist/core/websocket-client.d.ts +30 -0
  35. package/dist/core/websocket-client.d.ts.map +1 -0
  36. package/dist/core/websocket-client.js +167 -0
  37. package/dist/core/websocket-client.js.map +1 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +51 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/types/index.d.ts +69 -0
  43. package/dist/types/index.d.ts.map +1 -0
  44. package/dist/types/index.js +3 -0
  45. package/dist/types/index.js.map +1 -0
  46. package/dist/utils/api.d.ts +21 -0
  47. package/dist/utils/api.d.ts.map +1 -0
  48. package/dist/utils/api.js +62 -0
  49. package/dist/utils/api.js.map +1 -0
  50. package/dist/utils/config.d.ts +15 -0
  51. package/dist/utils/config.d.ts.map +1 -0
  52. package/dist/utils/config.js +58 -0
  53. package/dist/utils/config.js.map +1 -0
  54. package/dist/utils/logger.d.ts +10 -0
  55. package/dist/utils/logger.d.ts.map +1 -0
  56. package/dist/utils/logger.js +50 -0
  57. package/dist/utils/logger.js.map +1 -0
  58. package/dist/utils/sentry.d.ts +2 -0
  59. package/dist/utils/sentry.d.ts.map +1 -0
  60. package/dist/utils/sentry.js +21 -0
  61. package/dist/utils/sentry.js.map +1 -0
  62. package/package.json +64 -0
package/README.md ADDED
@@ -0,0 +1,235 @@
1
+ # HookLink CLI
2
+
3
+ Forward webhooks to your local development machine via WebSocket tunnel.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @hooklink/cli
9
+ ```
10
+
11
+ Or use locally:
12
+
13
+ ```bash
14
+ npm install
15
+ npm run build
16
+ npm link
17
+ ```
18
+
19
+ ## Quick Start
20
+
21
+ 1. **Login with your API key:**
22
+ ```bash
23
+ hooklink login
24
+ ```
25
+
26
+ 2. **View your endpoints:**
27
+ ```bash
28
+ hooklink endpoints
29
+ ```
30
+
31
+ 3. **Connect and start forwarding:**
32
+ ```bash
33
+ hooklink connect myapp --target http://localhost:3000
34
+ ```
35
+
36
+ ## Commands
37
+
38
+ ### `hooklink login`
39
+
40
+ Authenticate with your HookLink API key.
41
+
42
+ ```bash
43
+ # Interactive prompt
44
+ hooklink login
45
+
46
+ # With API key flag
47
+ hooklink login --key hlk_your_api_key_here
48
+ ```
49
+
50
+ ### `hooklink logout`
51
+
52
+ Clear stored credentials.
53
+
54
+ ```bash
55
+ hooklink logout
56
+ ```
57
+
58
+ ### `hooklink connect [endpoint]`
59
+
60
+ Connect to HookLink and forward webhooks to your local server.
61
+
62
+ ```bash
63
+ # Connect to specific endpoint
64
+ hooklink connect myapp --target http://localhost:3000
65
+
66
+ # Use port shorthand
67
+ hooklink connect myapp --port 3000
68
+
69
+ # Connect to first active endpoint
70
+ hooklink connect --port 8080
71
+ ```
72
+
73
+ **Options:**
74
+ - `-t, --target <url>` - Local target URL (default: http://localhost:3000)
75
+ - `-p, --port <port>` - Local port (alternative to --target)
76
+
77
+ ### `hooklink status`
78
+
79
+ Show current configuration and connection status.
80
+
81
+ ```bash
82
+ hooklink status
83
+ ```
84
+
85
+ ### `hooklink endpoints`
86
+
87
+ List all your endpoints.
88
+
89
+ ```bash
90
+ hooklink endpoints
91
+ # or
92
+ hooklink ls
93
+ ```
94
+
95
+ ### `hooklink logs`
96
+
97
+ View recent webhook request logs.
98
+
99
+ ```bash
100
+ # Show recent logs
101
+ hooklink logs
102
+
103
+ # Filter by endpoint
104
+ hooklink logs --endpoint myapp
105
+
106
+ # Limit number of logs
107
+ hooklink logs --limit 50
108
+ ```
109
+
110
+ **Options:**
111
+ - `-e, --endpoint <keyword>` - Filter by endpoint keyword
112
+ - `-l, --limit <number>` - Number of logs to fetch (default: 20)
113
+
114
+ ### `hooklink config`
115
+
116
+ View or modify CLI configuration.
117
+
118
+ ```bash
119
+ # List all configuration
120
+ hooklink config
121
+
122
+ # Get specific value
123
+ hooklink config --get apiUrl
124
+
125
+ # Set configuration value
126
+ hooklink config --set apiUrl=https://api.hooklink.net
127
+ hooklink config --set defaultPort=8080
128
+
129
+ # Delete configuration value
130
+ hooklink config --delete defaultPort
131
+
132
+ # Reset all configuration
133
+ hooklink config --reset
134
+ ```
135
+
136
+ ## Configuration
137
+
138
+ Configuration is stored in `~/.config/hooklink/config.json` (or OS-specific config directory).
139
+
140
+ **Available configuration keys:**
141
+ - `apiKey` - Your HookLink API key (use `hooklink login` instead)
142
+ - `apiUrl` - API base URL (default: https://api.hooklink.net)
143
+ - `wsUrl` - WebSocket server URL (default: wss://api.hooklink.net/ws)
144
+ - `defaultEndpoint` - Default endpoint keyword to connect to
145
+ - `defaultPort` - Default local port (default: 3000)
146
+
147
+ ## How It Works
148
+
149
+ 1. The CLI establishes a WebSocket connection to the HookLink server
150
+ 2. When a webhook arrives at your public URL, the server forwards it through the WebSocket
151
+ 3. The CLI receives the webhook and forwards it to your local server
152
+ 4. The response from your local server is sent back through the WebSocket
153
+ 5. HookLink returns the response to the original webhook sender
154
+
155
+ ## Development
156
+
157
+ ```bash
158
+ # Install dependencies
159
+ npm install
160
+
161
+ # Build TypeScript
162
+ npm run build
163
+
164
+ # Watch mode for development
165
+ npm run dev
166
+
167
+ # Link locally for testing
168
+ npm link
169
+ ```
170
+
171
+ ## Troubleshooting
172
+
173
+ ### Connection Issues
174
+
175
+ - Ensure you're logged in: `hooklink login`
176
+ - Check your endpoint is active: `hooklink endpoints`
177
+ - Verify your local server is running
178
+ - Check WebSocket URL: `hooklink config --get wsUrl`
179
+
180
+ ### Authentication Errors
181
+
182
+ - Verify your API key is valid: `hooklink status`
183
+ - Re-login if needed: `hooklink logout && hooklink login`
184
+
185
+ ### Request Not Forwarding
186
+
187
+ - Check logs: `hooklink logs`
188
+ - Ensure your endpoint URL matches the webhook source
189
+ - Verify source whitelist settings in the dashboard
190
+
191
+ ## Examples
192
+
193
+ ### Basic Usage
194
+
195
+ ```bash
196
+ # Login
197
+ hooklink login --key hlk_your_api_key
198
+
199
+ # Start forwarding to localhost:3000
200
+ hooklink connect myapp
201
+
202
+ # Start forwarding to different port
203
+ hooklink connect myapp --port 8080
204
+ ```
205
+
206
+ ### Custom Configuration
207
+
208
+ ```bash
209
+ # Set custom API URL (for self-hosted)
210
+ hooklink config --set apiUrl=https://api.yourdomain.com
211
+ hooklink config --set wsUrl=wss://ws.yourdomain.com
212
+
213
+ # Set default port
214
+ hooklink config --set defaultPort=8080
215
+
216
+ # Now connect uses your defaults
217
+ hooklink connect myapp
218
+ ```
219
+
220
+ ### Viewing Logs
221
+
222
+ ```bash
223
+ # View recent logs
224
+ hooklink logs
225
+
226
+ # View logs for specific endpoint
227
+ hooklink logs --endpoint myapp
228
+
229
+ # View more logs
230
+ hooklink logs --limit 100
231
+ ```
232
+
233
+ ## License
234
+
235
+ MIT
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const configCommand: Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,SAqEtB,CAAC"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.configCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const config_1 = require("../utils/config");
10
+ const logger_1 = require("../utils/logger");
11
+ exports.configCommand = new commander_1.Command('config')
12
+ .description('View or modify CLI configuration')
13
+ .option('-s, --set <key=value>', 'Set a configuration value')
14
+ .option('-g, --get <key>', 'Get a configuration value')
15
+ .option('-d, --delete <key>', 'Delete a configuration value')
16
+ .option('-l, --list', 'List all configuration values')
17
+ .option('--reset', 'Reset all configuration to defaults')
18
+ .action((options) => {
19
+ if (options.set) {
20
+ const [key, value] = options.set.split('=');
21
+ if (!key || !value) {
22
+ logger_1.Logger.error('Invalid format. Use: --set key=value');
23
+ process.exit(1);
24
+ }
25
+ const validKeys = ['apiUrl', 'wsUrl', 'defaultEndpoint', 'defaultPort'];
26
+ if (!validKeys.includes(key)) {
27
+ logger_1.Logger.error(`Invalid config key. Valid keys: ${validKeys.join(', ')}`);
28
+ process.exit(1);
29
+ }
30
+ const parsedValue = key === 'defaultPort' ? parseInt(value) : value;
31
+ config_1.config.set(key, parsedValue);
32
+ logger_1.Logger.success(`Set ${key} = ${value}`);
33
+ return;
34
+ }
35
+ if (options.get) {
36
+ const value = config_1.config.get(options.get);
37
+ if (value === undefined) {
38
+ logger_1.Logger.warning(`Key "${options.get}" not found`);
39
+ return;
40
+ }
41
+ logger_1.Logger.log(`${options.get} = ${value}`);
42
+ return;
43
+ }
44
+ if (options.delete) {
45
+ if (options.delete === 'apiKey') {
46
+ logger_1.Logger.error('Cannot delete apiKey. Use: hooklink logout');
47
+ process.exit(1);
48
+ }
49
+ config_1.config.delete(options.delete);
50
+ logger_1.Logger.success(`Deleted ${options.delete}`);
51
+ return;
52
+ }
53
+ if (options.reset) {
54
+ config_1.config.clear();
55
+ logger_1.Logger.success('Configuration reset to defaults');
56
+ return;
57
+ }
58
+ // Default: list all
59
+ const allConfig = config_1.config.getAll();
60
+ logger_1.Logger.log('');
61
+ logger_1.Logger.log(chalk_1.default.bold('Configuration:'));
62
+ Object.entries(allConfig).forEach(([key, value]) => {
63
+ if (key === 'apiKey' && value) {
64
+ logger_1.Logger.log(` ${key.padEnd(20)} ${chalk_1.default.gray('***hidden***')}`);
65
+ }
66
+ else {
67
+ logger_1.Logger.log(` ${key.padEnd(20)} ${chalk_1.default.cyan(value?.toString() || 'not set')}`);
68
+ }
69
+ });
70
+ logger_1.Logger.log('');
71
+ logger_1.Logger.log(` ${chalk_1.default.gray('Path:')} ${config_1.config.getPath()}`);
72
+ logger_1.Logger.log('');
73
+ });
74
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const connectCommand: Command;
3
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,cAAc,SA8KvB,CAAC"}
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.connectCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const inquirer_1 = __importDefault(require("inquirer"));
10
+ const config_1 = require("../utils/config");
11
+ const api_1 = require("../utils/api");
12
+ const logger_1 = require("../utils/logger");
13
+ const websocket_client_1 = require("../core/websocket-client");
14
+ const http_forwarder_1 = require("../core/http-forwarder");
15
+ const chalk_1 = __importDefault(require("chalk"));
16
+ exports.connectCommand = new commander_1.Command('connect')
17
+ .description('Connect to HookLink and forward webhooks to local server')
18
+ .argument('[endpoint]', 'Endpoint keyword to connect to')
19
+ .option('-t, --target <url>', 'Override local target URL (uses endpoint\'s configured URL by default)')
20
+ .option('-p, --port <port>', 'Override local port (alternative to --target)', parseInt)
21
+ .action(async (endpointKeyword, options) => {
22
+ // Check authentication
23
+ let apiKey = config_1.config.get('apiKey');
24
+ if (!apiKey) {
25
+ // Welcome message
26
+ logger_1.Logger.log('');
27
+ logger_1.Logger.log(chalk_1.default.cyan.bold('👋 Welcome to HookLink!'));
28
+ logger_1.Logger.log('');
29
+ logger_1.Logger.log('To get started, you\'ll need an API key.');
30
+ logger_1.Logger.log(chalk_1.default.gray('You can create one at: ') + chalk_1.default.cyan('https://hooklink.net/dashboard/keys'));
31
+ logger_1.Logger.log('');
32
+ // Prompt for API key
33
+ const answers = await inquirer_1.default.prompt([
34
+ {
35
+ type: 'password',
36
+ name: 'apiKey',
37
+ message: 'Please paste your API key:',
38
+ mask: '*',
39
+ validate: (input) => {
40
+ if (!input || input.trim().length === 0) {
41
+ return 'API key is required';
42
+ }
43
+ if (!input.startsWith('hlk_')) {
44
+ return 'Invalid API key format (should start with hlk_)';
45
+ }
46
+ return true;
47
+ },
48
+ },
49
+ ]);
50
+ apiKey = answers.apiKey;
51
+ // Verify and save the API key
52
+ const spinner = (0, ora_1.default)('Verifying API key...').start();
53
+ try {
54
+ // Temporarily set API key for verification
55
+ config_1.config.set('apiKey', apiKey);
56
+ const isValid = await api_1.api.verifyApiKey();
57
+ if (!isValid) {
58
+ spinner.fail('Invalid API key');
59
+ config_1.config.delete('apiKey');
60
+ logger_1.Logger.error('Please check your API key and try again');
61
+ process.exit(1);
62
+ }
63
+ // Get user info
64
+ const user = await api_1.api.getCurrentUser();
65
+ spinner.succeed(`Authenticated as ${chalk_1.default.cyan(user.user.email)}`);
66
+ logger_1.Logger.success('API key saved for future use');
67
+ logger_1.Logger.log('');
68
+ }
69
+ catch (error) {
70
+ spinner.fail('Authentication failed');
71
+ config_1.config.delete('apiKey');
72
+ logger_1.Logger.error(error instanceof Error ? error.message : 'Unknown error');
73
+ process.exit(1);
74
+ }
75
+ }
76
+ // Determine target URL
77
+ let targetUrl = options.target;
78
+ if (!targetUrl && options.port) {
79
+ targetUrl = `http://localhost:${options.port}`;
80
+ }
81
+ if (!targetUrl) {
82
+ targetUrl = config_1.config.get('defaultPort')
83
+ ? `http://localhost:${config_1.config.get('defaultPort')}`
84
+ : 'http://localhost:3000';
85
+ }
86
+ const spinner = (0, ora_1.default)('Fetching endpoints...').start();
87
+ try {
88
+ // Get endpoints
89
+ const endpoints = await api_1.api.getEndpoints();
90
+ if (endpoints.length === 0) {
91
+ spinner.fail('No endpoints found');
92
+ logger_1.Logger.info('Create an endpoint at: https://hooklink.net/dashboard/endpoints');
93
+ process.exit(1);
94
+ }
95
+ // Find endpoint
96
+ let endpoint = endpoints.find((e) => e.keyword === endpointKeyword);
97
+ if (!endpoint && endpointKeyword) {
98
+ spinner.fail(`Endpoint "${endpointKeyword}" not found`);
99
+ process.exit(1);
100
+ }
101
+ if (!endpoint) {
102
+ // Use first active endpoint
103
+ endpoint = endpoints.find((e) => e.is_active);
104
+ if (!endpoint) {
105
+ endpoint = endpoints[0];
106
+ }
107
+ }
108
+ spinner.succeed(`Connected to endpoint: ${chalk_1.default.cyan(endpoint.name)}`);
109
+ // Use endpoint's local_target_url if not overridden
110
+ if (!options.target && !options.port) {
111
+ targetUrl = endpoint.local_target_url || targetUrl;
112
+ logger_1.Logger.info(`Using target URL from endpoint: ${chalk_1.default.cyan(targetUrl)}`);
113
+ }
114
+ else {
115
+ logger_1.Logger.info(`Overriding endpoint target with: ${chalk_1.default.cyan(targetUrl)}`);
116
+ }
117
+ // Display connection info
118
+ logger_1.Logger.log('');
119
+ logger_1.Logger.log(chalk_1.default.bold('Connection Details:'));
120
+ logger_1.Logger.log(` Endpoint: ${chalk_1.default.cyan(endpoint.name)}`);
121
+ logger_1.Logger.log(` Keyword: ${chalk_1.default.cyan(endpoint.keyword)}`);
122
+ logger_1.Logger.log(` Type: ${chalk_1.default.cyan(endpoint.endpoint_type)}`);
123
+ logger_1.Logger.log(` Local Target: ${chalk_1.default.cyan(targetUrl)}`);
124
+ logger_1.Logger.log('');
125
+ logger_1.Logger.info('Waiting for webhooks...');
126
+ logger_1.Logger.log('');
127
+ // Create HTTP forwarder
128
+ const forwarder = new http_forwarder_1.HttpForwarder(targetUrl);
129
+ // Create WebSocket client
130
+ const wsUrl = config_1.config.get('wsUrl') || 'ws://localhost:3001/ws';
131
+ const wsClient = new websocket_client_1.WebSocketClient({
132
+ wsUrl,
133
+ apiKey: apiKey,
134
+ endpointId: endpoint.id,
135
+ onRequest: async (request) => {
136
+ return await forwarder.forward(request);
137
+ },
138
+ });
139
+ // Handle events
140
+ wsClient.on('connected', () => {
141
+ logger_1.Logger.success('WebSocket connected');
142
+ });
143
+ wsClient.on('disconnected', () => {
144
+ logger_1.Logger.warning('WebSocket disconnected');
145
+ });
146
+ wsClient.on('error', (error) => {
147
+ logger_1.Logger.error(`WebSocket error: ${error instanceof Error ? error.message : 'Unknown error'}`);
148
+ });
149
+ // Handle graceful shutdown
150
+ process.on('SIGINT', () => {
151
+ logger_1.Logger.log('');
152
+ logger_1.Logger.info('Shutting down...');
153
+ wsClient.disconnect();
154
+ process.exit(0);
155
+ });
156
+ process.on('SIGTERM', () => {
157
+ wsClient.disconnect();
158
+ process.exit(0);
159
+ });
160
+ // Connect
161
+ await wsClient.connect();
162
+ }
163
+ catch (error) {
164
+ spinner.fail('Connection failed');
165
+ logger_1.Logger.error(error instanceof Error ? error.message : 'Unknown error');
166
+ process.exit(1);
167
+ }
168
+ });
169
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const endpointsCommand: Command;
3
+ //# sourceMappingURL=endpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/commands/endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,gBAAgB,SAiDzB,CAAC"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.endpointsCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const cli_table3_1 = __importDefault(require("cli-table3"));
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const config_1 = require("../utils/config");
11
+ const api_1 = require("../utils/api");
12
+ const logger_1 = require("../utils/logger");
13
+ exports.endpointsCommand = new commander_1.Command('endpoints')
14
+ .description('List all your endpoints')
15
+ .alias('ls')
16
+ .action(async () => {
17
+ const apiKey = config_1.config.get('apiKey');
18
+ if (!apiKey) {
19
+ logger_1.Logger.error('You must login first. Run: hooklink login');
20
+ process.exit(1);
21
+ }
22
+ try {
23
+ const endpoints = await api_1.api.getEndpoints();
24
+ if (endpoints.length === 0) {
25
+ logger_1.Logger.info('No endpoints found');
26
+ logger_1.Logger.info('Create one at: https://hooklink.net/dashboard/endpoints');
27
+ return;
28
+ }
29
+ const table = new cli_table3_1.default({
30
+ head: [
31
+ chalk_1.default.cyan('Keyword'),
32
+ chalk_1.default.cyan('Name'),
33
+ chalk_1.default.cyan('Type'),
34
+ chalk_1.default.cyan('Status'),
35
+ chalk_1.default.cyan('Created'),
36
+ ],
37
+ colWidths: [20, 30, 12, 12, 20],
38
+ });
39
+ endpoints.forEach((endpoint) => {
40
+ table.push([
41
+ endpoint.keyword,
42
+ endpoint.name,
43
+ endpoint.endpoint_type,
44
+ endpoint.is_active ? chalk_1.default.green('Active') : chalk_1.default.gray('Inactive'),
45
+ new Date(endpoint.created_at).toLocaleDateString(),
46
+ ]);
47
+ });
48
+ logger_1.Logger.log('');
49
+ logger_1.Logger.log(table.toString());
50
+ logger_1.Logger.log('');
51
+ logger_1.Logger.info(`Total: ${endpoints.length} endpoint(s)`);
52
+ }
53
+ catch (error) {
54
+ logger_1.Logger.error(`Failed to fetch endpoints: ${error instanceof Error ? error.message : 'Unknown error'}`);
55
+ process.exit(1);
56
+ }
57
+ });
58
+ //# sourceMappingURL=endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../src/commands/endpoints.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,4DAA+B;AAC/B,kDAA0B;AAC1B,4CAAyC;AACzC,sCAAmC;AACnC,4CAAyC;AAE5B,QAAA,gBAAgB,GAAG,IAAI,mBAAO,CAAC,WAAW,CAAC;KACrD,WAAW,CAAC,yBAAyB,CAAC;KACtC,KAAK,CAAC,IAAI,CAAC;KACX,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,GAAG,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,eAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,SAAG,CAAC,YAAY,EAAE,CAAC;QAE3C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,eAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAClC,eAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;YACtB,IAAI,EAAE;gBACJ,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gBACrB,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClB,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClB,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACpB,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC;aACtB;YACD,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;SAChC,CAAC,CAAC;QAEH,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7B,KAAK,CAAC,IAAI,CAAC;gBACT,QAAQ,CAAC,OAAO;gBAChB,QAAQ,CAAC,IAAI;gBACb,QAAQ,CAAC,aAAa;gBACtB,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC;gBACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE;aACnD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,eAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,eAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7B,eAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,eAAM,CAAC,IAAI,CAAC,UAAU,SAAS,CAAC,MAAM,cAAc,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,eAAM,CAAC,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const loginCommand: Command;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,YAAY,SA0ErB,CAAC"}