@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.
- package/README.md +235 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +74 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/connect.d.ts +3 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +169 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/endpoints.d.ts +3 -0
- package/dist/commands/endpoints.d.ts.map +1 -0
- package/dist/commands/endpoints.js +58 -0
- package/dist/commands/endpoints.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +82 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +17 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +77 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +43 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/http-forwarder.d.ts +10 -0
- package/dist/core/http-forwarder.d.ts.map +1 -0
- package/dist/core/http-forwarder.js +98 -0
- package/dist/core/http-forwarder.js.map +1 -0
- package/dist/core/websocket-client.d.ts +30 -0
- package/dist/core/websocket-client.d.ts.map +1 -0
- package/dist/core/websocket-client.js +167 -0
- package/dist/core/websocket-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +69 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/api.d.ts +21 -0
- package/dist/utils/api.d.ts.map +1 -0
- package/dist/utils/api.js +62 -0
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/config.d.ts +15 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +58 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/sentry.d.ts +2 -0
- package/dist/utils/sentry.d.ts.map +1 -0
- package/dist/utils/sentry.js +21 -0
- package/dist/utils/sentry.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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
|
+
}
|