@nexical/cli 0.1.6 → 0.10.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 (236) hide show
  1. package/.github/workflows/deploy.yml +3 -3
  2. package/README.md +317 -104
  3. package/dist/chunk-JYASTIIW.js +42 -0
  4. package/dist/chunk-JYASTIIW.js.map +1 -0
  5. package/dist/chunk-LZ3YQWAR.js +2204 -0
  6. package/dist/chunk-LZ3YQWAR.js.map +1 -0
  7. package/dist/chunk-OKXOCNXP.js +105 -0
  8. package/dist/chunk-OKXOCNXP.js.map +1 -0
  9. package/dist/chunk-OYFWMYPG.js +52 -0
  10. package/dist/chunk-OYFWMYPG.js.map +1 -0
  11. package/dist/chunk-WKERTCM6.js +74 -0
  12. package/dist/chunk-WKERTCM6.js.map +1 -0
  13. package/dist/index.js +33 -6
  14. package/dist/index.js.map +1 -1
  15. package/dist/src/commands/init.d.ts +11 -0
  16. package/dist/src/commands/init.js +88 -0
  17. package/dist/src/commands/init.js.map +1 -0
  18. package/dist/src/commands/module/add.d.ts +14 -0
  19. package/dist/src/commands/module/add.js +136 -0
  20. package/dist/src/commands/module/add.js.map +1 -0
  21. package/dist/src/commands/module/list.d.ts +10 -0
  22. package/dist/src/commands/module/list.js +73 -0
  23. package/dist/src/commands/module/list.js.map +1 -0
  24. package/dist/src/commands/module/remove.d.ts +12 -0
  25. package/dist/src/commands/module/remove.js +71 -0
  26. package/dist/src/commands/module/remove.js.map +1 -0
  27. package/dist/src/commands/module/update.d.ts +11 -0
  28. package/dist/src/commands/module/update.js +52 -0
  29. package/dist/src/commands/module/update.js.map +1 -0
  30. package/dist/src/commands/run.d.ts +11 -0
  31. package/dist/src/commands/run.js +93 -0
  32. package/dist/src/commands/run.js.map +1 -0
  33. package/dist/src/utils/discovery.d.ts +13 -0
  34. package/dist/src/utils/discovery.js +9 -0
  35. package/dist/src/utils/git.d.ts +16 -0
  36. package/dist/src/utils/git.js +29 -0
  37. package/dist/src/utils/git.js.map +1 -0
  38. package/dist/src/utils/url-resolver.d.ts +15 -0
  39. package/dist/src/utils/url-resolver.js +9 -0
  40. package/dist/src/utils/url-resolver.js.map +1 -0
  41. package/index.ts +29 -5
  42. package/package.json +32 -30
  43. package/src/commands/init.ts +85 -0
  44. package/src/commands/module/add.ts +169 -0
  45. package/src/commands/module/list.ts +69 -0
  46. package/src/commands/module/remove.ts +74 -0
  47. package/src/commands/module/update.ts +50 -0
  48. package/src/commands/run.ts +98 -0
  49. package/src/utils/discovery.ts +134 -0
  50. package/src/utils/git.ts +65 -0
  51. package/src/utils/url-resolver.ts +57 -0
  52. package/test/e2e/lifecycle.e2e.test.ts +152 -0
  53. package/test/integration/commands/init.integration.test.ts +82 -0
  54. package/test/integration/commands/module.integration.test.ts +144 -0
  55. package/test/integration/commands/run.integration.test.ts +90 -0
  56. package/test/integration/utils/command-loading.integration.test.ts +80 -0
  57. package/test/unit/commands/init.test.ts +153 -0
  58. package/test/unit/commands/module/add.test.ts +262 -0
  59. package/test/unit/commands/module/list.test.ts +115 -0
  60. package/test/unit/commands/module/remove.test.ts +89 -0
  61. package/test/unit/commands/module/update.test.ts +91 -0
  62. package/test/unit/commands/run.test.ts +252 -0
  63. package/test/unit/utils/command-discovery.test.ts +176 -0
  64. package/test/unit/utils/git.test.ts +152 -0
  65. package/test/unit/utils/integration-helpers.test.ts +72 -0
  66. package/test/unit/utils/url-resolver.test.ts +39 -0
  67. package/test/utils/integration-helpers.ts +66 -0
  68. package/vitest.e2e.config.ts +0 -1
  69. package/dist/chunk-JDRAVUKK.js +0 -48
  70. package/dist/chunk-JDRAVUKK.js.map +0 -1
  71. package/dist/src/commands/admin/create-user.d.ts +0 -15
  72. package/dist/src/commands/admin/create-user.js +0 -49
  73. package/dist/src/commands/admin/create-user.js.map +0 -1
  74. package/dist/src/commands/branch/create.d.ts +0 -19
  75. package/dist/src/commands/branch/create.js +0 -59
  76. package/dist/src/commands/branch/create.js.map +0 -1
  77. package/dist/src/commands/branch/delete.d.ts +0 -15
  78. package/dist/src/commands/branch/delete.js +0 -50
  79. package/dist/src/commands/branch/delete.js.map +0 -1
  80. package/dist/src/commands/branch/get.d.ts +0 -15
  81. package/dist/src/commands/branch/get.js +0 -53
  82. package/dist/src/commands/branch/get.js.map +0 -1
  83. package/dist/src/commands/branch/list.d.ts +0 -15
  84. package/dist/src/commands/branch/list.js +0 -51
  85. package/dist/src/commands/branch/list.js.map +0 -1
  86. package/dist/src/commands/job/get.d.ts +0 -15
  87. package/dist/src/commands/job/get.js +0 -62
  88. package/dist/src/commands/job/get.js.map +0 -1
  89. package/dist/src/commands/job/list.d.ts +0 -15
  90. package/dist/src/commands/job/list.js +0 -57
  91. package/dist/src/commands/job/list.js.map +0 -1
  92. package/dist/src/commands/job/logs.d.ts +0 -15
  93. package/dist/src/commands/job/logs.js +0 -67
  94. package/dist/src/commands/job/logs.js.map +0 -1
  95. package/dist/src/commands/job/trigger.d.ts +0 -19
  96. package/dist/src/commands/job/trigger.js +0 -74
  97. package/dist/src/commands/job/trigger.js.map +0 -1
  98. package/dist/src/commands/login.d.ts +0 -8
  99. package/dist/src/commands/login.js +0 -31
  100. package/dist/src/commands/login.js.map +0 -1
  101. package/dist/src/commands/project/create.d.ts +0 -24
  102. package/dist/src/commands/project/create.js +0 -63
  103. package/dist/src/commands/project/create.js.map +0 -1
  104. package/dist/src/commands/project/delete.d.ts +0 -20
  105. package/dist/src/commands/project/delete.js +0 -58
  106. package/dist/src/commands/project/delete.js.map +0 -1
  107. package/dist/src/commands/project/get.d.ts +0 -15
  108. package/dist/src/commands/project/get.js +0 -49
  109. package/dist/src/commands/project/get.js.map +0 -1
  110. package/dist/src/commands/project/list.d.ts +0 -15
  111. package/dist/src/commands/project/list.js +0 -45
  112. package/dist/src/commands/project/list.js.map +0 -1
  113. package/dist/src/commands/project/update.d.ts +0 -19
  114. package/dist/src/commands/project/update.js +0 -66
  115. package/dist/src/commands/project/update.js.map +0 -1
  116. package/dist/src/commands/team/create.d.ts +0 -19
  117. package/dist/src/commands/team/create.js +0 -45
  118. package/dist/src/commands/team/create.js.map +0 -1
  119. package/dist/src/commands/team/delete.d.ts +0 -20
  120. package/dist/src/commands/team/delete.js +0 -52
  121. package/dist/src/commands/team/delete.js.map +0 -1
  122. package/dist/src/commands/team/get.d.ts +0 -15
  123. package/dist/src/commands/team/get.js +0 -42
  124. package/dist/src/commands/team/get.js.map +0 -1
  125. package/dist/src/commands/team/list.d.ts +0 -8
  126. package/dist/src/commands/team/list.js +0 -30
  127. package/dist/src/commands/team/list.js.map +0 -1
  128. package/dist/src/commands/team/member/invite.d.ts +0 -20
  129. package/dist/src/commands/team/member/invite.js +0 -54
  130. package/dist/src/commands/team/member/invite.js.map +0 -1
  131. package/dist/src/commands/team/member/remove.d.ts +0 -15
  132. package/dist/src/commands/team/member/remove.js +0 -43
  133. package/dist/src/commands/team/member/remove.js.map +0 -1
  134. package/dist/src/commands/team/update.d.ts +0 -19
  135. package/dist/src/commands/team/update.js +0 -55
  136. package/dist/src/commands/team/update.js.map +0 -1
  137. package/dist/src/commands/token/generate.d.ts +0 -19
  138. package/dist/src/commands/token/generate.js +0 -48
  139. package/dist/src/commands/token/generate.js.map +0 -1
  140. package/dist/src/commands/token/list.d.ts +0 -8
  141. package/dist/src/commands/token/list.js +0 -31
  142. package/dist/src/commands/token/list.js.map +0 -1
  143. package/dist/src/commands/token/revoke.d.ts +0 -15
  144. package/dist/src/commands/token/revoke.js +0 -38
  145. package/dist/src/commands/token/revoke.js.map +0 -1
  146. package/dist/src/commands/whoami.d.ts +0 -8
  147. package/dist/src/commands/whoami.js +0 -26
  148. package/dist/src/commands/whoami.js.map +0 -1
  149. package/dist/src/utils/nexical-client.d.ts +0 -10
  150. package/dist/src/utils/nexical-client.js +0 -12
  151. package/src/commands/admin/create-user.ts +0 -46
  152. package/src/commands/branch/create.ts +0 -57
  153. package/src/commands/branch/delete.ts +0 -47
  154. package/src/commands/branch/get.ts +0 -50
  155. package/src/commands/branch/list.ts +0 -50
  156. package/src/commands/job/get.ts +0 -59
  157. package/src/commands/job/list.ts +0 -56
  158. package/src/commands/job/logs.ts +0 -67
  159. package/src/commands/job/trigger.ts +0 -73
  160. package/src/commands/login.ts +0 -31
  161. package/src/commands/project/create.ts +0 -61
  162. package/src/commands/project/delete.ts +0 -56
  163. package/src/commands/project/get.ts +0 -46
  164. package/src/commands/project/list.ts +0 -44
  165. package/src/commands/project/update.ts +0 -63
  166. package/src/commands/team/create.ts +0 -43
  167. package/src/commands/team/delete.ts +0 -50
  168. package/src/commands/team/get.ts +0 -39
  169. package/src/commands/team/list.ts +0 -26
  170. package/src/commands/team/member/invite.ts +0 -56
  171. package/src/commands/team/member/remove.ts +0 -40
  172. package/src/commands/team/update.ts +0 -53
  173. package/src/commands/token/generate.ts +0 -45
  174. package/src/commands/token/list.ts +0 -27
  175. package/src/commands/token/revoke.ts +0 -35
  176. package/src/commands/whoami.ts +0 -21
  177. package/src/utils/nexical-client.ts +0 -47
  178. package/test/e2e/auth.e2e.test.ts +0 -46
  179. package/test/e2e/job-workflow.e2e.test.ts +0 -33
  180. package/test/e2e/project-lifecycle.e2e.test.ts +0 -48
  181. package/test/e2e/setup.ts +0 -237
  182. package/test/e2e/utils.ts +0 -33
  183. package/test/integration/commands/admin/create-user.test.ts +0 -51
  184. package/test/integration/commands/branch/create.test.ts +0 -51
  185. package/test/integration/commands/branch/delete.test.ts +0 -43
  186. package/test/integration/commands/branch/get.test.ts +0 -49
  187. package/test/integration/commands/branch/list.test.ts +0 -47
  188. package/test/integration/commands/job/get.test.ts +0 -54
  189. package/test/integration/commands/job/list.test.ts +0 -47
  190. package/test/integration/commands/job/logs.test.ts +0 -47
  191. package/test/integration/commands/job/trigger.test.ts +0 -57
  192. package/test/integration/commands/login.test.ts +0 -62
  193. package/test/integration/commands/project/create.test.ts +0 -53
  194. package/test/integration/commands/project/delete.test.ts +0 -43
  195. package/test/integration/commands/project/get.test.ts +0 -51
  196. package/test/integration/commands/project/list.test.ts +0 -47
  197. package/test/integration/commands/project/update.test.ts +0 -53
  198. package/test/integration/commands/team/create.test.ts +0 -53
  199. package/test/integration/commands/team/delete.test.ts +0 -43
  200. package/test/integration/commands/team/get.test.ts +0 -50
  201. package/test/integration/commands/team/list.test.ts +0 -47
  202. package/test/integration/commands/team/member/invite.test.ts +0 -46
  203. package/test/integration/commands/team/member/remove.test.ts +0 -43
  204. package/test/integration/commands/team/update.test.ts +0 -50
  205. package/test/integration/commands/token/generate.test.ts +0 -51
  206. package/test/integration/commands/token/list.test.ts +0 -47
  207. package/test/integration/commands/token/revoke.test.ts +0 -43
  208. package/test/integration/commands/whoami.test.ts +0 -49
  209. package/test/unit/commands/admin/create-user.test.ts +0 -51
  210. package/test/unit/commands/branch/create.test.ts +0 -57
  211. package/test/unit/commands/branch/delete.test.ts +0 -49
  212. package/test/unit/commands/branch/get.test.ts +0 -67
  213. package/test/unit/commands/branch/list.test.ts +0 -62
  214. package/test/unit/commands/job/get.test.ts +0 -76
  215. package/test/unit/commands/job/list.test.ts +0 -62
  216. package/test/unit/commands/job/logs.test.ts +0 -60
  217. package/test/unit/commands/job/trigger.test.ts +0 -75
  218. package/test/unit/commands/login.test.ts +0 -64
  219. package/test/unit/commands/project/create.test.ts +0 -64
  220. package/test/unit/commands/project/delete.test.ts +0 -72
  221. package/test/unit/commands/project/get.test.ts +0 -73
  222. package/test/unit/commands/project/list.test.ts +0 -62
  223. package/test/unit/commands/project/update.test.ts +0 -58
  224. package/test/unit/commands/team/create.test.ts +0 -68
  225. package/test/unit/commands/team/delete.test.ts +0 -71
  226. package/test/unit/commands/team/get.test.ts +0 -70
  227. package/test/unit/commands/team/list.test.ts +0 -56
  228. package/test/unit/commands/team/member/invite.test.ts +0 -52
  229. package/test/unit/commands/team/member/remove.test.ts +0 -49
  230. package/test/unit/commands/team/update.test.ts +0 -63
  231. package/test/unit/commands/token/generate.test.ts +0 -65
  232. package/test/unit/commands/token/list.test.ts +0 -58
  233. package/test/unit/commands/token/revoke.test.ts +0 -49
  234. package/test/unit/commands/whoami.test.ts +0 -49
  235. package/test/unit/utils/nexical-client.test.ts +0 -113
  236. /package/dist/src/utils/{nexical-client.js.map → discovery.js.map} +0 -0
