@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/dist/index.js ADDED
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const sentry_1 = require("./utils/sentry");
8
+ (0, sentry_1.initSentry)();
9
+ const commander_1 = require("commander");
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const login_1 = require("./commands/login");
12
+ const logout_1 = require("./commands/logout");
13
+ const connect_1 = require("./commands/connect");
14
+ const status_1 = require("./commands/status");
15
+ const endpoints_1 = require("./commands/endpoints");
16
+ const logs_1 = require("./commands/logs");
17
+ const config_1 = require("./commands/config");
18
+ const program = new commander_1.Command();
19
+ program
20
+ .name('hooklink')
21
+ .description('HookLink CLI - Forward webhooks to your local development machine')
22
+ .version('0.1.0')
23
+ .exitOverride();
24
+ // ASCII art banner
25
+ const banner = `
26
+ ${chalk_1.default.cyan('╦ ╦╔═╗╔═╗╦╔═╦ ╦╔╗╔╦╔═')}
27
+ ${chalk_1.default.cyan('╠═╣║ ║║ ║╠╩╗║ ║║║║╠╩╗')}
28
+ ${chalk_1.default.cyan('╩ ╩╚═╝╚═╝╩ ╩╩═╝╩╝╚╝╩ ╩')}
29
+ ${chalk_1.default.gray('Forward webhooks to localhost')}
30
+ `;
31
+ program.addHelpText('beforeAll', banner);
32
+ // Register commands
33
+ program.addCommand(login_1.loginCommand);
34
+ program.addCommand(logout_1.logoutCommand);
35
+ program.addCommand(connect_1.connectCommand);
36
+ program.addCommand(status_1.statusCommand);
37
+ program.addCommand(endpoints_1.endpointsCommand);
38
+ program.addCommand(logs_1.logsCommand);
39
+ program.addCommand(config_1.configCommand);
40
+ // Parse arguments
41
+ try {
42
+ program.parse(process.argv);
43
+ // Show help if no command provided
44
+ if (!process.argv.slice(2).length) {
45
+ program.outputHelp();
46
+ }
47
+ }
48
+ catch {
49
+ // exitOverride throws on --help / --version — ignore
50
+ }
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,2CAA4C;AAE5C,IAAA,mBAAU,GAAE,CAAC;AAEb,yCAAoC;AACpC,kDAA0B;AAC1B,4CAAgD;AAChD,8CAAkD;AAClD,gDAAoD;AACpD,8CAAkD;AAClD,oDAAwD;AACxD,0CAA8C;AAC9C,8CAAkD;AAElD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,mEAAmE,CAAC;KAChF,OAAO,CAAC,OAAO,CAAC;KAChB,YAAY,EAAE,CAAC;AAElB,mBAAmB;AACnB,MAAM,MAAM,GAAG;EACb,eAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC;EACpC,eAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC;EACpC,eAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC;EACpC,eAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC;CAC5C,CAAC;AAEF,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAEzC,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,4BAAgB,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAElC,kBAAkB;AAClB,IAAI,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B,mCAAmC;IACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAAC,MAAM,CAAC;IACP,qDAAqD;AACvD,CAAC"}
@@ -0,0 +1,69 @@
1
+ export interface Config {
2
+ apiKey?: string;
3
+ apiUrl?: string;
4
+ wsUrl?: string;
5
+ defaultEndpoint?: string;
6
+ defaultPort?: number;
7
+ }
8
+ export interface WSAuthMessage {
9
+ type: 'auth';
10
+ apiKey: string;
11
+ endpointId: string;
12
+ }
13
+ export interface WSHeartbeatMessage {
14
+ type: 'heartbeat';
15
+ }
16
+ export interface WSRequestMessage {
17
+ type: 'request';
18
+ requestId: string;
19
+ method: string;
20
+ path: string;
21
+ headers: Record<string, string>;
22
+ query: Record<string, string>;
23
+ body?: string;
24
+ }
25
+ export interface WSResponseMessage {
26
+ type: 'response';
27
+ requestId: string;
28
+ statusCode: number;
29
+ headers: Record<string, string>;
30
+ body?: string;
31
+ }
32
+ export interface WSErrorMessage {
33
+ type: 'error';
34
+ requestId?: string;
35
+ message: string;
36
+ }
37
+ export type WSMessage = WSAuthMessage | WSHeartbeatMessage | WSRequestMessage | WSResponseMessage | WSErrorMessage;
38
+ export interface Endpoint {
39
+ id: string;
40
+ keyword: string;
41
+ name: string;
42
+ description?: string;
43
+ local_target_url: string;
44
+ endpoint_type: 'webhook' | 'tunnel';
45
+ is_active: boolean;
46
+ created_at: string;
47
+ }
48
+ export interface RequestLog {
49
+ id: string;
50
+ endpoint_id?: string;
51
+ method: string;
52
+ path: string;
53
+ status_code?: number;
54
+ response_time_ms?: number;
55
+ source_ip?: string;
56
+ forwarded_to_cli: boolean;
57
+ error_message?: string;
58
+ received_at: string;
59
+ }
60
+ export interface ConnectOptions {
61
+ port?: number;
62
+ endpoint?: string;
63
+ target?: string;
64
+ }
65
+ export interface LogsOptions {
66
+ endpoint?: string;
67
+ limit?: number;
68
+ }
69
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,MAAM;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,SAAS,GACjB,aAAa,GACb,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,CAAC;AAGnB,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,SAAS,GAAG,QAAQ,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { Endpoint, RequestLog } from '../types';
2
+ declare class ApiClient {
3
+ private client;
4
+ constructor();
5
+ private getApiKey;
6
+ verifyApiKey(): Promise<boolean>;
7
+ getEndpoints(): Promise<Endpoint[]>;
8
+ getEndpoint(id: string): Promise<Endpoint>;
9
+ getLogs(endpointId?: string, limit?: number): Promise<RequestLog[]>;
10
+ getCurrentUser(): Promise<{
11
+ user: {
12
+ email: string;
13
+ [key: string]: unknown;
14
+ };
15
+ profile: unknown;
16
+ email?: string;
17
+ }>;
18
+ }
19
+ export declare const api: ApiClient;
20
+ export {};
21
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhD,cAAM,SAAS;IACb,OAAO,CAAC,MAAM,CAAgB;;IAqB9B,OAAO,CAAC,SAAS;IAIX,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAShC,YAAY,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAKnC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1C,OAAO,CACX,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,UAAU,EAAE,CAAC;IAalB,cAAc,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAIvH;AAED,eAAO,MAAM,GAAG,WAAkB,CAAC"}
@@ -0,0 +1,62 @@
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.api = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const config_1 = require("./config");
9
+ class ApiClient {
10
+ constructor() {
11
+ const apiUrl = config_1.config.get('apiUrl') || 'http://localhost:3001';
12
+ this.client = axios_1.default.create({
13
+ baseURL: `${apiUrl}/api`,
14
+ headers: {
15
+ 'Content-Type': 'application/json',
16
+ },
17
+ });
18
+ // Add auth interceptor
19
+ this.client.interceptors.request.use((config) => {
20
+ const apiKey = this.getApiKey();
21
+ if (apiKey) {
22
+ config.headers.Authorization = `Bearer ${apiKey}`;
23
+ }
24
+ return config;
25
+ });
26
+ }
27
+ getApiKey() {
28
+ return config_1.config.get('apiKey');
29
+ }
30
+ async verifyApiKey() {
31
+ try {
32
+ await this.client.get('/auth/me');
33
+ return true;
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ async getEndpoints() {
40
+ const { data } = await this.client.get('/endpoints');
41
+ return data.endpoints;
42
+ }
43
+ async getEndpoint(id) {
44
+ const { data } = await this.client.get(`/endpoints/${id}`);
45
+ return data.endpoint;
46
+ }
47
+ async getLogs(endpointId, limit = 20) {
48
+ const params = new URLSearchParams();
49
+ params.append('limit', limit.toString());
50
+ if (endpointId) {
51
+ params.append('endpoint_id', endpointId);
52
+ }
53
+ const { data } = await this.client.get(`/analytics/logs?${params.toString()}`);
54
+ return data.logs;
55
+ }
56
+ async getCurrentUser() {
57
+ const { data } = await this.client.get('/auth/me');
58
+ return data;
59
+ }
60
+ }
61
+ exports.api = new ApiClient();
62
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA6C;AAC7C,qCAAkC;AAGlC,MAAM,SAAS;IAGb;QACE,MAAM,MAAM,GAAG,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,uBAAuB,CAAC;QAC/D,IAAI,CAAC,MAAM,GAAG,eAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,GAAG,MAAM,MAAM;YACxB,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;QAEH,uBAAuB;QACvB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,MAAM,EAAE,CAAC;YACpD,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,SAAS;QACf,OAAO,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAA4B,YAAY,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAyB,cAAc,EAAE,EAAE,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CACX,UAAmB,EACnB,QAAgB,EAAE;QAElB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAEnC,mBAAmB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAwF,UAAU,CAAC,CAAC;QAC1I,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAEY,QAAA,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Config } from '../types';
2
+ declare class ConfigManager {
3
+ private config;
4
+ constructor();
5
+ get<K extends keyof Config>(key: K): Config[K];
6
+ set<K extends keyof Config>(key: K, value: Config[K]): void;
7
+ has(key: keyof Config): boolean;
8
+ delete(key: keyof Config): void;
9
+ clear(): void;
10
+ getAll(): Config;
11
+ getPath(): string;
12
+ }
13
+ export declare const config: ConfigManager;
14
+ export {};
15
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAuBlC,cAAM,aAAa;IACjB,OAAO,CAAC,MAAM,CAAe;;IAS7B,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAI9C,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3D,GAAG,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,OAAO;IAI/B,MAAM,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,IAAI;IAI/B,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,MAAM;IAIhB,OAAO,IAAI,MAAM;CAGlB;AAED,eAAO,MAAM,MAAM,eAAsB,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.config = void 0;
7
+ const conf_1 = __importDefault(require("conf"));
8
+ const schema = {
9
+ apiKey: {
10
+ type: 'string',
11
+ },
12
+ apiUrl: {
13
+ type: 'string',
14
+ default: 'https://api.hooklink.net',
15
+ },
16
+ wsUrl: {
17
+ type: 'string',
18
+ default: 'wss://api.hooklink.net/ws',
19
+ },
20
+ defaultEndpoint: {
21
+ type: 'string',
22
+ },
23
+ defaultPort: {
24
+ type: 'number',
25
+ default: 3000,
26
+ },
27
+ };
28
+ class ConfigManager {
29
+ constructor() {
30
+ this.config = new conf_1.default({
31
+ projectName: 'hooklink',
32
+ schema: schema,
33
+ });
34
+ }
35
+ get(key) {
36
+ return this.config.get(key);
37
+ }
38
+ set(key, value) {
39
+ this.config.set(key, value);
40
+ }
41
+ has(key) {
42
+ return this.config.has(key);
43
+ }
44
+ delete(key) {
45
+ this.config.delete(key);
46
+ }
47
+ clear() {
48
+ this.config.clear();
49
+ }
50
+ getAll() {
51
+ return this.config.store;
52
+ }
53
+ getPath() {
54
+ return this.config.path;
55
+ }
56
+ }
57
+ exports.config = new ConfigManager();
58
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAIxB,MAAM,MAAM,GAAG;IACb,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;KACf;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,0BAA0B;KACpC;IACD,KAAK,EAAE;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,2BAA2B;KACrC;IACD,eAAe,EAAE;QACf,IAAI,EAAE,QAAQ;KACf;IACD,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;KACd;CACO,CAAC;AAEX,MAAM,aAAa;IAGjB;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,cAAI,CAAS;YAC7B,WAAW,EAAE,UAAU;YACvB,MAAM,EAAE,MAAmC;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAyB,GAAM;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAyB,GAAM,EAAE,KAAgB;QAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,GAAiB;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,GAAiB;QACtB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;CACF;AAEY,QAAA,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare class Logger {
2
+ static info(message: string): void;
3
+ static success(message: string): void;
4
+ static error(message: string): void;
5
+ static warning(message: string): void;
6
+ static debug(message: string): void;
7
+ static log(message: string): void;
8
+ static request(method: string, path: string, statusCode: number): void;
9
+ }
10
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,qBAAa,MAAM;IACjB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMnC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;CA2BvE"}
@@ -0,0 +1,50 @@
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.Logger = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ class Logger {
9
+ static info(message) {
10
+ console.log(chalk_1.default.blue('ℹ'), message);
11
+ }
12
+ static success(message) {
13
+ console.log(chalk_1.default.green('✔'), message);
14
+ }
15
+ static error(message) {
16
+ console.error(chalk_1.default.red('✖'), message);
17
+ }
18
+ static warning(message) {
19
+ console.warn(chalk_1.default.yellow('⚠'), message);
20
+ }
21
+ static debug(message) {
22
+ if (process.env.DEBUG) {
23
+ console.log(chalk_1.default.gray('→'), message);
24
+ }
25
+ }
26
+ static log(message) {
27
+ console.log(message);
28
+ }
29
+ static request(method, path, statusCode) {
30
+ const methodColor = method === 'GET'
31
+ ? chalk_1.default.blue
32
+ : method === 'POST'
33
+ ? chalk_1.default.green
34
+ : method === 'PUT'
35
+ ? chalk_1.default.yellow
36
+ : method === 'DELETE'
37
+ ? chalk_1.default.red
38
+ : chalk_1.default.white;
39
+ const statusColor = statusCode >= 200 && statusCode < 300
40
+ ? chalk_1.default.green
41
+ : statusCode >= 300 && statusCode < 400
42
+ ? chalk_1.default.cyan
43
+ : statusCode >= 400 && statusCode < 500
44
+ ? chalk_1.default.yellow
45
+ : chalk_1.default.red;
46
+ console.log(methodColor(method.padEnd(7)), path.padEnd(40), statusColor(statusCode.toString()));
47
+ }
48
+ }
49
+ exports.Logger = Logger;
50
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,MAAa,MAAM;IACjB,MAAM,CAAC,IAAI,CAAC,OAAe;QACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,OAAe;QAC5B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe;QAC1B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,OAAe;QAC5B,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe;QAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,OAAe;QACxB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,MAAc,EAAE,IAAY,EAAE,UAAkB;QAC7D,MAAM,WAAW,GACf,MAAM,KAAK,KAAK;YACd,CAAC,CAAC,eAAK,CAAC,IAAI;YACZ,CAAC,CAAC,MAAM,KAAK,MAAM;gBACnB,CAAC,CAAC,eAAK,CAAC,KAAK;gBACb,CAAC,CAAC,MAAM,KAAK,KAAK;oBAClB,CAAC,CAAC,eAAK,CAAC,MAAM;oBACd,CAAC,CAAC,MAAM,KAAK,QAAQ;wBACrB,CAAC,CAAC,eAAK,CAAC,GAAG;wBACX,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC;QAElB,MAAM,WAAW,GACf,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG;YACnC,CAAC,CAAC,eAAK,CAAC,KAAK;YACb,CAAC,CAAC,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG;gBACvC,CAAC,CAAC,eAAK,CAAC,IAAI;gBACZ,CAAC,CAAC,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG;oBACvC,CAAC,CAAC,eAAK,CAAC,MAAM;oBACd,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC;QAEhB,OAAO,CAAC,GAAG,CACT,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EACf,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CACnC,CAAC;IACJ,CAAC;CACF;AAtDD,wBAsDC"}
@@ -0,0 +1,2 @@
1
+ export declare function initSentry(): void;
2
+ //# sourceMappingURL=sentry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.d.ts","sourceRoot":"","sources":["../../src/utils/sentry.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,IAAI,CAejC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initSentry = initSentry;
4
+ function initSentry() {
5
+ const dsn = process.env.SENTRY_DSN;
6
+ if (!dsn)
7
+ return;
8
+ try {
9
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
10
+ const Sentry = require('@sentry/node');
11
+ Sentry.init({
12
+ dsn,
13
+ environment: process.env.NODE_ENV || 'production',
14
+ tracesSampleRate: 0.01,
15
+ });
16
+ }
17
+ catch {
18
+ // @sentry/node not installed — skip silently
19
+ }
20
+ }
21
+ //# sourceMappingURL=sentry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.js","sourceRoot":"","sources":["../../src/utils/sentry.ts"],"names":[],"mappings":";;AAAA,gCAeC;AAfD,SAAgB,UAAU;IACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACnC,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,IAAI,CAAC;QACH,iEAAiE;QACjE,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC;YACV,GAAG;YACH,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,YAAY;YACjD,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@hooklink/cli",
3
+ "version": "0.1.0",
4
+ "description": "HookLink CLI - Forward webhooks to your local development machine",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "hooklink": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsc --watch",
16
+ "start": "node dist/index.js",
17
+ "prepublishOnly": "npm run build",
18
+ "test": "echo \"No tests yet for CLI\" && exit 0",
19
+ "lint": "eslint src"
20
+ },
21
+ "keywords": [
22
+ "webhook",
23
+ "local",
24
+ "development",
25
+ "tunnel",
26
+ "cli",
27
+ "hooklink",
28
+ "forwarding",
29
+ "websocket"
30
+ ],
31
+ "author": "HookLink",
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/hooklink/hooklink.git",
36
+ "directory": "packages/cli"
37
+ },
38
+ "homepage": "https://hooklink.net",
39
+ "bugs": {
40
+ "url": "https://github.com/hooklink/hooklink/issues"
41
+ },
42
+ "engines": {
43
+ "node": ">=18"
44
+ },
45
+ "dependencies": {
46
+ "@sentry/node": "^10.38.0",
47
+ "axios": "^1.13.5",
48
+ "chalk": "^4.1.2",
49
+ "cli-table3": "^0.6.3",
50
+ "commander": "^11.1.0",
51
+ "conf": "^10.2.0",
52
+ "express": "^4.18.2",
53
+ "inquirer": "^8.2.6",
54
+ "ora": "^5.4.1",
55
+ "ws": "^8.16.0"
56
+ },
57
+ "devDependencies": {
58
+ "@types/express": "^4.17.21",
59
+ "@types/inquirer": "^8.2.10",
60
+ "@types/node": "^20.10.6",
61
+ "@types/ws": "^8.5.10",
62
+ "typescript": "^5.3.3"
63
+ }
64
+ }