@closedloop-ai/cli 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/__tests__/cli.test.js +37 -0
  2. package/dist/__tests__/cli.test.js.map +1 -0
  3. package/dist/__tests__/config.test.js +33 -0
  4. package/dist/__tests__/config.test.js.map +1 -0
  5. package/dist/__tests__/errors.test.js +109 -0
  6. package/dist/__tests__/errors.test.js.map +1 -0
  7. package/dist/__tests__/setup.js +20 -0
  8. package/dist/__tests__/setup.js.map +1 -0
  9. package/dist/__tests__/validation.test.js +124 -0
  10. package/dist/__tests__/validation.test.js.map +1 -0
  11. package/dist/api/auth.js +27 -0
  12. package/dist/api/auth.js.map +1 -0
  13. package/dist/api/feedback.js +70 -0
  14. package/dist/api/feedback.js.map +1 -0
  15. package/dist/api/input.js +60 -0
  16. package/dist/api/input.js.map +1 -0
  17. package/dist/api/usage.js +49 -0
  18. package/dist/api/usage.js.map +1 -0
  19. package/dist/cli.js +156 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/commands/config.js +186 -0
  22. package/dist/commands/config.js.map +1 -0
  23. package/dist/commands/feedback.js +234 -0
  24. package/dist/commands/feedback.js.map +1 -0
  25. package/dist/commands/input.js +370 -0
  26. package/dist/commands/input.js.map +1 -0
  27. package/dist/commands/list.js +81 -0
  28. package/dist/commands/list.js.map +1 -0
  29. package/dist/commands/status.js +93 -0
  30. package/dist/commands/status.js.map +1 -0
  31. package/dist/commands/submit.js +225 -0
  32. package/dist/commands/submit.js.map +1 -0
  33. package/dist/commands/usage.js +168 -0
  34. package/dist/commands/usage.js.map +1 -0
  35. package/dist/config/constants.js +37 -0
  36. package/dist/config/constants.js.map +1 -0
  37. package/dist/config/index.js +84 -0
  38. package/dist/config/index.js.map +1 -0
  39. package/dist/types/index.js +3 -0
  40. package/dist/types/index.js.map +1 -0
  41. package/dist/utils/config.js +55 -0
  42. package/dist/utils/config.js.map +1 -0
  43. package/dist/utils/errors.js +70 -0
  44. package/dist/utils/errors.js.map +1 -0
  45. package/dist/utils/validation.js +133 -0
  46. package/dist/utils/validation.js.map +1 -0
  47. package/jest.config.js +14 -0
  48. package/package.json +42 -0
  49. package/src/__tests__/cli.test.ts +44 -0
  50. package/src/__tests__/config.test.ts +38 -0
  51. package/src/__tests__/errors.test.ts +132 -0
  52. package/src/__tests__/setup.ts +21 -0
  53. package/src/__tests__/validation.test.ts +156 -0
  54. package/src/api/auth.ts +21 -0
  55. package/src/api/feedback.ts +64 -0
  56. package/src/api/input.ts +55 -0
  57. package/src/api/usage.ts +45 -0
  58. package/src/cli.ts +158 -0
  59. package/src/commands/config.ts +192 -0
  60. package/src/commands/feedback.ts +250 -0
  61. package/src/commands/input.ts +389 -0
  62. package/src/commands/list.ts +84 -0
  63. package/src/commands/status.ts +96 -0
  64. package/src/commands/submit.ts +214 -0
  65. package/src/config/constants.ts +36 -0
  66. package/src/config/index.ts +59 -0
  67. package/src/types/index.ts +119 -0
  68. package/src/utils/errors.ts +98 -0
  69. package/src/utils/validation.ts +166 -0
  70. package/tsconfig.json +25 -0
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const commander_1 = require("commander");
4
+ // Mock the command handlers
5
+ jest.mock('../commands/input', () => ({
6
+ handleInputCommand: jest.fn()
7
+ }));
8
+ jest.mock('../commands/feedback', () => ({
9
+ handleFeedbackCommand: jest.fn()
10
+ }));
11
+ jest.mock('../commands/config', () => ({
12
+ configCommand: new commander_1.Command('config')
13
+ }));
14
+ describe('CLI Structure', () => {
15
+ it('should have correct command structure', () => {
16
+ // This is a basic smoke test to ensure the CLI can be imported
17
+ // without errors
18
+ expect(() => {
19
+ require('../cli');
20
+ }).not.toThrow();
21
+ });
22
+ it('should handle input command', async () => {
23
+ const { handleInputCommand } = require('../commands/input');
24
+ // Mock successful execution
25
+ handleInputCommand.mockResolvedValue(undefined);
26
+ await handleInputCommand('test content', {});
27
+ expect(handleInputCommand).toHaveBeenCalledWith('test content', {});
28
+ });
29
+ it('should handle feedback command', async () => {
30
+ const { handleFeedbackCommand } = require('../commands/feedback');
31
+ // Mock successful execution
32
+ handleFeedbackCommand.mockResolvedValue(undefined);
33
+ await handleFeedbackCommand('test-id', {});
34
+ expect(handleFeedbackCommand).toHaveBeenCalledWith('test-id', {});
35
+ });
36
+ });
37
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AAEpC,4BAA4B;AAC5B,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE;CAC9B,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,qBAAqB,EAAE,IAAI,CAAC,EAAE,EAAE;CACjC,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,aAAa,EAAE,IAAI,mBAAO,CAAC,QAAQ,CAAC;CACrC,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,+DAA+D;QAC/D,iBAAiB;QACjB,MAAM,CAAC,GAAG,EAAE;YACV,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAE5D,4BAA4B;QAC3B,kBAAgC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAE/D,MAAM,kBAAkB,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAElE,4BAA4B;QAC3B,qBAAmC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAElE,MAAM,qBAAqB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const config_1 = require("../config");
4
+ // Mock the config for testing
5
+ jest.mock('../config', () => ({
6
+ config: {
7
+ get: jest.fn(),
8
+ set: jest.fn(),
9
+ getConfigPath: jest.fn()
10
+ }
11
+ }));
12
+ describe('Config Manager', () => {
13
+ beforeEach(() => {
14
+ jest.clearAllMocks();
15
+ });
16
+ it('should get config values', () => {
17
+ config_1.config.get.mockReturnValue({ apiKey: 'test-key' });
18
+ const result = config_1.config.get();
19
+ expect(result).toEqual({ apiKey: 'test-key' });
20
+ expect(config_1.config.get).toHaveBeenCalled();
21
+ });
22
+ it('should set config values', () => {
23
+ config_1.config.set.mockImplementation(() => { });
24
+ config_1.config.set('apiKey', 'new-key');
25
+ expect(config_1.config.set).toHaveBeenCalledWith('apiKey', 'new-key');
26
+ });
27
+ it('should get config path', () => {
28
+ config_1.config.getConfigPath.mockReturnValue('/path/to/config.json');
29
+ const result = config_1.config.getConfigPath();
30
+ expect(result).toBe('/path/to/config.json');
31
+ });
32
+ });
33
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":";;AAAA,sCAAmC;AAEnC,8BAA8B;AAC9B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,MAAM,EAAE;QACN,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;QACd,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;QACd,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;KACzB;CACF,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACjC,eAAM,CAAC,GAAiB,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAElE,MAAM,MAAM,GAAG,eAAM,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,eAAM,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACjC,eAAM,CAAC,GAAiB,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEvD,eAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChC,MAAM,CAAC,eAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAC/B,eAAM,CAAC,aAA2B,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;QAE5E,MAAM,MAAM,GAAG,eAAM,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const errors_1 = require("../utils/errors");
4
+ describe('Error Utils', () => {
5
+ describe('CliError', () => {
6
+ it('should create error with message and code', () => {
7
+ const error = new errors_1.CliError('Test error', errors_1.ERROR_CODES.VALIDATION_ERROR);
8
+ expect(error.message).toBe('Test error');
9
+ expect(error.code).toBe(errors_1.ERROR_CODES.VALIDATION_ERROR);
10
+ expect(error.exitCode).toBe(1);
11
+ });
12
+ it('should create error with custom exit code', () => {
13
+ const error = new errors_1.CliError('Test error', errors_1.ERROR_CODES.VALIDATION_ERROR, 2);
14
+ expect(error.exitCode).toBe(2);
15
+ });
16
+ });
17
+ describe('handleApiError', () => {
18
+ it('should handle 401 errors', () => {
19
+ const mockError = {
20
+ response: {
21
+ status: 401,
22
+ data: { message: 'Unauthorized' }
23
+ }
24
+ };
25
+ const result = (0, errors_1.handleApiError)(mockError);
26
+ expect(result.message).toContain('Invalid API key');
27
+ expect(result.code).toBe(errors_1.ERROR_CODES.UNAUTHORIZED);
28
+ });
29
+ it('should handle 404 errors', () => {
30
+ const mockError = {
31
+ response: {
32
+ status: 404,
33
+ data: { message: 'Not found' }
34
+ }
35
+ };
36
+ const result = (0, errors_1.handleApiError)(mockError);
37
+ expect(result.message).toContain('Resource not found');
38
+ expect(result.code).toBe(errors_1.ERROR_CODES.NOT_FOUND);
39
+ });
40
+ it('should handle 429 errors', () => {
41
+ const mockError = {
42
+ response: {
43
+ status: 429,
44
+ data: { message: 'Rate limited' }
45
+ }
46
+ };
47
+ const result = (0, errors_1.handleApiError)(mockError);
48
+ expect(result.message).toContain('Rate limit exceeded');
49
+ expect(result.code).toBe(errors_1.ERROR_CODES.RATE_LIMITED);
50
+ });
51
+ it('should handle 500 errors', () => {
52
+ const mockError = {
53
+ response: {
54
+ status: 500,
55
+ data: { message: 'Internal server error' }
56
+ }
57
+ };
58
+ const result = (0, errors_1.handleApiError)(mockError);
59
+ expect(result.message).toContain('Server error');
60
+ expect(result.code).toBe(errors_1.ERROR_CODES.SERVER_ERROR);
61
+ });
62
+ it('should handle connection errors', () => {
63
+ const mockError = {
64
+ code: 'ENOTFOUND'
65
+ };
66
+ const result = (0, errors_1.handleApiError)(mockError);
67
+ expect(result.message).toContain('Cannot connect to ClosedLoop servers');
68
+ expect(result.code).toBe(errors_1.ERROR_CODES.CONNECTION_ERROR);
69
+ });
70
+ it('should handle timeout errors', () => {
71
+ const mockError = {
72
+ code: 'ETIMEDOUT'
73
+ };
74
+ const result = (0, errors_1.handleApiError)(mockError);
75
+ expect(result.message).toContain('Request timed out');
76
+ expect(result.code).toBe(errors_1.ERROR_CODES.CONNECTION_ERROR);
77
+ });
78
+ it('should handle unknown errors', () => {
79
+ const mockError = {
80
+ message: 'Unknown error'
81
+ };
82
+ const result = (0, errors_1.handleApiError)(mockError);
83
+ expect(result.message).toBe('Unknown error');
84
+ expect(result.code).toBe(errors_1.ERROR_CODES.UNKNOWN_ERROR);
85
+ });
86
+ });
87
+ describe('handleValidationError', () => {
88
+ it('should create validation error', () => {
89
+ const result = (0, errors_1.handleValidationError)('Validation failed');
90
+ expect(result.message).toBe('Validation failed');
91
+ expect(result.code).toBe(errors_1.ERROR_CODES.VALIDATION_ERROR);
92
+ });
93
+ });
94
+ describe('handleInputError', () => {
95
+ it('should create input error', () => {
96
+ const result = (0, errors_1.handleInputError)('Input invalid');
97
+ expect(result.message).toBe('Input invalid');
98
+ expect(result.code).toBe(errors_1.ERROR_CODES.INVALID_INPUT);
99
+ });
100
+ });
101
+ describe('handleProcessingError', () => {
102
+ it('should create processing error', () => {
103
+ const result = (0, errors_1.handleProcessingError)('Processing failed');
104
+ expect(result.message).toBe('Processing failed');
105
+ expect(result.code).toBe(errors_1.ERROR_CODES.PROCESSING_ERROR);
106
+ });
107
+ });
108
+ });
109
+ //# sourceMappingURL=errors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ // Test setup file
3
+ // This file runs before each test file
4
+ // Mock console methods to avoid cluttering test output
5
+ global.console = {
6
+ ...console,
7
+ log: jest.fn(),
8
+ error: jest.fn(),
9
+ warn: jest.fn(),
10
+ info: jest.fn()
11
+ };
12
+ // Mock process.exit to prevent tests from actually exiting
13
+ const originalExit = process.exit;
14
+ beforeAll(() => {
15
+ process.exit = jest.fn();
16
+ });
17
+ afterAll(() => {
18
+ process.exit = originalExit;
19
+ });
20
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":";AAAA,kBAAkB;AAClB,uCAAuC;AAEvC,uDAAuD;AACvD,MAAM,CAAC,OAAO,GAAG;IACf,GAAG,OAAO;IACV,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;IAChB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACf,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;CAChB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;AAClC,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,EAAS,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,GAAG,EAAE;IACZ,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;AAC9B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const validation_1 = require("../utils/validation");
4
+ const errors_1 = require("../utils/errors");
5
+ describe('Validation Utils', () => {
6
+ describe('validateUuid', () => {
7
+ it('should validate correct UUIDs', () => {
8
+ expect((0, validation_1.validateUuid)('123e4567-e89b-12d3-a456-426614174000')).toBe(true);
9
+ expect((0, validation_1.validateUuid)('00000000-0000-0000-0000-000000000000')).toBe(true);
10
+ });
11
+ it('should reject invalid UUIDs', () => {
12
+ expect((0, validation_1.validateUuid)('invalid-uuid')).toBe(false);
13
+ expect((0, validation_1.validateUuid)('123e4567-e89b-12d3-a456')).toBe(false);
14
+ expect((0, validation_1.validateUuid)('')).toBe(false);
15
+ });
16
+ });
17
+ describe('validateInputContent', () => {
18
+ it('should validate correct content', () => {
19
+ expect((0, validation_1.validateInputContent)('Valid content')).toBe('Valid content');
20
+ expect((0, validation_1.validateInputContent)(' Valid content ')).toBe('Valid content');
21
+ });
22
+ it('should reject empty content', () => {
23
+ expect(() => (0, validation_1.validateInputContent)('')).toThrow(errors_1.CliError);
24
+ expect(() => (0, validation_1.validateInputContent)(' ')).toThrow(errors_1.CliError);
25
+ });
26
+ it('should reject content that is too long', () => {
27
+ const longContent = 'a'.repeat(10001);
28
+ expect(() => (0, validation_1.validateInputContent)(longContent)).toThrow(errors_1.CliError);
29
+ });
30
+ });
31
+ describe('validateApiKey', () => {
32
+ it('should validate correct API keys', () => {
33
+ expect((0, validation_1.validateApiKey)('valid-api-key-123')).toBe('valid-api-key-123');
34
+ expect((0, validation_1.validateApiKey)(' valid-api-key-123 ')).toBe('valid-api-key-123');
35
+ });
36
+ it('should reject empty API keys', () => {
37
+ expect(() => (0, validation_1.validateApiKey)('')).toThrow(errors_1.CliError);
38
+ expect(() => (0, validation_1.validateApiKey)(' ')).toThrow(errors_1.CliError);
39
+ });
40
+ it('should reject API keys that are too short', () => {
41
+ expect(() => (0, validation_1.validateApiKey)('short')).toThrow(errors_1.CliError);
42
+ });
43
+ });
44
+ describe('validateEmail', () => {
45
+ it('should validate correct emails', () => {
46
+ expect((0, validation_1.validateEmail)('test@example.com')).toBe('test@example.com');
47
+ expect((0, validation_1.validateEmail)(' TEST@EXAMPLE.COM ')).toBe('test@example.com');
48
+ });
49
+ it('should reject invalid emails', () => {
50
+ expect(() => (0, validation_1.validateEmail)('invalid-email')).toThrow(errors_1.CliError);
51
+ expect(() => (0, validation_1.validateEmail)('test@')).toThrow(errors_1.CliError);
52
+ expect(() => (0, validation_1.validateEmail)('@example.com')).toThrow(errors_1.CliError);
53
+ });
54
+ });
55
+ describe('validateUrl', () => {
56
+ it('should validate correct URLs', () => {
57
+ expect((0, validation_1.validateUrl)('https://example.com')).toBe('https://example.com/');
58
+ expect((0, validation_1.validateUrl)('http://example.com')).toBe('http://example.com/');
59
+ });
60
+ it('should reject invalid URLs', () => {
61
+ expect(() => (0, validation_1.validateUrl)('invalid-url')).toThrow(errors_1.CliError);
62
+ expect(() => (0, validation_1.validateUrl)('ftp://example.com')).toThrow(errors_1.CliError);
63
+ });
64
+ });
65
+ describe('validatePagination', () => {
66
+ it('should validate correct pagination', () => {
67
+ expect((0, validation_1.validatePagination)(1, 20)).toEqual({ page: 1, limit: 20 });
68
+ expect((0, validation_1.validatePagination)(undefined, undefined)).toEqual({ page: 1, limit: 20 });
69
+ });
70
+ it('should enforce minimum values', () => {
71
+ expect((0, validation_1.validatePagination)(0, 0)).toEqual({ page: 1, limit: 20 });
72
+ expect((0, validation_1.validatePagination)(-1, -1)).toEqual({ page: 1, limit: 1 });
73
+ });
74
+ it('should enforce maximum limit', () => {
75
+ const result = (0, validation_1.validatePagination)(1, 1000);
76
+ expect(result.limit).toBeLessThanOrEqual(100);
77
+ });
78
+ });
79
+ describe('sanitizeInput', () => {
80
+ it('should sanitize dangerous content', () => {
81
+ expect((0, validation_1.sanitizeInput)('<script>alert("xss")</script>')).toBe('scriptalert("xss")/script');
82
+ expect((0, validation_1.sanitizeInput)('javascript:alert("xss")')).toBe('alert("xss")');
83
+ expect((0, validation_1.sanitizeInput)('onclick="alert(\'xss\')"')).toBe('"alert(\'xss\')"');
84
+ });
85
+ it('should preserve safe content', () => {
86
+ expect((0, validation_1.sanitizeInput)('Safe content')).toBe('Safe content');
87
+ expect((0, validation_1.sanitizeInput)(' Safe content ')).toBe('Safe content');
88
+ });
89
+ });
90
+ describe('validateAndSanitizeInput', () => {
91
+ it('should validate and sanitize complete input data', () => {
92
+ const inputData = {
93
+ content: 'Test content',
94
+ title: 'Test title',
95
+ source_url: 'https://example.com',
96
+ customer_id: 'customer-123',
97
+ reporter_name: 'John Doe',
98
+ reporter_email: 'john@example.com'
99
+ };
100
+ const result = (0, validation_1.validateAndSanitizeInput)(inputData);
101
+ expect(result.content).toBe('Test content');
102
+ expect(result.title).toBe('Test title');
103
+ expect(result.source_url).toBe('https://example.com/');
104
+ expect(result.customer_id).toBe('customer-123');
105
+ expect(result.reporter_name).toBe('John Doe');
106
+ expect(result.reporter_email).toBe('john@example.com');
107
+ });
108
+ it('should handle optional fields', () => {
109
+ const inputData = {
110
+ content: 'Test content'
111
+ };
112
+ const result = (0, validation_1.validateAndSanitizeInput)(inputData);
113
+ expect(result.content).toBe('Test content');
114
+ expect(result.title).toBeUndefined();
115
+ });
116
+ it('should reject invalid content', () => {
117
+ const inputData = {
118
+ content: ''
119
+ };
120
+ expect(() => (0, validation_1.validateAndSanitizeInput)(inputData)).toThrow(errors_1.CliError);
121
+ });
122
+ });
123
+ });
124
+ //# sourceMappingURL=validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
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.validateApiKey = validateApiKey;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const constants_1 = require("../config/constants");
9
+ const errors_1 = require("../utils/errors");
10
+ async function validateApiKey(apiKey) {
11
+ try {
12
+ const response = await axios_1.default.get(`${constants_1.CONFIG.API_BASE_URL}/health`, {
13
+ headers: {
14
+ 'Authorization': `Bearer ${apiKey}`
15
+ },
16
+ timeout: constants_1.CONFIG.TIMEOUT_MS
17
+ });
18
+ return response.status === 200;
19
+ }
20
+ catch (error) {
21
+ if (error.response?.status === 401) {
22
+ return false;
23
+ }
24
+ throw (0, errors_1.handleApiError)(error);
25
+ }
26
+ }
27
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":";;;;;AAIA,wCAgBC;AApBD,kDAA0B;AAC1B,mDAA6C;AAC7C,4CAAwE;AAEjE,KAAK,UAAU,cAAc,CAAC,MAAc;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,kBAAM,CAAC,YAAY,SAAS,EAAE;YAChE,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,MAAM,EAAE;aACpC;YACD,OAAO,EAAE,kBAAM,CAAC,UAAU;SAC3B,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;IACjC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,70 @@
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.submitFeedback = submitFeedback;
7
+ exports.listFeedbacks = listFeedbacks;
8
+ exports.getFeedbackStatus = getFeedbackStatus;
9
+ exports.getFeedbackDetail = getFeedbackDetail;
10
+ const axios_1 = __importDefault(require("axios"));
11
+ const config_1 = require("../config");
12
+ const constants_1 = require("../config/constants");
13
+ const errors_1 = require("../utils/errors");
14
+ const getClient = () => {
15
+ const apiKey = config_1.config.get('apiKey');
16
+ if (!apiKey) {
17
+ throw new errors_1.CliError(constants_1.MESSAGES.NO_API_KEY, errors_1.ERROR_CODES.NO_API_KEY);
18
+ }
19
+ return axios_1.default.create({
20
+ baseURL: constants_1.CONFIG.API_BASE_URL,
21
+ headers: {
22
+ 'Authorization': `Bearer ${apiKey}`,
23
+ 'Content-Type': 'application/json',
24
+ 'User-Agent': constants_1.CONFIG.USER_AGENT
25
+ },
26
+ timeout: constants_1.CONFIG.TIMEOUT_MS
27
+ });
28
+ };
29
+ async function submitFeedback(data) {
30
+ try {
31
+ const client = getClient();
32
+ const response = await client.post('/feedbacks', data);
33
+ return response.data.data;
34
+ }
35
+ catch (error) {
36
+ throw (0, errors_1.handleApiError)(error);
37
+ }
38
+ }
39
+ async function listFeedbacks(params, isNew = false) {
40
+ try {
41
+ const client = getClient();
42
+ const endpoint = isNew ? '/feedbacks/new' : '/feedbacks';
43
+ const response = await client.get(endpoint, { params });
44
+ return response.data.data;
45
+ }
46
+ catch (error) {
47
+ throw (0, errors_1.handleApiError)(error);
48
+ }
49
+ }
50
+ async function getFeedbackStatus(id) {
51
+ try {
52
+ const client = getClient();
53
+ const response = await client.get(`/feedbacks/new/${id}`);
54
+ return response.data.data;
55
+ }
56
+ catch (error) {
57
+ throw (0, errors_1.handleApiError)(error);
58
+ }
59
+ }
60
+ async function getFeedbackDetail(id) {
61
+ try {
62
+ const client = getClient();
63
+ const response = await client.get(`/feedbacks/${id}`);
64
+ return response.data.data;
65
+ }
66
+ catch (error) {
67
+ throw (0, errors_1.handleApiError)(error);
68
+ }
69
+ }
70
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/api/feedback.ts"],"names":[],"mappings":";;;;;AAwBA,wCAQC;AAED,sCASC;AAED,8CAQC;AAED,8CAQC;AA/DD,kDAA0B;AAC1B,sCAAmC;AAEnC,mDAAuD;AACvD,4CAAwE;AAExE,MAAM,SAAS,GAAG,GAAG,EAAE;IACrB,MAAM,MAAM,GAAG,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,iBAAQ,CAAC,oBAAQ,CAAC,UAAU,EAAE,oBAAW,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,eAAK,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,kBAAM,CAAC,YAAY;QAC5B,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,MAAM,EAAE;YACnC,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,kBAAM,CAAC,UAAU;SAChC;QACD,OAAO,EAAE,kBAAM,CAAC,UAAU;KAC3B,CAAC,CAAC;AACL,CAAC,CAAC;AAEK,KAAK,UAAU,cAAc,CAAC,IAAwB;IAC3D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACvD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,MAAsB,EAAE,KAAK,GAAG,KAAK;IACvE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACxD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,EAAU;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAC1D,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,EAAU;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACtD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,60 @@
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.listInputs = listInputs;
7
+ exports.getInputDetail = getInputDetail;
8
+ exports.getInputStatus = getInputStatus;
9
+ const axios_1 = __importDefault(require("axios"));
10
+ const config_1 = require("../config");
11
+ const constants_1 = require("../config/constants");
12
+ const errors_1 = require("../utils/errors");
13
+ const getClient = () => {
14
+ const apiKey = config_1.config.get('apiKey');
15
+ if (!apiKey) {
16
+ throw new errors_1.CliError(constants_1.MESSAGES.NO_API_KEY, errors_1.ERROR_CODES.NO_API_KEY);
17
+ }
18
+ return axios_1.default.create({
19
+ baseURL: constants_1.CONFIG.API_BASE_URL,
20
+ headers: {
21
+ 'Authorization': `Bearer ${apiKey}`,
22
+ 'Content-Type': 'application/json',
23
+ 'User-Agent': constants_1.CONFIG.USER_AGENT
24
+ },
25
+ timeout: constants_1.CONFIG.TIMEOUT_MS
26
+ });
27
+ };
28
+ async function listInputs(page = 1, limit = 20) {
29
+ try {
30
+ const client = getClient();
31
+ const response = await client.get('/inputs', {
32
+ params: { page, limit }
33
+ });
34
+ return response.data.data;
35
+ }
36
+ catch (error) {
37
+ throw (0, errors_1.handleApiError)(error);
38
+ }
39
+ }
40
+ async function getInputDetail(id) {
41
+ try {
42
+ const client = getClient();
43
+ const response = await client.get(`/inputs/${id}`);
44
+ return response.data.data;
45
+ }
46
+ catch (error) {
47
+ throw (0, errors_1.handleApiError)(error);
48
+ }
49
+ }
50
+ async function getInputStatus(id) {
51
+ try {
52
+ const client = getClient();
53
+ const response = await client.get(`/inputs/${id}`);
54
+ return response.data.data;
55
+ }
56
+ catch (error) {
57
+ throw (0, errors_1.handleApiError)(error);
58
+ }
59
+ }
60
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/api/input.ts"],"names":[],"mappings":";;;;;AAwBA,gCAUC;AAED,wCAQC;AAED,wCAQC;AAtDD,kDAA0B;AAC1B,sCAAmC;AAEnC,mDAAuD;AACvD,4CAAwE;AAExE,MAAM,SAAS,GAAG,GAAG,EAAE;IACrB,MAAM,MAAM,GAAG,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,iBAAQ,CAAC,oBAAQ,CAAC,UAAU,EAAE,oBAAW,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,eAAK,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,kBAAM,CAAC,YAAY;QAC5B,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,MAAM,EAAE;YACnC,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,kBAAM,CAAC,UAAU;SAChC;QACD,OAAO,EAAE,kBAAM,CAAC,UAAU;KAC3B,CAAC,CAAC;AACL,CAAC,CAAC;AAEK,KAAK,UAAU,UAAU,CAAC,OAAe,CAAC,EAAE,QAAgB,EAAE;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE;YAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACxB,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,EAAU;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,EAAU;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,49 @@
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.listUsage = listUsage;
7
+ exports.getUsageDetail = getUsageDetail;
8
+ const axios_1 = __importDefault(require("axios"));
9
+ const config_1 = require("../config");
10
+ const constants_1 = require("../config/constants");
11
+ const errors_1 = require("../utils/errors");
12
+ const getClient = () => {
13
+ const apiKey = config_1.config.get('apiKey');
14
+ if (!apiKey) {
15
+ throw new errors_1.CliError(constants_1.MESSAGES.NO_API_KEY, errors_1.ERROR_CODES.NO_API_KEY);
16
+ }
17
+ return axios_1.default.create({
18
+ baseURL: constants_1.CONFIG.API_BASE_URL,
19
+ headers: {
20
+ 'Authorization': `Bearer ${apiKey}`,
21
+ 'Content-Type': 'application/json',
22
+ 'User-Agent': constants_1.CONFIG.USER_AGENT
23
+ },
24
+ timeout: constants_1.CONFIG.TIMEOUT_MS
25
+ });
26
+ };
27
+ async function listUsage(page = 1, limit = 20) {
28
+ try {
29
+ const client = getClient();
30
+ const response = await client.get('/usage', {
31
+ params: { page, limit }
32
+ });
33
+ return response.data.data;
34
+ }
35
+ catch (error) {
36
+ throw (0, errors_1.handleApiError)(error);
37
+ }
38
+ }
39
+ async function getUsageDetail(id) {
40
+ try {
41
+ const client = getClient();
42
+ const response = await client.get(`/usage/${id}`);
43
+ return response.data.data;
44
+ }
45
+ catch (error) {
46
+ throw (0, errors_1.handleApiError)(error);
47
+ }
48
+ }
49
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/api/usage.ts"],"names":[],"mappings":";;;;;AAwBA,8BAUC;AAED,wCAQC;AA5CD,kDAA0B;AAC1B,sCAAmC;AAEnC,mDAAuD;AACvD,4CAAwE;AAExE,MAAM,SAAS,GAAG,GAAG,EAAE;IACrB,MAAM,MAAM,GAAG,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,iBAAQ,CAAC,oBAAQ,CAAC,UAAU,EAAE,oBAAW,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,eAAK,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,kBAAM,CAAC,YAAY;QAC5B,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,MAAM,EAAE;YACnC,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,kBAAM,CAAC,UAAU;SAChC;QACD,OAAO,EAAE,kBAAM,CAAC,UAAU;KAC3B,CAAC,CAAC;AACL,CAAC,CAAC;AAEK,KAAK,UAAU,SAAS,CAAC,OAAe,CAAC,EAAE,QAAgB,EAAE;IAClE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE;YAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACxB,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,EAAU;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}