@@ -1,51 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import AdminUsersCreateSystemCommand from '../../../../src/commands/admin/create-user.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('AdminUsersCreateSystemCommand Integration', () => {
9
- let command: AdminUsersCreateSystemCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- auth: {
17
- createSystemUser: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new AdminUsersCreateSystemCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'success').mockImplementation(() => { });
25
- vi.spyOn(command, 'error').mockImplementation(() => { });
26
- });
27
-
28
- it('should create system user successfully', async () => {
29
- mockClient.auth.createSystemUser.mockResolvedValue({
30
- user: { fullName: 'Integration User', id: 'sys-int' }
31
- });
32
-
33
- await command.run({ name: 'Integration User', email: 'sys-int@example.com', password: 'password123' });
34
-
35
- expect(mockClient.auth.createSystemUser).toHaveBeenCalledWith({
36
- fullName: 'Integration User',
37
- email: 'sys-int@example.com',
38
- password: 'password123'
39
- });
40
- expect(command.success).toHaveBeenCalledWith('System user "Integration User" created!');
41
- expect(command.info).toHaveBeenCalledWith('ID: sys-int');
42
- });
43
-
44
- it('should handle creation failure', async () => {
45
- mockClient.auth.createSystemUser.mockRejectedValue(new Error('Email already exists'));
46
-
47
- await command.run({ name: 'Integration User', email: 'sys-int@example.com', password: 'password123' });
48
-
49
- expect(command.error).toHaveBeenCalledWith('Failed to create system user: Email already exists');
50
- });
51
- });
@@ -1,51 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import BranchesCreateCommand from '../../../../src/commands/branch/create.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('BranchesCreateCommand Integration', () => {
9
- let command: BranchesCreateCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- branches: {
17
- create: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new BranchesCreateCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'success').mockImplementation(() => { });
25
- vi.spyOn(command, 'error').mockImplementation(() => { });
26
- });
27
-
28
- it('should create branch successfully', async () => {
29
- mockClient.branches.create.mockResolvedValue({
30
- name: 'integration-branch',
31
- id: 'br-int'
32
- });
33
-
34
- await command.run({ teamId: '1', projectId: '2', name: 'integration-branch', preview: 'http://int.com' });
35
-
36
- expect(mockClient.branches.create).toHaveBeenCalledWith(1, 2, {
37
- name: 'integration-branch',
38
- previewUrl: 'http://int.com',
39
- });
40
- expect(command.success).toHaveBeenCalledWith('Branch "integration-branch" created!');
41
- expect(command.info).toHaveBeenCalledWith('ID: br-int');
42
- });
43
-
44
- it('should handle creation failure', async () => {
45
- mockClient.branches.create.mockRejectedValue(new Error('Branch exists'));
46
-
47
- await command.run({ teamId: '1', projectId: '2', name: 'main' });
48
-
49
- expect(command.error).toHaveBeenCalledWith('Failed to create branch: Branch exists');
50
- });
51
- });
@@ -1,43 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import BranchesDeleteCommand from '../../../../src/commands/branch/delete.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('BranchesDeleteCommand Integration', () => {
9
- let command: BranchesDeleteCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- branches: {
17
- delete: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new BranchesDeleteCommand([], {} as any);
23
- vi.spyOn(command, 'success').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should delete branch successfully', async () => {
28
- mockClient.branches.delete.mockResolvedValue({});
29
-
30
- await command.run({ teamId: '1', projectId: '2', branchId: '3' });
31
-
32
- expect(mockClient.branches.delete).toHaveBeenCalledWith(1, 2, 3);
33
- expect(command.success).toHaveBeenCalledWith('Branch 3 deleted.');
34
- });
35
-
36
- it('should handle deletion failure', async () => {
37
- mockClient.branches.delete.mockRejectedValue(new Error('Not found'));
38
-
39
- await command.run({ teamId: '1', projectId: '2', branchId: '3' });
40
-
41
- expect(command.error).toHaveBeenCalledWith('Failed to delete branch: Not found');
42
- });
43
- });
@@ -1,49 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import BranchesGetCommand from '../../../../src/commands/branch/get.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('BranchesGetCommand Integration', () => {
9
- let command: BranchesGetCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- branches: {
17
- get: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new BranchesGetCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should get branch details successfully', async () => {
28
- mockClient.branches.get.mockResolvedValue({
29
- id: '100',
30
- name: 'integration-main',
31
- previewUrl: 'http://int.com'
32
- });
33
-
34
- await command.run({ teamId: '1', projectId: '2', branchId: '100' });
35
-
36
- expect(mockClient.branches.get).toHaveBeenCalledWith(1, 2, 100);
37
- expect(command.info).toHaveBeenCalledWith('Branch Details:');
38
- expect(command.info).toHaveBeenCalledWith(' ID: 100');
39
- expect(command.info).toHaveBeenCalledWith(' Name: integration-main');
40
- });
41
-
42
- it('should handle get failure', async () => {
43
- mockClient.branches.get.mockRejectedValue(new Error('Not found'));
44
-
45
- await command.run({ teamId: '1', projectId: '2', branchId: '100' });
46
-
47
- expect(command.error).toHaveBeenCalledWith('Failed to get branch: Not found');
48
- });
49
- });
@@ -1,47 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import BranchesListCommand from '../../../../src/commands/branch/list.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('BranchesListCommand Integration', () => {
9
- let command: BranchesListCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- branches: {
17
- list: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new BranchesListCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should list branches successfully', async () => {
28
- mockClient.branches.list.mockResolvedValue([
29
- { id: '100', name: 'integration-main' },
30
- { id: '101', name: 'integration-dev' }
31
- ]);
32
-
33
- await command.run({ teamId: '1', projectId: '2' });
34
-
35
- expect(mockClient.branches.list).toHaveBeenCalledWith(1, 2);
36
- expect(command.info).toHaveBeenCalledWith('Branches for Project 2:');
37
- expect(command.info).toHaveBeenCalledWith('- integration-main (ID: 100)');
38
- });
39
-
40
- it('should handle list failure', async () => {
41
- mockClient.branches.list.mockRejectedValue(new Error('Network error'));
42
-
43
- await command.run({ teamId: '1', projectId: '2' });
44
-
45
- expect(command.error).toHaveBeenCalledWith('Failed to list branches: Network error');
46
- });
47
- });
@@ -1,54 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import JobsGetCommand from '../../../../src/commands/job/get.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('JobsGetCommand Integration', () => {
9
- let command: JobsGetCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- jobs: {
17
- get: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new JobsGetCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should get job details successfully', async () => {
28
- mockClient.jobs.get.mockResolvedValue({
29
- id: '123',
30
- type: 'build',
31
- status: 'success',
32
- createdAt: '2023-01-01T00:00:00Z',
33
- finishedAt: '2023-01-01T00:05:00Z',
34
- startedAt: '2023-01-01T00:01:00Z',
35
- completedAt: '2023-01-01T00:05:00Z',
36
- queue: 'default'
37
- });
38
-
39
- await command.run({ teamId: '1', projectId: '2', branchId: '3', jobId: '123' });
40
-
41
- expect(mockClient.jobs.get).toHaveBeenCalledWith(1, 2, 3, 123);
42
- expect(command.info).toHaveBeenCalledWith('Job Details:');
43
- expect(command.info).toHaveBeenCalledWith(' ID: 123');
44
- expect(command.info).toHaveBeenCalledWith(' Status: success');
45
- });
46
-
47
- it('should handle get failure', async () => {
48
- mockClient.jobs.get.mockRejectedValue(new Error('Job not found'));
49
-
50
- await command.run({ teamId: '1', projectId: '2', branchId: '3', jobId: '123' });
51
-
52
- expect(command.error).toHaveBeenCalledWith('Failed to get job: Job not found');
53
- });
54
- });
@@ -1,47 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import JobsListCommand from '../../../../src/commands/job/list.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('JobsListCommand Integration', () => {
9
- let command: JobsListCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- jobs: {
17
- list: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new JobsListCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should list jobs successfully', async () => {
28
- mockClient.jobs.list.mockResolvedValue([
29
- { id: '101', status: 'running', type: 'build' },
30
- { id: '102', status: 'pending', type: 'deploy' }
31
- ]);
32
-
33
- await command.run({ teamId: '1', projectId: '2', branchId: '3' });
34
-
35
- expect(mockClient.jobs.list).toHaveBeenCalledWith(1, 2, 3);
36
- expect(command.info).toHaveBeenCalledWith('Jobs for Branch 3:');
37
- expect(command.info).toHaveBeenCalledWith('101 - build [running] (Started: Waiting)');
38
- });
39
-
40
- it('should handle list failure', async () => {
41
- mockClient.jobs.list.mockRejectedValue(new Error('Network error'));
42
-
43
- await command.run({ teamId: '1', projectId: '2', branchId: '3' });
44
-
45
- expect(command.error).toHaveBeenCalledWith('Failed to list jobs: Network error');
46
- });
47
- });
@@ -1,47 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import JobsLogsCommand from '../../../../src/commands/job/logs.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('JobsLogsCommand Integration', () => {
9
- let command: JobsLogsCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- jobs: {
17
- getLogs: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new JobsLogsCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should get job logs successfully', async () => {
28
- mockClient.jobs.getLogs.mockResolvedValue([
29
- { timestamp: '2023T12:00:00', level: 'info', message: 'Build started' },
30
- { timestamp: '2023T12:01:00', level: 'error', message: 'Build failed' }
31
- ]);
32
-
33
- await command.run({ teamId: '1', projectId: '2', branchId: '3', jobId: '123' });
34
-
35
- expect(mockClient.jobs.getLogs).toHaveBeenCalledWith(1, 2, 3, 123);
36
- expect(command.info).toHaveBeenCalledWith(expect.stringContaining('Build started'));
37
- expect(command.error).toHaveBeenCalledWith(expect.stringContaining('Build failed'));
38
- });
39
-
40
- it('should handle log failure', async () => {
41
- mockClient.jobs.getLogs.mockRejectedValue(new Error('Logs unavailable'));
42
-
43
- await command.run({ teamId: '1', projectId: '2', branchId: '3', jobId: '123' });
44
-
45
- expect(command.error).toHaveBeenCalledWith('Failed to get logs: Logs unavailable');
46
- });
47
- });
@@ -1,57 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import JobsTriggerCommand from '../../../../src/commands/job/trigger.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('JobsTriggerCommand Integration', () => {
9
- let command: JobsTriggerCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- jobs: {
17
- create: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new JobsTriggerCommand([], {} as any);
23
- vi.spyOn(command, 'success').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should trigger job successfully', async () => {
28
- mockClient.jobs.create.mockResolvedValue({ id: 'job-new' });
29
-
30
- await command.run({ teamId: '1', projectId: '2', branchId: '3', type: 'build' });
31
-
32
- expect(mockClient.jobs.create).toHaveBeenCalledWith(1, 2, 3, {
33
- type: 'build',
34
- inputs: {},
35
- });
36
- expect(command.success).toHaveBeenCalledWith('Job job-new triggered successfully!');
37
- });
38
-
39
- it('should trigger job with input', async () => {
40
- mockClient.jobs.create.mockResolvedValue({ id: 'job-new' });
41
-
42
- await command.run({ teamId: '1', projectId: '2', branchId: '3', type: 'deploy', input: '{"env":"prod"}' });
43
-
44
- expect(mockClient.jobs.create).toHaveBeenCalledWith(1, 2, 3, {
45
- type: 'deploy',
46
- inputs: { env: 'prod' },
47
- });
48
- });
49
-
50
- it('should handle trigger failure', async () => {
51
- mockClient.jobs.create.mockRejectedValue(new Error('Quota exceeded'));
52
-
53
- await command.run({ teamId: '1', projectId: '2', branchId: '3', type: 'build' });
54
-
55
- expect(command.error).toHaveBeenCalledWith('Failed to trigger job: Quota exceeded');
56
- });
57
- });
@@ -1,62 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import LoginCommand from '../../../src/commands/login.js';
4
- import { getClient, saveToken } from '../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../src/utils/nexical-client.js');
7
-
8
- describe('LoginCommand Integration', () => {
9
- let command: LoginCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- auth: {
17
- authenticateDevice: vi.fn(),
18
- },
19
- users: {
20
- me: vi.fn(),
21
- },
22
- setToken: vi.fn(),
23
- };
24
- vi.mocked(getClient).mockReturnValue(mockClient);
25
-
26
- command = new LoginCommand([], {} as any);
27
- vi.spyOn(command, 'info').mockImplementation(() => { });
28
- vi.spyOn(command, 'notice').mockImplementation(() => { });
29
- vi.spyOn(command, 'success').mockImplementation(() => { });
30
- vi.spyOn(command, 'error').mockImplementation(() => { });
31
- });
32
-
33
- it('should authenticate successfully', async () => {
34
- mockClient.auth.authenticateDevice.mockImplementation(async (_clientId: string, callback: any) => {
35
- callback('USER-CODE', 'https://verify.url');
36
- return 'new-token';
37
- });
38
- mockClient.users.me.mockResolvedValue({ fullName: 'Integration User', email: 'int@example.com' });
39
-
40
- await command.run();
41
-
42
- expect(command.info).toHaveBeenCalledWith('Starting device authentication...');
43
- expect(mockClient.auth.authenticateDevice).toHaveBeenCalledWith('nexical-cli', expect.any(Function));
44
-
45
- expect(command.notice).toHaveBeenCalledWith('Please visit: https://verify.url');
46
- expect(command.notice).toHaveBeenCalledWith('And enter code: USER-CODE');
47
-
48
- expect(saveToken).toHaveBeenCalledWith('new-token');
49
- expect(mockClient.setToken).toHaveBeenCalledWith('new-token');
50
- expect(mockClient.users.me).toHaveBeenCalled();
51
- expect(command.success).toHaveBeenCalledWith('Successfully logged in as Integration User (int@example.com)');
52
- });
53
-
54
- it('should handle authentication failure', async () => {
55
- mockClient.auth.authenticateDevice.mockRejectedValue(new Error('Auth failed'));
56
-
57
- await command.run();
58
-
59
- expect(command.error).toHaveBeenCalledWith('Login failed: Auth failed');
60
- expect(saveToken).not.toHaveBeenCalled();
61
- });
62
- });
@@ -1,53 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import ProjectsCreateCommand from '../../../../src/commands/project/create.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('ProjectsCreateCommand Integration', () => {
9
- let command: ProjectsCreateCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- projects: {
17
- create: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new ProjectsCreateCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'success').mockImplementation(() => { });
25
- vi.spyOn(command, 'error').mockImplementation(() => { });
26
- });
27
-
28
- it('should create project successfully', async () => {
29
- mockClient.projects.create.mockResolvedValue({
30
- name: 'New Project',
31
- id: 'proj-1'
32
- });
33
-
34
- await command.run({ teamId: '1', name: 'New Project', repo: 'git@repo', prod: 'http://prod.com' });
35
-
36
- expect(mockClient.projects.create).toHaveBeenCalledWith(1, {
37
- name: 'New Project',
38
- repoUrl: 'git@repo',
39
- productionUrl: 'http://prod.com',
40
- mode: undefined
41
- });
42
- expect(command.success).toHaveBeenCalledWith('Project "New Project" set up successfully!');
43
- expect(command.info).toHaveBeenCalledWith('ID: proj-1');
44
- });
45
-
46
- it('should handle creation failure', async () => {
47
- mockClient.projects.create.mockRejectedValue(new Error('Project exists'));
48
-
49
- await command.run({ teamId: '1', name: 'New Project' });
50
-
51
- expect(command.error).toHaveBeenCalledWith('Failed to create project: Project exists');
52
- });
53
- });
@@ -1,43 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import ProjectsDeleteCommand from '../../../../src/commands/project/delete.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('ProjectsDeleteCommand Integration', () => {
9
- let command: ProjectsDeleteCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- projects: {
17
- delete: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new ProjectsDeleteCommand([], {} as any);
23
- vi.spyOn(command, 'success').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should delete project successfully', async () => {
28
- mockClient.projects.delete.mockResolvedValue({});
29
-
30
- await command.run({ teamId: '1', projectId: '2', confirm: true });
31
-
32
- expect(mockClient.projects.delete).toHaveBeenCalledWith(1, 2);
33
- expect(command.success).toHaveBeenCalledWith('Project 2 deleted.');
34
- });
35
-
36
- it('should handle deletion failure', async () => {
37
- mockClient.projects.delete.mockRejectedValue(new Error('Project not found'));
38
-
39
- await command.run({ teamId: '1', projectId: '2', confirm: true });
40
-
41
- expect(command.error).toHaveBeenCalledWith('Failed to delete project: Project not found');
42
- });
43
- });
@@ -1,51 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import ProjectsGetCommand from '../../../../src/commands/project/get.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('ProjectsGetCommand Integration', () => {
9
- let command: ProjectsGetCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- projects: {
17
- get: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new ProjectsGetCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should get project details successfully', async () => {
28
- mockClient.projects.get.mockResolvedValue({
29
- id: '101',
30
- name: 'My Project',
31
- repoUrl: 'git@repo',
32
- productionUrl: 'http://prod.com',
33
- mode: 'full'
34
- });
35
-
36
- await command.run({ teamId: '1', projectId: '101' });
37
-
38
- expect(mockClient.projects.get).toHaveBeenCalledWith(1, 101);
39
- expect(command.info).toHaveBeenCalledWith('Project Details:');
40
- expect(command.info).toHaveBeenCalledWith(' ID: 101');
41
- expect(command.info).toHaveBeenCalledWith(' Name: My Project');
42
- });
43
-
44
- it('should handle get failure', async () => {
45
- mockClient.projects.get.mockRejectedValue(new Error('Project not found'));
46
-
47
- await command.run({ teamId: '1', projectId: '101' });
48
-
49
- expect(command.error).toHaveBeenCalledWith('Failed to get project: Project not found');
50
- });
51
- });