@nexical/cli 0.1.7 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/deploy.yml +3 -3
- package/GEMINI.md +193 -0
- package/README.md +317 -104
- package/dist/chunk-JYASTIIW.js +42 -0
- package/dist/chunk-JYASTIIW.js.map +1 -0
- package/dist/chunk-LZ3YQWAR.js +2204 -0
- package/dist/chunk-LZ3YQWAR.js.map +1 -0
- package/dist/chunk-OKXOCNXP.js +105 -0
- package/dist/chunk-OKXOCNXP.js.map +1 -0
- package/dist/chunk-OYFWMYPG.js +52 -0
- package/dist/chunk-OYFWMYPG.js.map +1 -0
- package/dist/chunk-WKERTCM6.js +74 -0
- package/dist/chunk-WKERTCM6.js.map +1 -0
- package/dist/index.js +32 -5
- package/dist/index.js.map +1 -1
- package/dist/src/commands/init.d.ts +11 -0
- package/dist/src/commands/init.js +89 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/module/add.d.ts +14 -0
- package/dist/src/commands/module/add.js +136 -0
- package/dist/src/commands/module/add.js.map +1 -0
- package/dist/src/commands/module/list.d.ts +10 -0
- package/dist/src/commands/module/list.js +73 -0
- package/dist/src/commands/module/list.js.map +1 -0
- package/dist/src/commands/module/remove.d.ts +12 -0
- package/dist/src/commands/module/remove.js +71 -0
- package/dist/src/commands/module/remove.js.map +1 -0
- package/dist/src/commands/module/update.d.ts +11 -0
- package/dist/src/commands/module/update.js +52 -0
- package/dist/src/commands/module/update.js.map +1 -0
- package/dist/src/commands/run.d.ts +11 -0
- package/dist/src/commands/run.js +93 -0
- package/dist/src/commands/run.js.map +1 -0
- package/dist/src/commands/{login.d.ts → setup.d.ts} +2 -2
- package/dist/src/commands/setup.js +62 -0
- package/dist/src/commands/setup.js.map +1 -0
- package/dist/src/utils/discovery.d.ts +13 -0
- package/dist/src/utils/discovery.js +9 -0
- package/dist/src/utils/git.d.ts +16 -0
- package/dist/src/utils/git.js +29 -0
- package/dist/src/utils/git.js.map +1 -0
- package/dist/src/utils/url-resolver.d.ts +15 -0
- package/dist/src/utils/url-resolver.js +9 -0
- package/dist/src/utils/url-resolver.js.map +1 -0
- package/index.ts +29 -5
- package/package.json +32 -30
- package/src/commands/init.ts +86 -0
- package/src/commands/module/add.ts +169 -0
- package/src/commands/module/list.ts +69 -0
- package/src/commands/module/remove.ts +74 -0
- package/src/commands/module/update.ts +50 -0
- package/src/commands/run.ts +98 -0
- package/src/commands/setup.ts +74 -0
- package/src/utils/discovery.ts +134 -0
- package/src/utils/git.ts +65 -0
- package/src/utils/url-resolver.ts +57 -0
- package/test/e2e/lifecycle.e2e.test.ts +153 -0
- package/test/integration/commands/init.integration.test.ts +85 -0
- package/test/integration/commands/module.integration.test.ts +144 -0
- package/test/integration/commands/run.integration.test.ts +90 -0
- package/test/integration/utils/command-loading.integration.test.ts +80 -0
- package/test/unit/commands/init.test.ts +153 -0
- package/test/unit/commands/module/add.test.ts +262 -0
- package/test/unit/commands/module/list.test.ts +115 -0
- package/test/unit/commands/module/remove.test.ts +89 -0
- package/test/unit/commands/module/update.test.ts +91 -0
- package/test/unit/commands/run.test.ts +252 -0
- package/test/unit/commands/setup.test.ts +169 -0
- package/test/unit/utils/command-discovery.test.ts +176 -0
- package/test/unit/utils/git.test.ts +152 -0
- package/test/unit/utils/integration-helpers.test.ts +72 -0
- package/test/unit/utils/url-resolver.test.ts +39 -0
- package/test/utils/integration-helpers.ts +66 -0
- package/vitest.e2e.config.ts +0 -1
- package/dist/chunk-JDRAVUKK.js +0 -48
- package/dist/chunk-JDRAVUKK.js.map +0 -1
- package/dist/src/commands/admin/create-user.d.ts +0 -15
- package/dist/src/commands/admin/create-user.js +0 -49
- package/dist/src/commands/admin/create-user.js.map +0 -1
- package/dist/src/commands/branch/create.d.ts +0 -19
- package/dist/src/commands/branch/create.js +0 -59
- package/dist/src/commands/branch/create.js.map +0 -1
- package/dist/src/commands/branch/delete.d.ts +0 -15
- package/dist/src/commands/branch/delete.js +0 -50
- package/dist/src/commands/branch/delete.js.map +0 -1
- package/dist/src/commands/branch/get.d.ts +0 -15
- package/dist/src/commands/branch/get.js +0 -53
- package/dist/src/commands/branch/get.js.map +0 -1
- package/dist/src/commands/branch/list.d.ts +0 -15
- package/dist/src/commands/branch/list.js +0 -51
- package/dist/src/commands/branch/list.js.map +0 -1
- package/dist/src/commands/job/get.d.ts +0 -15
- package/dist/src/commands/job/get.js +0 -62
- package/dist/src/commands/job/get.js.map +0 -1
- package/dist/src/commands/job/list.d.ts +0 -15
- package/dist/src/commands/job/list.js +0 -57
- package/dist/src/commands/job/list.js.map +0 -1
- package/dist/src/commands/job/logs.d.ts +0 -15
- package/dist/src/commands/job/logs.js +0 -67
- package/dist/src/commands/job/logs.js.map +0 -1
- package/dist/src/commands/job/trigger.d.ts +0 -19
- package/dist/src/commands/job/trigger.js +0 -74
- package/dist/src/commands/job/trigger.js.map +0 -1
- package/dist/src/commands/login.js +0 -31
- package/dist/src/commands/login.js.map +0 -1
- package/dist/src/commands/project/create.d.ts +0 -24
- package/dist/src/commands/project/create.js +0 -63
- package/dist/src/commands/project/create.js.map +0 -1
- package/dist/src/commands/project/delete.d.ts +0 -20
- package/dist/src/commands/project/delete.js +0 -58
- package/dist/src/commands/project/delete.js.map +0 -1
- package/dist/src/commands/project/get.d.ts +0 -15
- package/dist/src/commands/project/get.js +0 -49
- package/dist/src/commands/project/get.js.map +0 -1
- package/dist/src/commands/project/list.d.ts +0 -15
- package/dist/src/commands/project/list.js +0 -45
- package/dist/src/commands/project/list.js.map +0 -1
- package/dist/src/commands/project/update.d.ts +0 -19
- package/dist/src/commands/project/update.js +0 -66
- package/dist/src/commands/project/update.js.map +0 -1
- package/dist/src/commands/team/create.d.ts +0 -19
- package/dist/src/commands/team/create.js +0 -45
- package/dist/src/commands/team/create.js.map +0 -1
- package/dist/src/commands/team/delete.d.ts +0 -20
- package/dist/src/commands/team/delete.js +0 -52
- package/dist/src/commands/team/delete.js.map +0 -1
- package/dist/src/commands/team/get.d.ts +0 -15
- package/dist/src/commands/team/get.js +0 -42
- package/dist/src/commands/team/get.js.map +0 -1
- package/dist/src/commands/team/list.d.ts +0 -8
- package/dist/src/commands/team/list.js +0 -30
- package/dist/src/commands/team/list.js.map +0 -1
- package/dist/src/commands/team/member/invite.d.ts +0 -20
- package/dist/src/commands/team/member/invite.js +0 -54
- package/dist/src/commands/team/member/invite.js.map +0 -1
- package/dist/src/commands/team/member/remove.d.ts +0 -15
- package/dist/src/commands/team/member/remove.js +0 -43
- package/dist/src/commands/team/member/remove.js.map +0 -1
- package/dist/src/commands/team/update.d.ts +0 -19
- package/dist/src/commands/team/update.js +0 -55
- package/dist/src/commands/team/update.js.map +0 -1
- package/dist/src/commands/token/generate.d.ts +0 -19
- package/dist/src/commands/token/generate.js +0 -48
- package/dist/src/commands/token/generate.js.map +0 -1
- package/dist/src/commands/token/list.d.ts +0 -8
- package/dist/src/commands/token/list.js +0 -31
- package/dist/src/commands/token/list.js.map +0 -1
- package/dist/src/commands/token/revoke.d.ts +0 -15
- package/dist/src/commands/token/revoke.js +0 -38
- package/dist/src/commands/token/revoke.js.map +0 -1
- package/dist/src/commands/whoami.d.ts +0 -8
- package/dist/src/commands/whoami.js +0 -26
- package/dist/src/commands/whoami.js.map +0 -1
- package/dist/src/utils/nexical-client.d.ts +0 -10
- package/dist/src/utils/nexical-client.js +0 -12
- package/src/commands/admin/create-user.ts +0 -46
- package/src/commands/branch/create.ts +0 -57
- package/src/commands/branch/delete.ts +0 -47
- package/src/commands/branch/get.ts +0 -50
- package/src/commands/branch/list.ts +0 -50
- package/src/commands/job/get.ts +0 -59
- package/src/commands/job/list.ts +0 -56
- package/src/commands/job/logs.ts +0 -67
- package/src/commands/job/trigger.ts +0 -73
- package/src/commands/login.ts +0 -31
- package/src/commands/project/create.ts +0 -61
- package/src/commands/project/delete.ts +0 -56
- package/src/commands/project/get.ts +0 -46
- package/src/commands/project/list.ts +0 -44
- package/src/commands/project/update.ts +0 -63
- package/src/commands/team/create.ts +0 -43
- package/src/commands/team/delete.ts +0 -50
- package/src/commands/team/get.ts +0 -39
- package/src/commands/team/list.ts +0 -26
- package/src/commands/team/member/invite.ts +0 -56
- package/src/commands/team/member/remove.ts +0 -40
- package/src/commands/team/update.ts +0 -53
- package/src/commands/token/generate.ts +0 -45
- package/src/commands/token/list.ts +0 -27
- package/src/commands/token/revoke.ts +0 -35
- package/src/commands/whoami.ts +0 -21
- package/src/utils/nexical-client.ts +0 -47
- package/test/e2e/auth.e2e.test.ts +0 -46
- package/test/e2e/job-workflow.e2e.test.ts +0 -33
- package/test/e2e/project-lifecycle.e2e.test.ts +0 -48
- package/test/e2e/setup.ts +0 -237
- package/test/e2e/utils.ts +0 -33
- package/test/integration/commands/admin/create-user.test.ts +0 -51
- package/test/integration/commands/branch/create.test.ts +0 -51
- package/test/integration/commands/branch/delete.test.ts +0 -43
- package/test/integration/commands/branch/get.test.ts +0 -49
- package/test/integration/commands/branch/list.test.ts +0 -47
- package/test/integration/commands/job/get.test.ts +0 -54
- package/test/integration/commands/job/list.test.ts +0 -47
- package/test/integration/commands/job/logs.test.ts +0 -47
- package/test/integration/commands/job/trigger.test.ts +0 -57
- package/test/integration/commands/login.test.ts +0 -62
- package/test/integration/commands/project/create.test.ts +0 -53
- package/test/integration/commands/project/delete.test.ts +0 -43
- package/test/integration/commands/project/get.test.ts +0 -51
- package/test/integration/commands/project/list.test.ts +0 -47
- package/test/integration/commands/project/update.test.ts +0 -53
- package/test/integration/commands/team/create.test.ts +0 -53
- package/test/integration/commands/team/delete.test.ts +0 -43
- package/test/integration/commands/team/get.test.ts +0 -50
- package/test/integration/commands/team/list.test.ts +0 -47
- package/test/integration/commands/team/member/invite.test.ts +0 -46
- package/test/integration/commands/team/member/remove.test.ts +0 -43
- package/test/integration/commands/team/update.test.ts +0 -50
- package/test/integration/commands/token/generate.test.ts +0 -51
- package/test/integration/commands/token/list.test.ts +0 -47
- package/test/integration/commands/token/revoke.test.ts +0 -43
- package/test/integration/commands/whoami.test.ts +0 -49
- package/test/unit/commands/admin/create-user.test.ts +0 -51
- package/test/unit/commands/branch/create.test.ts +0 -57
- package/test/unit/commands/branch/delete.test.ts +0 -49
- package/test/unit/commands/branch/get.test.ts +0 -67
- package/test/unit/commands/branch/list.test.ts +0 -62
- package/test/unit/commands/job/get.test.ts +0 -76
- package/test/unit/commands/job/list.test.ts +0 -62
- package/test/unit/commands/job/logs.test.ts +0 -60
- package/test/unit/commands/job/trigger.test.ts +0 -75
- package/test/unit/commands/login.test.ts +0 -64
- package/test/unit/commands/project/create.test.ts +0 -64
- package/test/unit/commands/project/delete.test.ts +0 -72
- package/test/unit/commands/project/get.test.ts +0 -73
- package/test/unit/commands/project/list.test.ts +0 -62
- package/test/unit/commands/project/update.test.ts +0 -58
- package/test/unit/commands/team/create.test.ts +0 -68
- package/test/unit/commands/team/delete.test.ts +0 -71
- package/test/unit/commands/team/get.test.ts +0 -70
- package/test/unit/commands/team/list.test.ts +0 -56
- package/test/unit/commands/team/member/invite.test.ts +0 -52
- package/test/unit/commands/team/member/remove.test.ts +0 -49
- package/test/unit/commands/team/update.test.ts +0 -63
- package/test/unit/commands/token/generate.test.ts +0 -65
- package/test/unit/commands/token/list.test.ts +0 -58
- package/test/unit/commands/token/revoke.test.ts +0 -49
- package/test/unit/commands/whoami.test.ts +0 -49
- package/test/unit/utils/nexical-client.test.ts +0 -113
- /package/dist/src/utils/{nexical-client.js.map → discovery.js.map} +0 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { runCommand } from '@nexical/cli-core';
|
|
2
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
3
|
+
import * as git from '../../../src/utils/git.js';
|
|
4
|
+
|
|
5
|
+
const mocks = vi.hoisted(() => ({
|
|
6
|
+
exec: vi.fn(),
|
|
7
|
+
}));
|
|
8
|
+
|
|
9
|
+
vi.mock('@nexical/cli-core', async (importOriginal) => {
|
|
10
|
+
const mod = await importOriginal<typeof import('@nexical/cli-core')>();
|
|
11
|
+
return {
|
|
12
|
+
...mod,
|
|
13
|
+
runCommand: vi.fn(),
|
|
14
|
+
logger: { code: vi.fn(), debug: vi.fn() }
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
vi.mock('node:child_process', () => ({
|
|
19
|
+
exec: mocks.exec,
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
vi.mock('node:util', async () => {
|
|
23
|
+
const actual = await vi.importActual<any>('node:util');
|
|
24
|
+
return {
|
|
25
|
+
...actual,
|
|
26
|
+
promisify: (fn: Function) => {
|
|
27
|
+
return (...args: any[]) => new Promise((resolve, reject) => {
|
|
28
|
+
fn(...args, (err: Error | null, ...values: any[]) => {
|
|
29
|
+
if (err) return reject(err);
|
|
30
|
+
// Handle exec-like signature (stdout, stderr) -> { stdout, stderr }
|
|
31
|
+
// Simple heuristic: if values.length > 1, assume explicit mapping needed?
|
|
32
|
+
// Or just hardcode for our known usage (exec).
|
|
33
|
+
if (values.length >= 2) {
|
|
34
|
+
resolve({ stdout: values[0], stderr: values[1] });
|
|
35
|
+
} else {
|
|
36
|
+
resolve(values[0]);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
describe('git utils', () => {
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
vi.clearAllMocks();
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('should clone repository', async () => {
|
|
50
|
+
await git.clone('http://repo.git', 'dest', { recursive: true });
|
|
51
|
+
expect(runCommand).toHaveBeenCalledWith(
|
|
52
|
+
'git clone --recursive http://repo.git .',
|
|
53
|
+
'dest'
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should clone repository with depth', async () => {
|
|
58
|
+
await git.clone('http://repo.git', 'dest', { depth: 1 });
|
|
59
|
+
expect(runCommand).toHaveBeenCalledWith(
|
|
60
|
+
'git clone --depth 1 http://repo.git .',
|
|
61
|
+
'dest'
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('should update submodules', async () => {
|
|
66
|
+
await git.updateSubmodules('dest');
|
|
67
|
+
expect(runCommand).toHaveBeenCalledWith(
|
|
68
|
+
'git submodule foreach --recursive "git checkout main && git pull origin main"',
|
|
69
|
+
'dest'
|
|
70
|
+
);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('should checkout orphan branch', async () => {
|
|
74
|
+
await git.checkoutOrphan('branch', 'dest');
|
|
75
|
+
expect(runCommand).toHaveBeenCalledWith('git checkout --orphan branch', 'dest');
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('should get remote url', async () => {
|
|
79
|
+
// Mock exec to call the callback with success
|
|
80
|
+
mocks.exec.mockImplementation((((cmd: string, options: any, callback: any) => {
|
|
81
|
+
if (typeof options === 'function') {
|
|
82
|
+
callback = options;
|
|
83
|
+
options = {};
|
|
84
|
+
}
|
|
85
|
+
// callback(error, stdout, stderr)
|
|
86
|
+
callback(null, 'https://github.com/origin.git\n', '');
|
|
87
|
+
return {} as any; // exec returns a ChildProcess
|
|
88
|
+
}) as any));
|
|
89
|
+
|
|
90
|
+
const url = await git.getRemoteUrl('cwd');
|
|
91
|
+
expect(url).toBe('https://github.com/origin.git');
|
|
92
|
+
expect(mocks.exec).toHaveBeenCalledWith('git remote get-url origin', { cwd: 'cwd' }, expect.any(Function));
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('should return empty string on getRemoteUrl failure', async () => {
|
|
96
|
+
// Mock exec to call the callback with error
|
|
97
|
+
mocks.exec.mockImplementation((((cmd: string, options: any, callback: any) => {
|
|
98
|
+
if (typeof options === 'function') callback = options;
|
|
99
|
+
callback(new Error('fail'), '', '');
|
|
100
|
+
return {} as any;
|
|
101
|
+
}) as any));
|
|
102
|
+
|
|
103
|
+
const url = await git.getRemoteUrl('cwd');
|
|
104
|
+
expect(url).toBe('');
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('should add all files', async () => {
|
|
109
|
+
await git.addAll('cwd');
|
|
110
|
+
expect(runCommand).toHaveBeenCalledWith('git add -A', 'cwd');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('should commit', async () => {
|
|
114
|
+
await git.commit('msg', 'cwd');
|
|
115
|
+
expect(runCommand).toHaveBeenCalledWith('git commit -m "msg"', 'cwd');
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('should delete branch', async () => {
|
|
119
|
+
await git.deleteBranch('branch', 'cwd');
|
|
120
|
+
expect(runCommand).toHaveBeenCalledWith('git branch -D branch', 'cwd');
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('should rename branch', async () => {
|
|
124
|
+
await git.renameBranch('branch', 'cwd');
|
|
125
|
+
expect(runCommand).toHaveBeenCalledWith('git branch -m branch', 'cwd');
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('should remove remote', async () => {
|
|
129
|
+
await git.removeRemote('origin', 'cwd');
|
|
130
|
+
expect(runCommand).toHaveBeenCalledWith('git remote remove origin', 'cwd');
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('should check if branch exists', async () => {
|
|
134
|
+
// Mock success
|
|
135
|
+
mocks.exec.mockImplementation((((cmd: string, options: any, callback: any) => {
|
|
136
|
+
if (typeof options === 'function') callback = options;
|
|
137
|
+
callback(null, '', '');
|
|
138
|
+
return {} as any;
|
|
139
|
+
}) as any));
|
|
140
|
+
|
|
141
|
+
expect(await git.branchExists('branch', 'cwd')).toBe(true);
|
|
142
|
+
expect(mocks.exec).toHaveBeenCalledWith('git show-ref --verify --quiet refs/heads/branch', { cwd: 'cwd' }, expect.any(Function));
|
|
143
|
+
|
|
144
|
+
// Mock failure
|
|
145
|
+
mocks.exec.mockImplementation((((cmd: string, options: any, callback: any) => {
|
|
146
|
+
if (typeof options === 'function') callback = options;
|
|
147
|
+
callback(new Error('fail'), '', '');
|
|
148
|
+
return {} as any;
|
|
149
|
+
}) as any));
|
|
150
|
+
|
|
151
|
+
expect(await git.branchExists('branch', 'cwd')).toBe(false);
|
|
152
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import * as helpers from '../../utils/integration-helpers.js';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import { execa } from 'execa';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
|
|
7
|
+
vi.mock('fs-extra');
|
|
8
|
+
vi.mock('execa');
|
|
9
|
+
|
|
10
|
+
describe('Integration Helpers Unit', () => {
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
vi.clearAllMocks();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('runCLI should execute node with correct arguments', async () => {
|
|
16
|
+
vi.mocked(execa).mockResolvedValue({ exitCode: 0 } as any);
|
|
17
|
+
const args = ['init', 'my-project'];
|
|
18
|
+
const cwd = '/test/cwd';
|
|
19
|
+
const env = { FOO: 'bar' };
|
|
20
|
+
|
|
21
|
+
await helpers.runCLI(args, cwd, { env });
|
|
22
|
+
|
|
23
|
+
expect(execa).toHaveBeenCalledWith(
|
|
24
|
+
'node',
|
|
25
|
+
expect.arrayContaining([expect.stringContaining('dist/index.js'), ...args]),
|
|
26
|
+
expect.objectContaining({
|
|
27
|
+
cwd,
|
|
28
|
+
env: expect.objectContaining({ FOO: 'bar' }),
|
|
29
|
+
reject: false
|
|
30
|
+
})
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('createTempDir should create directory and return path', async () => {
|
|
35
|
+
vi.mocked(fs.ensureDir).mockResolvedValue(undefined);
|
|
36
|
+
|
|
37
|
+
const dir = await helpers.createTempDir('test-prefix-');
|
|
38
|
+
|
|
39
|
+
expect(dir).toContain('test-prefix-');
|
|
40
|
+
expect(fs.ensureDir).toHaveBeenCalledWith(dir);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('cleanupTestRoot should remove test root directory', async () => {
|
|
44
|
+
vi.mocked(fs.remove).mockResolvedValue(undefined);
|
|
45
|
+
|
|
46
|
+
await helpers.cleanupTestRoot();
|
|
47
|
+
|
|
48
|
+
expect(fs.remove).toHaveBeenCalledWith(expect.stringContaining('.test-tmp'));
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('createMockRepo should initialize git repo and commit files', async () => {
|
|
52
|
+
vi.mocked(fs.ensureDir).mockResolvedValue(undefined);
|
|
53
|
+
vi.mocked(fs.outputFile).mockResolvedValue(undefined);
|
|
54
|
+
vi.mocked(execa).mockResolvedValue({} as any);
|
|
55
|
+
|
|
56
|
+
const dir = '/test/repo';
|
|
57
|
+
const files = {
|
|
58
|
+
'package.json': '{}',
|
|
59
|
+
'README.md': '# Test'
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
await helpers.createMockRepo(dir, files);
|
|
63
|
+
|
|
64
|
+
expect(fs.ensureDir).toHaveBeenCalledWith(dir);
|
|
65
|
+
expect(execa).toHaveBeenCalledWith('git', ['init'], expect.objectContaining({ cwd: dir }));
|
|
66
|
+
expect(execa).toHaveBeenCalledWith('git', ['config', 'user.email', 'test@test.com'], expect.objectContaining({ cwd: dir }));
|
|
67
|
+
expect(fs.outputFile).toHaveBeenCalledWith(path.join(dir, 'package.json'), '{}');
|
|
68
|
+
expect(fs.outputFile).toHaveBeenCalledWith(path.join(dir, 'README.md'), '# Test');
|
|
69
|
+
expect(execa).toHaveBeenCalledWith('git', ['add', '.'], expect.objectContaining({ cwd: dir }));
|
|
70
|
+
expect(execa).toHaveBeenCalledWith('git', ['commit', '-m', 'Initial commit'], expect.objectContaining({ cwd: dir }));
|
|
71
|
+
});
|
|
72
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { resolveGitUrl } from '../../../src/utils/url-resolver';
|
|
3
|
+
|
|
4
|
+
describe('resolveGitUrl', () => {
|
|
5
|
+
it('should expand gh@ shorthand correctly', () => {
|
|
6
|
+
expect(resolveGitUrl('gh@nexical-cms/starter')).toBe('https://github.com/nexical-cms/starter.git');
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
it('should expand gh@ shorthand with subpath correctly', () => {
|
|
10
|
+
expect(resolveGitUrl('gh@nexical-cms/starter//path/to/module')).toBe('https://github.com/nexical-cms/starter.git//path/to/module');
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('should add .git extension to standard URLs if missing', () => {
|
|
14
|
+
expect(resolveGitUrl('https://github.com/nexical-cms/starter')).toBe('https://github.com/nexical-cms/starter.git');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('should preserve .git extension if already present', () => {
|
|
18
|
+
expect(resolveGitUrl('https://github.com/nexical-cms/starter.git')).toBe('https://github.com/nexical-cms/starter.git');
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('should handle standard URLs with subpath correctly', () => {
|
|
22
|
+
expect(resolveGitUrl('https://github.com/nexical-cms/starter//path/to/dir')).toBe('https://github.com/nexical-cms/starter.git//path/to/dir');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('should handle standard URLs with .git and subpath correctly', () => {
|
|
26
|
+
expect(resolveGitUrl('https://github.com/nexical-cms/starter.git//path/to/dir')).toBe('https://github.com/nexical-cms/starter.git//path/to/dir');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should throw error for empty url', () => {
|
|
30
|
+
expect(() => resolveGitUrl('')).toThrow('URL cannot be empty');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should not append .git to local paths', () => {
|
|
34
|
+
expect(resolveGitUrl('/tmp/local/repo')).toBe('/tmp/local/repo');
|
|
35
|
+
expect(resolveGitUrl('./local/repo')).toBe('./local/repo');
|
|
36
|
+
expect(resolveGitUrl('../local/repo')).toBe('../local/repo');
|
|
37
|
+
expect(resolveGitUrl('file:///tmp/repo')).toBe('file:///tmp/repo');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { execa } from 'execa';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
|
|
6
|
+
// Constants
|
|
7
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
export const TEST_ROOT = path.resolve(__dirname, '../../.test-tmp');
|
|
9
|
+
export const CLI_BIN = path.resolve(__dirname, '../../dist/index.js');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Runs the CLI command against the compiled binary (E2E style)
|
|
13
|
+
*/
|
|
14
|
+
export async function runCLI(args: string[], cwd: string, options: any = {}) {
|
|
15
|
+
return execa('node', [CLI_BIN, ...args], {
|
|
16
|
+
cwd,
|
|
17
|
+
...options,
|
|
18
|
+
env: {
|
|
19
|
+
...process.env,
|
|
20
|
+
...options.env
|
|
21
|
+
},
|
|
22
|
+
reject: false // Allow checking exit code in tests
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Creates a temporary directory for testing.
|
|
28
|
+
* @returns The absolute path to the temporary directory.
|
|
29
|
+
*/
|
|
30
|
+
export async function createTempDir(prefix = 'test-'): Promise<string> {
|
|
31
|
+
const dir = path.join(TEST_ROOT, `${prefix}${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
32
|
+
await fs.ensureDir(dir);
|
|
33
|
+
return dir;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Cleans up the temporary test root.
|
|
38
|
+
*/
|
|
39
|
+
export async function cleanupTestRoot(): Promise<void> {
|
|
40
|
+
await fs.remove(TEST_ROOT);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Creates a mock git repository at the specified path.
|
|
45
|
+
* This is useful for testing commands that clone from a remote.
|
|
46
|
+
*/
|
|
47
|
+
export async function createMockRepo(dir: string, initialFiles: Record<string, string> = {}): Promise<string> {
|
|
48
|
+
await fs.ensureDir(dir);
|
|
49
|
+
|
|
50
|
+
// Initialize bare repo? No, usually we want a regular repo then commit,
|
|
51
|
+
// but if we want to clone FROM it locally, it acts as a remote.
|
|
52
|
+
// Let's make it a regular repo.
|
|
53
|
+
await execa('git', ['init'], { cwd: dir });
|
|
54
|
+
await execa('git', ['config', 'user.email', 'test@test.com'], { cwd: dir });
|
|
55
|
+
await execa('git', ['config', 'user.name', 'Test User'], { cwd: dir });
|
|
56
|
+
|
|
57
|
+
// Write initial files
|
|
58
|
+
for (const [filename, content] of Object.entries(initialFiles)) {
|
|
59
|
+
await fs.outputFile(path.join(dir, filename), content);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
await execa('git', ['add', '.'], { cwd: dir });
|
|
63
|
+
await execa('git', ['commit', '-m', 'Initial commit'], { cwd: dir });
|
|
64
|
+
|
|
65
|
+
return dir;
|
|
66
|
+
}
|
package/vitest.e2e.config.ts
CHANGED
package/dist/chunk-JDRAVUKK.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { createRequire } from "module"; const require = createRequire(import.meta.url);
|
|
2
|
-
|
|
3
|
-
// src/utils/nexical-client.ts
|
|
4
|
-
import { NexicalClient } from "@nexical/sdk";
|
|
5
|
-
import fs from "fs";
|
|
6
|
-
import path from "path";
|
|
7
|
-
import os from "os";
|
|
8
|
-
var getConfigPaths = () => {
|
|
9
|
-
const HOME = process.env.HOME || os.homedir();
|
|
10
|
-
const CONFIG_DIR = path.join(HOME, ".nexical");
|
|
11
|
-
const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
|
|
12
|
-
return { CONFIG_DIR, CONFIG_FILE };
|
|
13
|
-
};
|
|
14
|
-
function getConfig() {
|
|
15
|
-
const { CONFIG_FILE } = getConfigPaths();
|
|
16
|
-
if (!fs.existsSync(CONFIG_FILE)) {
|
|
17
|
-
return {};
|
|
18
|
-
}
|
|
19
|
-
try {
|
|
20
|
-
const content = fs.readFileSync(CONFIG_FILE, "utf-8");
|
|
21
|
-
return JSON.parse(content);
|
|
22
|
-
} catch (error) {
|
|
23
|
-
return {};
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
function saveToken(token) {
|
|
27
|
-
const { CONFIG_DIR, CONFIG_FILE } = getConfigPaths();
|
|
28
|
-
if (!fs.existsSync(CONFIG_DIR)) {
|
|
29
|
-
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
30
|
-
}
|
|
31
|
-
const config = getConfig();
|
|
32
|
-
config.token = token;
|
|
33
|
-
fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
34
|
-
}
|
|
35
|
-
function getClient() {
|
|
36
|
-
const config = getConfig();
|
|
37
|
-
return new NexicalClient({
|
|
38
|
-
token: config.token,
|
|
39
|
-
baseURL: process.env.NEXICAL_API_URL
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export {
|
|
44
|
-
getConfig,
|
|
45
|
-
saveToken,
|
|
46
|
-
getClient
|
|
47
|
-
};
|
|
48
|
-
//# sourceMappingURL=chunk-JDRAVUKK.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/nexical-client.ts"],"sourcesContent":["\nimport { NexicalClient } from '@nexical/sdk';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nconst getConfigPaths = () => {\n const HOME = process.env.HOME || os.homedir();\n const CONFIG_DIR = path.join(HOME, '.nexical');\n const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\n return { CONFIG_DIR, CONFIG_FILE };\n};\n\ninterface Config {\n token?: string;\n}\n\nexport function getConfig(): Config {\n const { CONFIG_FILE } = getConfigPaths();\n if (!fs.existsSync(CONFIG_FILE)) {\n return {};\n }\n try {\n const content = fs.readFileSync(CONFIG_FILE, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n return {};\n }\n}\n\nexport function saveToken(token: string) {\n const { CONFIG_DIR, CONFIG_FILE } = getConfigPaths();\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n }\n const config = getConfig();\n config.token = token;\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));\n}\n\nexport function getClient(): NexicalClient {\n const config = getConfig();\n return new NexicalClient({\n token: config.token,\n baseURL: process.env.NEXICAL_API_URL,\n });\n}\n"],"mappings":";;;AACA,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AAEf,IAAM,iBAAiB,MAAM;AACzB,QAAM,OAAO,QAAQ,IAAI,QAAQ,GAAG,QAAQ;AAC5C,QAAM,aAAa,KAAK,KAAK,MAAM,UAAU;AAC7C,QAAM,cAAc,KAAK,KAAK,YAAY,aAAa;AACvD,SAAO,EAAE,YAAY,YAAY;AACrC;AAMO,SAAS,YAAoB;AAChC,QAAM,EAAE,YAAY,IAAI,eAAe;AACvC,MAAI,CAAC,GAAG,WAAW,WAAW,GAAG;AAC7B,WAAO,CAAC;AAAA,EACZ;AACA,MAAI;AACA,UAAM,UAAU,GAAG,aAAa,aAAa,OAAO;AACpD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC7B,SAAS,OAAO;AACZ,WAAO,CAAC;AAAA,EACZ;AACJ;AAEO,SAAS,UAAU,OAAe;AACrC,QAAM,EAAE,YAAY,YAAY,IAAI,eAAe;AACnD,MAAI,CAAC,GAAG,WAAW,UAAU,GAAG;AAC5B,OAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAChD;AACA,QAAM,SAAS,UAAU;AACzB,SAAO,QAAQ;AACf,KAAG,cAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AACjE;AAEO,SAAS,YAA2B;AACvC,QAAM,SAAS,UAAU;AACzB,SAAO,IAAI,cAAc;AAAA,IACrB,OAAO,OAAO;AAAA,IACd,SAAS,QAAQ,IAAI;AAAA,EACzB,CAAC;AACL;","names":[]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
2
|
-
|
|
3
|
-
declare class AdminUsersCreateSystemCommand extends BaseCommand {
|
|
4
|
-
static description: string;
|
|
5
|
-
static args: {
|
|
6
|
-
args: {
|
|
7
|
-
name: string;
|
|
8
|
-
required: boolean;
|
|
9
|
-
description: string;
|
|
10
|
-
}[];
|
|
11
|
-
};
|
|
12
|
-
run(options: any): Promise<void>;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export { AdminUsersCreateSystemCommand as default };
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { createRequire } from "module"; const require = createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
getClient
|
|
4
|
-
} from "../../../chunk-JDRAVUKK.js";
|
|
5
|
-
|
|
6
|
-
// src/commands/admin/create-user.ts
|
|
7
|
-
import { BaseCommand } from "@nexical/cli-core";
|
|
8
|
-
var AdminUsersCreateSystemCommand = class extends BaseCommand {
|
|
9
|
-
static description = "Create a new system user";
|
|
10
|
-
static args = {
|
|
11
|
-
args: [
|
|
12
|
-
{
|
|
13
|
-
name: "name",
|
|
14
|
-
required: true,
|
|
15
|
-
description: "System user name"
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
name: "email",
|
|
19
|
-
required: true,
|
|
20
|
-
description: "System user email"
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
name: "password",
|
|
24
|
-
required: true,
|
|
25
|
-
description: "System user password"
|
|
26
|
-
}
|
|
27
|
-
]
|
|
28
|
-
};
|
|
29
|
-
async run(options) {
|
|
30
|
-
const client = getClient();
|
|
31
|
-
const { name, email, password } = options;
|
|
32
|
-
try {
|
|
33
|
-
const response = await client.auth.createSystemUser({
|
|
34
|
-
fullName: name,
|
|
35
|
-
email,
|
|
36
|
-
password
|
|
37
|
-
});
|
|
38
|
-
const user = response.user;
|
|
39
|
-
this.success(`System user "${user.fullName}" created!`);
|
|
40
|
-
this.info(`ID: ${user.id}`);
|
|
41
|
-
} catch (error) {
|
|
42
|
-
this.error(`Failed to create system user: ${error.message}`);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
export {
|
|
47
|
-
AdminUsersCreateSystemCommand as default
|
|
48
|
-
};
|
|
49
|
-
//# sourceMappingURL=create-user.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/admin/create-user.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../../utils/nexical-client.js';\n\nexport default class AdminUsersCreateSystemCommand extends BaseCommand {\n static description = 'Create a new system user';\n\n static args = {\n args: [\n {\n name: 'name',\n required: true,\n description: 'System user name',\n },\n {\n name: 'email',\n required: true,\n description: 'System user email',\n },\n {\n name: 'password',\n required: true,\n description: 'System user password',\n },\n ],\n };\n\n async run(options: any) {\n const client = getClient();\n const { name, email, password } = options;\n\n try {\n const response = await client.auth.createSystemUser({\n fullName: name,\n email,\n password,\n });\n const user = response.user;\n\n this.success(`System user \"${user.fullName}\" created!`);\n this.info(`ID: ${user.id}`);\n } catch (error: any) {\n this.error(`Failed to create system user: ${error.message}`);\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,gCAArB,cAA2D,YAAY;AAAA,EACnE,OAAO,cAAc;AAAA,EAErB,OAAO,OAAO;AAAA,IACV,MAAM;AAAA,MACF;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,IAAI,SAAc;AACpB,UAAM,SAAS,UAAU;AACzB,UAAM,EAAE,MAAM,OAAO,SAAS,IAAI;AAElC,QAAI;AACA,YAAM,WAAW,MAAM,OAAO,KAAK,iBAAiB;AAAA,QAChD,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MACJ,CAAC;AACD,YAAM,OAAO,SAAS;AAEtB,WAAK,QAAQ,gBAAgB,KAAK,QAAQ,YAAY;AACtD,WAAK,KAAK,OAAO,KAAK,EAAE,EAAE;AAAA,IAC9B,SAAS,OAAY;AACjB,WAAK,MAAM,iCAAiC,MAAM,OAAO,EAAE;AAAA,IAC/D;AAAA,EACJ;AACJ;","names":[]}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
2
|
-
|
|
3
|
-
declare class BranchesCreateCommand extends BaseCommand {
|
|
4
|
-
static description: string;
|
|
5
|
-
static args: {
|
|
6
|
-
args: {
|
|
7
|
-
name: string;
|
|
8
|
-
required: boolean;
|
|
9
|
-
description: string;
|
|
10
|
-
}[];
|
|
11
|
-
options: {
|
|
12
|
-
name: string;
|
|
13
|
-
description: string;
|
|
14
|
-
}[];
|
|
15
|
-
};
|
|
16
|
-
run(options: any): Promise<void>;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export { BranchesCreateCommand as default };
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { createRequire } from "module"; const require = createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
getClient
|
|
4
|
-
} from "../../../chunk-JDRAVUKK.js";
|
|
5
|
-
|
|
6
|
-
// src/commands/branch/create.ts
|
|
7
|
-
import { BaseCommand } from "@nexical/cli-core";
|
|
8
|
-
var BranchesCreateCommand = class extends BaseCommand {
|
|
9
|
-
static description = "Create a new branch";
|
|
10
|
-
static args = {
|
|
11
|
-
args: [
|
|
12
|
-
{
|
|
13
|
-
name: "teamId",
|
|
14
|
-
required: true,
|
|
15
|
-
description: "Team ID"
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
name: "projectId",
|
|
19
|
-
required: true,
|
|
20
|
-
description: "Project ID"
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
name: "name",
|
|
24
|
-
required: true,
|
|
25
|
-
description: "Name of the branch"
|
|
26
|
-
}
|
|
27
|
-
],
|
|
28
|
-
options: [
|
|
29
|
-
{
|
|
30
|
-
name: "--preview <url>",
|
|
31
|
-
description: "Preview URL"
|
|
32
|
-
}
|
|
33
|
-
]
|
|
34
|
-
};
|
|
35
|
-
async run(options) {
|
|
36
|
-
const client = getClient();
|
|
37
|
-
const { teamId, projectId, name, preview } = options;
|
|
38
|
-
const tid = parseInt(teamId, 10);
|
|
39
|
-
const pid = parseInt(projectId, 10);
|
|
40
|
-
if (isNaN(tid) || isNaN(pid)) {
|
|
41
|
-
this.error("IDs must be numbers.");
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
try {
|
|
45
|
-
const branch = await client.branches.create(tid, pid, {
|
|
46
|
-
name,
|
|
47
|
-
previewUrl: preview
|
|
48
|
-
});
|
|
49
|
-
this.success(`Branch "${branch.name}" created!`);
|
|
50
|
-
this.info(`ID: ${branch.id}`);
|
|
51
|
-
} catch (error) {
|
|
52
|
-
this.error(`Failed to create branch: ${error.message}`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
export {
|
|
57
|
-
BranchesCreateCommand as default
|
|
58
|
-
};
|
|
59
|
-
//# sourceMappingURL=create.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/branch/create.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../../utils/nexical-client.js';\n\nexport default class BranchesCreateCommand extends BaseCommand {\n static description = 'Create a new branch';\n\n static args = {\n args: [\n {\n name: 'teamId',\n required: true,\n description: 'Team ID',\n },\n {\n name: 'projectId',\n required: true,\n description: 'Project ID',\n },\n {\n name: 'name',\n required: true,\n description: 'Name of the branch',\n },\n ],\n options: [\n {\n name: '--preview <url>',\n description: 'Preview URL',\n },\n ],\n };\n\n async run(options: any) {\n const client = getClient();\n const { teamId, projectId, name, preview } = options;\n const tid = parseInt(teamId, 10);\n const pid = parseInt(projectId, 10);\n\n if (isNaN(tid) || isNaN(pid)) {\n this.error('IDs must be numbers.');\n return;\n }\n\n try {\n const branch = await client.branches.create(tid, pid, {\n name,\n previewUrl: preview,\n });\n\n this.success(`Branch \"${branch.name}\" created!`);\n this.info(`ID: ${branch.id}`);\n } catch (error: any) {\n this.error(`Failed to create branch: ${error.message}`);\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,wBAArB,cAAmD,YAAY;AAAA,EAC3D,OAAO,cAAc;AAAA,EAErB,OAAO,OAAO;AAAA,IACV,MAAM;AAAA,MACF;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,MACL;AAAA,QACI,MAAM;AAAA,QACN,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,IAAI,SAAc;AACpB,UAAM,SAAS,UAAU;AACzB,UAAM,EAAE,QAAQ,WAAW,MAAM,QAAQ,IAAI;AAC7C,UAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,UAAM,MAAM,SAAS,WAAW,EAAE;AAElC,QAAI,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG;AAC1B,WAAK,MAAM,sBAAsB;AACjC;AAAA,IACJ;AAEA,QAAI;AACA,YAAM,SAAS,MAAM,OAAO,SAAS,OAAO,KAAK,KAAK;AAAA,QAClD;AAAA,QACA,YAAY;AAAA,MAChB,CAAC;AAED,WAAK,QAAQ,WAAW,OAAO,IAAI,YAAY;AAC/C,WAAK,KAAK,OAAO,OAAO,EAAE,EAAE;AAAA,IAChC,SAAS,OAAY;AACjB,WAAK,MAAM,4BAA4B,MAAM,OAAO,EAAE;AAAA,IAC1D;AAAA,EACJ;AACJ;","names":[]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
2
|
-
|
|
3
|
-
declare class BranchesDeleteCommand extends BaseCommand {
|
|
4
|
-
static description: string;
|
|
5
|
-
static args: {
|
|
6
|
-
args: {
|
|
7
|
-
name: string;
|
|
8
|
-
required: boolean;
|
|
9
|
-
description: string;
|
|
10
|
-
}[];
|
|
11
|
-
};
|
|
12
|
-
run(options: any): Promise<void>;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export { BranchesDeleteCommand as default };
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { createRequire } from "module"; const require = createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
getClient
|
|
4
|
-
} from "../../../chunk-JDRAVUKK.js";
|
|
5
|
-
|
|
6
|
-
// src/commands/branch/delete.ts
|
|
7
|
-
import { BaseCommand } from "@nexical/cli-core";
|
|
8
|
-
var BranchesDeleteCommand = class extends BaseCommand {
|
|
9
|
-
static description = "Delete a branch";
|
|
10
|
-
static args = {
|
|
11
|
-
args: [
|
|
12
|
-
{
|
|
13
|
-
name: "teamId",
|
|
14
|
-
required: true,
|
|
15
|
-
description: "Team ID"
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
name: "projectId",
|
|
19
|
-
required: true,
|
|
20
|
-
description: "Project ID"
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
name: "branchId",
|
|
24
|
-
required: true,
|
|
25
|
-
description: "Branch ID"
|
|
26
|
-
}
|
|
27
|
-
]
|
|
28
|
-
};
|
|
29
|
-
async run(options) {
|
|
30
|
-
const client = getClient();
|
|
31
|
-
const { teamId, projectId, branchId } = options;
|
|
32
|
-
const tid = parseInt(teamId, 10);
|
|
33
|
-
const pid = parseInt(projectId, 10);
|
|
34
|
-
const bid = parseInt(branchId, 10);
|
|
35
|
-
if (isNaN(tid) || isNaN(pid) || isNaN(bid)) {
|
|
36
|
-
this.error("IDs must be numbers.");
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
await client.branches.delete(tid, pid, bid);
|
|
41
|
-
this.success(`Branch ${bid} deleted.`);
|
|
42
|
-
} catch (error) {
|
|
43
|
-
this.error(`Failed to delete branch: ${error.message}`);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
export {
|
|
48
|
-
BranchesDeleteCommand as default
|
|
49
|
-
};
|
|
50
|
-
//# sourceMappingURL=delete.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/branch/delete.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../../utils/nexical-client.js';\n\nexport default class BranchesDeleteCommand extends BaseCommand {\n static description = 'Delete a branch';\n\n static args = {\n args: [\n {\n name: 'teamId',\n required: true,\n description: 'Team ID',\n },\n {\n name: 'projectId',\n required: true,\n description: 'Project ID',\n },\n {\n name: 'branchId',\n required: true,\n description: 'Branch ID',\n },\n ],\n };\n\n async run(options: any) {\n const client = getClient();\n const { teamId, projectId, branchId } = options;\n const tid = parseInt(teamId, 10);\n const pid = parseInt(projectId, 10);\n const bid = parseInt(branchId, 10);\n\n if (isNaN(tid) || isNaN(pid) || isNaN(bid)) {\n this.error('IDs must be numbers.');\n return;\n }\n\n try {\n await client.branches.delete(tid, pid, bid);\n this.success(`Branch ${bid} deleted.`);\n } catch (error: any) {\n this.error(`Failed to delete branch: ${error.message}`);\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,wBAArB,cAAmD,YAAY;AAAA,EAC3D,OAAO,cAAc;AAAA,EAErB,OAAO,OAAO;AAAA,IACV,MAAM;AAAA,MACF;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,IAAI,SAAc;AACpB,UAAM,SAAS,UAAU;AACzB,UAAM,EAAE,QAAQ,WAAW,SAAS,IAAI;AACxC,UAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,UAAM,MAAM,SAAS,WAAW,EAAE;AAClC,UAAM,MAAM,SAAS,UAAU,EAAE;AAEjC,QAAI,MAAM,GAAG,KAAK,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG;AACxC,WAAK,MAAM,sBAAsB;AACjC;AAAA,IACJ;AAEA,QAAI;AACA,YAAM,OAAO,SAAS,OAAO,KAAK,KAAK,GAAG;AAC1C,WAAK,QAAQ,UAAU,GAAG,WAAW;AAAA,IACzC,SAAS,OAAY;AACjB,WAAK,MAAM,4BAA4B,MAAM,OAAO,EAAE;AAAA,IAC1D;AAAA,EACJ;AACJ;","names":[]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
2
|
-
|
|
3
|
-
declare class BranchesGetCommand extends BaseCommand {
|
|
4
|
-
static description: string;
|
|
5
|
-
static args: {
|
|
6
|
-
args: {
|
|
7
|
-
name: string;
|
|
8
|
-
required: boolean;
|
|
9
|
-
description: string;
|
|
10
|
-
}[];
|
|
11
|
-
};
|
|
12
|
-
run(options: any): Promise<void>;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export { BranchesGetCommand as default };
|