@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,47 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import ProjectsListCommand from '../../../../src/commands/project/list.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('ProjectsListCommand Integration', () => {
9
- let command: ProjectsListCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- projects: {
17
- list: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new ProjectsListCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should list projects successfully', async () => {
28
- mockClient.projects.list.mockResolvedValue([
29
- { id: '101', name: 'Project A' },
30
- { id: '102', name: 'Project B' }
31
- ]);
32
-
33
- await command.run({ teamId: '1' });
34
-
35
- expect(mockClient.projects.list).toHaveBeenCalledWith(1);
36
- expect(command.info).toHaveBeenCalledWith('Projects in Team 1:');
37
- expect(command.info).toHaveBeenCalledWith('- Project A (ID: 101) [No Repo]');
38
- });
39
-
40
- it('should handle list failure', async () => {
41
- mockClient.projects.list.mockRejectedValue(new Error('Network error'));
42
-
43
- await command.run({ teamId: '1' });
44
-
45
- expect(command.error).toHaveBeenCalledWith('Failed to list projects: Network error');
46
- });
47
- });
@@ -1,53 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import ProjectsUpdateCommand from '../../../../src/commands/project/update.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('ProjectsUpdateCommand Integration', () => {
9
- let command: ProjectsUpdateCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- projects: {
17
- update: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new ProjectsUpdateCommand([], {} as any);
23
- vi.spyOn(command, 'success').mockImplementation(() => { });
24
- vi.spyOn(command, 'info').mockImplementation(() => { });
25
- vi.spyOn(command, 'error').mockImplementation(() => { });
26
- vi.spyOn(command, 'warn').mockImplementation(() => { });
27
- });
28
-
29
- it('should update project successfully', async () => {
30
- mockClient.projects.update.mockResolvedValue({
31
- id: '101',
32
- name: 'Updated Name',
33
- repoUrl: 'git@newrepo'
34
- });
35
-
36
- await command.run({ teamId: '1', projectId: '101', name: 'Updated Name', repo: 'git@newrepo' });
37
-
38
- expect(mockClient.projects.update).toHaveBeenCalledWith(1, 101, {
39
- name: 'Updated Name',
40
- repoUrl: 'git@newrepo',
41
- });
42
- expect(command.success).toHaveBeenCalledWith('Project 101 updated!');
43
-
44
- });
45
-
46
- it('should handle update failure', async () => {
47
- mockClient.projects.update.mockRejectedValue(new Error('Update failed'));
48
-
49
- await command.run({ teamId: '1', projectId: '101', name: 'New Name' });
50
-
51
- expect(command.error).toHaveBeenCalledWith('Failed to update project: Update failed');
52
- });
53
- });
@@ -1,53 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import TeamsCreateCommand from '../../../../src/commands/team/create.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('TeamsCreateCommand Integration', () => {
9
- let command: TeamsCreateCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- teams: {
17
- create: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new TeamsCreateCommand([], {} 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 team successfully', async () => {
29
- mockClient.teams.create.mockResolvedValue({
30
- name: 'New Team',
31
- id: 'team-1',
32
- slug: 'new-team'
33
- });
34
-
35
- await command.run({ name: 'New Team', slug: 'new-team' });
36
-
37
- expect(mockClient.teams.create).toHaveBeenCalledWith({
38
- name: 'New Team',
39
- slug: 'new-team'
40
- });
41
- expect(command.success).toHaveBeenCalledWith('Team "New Team" created successfully!');
42
- expect(command.info).toHaveBeenCalledWith('ID: team-1');
43
- expect(command.info).toHaveBeenCalledWith('Slug: new-team');
44
- });
45
-
46
- it('should handle creation failure', async () => {
47
- mockClient.teams.create.mockRejectedValue(new Error('Slug taken'));
48
-
49
- await command.run({ name: 'New Team', slug: 'team' });
50
-
51
- expect(command.error).toHaveBeenCalledWith('Failed to create team: Slug taken');
52
- });
53
- });
@@ -1,43 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import TeamsDeleteCommand from '../../../../src/commands/team/delete.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('TeamsDeleteCommand Integration', () => {
9
- let command: TeamsDeleteCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- teams: {
17
- delete: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new TeamsDeleteCommand([], {} as any);
23
- vi.spyOn(command, 'success').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should delete team successfully', async () => {
28
- mockClient.teams.delete.mockResolvedValue({});
29
-
30
- await command.run({ teamId: '1', confirm: true });
31
-
32
- expect(mockClient.teams.delete).toHaveBeenCalledWith(1);
33
- expect(command.success).toHaveBeenCalledWith('Team 1 deleted.');
34
- });
35
-
36
- it('should handle deletion failure', async () => {
37
- mockClient.teams.delete.mockRejectedValue(new Error('Permission denied'));
38
-
39
- await command.run({ teamId: '1', confirm: true });
40
-
41
- expect(command.error).toHaveBeenCalledWith('Failed to delete team: Permission denied');
42
- });
43
- });
@@ -1,50 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import TeamsGetCommand from '../../../../src/commands/team/get.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('TeamsGetCommand Integration', () => {
9
- let command: TeamsGetCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- teams: {
17
- get: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new TeamsGetCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should get team details successfully', async () => {
28
- mockClient.teams.get.mockResolvedValue({
29
- id: '1',
30
- name: 'My Team',
31
- slug: 'my-team',
32
- role: 'owner'
33
- });
34
-
35
- await command.run({ teamId: '1' });
36
-
37
- expect(mockClient.teams.get).toHaveBeenCalledWith(1);
38
- expect(command.info).toHaveBeenCalledWith('Team Details:');
39
- expect(command.info).toHaveBeenCalledWith(' Name: My Team');
40
- expect(command.info).toHaveBeenCalledWith(' Role: owner');
41
- });
42
-
43
- it('should handle get failure', async () => {
44
- mockClient.teams.get.mockRejectedValue(new Error('Not found'));
45
-
46
- await command.run({ teamId: '1' });
47
-
48
- expect(command.error).toHaveBeenCalledWith('Failed to get team: Not found');
49
- });
50
- });
@@ -1,47 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import TeamsListCommand from '../../../../src/commands/team/list.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('TeamsListCommand Integration', () => {
9
- let command: TeamsListCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- teams: {
17
- list: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new TeamsListCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should list teams successfully', async () => {
28
- mockClient.teams.list.mockResolvedValue([
29
- { name: 'Team A', slug: 'team-a', role: 'admin' },
30
- { name: 'Team B', slug: 'team-b' }
31
- ]);
32
-
33
- await command.run();
34
-
35
- expect(mockClient.teams.list).toHaveBeenCalled();
36
- expect(command.info).toHaveBeenCalledWith('Your Teams:');
37
- expect(command.info).toHaveBeenCalledWith('- Team A (team-a) [admin]');
38
- });
39
-
40
- it('should handle list failure', async () => {
41
- mockClient.teams.list.mockRejectedValue(new Error('Network error'));
42
-
43
- await command.run();
44
-
45
- expect(command.error).toHaveBeenCalledWith('Failed to list teams: Network error');
46
- });
47
- });
@@ -1,46 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import TeamsInviteCommand from '../../../../../src/commands/team/member/invite.js';
4
- import { getClient } from '../../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../../src/utils/nexical-client.js');
7
-
8
- describe('TeamsInviteCommand Integration', () => {
9
- let command: TeamsInviteCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- teams: {
17
- inviteMember: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new TeamsInviteCommand([], {} as any);
23
- vi.spyOn(command, 'success').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should invite member successfully', async () => {
28
- mockClient.teams.inviteMember.mockResolvedValue({});
29
-
30
- await command.run({ teamId: '1', email: 'test@example.com', role: 'member' });
31
-
32
- expect(mockClient.teams.inviteMember).toHaveBeenCalledWith(1, {
33
- email: 'test@example.com',
34
- role: 'member'
35
- });
36
- expect(command.success).toHaveBeenCalledWith('Invited test@example.com to team 1 as member.');
37
- });
38
-
39
- it('should handle invite failure', async () => {
40
- mockClient.teams.inviteMember.mockRejectedValue(new Error('Invalid email'));
41
-
42
- await command.run({ teamId: '1', email: 'invalid' });
43
-
44
- expect(command.error).toHaveBeenCalledWith('Failed to invite member: Invalid email');
45
- });
46
- });
@@ -1,43 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import TeamsMembersRemoveCommand from '../../../../../src/commands/team/member/remove.js';
4
- import { getClient } from '../../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../../src/utils/nexical-client.js');
7
-
8
- describe('TeamsMembersRemoveCommand Integration', () => {
9
- let command: TeamsMembersRemoveCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- teams: {
17
- removeMember: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new TeamsMembersRemoveCommand([], {} as any);
23
- vi.spyOn(command, 'success').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should remove member successfully', async () => {
28
- mockClient.teams.removeMember.mockResolvedValue({});
29
-
30
- await command.run({ teamId: '1', userId: 'user-1' });
31
-
32
- expect(mockClient.teams.removeMember).toHaveBeenCalledWith(1, 'user-1');
33
- expect(command.success).toHaveBeenCalledWith('User user-1 removed from team 1.');
34
- });
35
-
36
- it('should handle removal failure', async () => {
37
- mockClient.teams.removeMember.mockRejectedValue(new Error('User not found'));
38
-
39
- await command.run({ teamId: '1', userId: 'user-1' });
40
-
41
- expect(command.error).toHaveBeenCalledWith('Failed to remove member: User not found');
42
- });
43
- });
@@ -1,50 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import TeamsUpdateCommand from '../../../../src/commands/team/update.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('TeamsUpdateCommand Integration', () => {
9
- let command: TeamsUpdateCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- teams: {
17
- update: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new TeamsUpdateCommand([], {} as any);
23
- vi.spyOn(command, 'success').mockImplementation(() => { });
24
- vi.spyOn(command, 'info').mockImplementation(() => { });
25
- vi.spyOn(command, 'error').mockImplementation(() => { });
26
- vi.spyOn(command, 'warn').mockImplementation(() => { });
27
- });
28
-
29
- it('should update team successfully', async () => {
30
- mockClient.teams.update.mockResolvedValue({
31
- id: '1',
32
- name: 'New Name'
33
- });
34
-
35
- await command.run({ teamId: '1', name: 'New Name' });
36
-
37
- expect(mockClient.teams.update).toHaveBeenCalledWith(1, {
38
- name: 'New Name'
39
- });
40
- expect(command.success).toHaveBeenCalledWith('Team 1 updated!');
41
- });
42
-
43
- it('should handle update failure', async () => {
44
- mockClient.teams.update.mockRejectedValue(new Error('Update failed'));
45
-
46
- await command.run({ teamId: '1', name: 'New Name' });
47
-
48
- expect(command.error).toHaveBeenCalledWith('Failed to update team: Update failed');
49
- });
50
- });
@@ -1,51 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import AuthTokensGenerateCommand from '../../../../src/commands/token/generate.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('AuthTokensGenerateCommand Integration', () => {
9
- let command: AuthTokensGenerateCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- auth: {
17
- generateToken: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new AuthTokensGenerateCommand([], {} as any);
23
- vi.spyOn(command, 'success').mockImplementation(() => { });
24
- vi.spyOn(command, 'warn').mockImplementation(() => { });
25
- vi.spyOn(command, 'error').mockImplementation(() => { });
26
- });
27
-
28
- it('should generate token successfully', async () => {
29
- mockClient.auth.generateToken.mockResolvedValue({
30
- name: 'My Token',
31
- token: 'secret-token'
32
- });
33
-
34
- await command.run({ name: 'My Token', scopes: 'read' });
35
-
36
- expect(mockClient.auth.generateToken).toHaveBeenCalledWith({
37
- name: 'My Token',
38
- scopes: ['read']
39
- });
40
- expect(command.success).toHaveBeenCalledWith('Token "My Token" generated!');
41
- expect(command.warn).toHaveBeenCalledWith('Token: secret-token');
42
- });
43
-
44
- it('should handle generation failure', async () => {
45
- mockClient.auth.generateToken.mockRejectedValue(new Error('Limit exceeded'));
46
-
47
- await command.run({ name: 'My Token' });
48
-
49
- expect(command.error).toHaveBeenCalledWith('Failed to generate token: Limit exceeded');
50
- });
51
- });
@@ -1,47 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import AuthTokensListCommand from '../../../../src/commands/token/list.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('AuthTokensListCommand Integration', () => {
9
- let command: AuthTokensListCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- auth: {
17
- listTokens: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new AuthTokensListCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should list tokens successfully', async () => {
28
- mockClient.auth.listTokens.mockResolvedValue({
29
- tokens: [
30
- { name: 'Token 1', tokenPrefix: 'abc', expiresAt: null }
31
- ]
32
- });
33
-
34
- await command.run();
35
-
36
- expect(mockClient.auth.listTokens).toHaveBeenCalled();
37
- expect(command.info).toHaveBeenCalledWith('Your API Tokens:');
38
- });
39
-
40
- it('should handle list failure', async () => {
41
- mockClient.auth.listTokens.mockRejectedValue(new Error('Network error'));
42
-
43
- await command.run();
44
-
45
- expect(command.error).toHaveBeenCalledWith('Failed to list tokens: Network error');
46
- });
47
- });
@@ -1,43 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import AuthTokensRevokeCommand from '../../../../src/commands/token/revoke.js';
4
- import { getClient } from '../../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../../src/utils/nexical-client.js');
7
-
8
- describe('AuthTokensRevokeCommand Integration', () => {
9
- let command: AuthTokensRevokeCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- auth: {
17
- revokeToken: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new AuthTokensRevokeCommand([], {} as any);
23
- vi.spyOn(command, 'success').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should revoke token successfully', async () => {
28
- mockClient.auth.revokeToken.mockResolvedValue({});
29
-
30
- await command.run({ id: '1' });
31
-
32
- expect(mockClient.auth.revokeToken).toHaveBeenCalledWith(1);
33
- expect(command.success).toHaveBeenCalledWith('Token 1 revoked.');
34
- });
35
-
36
- it('should handle revocation failure', async () => {
37
- mockClient.auth.revokeToken.mockRejectedValue(new Error('Not found'));
38
-
39
- await command.run({ id: '1' });
40
-
41
- expect(command.error).toHaveBeenCalledWith('Failed to revoke token: Not found');
42
- });
43
- });
@@ -1,49 +0,0 @@
1
-
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import WhoamiCommand from '../../../src/commands/whoami.js';
4
- import { getClient } from '../../../src/utils/nexical-client.js';
5
-
6
- vi.mock('../../../src/utils/nexical-client.js');
7
-
8
- describe('WhoamiCommand Integration', () => {
9
- let command: WhoamiCommand;
10
- let mockClient: any;
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
-
15
- mockClient = {
16
- users: {
17
- me: vi.fn(),
18
- },
19
- };
20
- vi.mocked(getClient).mockReturnValue(mockClient);
21
-
22
- command = new WhoamiCommand([], {} as any);
23
- vi.spyOn(command, 'info').mockImplementation(() => { });
24
- vi.spyOn(command, 'error').mockImplementation(() => { });
25
- });
26
-
27
- it('should display user info when logged in', async () => {
28
- mockClient.users.me.mockResolvedValue({
29
- fullName: 'Integration User',
30
- email: 'int@example.com',
31
- id: 'user-int'
32
- });
33
-
34
- await command.run();
35
-
36
- expect(command.info).toHaveBeenCalledWith('Logged in as:');
37
- expect(command.info).toHaveBeenCalledWith(' Name: Integration User');
38
- expect(command.info).toHaveBeenCalledWith(' Email: int@example.com');
39
- expect(command.info).toHaveBeenCalledWith(' ID: user-int');
40
- });
41
-
42
- it('should display error when not logged in', async () => {
43
- mockClient.users.me.mockRejectedValue(new Error('Unauthorized'));
44
-
45
- await command.run();
46
-
47
- expect(command.error).toHaveBeenCalledWith('Not logged in or token expired. Run `astrical login`.');
48
- });
49
- });