@reximo/cli 0.1.0-alpha.1 → 0.1.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -5
- package/package.json +5 -3
- package/src/client/generated/index.d.ts +1 -0
- package/src/client/generated/index.js +7 -0
- package/src/client/generated/index.js.map +1 -0
- package/src/client/generated/reximo-api-client.generated.d.ts +118 -0
- package/src/client/generated/reximo-api-client.generated.js +136 -0
- package/src/client/generated/reximo-api-client.generated.js.map +1 -0
- package/src/client/reximo-client.d.ts +36 -1
- package/src/client/reximo-client.js +108 -1
- package/src/client/reximo-client.js.map +1 -1
- package/src/index.d.ts +1 -1
- package/src/index.js +3 -1
- package/src/index.js.map +1 -1
- package/src/lib/config.d.ts +18 -2
- package/src/lib/config.js +61 -10
- package/src/lib/config.js.map +1 -1
- package/src/lib/prompt.d.ts +1 -0
- package/src/lib/prompt.js +6 -0
- package/src/lib/prompt.js.map +1 -0
- package/src/lib/prompts.d.ts +17 -0
- package/src/lib/prompts.js +98 -0
- package/src/lib/prompts.js.map +1 -0
- package/src/lib/run-cli.d.ts +6 -0
- package/src/lib/run-cli.js +197 -20
- package/src/lib/run-cli.js.map +1 -1
package/README.md
CHANGED
|
@@ -15,11 +15,15 @@ The current commands are intentionally small, but the package layout is prepared
|
|
|
15
15
|
npm install -g @reximo/cli
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
+
For a project-local install, use `npx reximo`, `npm exec reximo`, or `./node_modules/.bin/reximo`.
|
|
19
|
+
|
|
18
20
|
## Local usage
|
|
19
21
|
|
|
20
22
|
```bash
|
|
21
|
-
pnpm reximo:cli:dev -- hello
|
|
22
23
|
pnpm reximo:cli:dev -- info --json
|
|
24
|
+
pnpm reximo:cli:dev -- login --email user@example.com --password 'secret' --organization-id 123
|
|
25
|
+
pnpm reximo:cli:dev -- me
|
|
26
|
+
pnpm reximo:cli:dev -- logout
|
|
23
27
|
pnpm reximo:cli:build
|
|
24
28
|
pnpm reximo:cli:pack
|
|
25
29
|
```
|
|
@@ -30,9 +34,13 @@ pnpm reximo:cli:pack
|
|
|
30
34
|
|
|
31
35
|
## Commands
|
|
32
36
|
|
|
33
|
-
- `reximo hello`
|
|
34
|
-
- `reximo hello --name <name>`
|
|
35
37
|
- `reximo info`
|
|
38
|
+
- `reximo login`
|
|
39
|
+
- `reximo login --email <email> --password <password>`
|
|
40
|
+
- `reximo login --organization-id <organizationId>`
|
|
41
|
+
- `reximo me`
|
|
42
|
+
- `reximo profile`
|
|
43
|
+
- `reximo logout`
|
|
36
44
|
- `reximo config show`
|
|
37
45
|
- `reximo --help`
|
|
38
46
|
|
|
@@ -48,6 +56,8 @@ Supported environment variables:
|
|
|
48
56
|
|
|
49
57
|
- `REXIMO_API_BASE_URL`
|
|
50
58
|
- `REXIMO_TOKEN`
|
|
59
|
+
- `REXIMO_REFRESH_TOKEN`
|
|
60
|
+
- `REXIMO_ORGANIZATION_ID`
|
|
51
61
|
- `REXIMO_PROFILE`
|
|
52
62
|
- `REXIMO_CONFIG`
|
|
53
63
|
|
|
@@ -64,13 +74,52 @@ Example config file:
|
|
|
64
74
|
"profile": "default",
|
|
65
75
|
"profiles": {
|
|
66
76
|
"default": {
|
|
67
|
-
"apiBaseUrl": "https://api.reximo.
|
|
68
|
-
"
|
|
77
|
+
"apiBaseUrl": "https://api.reximo.app",
|
|
78
|
+
"accessToken": "redacted-access-token",
|
|
79
|
+
"refreshToken": "redacted-refresh-token",
|
|
80
|
+
"organizationId": "123"
|
|
69
81
|
}
|
|
70
82
|
}
|
|
71
83
|
}
|
|
72
84
|
```
|
|
73
85
|
|
|
86
|
+
The CLI stores persisted auth state in `~/.reximo/config.json` by default. Environment variables still override the file at runtime.
|
|
87
|
+
|
|
88
|
+
`REXIMO_TOKEN` remains the access-token override for compatibility.
|
|
89
|
+
|
|
90
|
+
## Login
|
|
91
|
+
|
|
92
|
+
`reximo login` supports both flag-driven and interactive use.
|
|
93
|
+
|
|
94
|
+
Flag-driven:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
reximo login --email user@example.com --password 'secret' --organization-id 123
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Interactive:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
reximo login
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Behavior:
|
|
107
|
+
|
|
108
|
+
- the CLI authenticates against `https://api.reximo.app/api/v1/auth/login` by default
|
|
109
|
+
- it persists the access token, refresh token, and selected organization ID to the active profile
|
|
110
|
+
- if multiple active organizations are available, it prompts for selection in an interactive terminal
|
|
111
|
+
- in non-interactive use, pass `--organization-id` when multiple organizations are possible
|
|
112
|
+
|
|
113
|
+
## Generated Client
|
|
114
|
+
|
|
115
|
+
The CLI API client is generated from the API OpenAPI spec emitted at `.agentic/docs/reference/api/openapi-v1.json`.
|
|
116
|
+
|
|
117
|
+
Regenerate it with:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
pnpm --dir packages/reximo-cli generate:client
|
|
121
|
+
```
|
|
122
|
+
|
|
74
123
|
## Release checks
|
|
75
124
|
|
|
76
125
|
```bash
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reximo/cli",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.3",
|
|
4
4
|
"description": "Command-line interface for Reximo.",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"license": "ISC",
|
|
@@ -46,13 +46,15 @@
|
|
|
46
46
|
"scripts": {
|
|
47
47
|
"build": "pnpm -C ../.. exec nx build reximo-cli",
|
|
48
48
|
"dev": "pnpm exec tsx src/cli.ts",
|
|
49
|
+
"generate:client": "pnpm -C ../.. docs:openapi && pnpm exec tsx scripts/generate-client.ts",
|
|
49
50
|
"lint": "ESLINT_USE_FLAT_CONFIG=false pnpm exec eslint src --ext .ts",
|
|
50
51
|
"pack:dry-run": "pnpm run build && cd ../../dist/packages/reximo-cli && npm pack --dry-run",
|
|
51
|
-
"test": "pnpm exec tsx --test src
|
|
52
|
+
"test": "pnpm exec tsx --test src/run-cli.test.ts src/lib/config.test.ts",
|
|
52
53
|
"typecheck": "tsc --noEmit",
|
|
53
54
|
"verify": "pnpm run lint && pnpm run typecheck && pnpm run test"
|
|
54
55
|
},
|
|
55
56
|
"dependencies": {
|
|
56
|
-
"commander": "^14.0.3"
|
|
57
|
+
"commander": "^14.0.3",
|
|
58
|
+
"tslib": "^2.8.1"
|
|
57
59
|
}
|
|
58
60
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ReximoApiClient, ReximoApiError, type BaseResponseDto, type GetMeOptions, type GetMeResponse, type GetMyOrganizationsResponse, type LoginOptions, type LoginRequest, type LoginResponse, type LogoutOptions, type LogoutResponse, type GetMyOrganizationsOptions, type RefreshTokenOptions, type RefreshTokenRequest, type RefreshTokenResponse, type ReximoApiClientOptions, type UserOrganizationDto } from './reximo-api-client.generated';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ReximoApiError = exports.ReximoApiClient = void 0;
|
|
4
|
+
var reximo_api_client_generated_1 = require("./reximo-api-client.generated");
|
|
5
|
+
Object.defineProperty(exports, "ReximoApiClient", { enumerable: true, get: function () { return reximo_api_client_generated_1.ReximoApiClient; } });
|
|
6
|
+
Object.defineProperty(exports, "ReximoApiError", { enumerable: true, get: function () { return reximo_api_client_generated_1.ReximoApiError; } });
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/reximo-cli/src/client/generated/index.ts"],"names":[],"mappings":";;;AAAA,6EAkBuC;AAjBrC,8HAAA,eAAe,OAAA;AACf,6HAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated from .agentic/docs/reference/api/openapi-v1.json.
|
|
3
|
+
* Do not edit manually. Regenerate with:
|
|
4
|
+
* pnpm --dir packages/reximo-cli generate:client
|
|
5
|
+
*/
|
|
6
|
+
export interface BaseResponseDto<T> {
|
|
7
|
+
data: T;
|
|
8
|
+
metadata?: {
|
|
9
|
+
timestamp?: string;
|
|
10
|
+
version?: string;
|
|
11
|
+
requestId?: string;
|
|
12
|
+
error?: Record<string, unknown>;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface LoginDto {
|
|
16
|
+
email: string;
|
|
17
|
+
password: string;
|
|
18
|
+
}
|
|
19
|
+
export interface RefreshTokenDto {
|
|
20
|
+
refreshToken: string;
|
|
21
|
+
}
|
|
22
|
+
export interface AuthResponseDto {
|
|
23
|
+
accessToken: string;
|
|
24
|
+
refreshToken: string;
|
|
25
|
+
idToken: string;
|
|
26
|
+
expiresIn: number;
|
|
27
|
+
refreshExpiresIn: number;
|
|
28
|
+
user: {
|
|
29
|
+
"userId"?: string;
|
|
30
|
+
"username"?: string;
|
|
31
|
+
"email"?: string;
|
|
32
|
+
"emailVerified"?: boolean;
|
|
33
|
+
"roles"?: Array<string>;
|
|
34
|
+
"permissions"?: Array<string>;
|
|
35
|
+
"tenantId"?: string;
|
|
36
|
+
};
|
|
37
|
+
isNewUser: boolean;
|
|
38
|
+
}
|
|
39
|
+
export interface UserOrganizationDto {
|
|
40
|
+
organizationId: string;
|
|
41
|
+
tenantId: string;
|
|
42
|
+
name: string;
|
|
43
|
+
displayName?: string;
|
|
44
|
+
slug: string;
|
|
45
|
+
role: string;
|
|
46
|
+
isDefault: boolean;
|
|
47
|
+
isActive: boolean;
|
|
48
|
+
}
|
|
49
|
+
export type LoginRequest = LoginDto;
|
|
50
|
+
export type LoginResponse = AuthResponseDto;
|
|
51
|
+
export type RefreshTokenRequest = RefreshTokenDto;
|
|
52
|
+
export type RefreshTokenResponse = AuthResponseDto;
|
|
53
|
+
export type GetMyOrganizationsResponse = BaseResponseDto<Array<UserOrganizationDto>>;
|
|
54
|
+
export type GetMeResponse = {
|
|
55
|
+
"data"?: {
|
|
56
|
+
"userId"?: string;
|
|
57
|
+
"tenantId"?: string;
|
|
58
|
+
"actorId"?: string;
|
|
59
|
+
"email"?: string;
|
|
60
|
+
"name"?: string;
|
|
61
|
+
"displayName"?: string;
|
|
62
|
+
"photoUrl"?: string;
|
|
63
|
+
"isActive"?: boolean;
|
|
64
|
+
"isVerified"?: boolean;
|
|
65
|
+
"emailVerified"?: boolean;
|
|
66
|
+
"roles"?: Array<string>;
|
|
67
|
+
"permissions"?: Array<string>;
|
|
68
|
+
};
|
|
69
|
+
"metadata"?: {
|
|
70
|
+
"timestamp"?: string;
|
|
71
|
+
"version"?: string;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
export type LogoutResponse = {
|
|
75
|
+
"message": string;
|
|
76
|
+
};
|
|
77
|
+
export declare class ReximoApiError extends Error {
|
|
78
|
+
readonly status: number;
|
|
79
|
+
readonly body: unknown;
|
|
80
|
+
constructor(status: number, body: unknown, message: string);
|
|
81
|
+
}
|
|
82
|
+
export type ReximoApiClientOptions = {
|
|
83
|
+
baseUrl: string;
|
|
84
|
+
fetchFn?: typeof fetch;
|
|
85
|
+
};
|
|
86
|
+
export type LoginOptions = {
|
|
87
|
+
signal?: AbortSignal;
|
|
88
|
+
tenantId?: string | null;
|
|
89
|
+
};
|
|
90
|
+
export type GetMyOrganizationsOptions = {
|
|
91
|
+
signal?: AbortSignal;
|
|
92
|
+
accessToken: string;
|
|
93
|
+
tenantId?: string | null;
|
|
94
|
+
};
|
|
95
|
+
export type GetMeOptions = {
|
|
96
|
+
signal?: AbortSignal;
|
|
97
|
+
accessToken: string;
|
|
98
|
+
tenantId?: string | null;
|
|
99
|
+
};
|
|
100
|
+
export type RefreshTokenOptions = {
|
|
101
|
+
signal?: AbortSignal;
|
|
102
|
+
tenantId?: string | null;
|
|
103
|
+
};
|
|
104
|
+
export type LogoutOptions = {
|
|
105
|
+
signal?: AbortSignal;
|
|
106
|
+
accessToken: string;
|
|
107
|
+
tenantId: string;
|
|
108
|
+
};
|
|
109
|
+
export declare class ReximoApiClient {
|
|
110
|
+
private readonly baseUrl;
|
|
111
|
+
private readonly fetchFn;
|
|
112
|
+
constructor(options: ReximoApiClientOptions);
|
|
113
|
+
login(body: LoginRequest, options?: LoginOptions): Promise<LoginResponse>;
|
|
114
|
+
getMyOrganizations(options: GetMyOrganizationsOptions): Promise<GetMyOrganizationsResponse>;
|
|
115
|
+
getMe(options: GetMeOptions): Promise<GetMeResponse>;
|
|
116
|
+
refreshToken(body: RefreshTokenRequest, options?: RefreshTokenOptions): Promise<RefreshTokenResponse>;
|
|
117
|
+
logout(body: RefreshTokenRequest, options: LogoutOptions): Promise<LogoutResponse>;
|
|
118
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/**
|
|
4
|
+
* Generated from .agentic/docs/reference/api/openapi-v1.json.
|
|
5
|
+
* Do not edit manually. Regenerate with:
|
|
6
|
+
* pnpm --dir packages/reximo-cli generate:client
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ReximoApiClient = exports.ReximoApiError = void 0;
|
|
10
|
+
class ReximoApiError extends Error {
|
|
11
|
+
status;
|
|
12
|
+
body;
|
|
13
|
+
constructor(status, body, message) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.name = 'ReximoApiError';
|
|
16
|
+
this.status = status;
|
|
17
|
+
this.body = body;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.ReximoApiError = ReximoApiError;
|
|
21
|
+
function normalizeBaseUrl(baseUrl) {
|
|
22
|
+
return baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
|
|
23
|
+
}
|
|
24
|
+
async function readJson(response) {
|
|
25
|
+
const text = await response.text();
|
|
26
|
+
if (!text) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
return JSON.parse(text);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return text;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
class ReximoApiClient {
|
|
37
|
+
baseUrl;
|
|
38
|
+
fetchFn;
|
|
39
|
+
constructor(options) {
|
|
40
|
+
this.baseUrl = normalizeBaseUrl(options.baseUrl);
|
|
41
|
+
this.fetchFn = options.fetchFn ?? fetch;
|
|
42
|
+
}
|
|
43
|
+
async login(body, options = {}) {
|
|
44
|
+
const headers = {
|
|
45
|
+
'content-type': 'application/json'
|
|
46
|
+
};
|
|
47
|
+
if (options.tenantId) {
|
|
48
|
+
headers['x-tenant-id'] = options.tenantId;
|
|
49
|
+
}
|
|
50
|
+
const response = await this.fetchFn(`${this.baseUrl}/api/v1/auth/login`, {
|
|
51
|
+
method: 'POST',
|
|
52
|
+
headers,
|
|
53
|
+
body: JSON.stringify(body),
|
|
54
|
+
signal: options.signal
|
|
55
|
+
});
|
|
56
|
+
const data = await readJson(response);
|
|
57
|
+
if (!response.ok) {
|
|
58
|
+
throw new ReximoApiError(response.status, data, 'Login request failed');
|
|
59
|
+
}
|
|
60
|
+
return data;
|
|
61
|
+
}
|
|
62
|
+
async getMyOrganizations(options) {
|
|
63
|
+
const headers = {
|
|
64
|
+
authorization: `Bearer ${options.accessToken}`
|
|
65
|
+
};
|
|
66
|
+
if (options.tenantId) {
|
|
67
|
+
headers['x-tenant-id'] = options.tenantId;
|
|
68
|
+
}
|
|
69
|
+
const response = await this.fetchFn(`${this.baseUrl}/api/v1/auth/me/organizations`, {
|
|
70
|
+
method: 'GET',
|
|
71
|
+
headers,
|
|
72
|
+
signal: options.signal
|
|
73
|
+
});
|
|
74
|
+
const data = await readJson(response);
|
|
75
|
+
if (!response.ok) {
|
|
76
|
+
throw new ReximoApiError(response.status, data, 'Get organizations request failed');
|
|
77
|
+
}
|
|
78
|
+
return data;
|
|
79
|
+
}
|
|
80
|
+
async getMe(options) {
|
|
81
|
+
const headers = {
|
|
82
|
+
authorization: `Bearer ${options.accessToken}`
|
|
83
|
+
};
|
|
84
|
+
if (options.tenantId) {
|
|
85
|
+
headers['x-tenant-id'] = options.tenantId;
|
|
86
|
+
}
|
|
87
|
+
const response = await this.fetchFn(`${this.baseUrl}/api/v1/auth/me`, {
|
|
88
|
+
method: 'GET',
|
|
89
|
+
headers,
|
|
90
|
+
signal: options.signal
|
|
91
|
+
});
|
|
92
|
+
const data = await readJson(response);
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw new ReximoApiError(response.status, data, 'Get current user request failed');
|
|
95
|
+
}
|
|
96
|
+
return data;
|
|
97
|
+
}
|
|
98
|
+
async refreshToken(body, options = {}) {
|
|
99
|
+
const headers = {
|
|
100
|
+
'content-type': 'application/json'
|
|
101
|
+
};
|
|
102
|
+
if (options.tenantId) {
|
|
103
|
+
headers['x-tenant-id'] = options.tenantId;
|
|
104
|
+
}
|
|
105
|
+
const response = await this.fetchFn(`${this.baseUrl}/api/v1/auth/refresh`, {
|
|
106
|
+
method: 'POST',
|
|
107
|
+
headers,
|
|
108
|
+
body: JSON.stringify(body),
|
|
109
|
+
signal: options.signal
|
|
110
|
+
});
|
|
111
|
+
const data = await readJson(response);
|
|
112
|
+
if (!response.ok) {
|
|
113
|
+
throw new ReximoApiError(response.status, data, 'Refresh token request failed');
|
|
114
|
+
}
|
|
115
|
+
return data;
|
|
116
|
+
}
|
|
117
|
+
async logout(body, options) {
|
|
118
|
+
const response = await this.fetchFn(`${this.baseUrl}/api/v1/auth/logout`, {
|
|
119
|
+
method: 'POST',
|
|
120
|
+
headers: {
|
|
121
|
+
'content-type': 'application/json',
|
|
122
|
+
authorization: `Bearer ${options.accessToken}`,
|
|
123
|
+
'x-tenant-id': options.tenantId
|
|
124
|
+
},
|
|
125
|
+
body: JSON.stringify(body),
|
|
126
|
+
signal: options.signal
|
|
127
|
+
});
|
|
128
|
+
const data = await readJson(response);
|
|
129
|
+
if (!response.ok) {
|
|
130
|
+
throw new ReximoApiError(response.status, data, 'Logout request failed');
|
|
131
|
+
}
|
|
132
|
+
return data;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.ReximoApiClient = ReximoApiClient;
|
|
136
|
+
//# sourceMappingURL=reximo-api-client.generated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reximo-api-client.generated.js","sourceRoot":"","sources":["../../../../../../packages/reximo-cli/src/client/generated/reximo-api-client.generated.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,45 @@
|
|
|
1
|
+
import { type GetMeResponse, type LoginResponse, type LogoutResponse, type RefreshTokenResponse, type UserOrganizationDto } from './generated';
|
|
1
2
|
import type { ResolvedConfig } from '../lib/config';
|
|
3
|
+
export type LoginInput = {
|
|
4
|
+
email: string;
|
|
5
|
+
password: string;
|
|
6
|
+
organizationId?: string | null;
|
|
7
|
+
};
|
|
8
|
+
export type LoginResult = LoginResponse;
|
|
9
|
+
export type OrganizationMembership = UserOrganizationDto;
|
|
10
|
+
export type RefreshTokenInput = {
|
|
11
|
+
refreshToken: string;
|
|
12
|
+
organizationId?: string | null;
|
|
13
|
+
};
|
|
14
|
+
export type RefreshTokenResult = RefreshTokenResponse;
|
|
15
|
+
export type UserProfileResult = GetMeResponse extends {
|
|
16
|
+
data?: infer T;
|
|
17
|
+
} ? T : never;
|
|
18
|
+
export type LogoutInput = {
|
|
19
|
+
accessToken: string;
|
|
20
|
+
refreshToken: string;
|
|
21
|
+
organizationId: string;
|
|
22
|
+
};
|
|
23
|
+
export type LogoutResult = LogoutResponse;
|
|
2
24
|
export type ReximoClient = {
|
|
3
25
|
isConfigured(): boolean;
|
|
4
26
|
describeTarget(): {
|
|
5
27
|
apiBaseUrl: string | null;
|
|
6
|
-
|
|
28
|
+
hasAccessToken: boolean;
|
|
29
|
+
hasRefreshToken: boolean;
|
|
30
|
+
organizationId: string | null;
|
|
7
31
|
profile: string;
|
|
8
32
|
};
|
|
33
|
+
login(input: LoginInput): Promise<LoginResult>;
|
|
34
|
+
refreshToken(input: RefreshTokenInput): Promise<RefreshTokenResult>;
|
|
35
|
+
getMyOrganizations(input: {
|
|
36
|
+
accessToken: string;
|
|
37
|
+
organizationId?: string | null;
|
|
38
|
+
}): Promise<OrganizationMembership[]>;
|
|
39
|
+
getMe(input: {
|
|
40
|
+
accessToken: string;
|
|
41
|
+
organizationId?: string | null;
|
|
42
|
+
}): Promise<UserProfileResult>;
|
|
43
|
+
logout(input: LogoutInput): Promise<LogoutResult>;
|
|
9
44
|
};
|
|
10
45
|
export declare function createReximoClient(config: ResolvedConfig): ReximoClient;
|
|
@@ -1,7 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createReximoClient = createReximoClient;
|
|
4
|
+
const generated_1 = require("./generated");
|
|
5
|
+
function extractApiErrorMessage(error, fallback) {
|
|
6
|
+
if (!(error instanceof generated_1.ReximoApiError)) {
|
|
7
|
+
return error instanceof Error ? error.message : fallback;
|
|
8
|
+
}
|
|
9
|
+
const body = error.body;
|
|
10
|
+
if (body && typeof body === 'object') {
|
|
11
|
+
const data = 'data' in body && body.data && typeof body.data === 'object'
|
|
12
|
+
? body.data
|
|
13
|
+
: null;
|
|
14
|
+
const message = data?.['translated'] ?? data?.['message'];
|
|
15
|
+
if (typeof message === 'string' && message.trim().length > 0) {
|
|
16
|
+
return message;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return fallback;
|
|
20
|
+
}
|
|
21
|
+
function unwrapResponseData(response, fallback) {
|
|
22
|
+
if (response && typeof response === 'object' && 'data' in response) {
|
|
23
|
+
const wrapped = response;
|
|
24
|
+
if (wrapped.data !== undefined) {
|
|
25
|
+
return wrapped.data;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (response === null || response === undefined) {
|
|
29
|
+
throw new Error(fallback);
|
|
30
|
+
}
|
|
31
|
+
return response;
|
|
32
|
+
}
|
|
4
33
|
function createReximoClient(config) {
|
|
34
|
+
const apiClient = new generated_1.ReximoApiClient({
|
|
35
|
+
baseUrl: config.apiBaseUrl ?? ''
|
|
36
|
+
});
|
|
5
37
|
return {
|
|
6
38
|
isConfigured() {
|
|
7
39
|
return Boolean(config.apiBaseUrl);
|
|
@@ -9,9 +41,84 @@ function createReximoClient(config) {
|
|
|
9
41
|
describeTarget() {
|
|
10
42
|
return {
|
|
11
43
|
apiBaseUrl: config.apiBaseUrl,
|
|
12
|
-
|
|
44
|
+
hasAccessToken: Boolean(config.accessToken),
|
|
45
|
+
hasRefreshToken: Boolean(config.refreshToken),
|
|
46
|
+
organizationId: config.organizationId,
|
|
13
47
|
profile: config.profile
|
|
14
48
|
};
|
|
49
|
+
},
|
|
50
|
+
async login(input) {
|
|
51
|
+
try {
|
|
52
|
+
const request = {
|
|
53
|
+
email: input.email,
|
|
54
|
+
password: input.password
|
|
55
|
+
};
|
|
56
|
+
const response = await apiClient.login(request, {
|
|
57
|
+
tenantId: input.organizationId
|
|
58
|
+
});
|
|
59
|
+
return unwrapResponseData(response, 'Login response missing data object');
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
throw new Error(extractApiErrorMessage(error, 'Login request failed'));
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
async refreshToken(input) {
|
|
66
|
+
try {
|
|
67
|
+
const request = {
|
|
68
|
+
refreshToken: input.refreshToken
|
|
69
|
+
};
|
|
70
|
+
const response = await apiClient.refreshToken(request, {
|
|
71
|
+
tenantId: input.organizationId
|
|
72
|
+
});
|
|
73
|
+
return unwrapResponseData(response, 'Refresh token response missing data object');
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
throw new Error(extractApiErrorMessage(error, 'Refresh token request failed'));
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
async getMyOrganizations(input) {
|
|
80
|
+
try {
|
|
81
|
+
const response = await apiClient.getMyOrganizations({
|
|
82
|
+
accessToken: input.accessToken,
|
|
83
|
+
tenantId: input.organizationId
|
|
84
|
+
});
|
|
85
|
+
if (!Array.isArray(response.data)) {
|
|
86
|
+
throw new Error('Organization response missing data array');
|
|
87
|
+
}
|
|
88
|
+
return response.data;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
throw new Error(extractApiErrorMessage(error, 'Get organizations request failed'));
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
async getMe(input) {
|
|
95
|
+
try {
|
|
96
|
+
const response = await apiClient.getMe({
|
|
97
|
+
accessToken: input.accessToken,
|
|
98
|
+
tenantId: input.organizationId
|
|
99
|
+
});
|
|
100
|
+
if (!response || typeof response !== 'object' || !('data' in response)) {
|
|
101
|
+
throw new Error('Profile response missing data object');
|
|
102
|
+
}
|
|
103
|
+
return response.data;
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
throw new Error(extractApiErrorMessage(error, 'Get current user request failed'));
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
async logout(input) {
|
|
110
|
+
try {
|
|
111
|
+
const response = await apiClient.logout({
|
|
112
|
+
refreshToken: input.refreshToken
|
|
113
|
+
}, {
|
|
114
|
+
accessToken: input.accessToken,
|
|
115
|
+
tenantId: input.organizationId
|
|
116
|
+
});
|
|
117
|
+
return unwrapResponseData(response, 'Logout response missing data object');
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
throw new Error(extractApiErrorMessage(error, 'Logout request failed'));
|
|
121
|
+
}
|
|
15
122
|
}
|
|
16
123
|
};
|
|
17
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reximo-client.js","sourceRoot":"","sources":["../../../../../packages/reximo-cli/src/client/reximo-client.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"reximo-client.js","sourceRoot":"","sources":["../../../../../packages/reximo-cli/src/client/reximo-client.ts"],"names":[],"mappings":";;AA+FA,gDAyGC;AAxMD,2CAYqB;AA+CrB,SAAS,sBAAsB,CAAC,KAAc,EAAE,QAAgB;IAC9D,IAAI,CAAC,CAAC,KAAK,YAAY,0BAAc,CAAC,EAAE,CAAC;QACvC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,GACR,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAC1D,CAAC,CAAE,IAAI,CAAC,IAAgC;YACxC,CAAC,CAAC,IAAI,CAAC;QAEX,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAI,QAA+B,EAAE,QAAgB;IAC9E,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,QAA6B,CAAC;QAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,OAAO,CAAC,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,QAAa,CAAC;AACvB,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAsB;IACvD,MAAM,SAAS,GAAG,IAAI,2BAAe,CAAC;QACpC,OAAO,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;KACjC,CAAC,CAAC;IAEH,OAAO;QACL,YAAY;YACV,OAAO,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;QACD,cAAc;YACZ,OAAO;gBACL,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC3C,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC7C,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,KAAiB;YAC3B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAiB;oBAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACzB,CAAC;gBAEF,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE;oBAC9C,QAAQ,EAAE,KAAK,CAAC,cAAc;iBAC/B,CAAC,CAAC;gBAEH,OAAO,kBAAkB,CAAC,QAAQ,EAAE,oCAAoC,CAAC,CAAC;YAC5E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,KAAwB;YACzC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAwB;oBACnC,YAAY,EAAE,KAAK,CAAC,YAAY;iBACjC,CAAC;gBAEF,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE;oBACrD,QAAQ,EAAE,KAAK,CAAC,cAAc;iBAC/B,CAAC,CAAC;gBAEH,OAAO,kBAAkB,CAAC,QAAQ,EAAE,4CAA4C,CAAC,CAAC;YACpF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QACD,KAAK,CAAC,kBAAkB,CAAC,KAGxB;YACC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC;oBAClD,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,QAAQ,EAAE,KAAK,CAAC,cAAc;iBAC/B,CAAC,CAAC;gBAEH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBAC9D,CAAC;gBAED,OAAO,QAAQ,CAAC,IAAI,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,KAAK,EAAE,kCAAkC,CAAC,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,KAGX;YACC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAkB,MAAM,SAAS,CAAC,KAAK,CAAC;oBACpD,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,QAAQ,EAAE,KAAK,CAAC,cAAc;iBACf,CAAC,CAAC;gBAEnB,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,EAAE,CAAC;oBACvE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBAC1D,CAAC;gBAED,OAAO,QAAQ,CAAC,IAAyB,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,KAAK,EAAE,iCAAiC,CAAC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,KAAkB;YAC7B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CACrC;oBACE,YAAY,EAAE,KAAK,CAAC,YAAY;iBACjC,EACD;oBACE,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,QAAQ,EAAE,KAAK,CAAC,cAAc;iBACd,CACnB,CAAC;gBAEF,OAAO,kBAAkB,CAAC,QAAQ,EAAE,qCAAqC,CAAC,CAAC;YAC7E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/src/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { runCli, type CliDependencies } from './lib/run-cli';
|
|
2
|
-
export { loadResolvedConfig, getDefaultConfigPath, type LoadResolvedConfigOptions, type ResolvedConfig } from './lib/config';
|
|
2
|
+
export { DEFAULT_API_BASE_URL, loadResolvedConfig, getDefaultConfigPath, saveProfileConfig, type LoadResolvedConfigOptions, type PersistedConfigFile, type PersistedProfileConfig, type ResolvedConfig } from './lib/config';
|
|
3
3
|
export { createReximoClient, type ReximoClient } from './client/reximo-client';
|
package/src/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createReximoClient = exports.getDefaultConfigPath = exports.loadResolvedConfig = exports.runCli = void 0;
|
|
3
|
+
exports.createReximoClient = exports.saveProfileConfig = exports.getDefaultConfigPath = exports.loadResolvedConfig = exports.DEFAULT_API_BASE_URL = exports.runCli = void 0;
|
|
4
4
|
var run_cli_1 = require("./lib/run-cli");
|
|
5
5
|
Object.defineProperty(exports, "runCli", { enumerable: true, get: function () { return run_cli_1.runCli; } });
|
|
6
6
|
var config_1 = require("./lib/config");
|
|
7
|
+
Object.defineProperty(exports, "DEFAULT_API_BASE_URL", { enumerable: true, get: function () { return config_1.DEFAULT_API_BASE_URL; } });
|
|
7
8
|
Object.defineProperty(exports, "loadResolvedConfig", { enumerable: true, get: function () { return config_1.loadResolvedConfig; } });
|
|
8
9
|
Object.defineProperty(exports, "getDefaultConfigPath", { enumerable: true, get: function () { return config_1.getDefaultConfigPath; } });
|
|
10
|
+
Object.defineProperty(exports, "saveProfileConfig", { enumerable: true, get: function () { return config_1.saveProfileConfig; } });
|
|
9
11
|
var reximo_client_1 = require("./client/reximo-client");
|
|
10
12
|
Object.defineProperty(exports, "createReximoClient", { enumerable: true, get: function () { return reximo_client_1.createReximoClient; } });
|
|
11
13
|
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/reximo-cli/src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA6D;AAApD,iGAAA,MAAM,OAAA;AACf,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/reximo-cli/src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA6D;AAApD,iGAAA,MAAM,OAAA;AACf,uCASsB;AARpB,8GAAA,oBAAoB,OAAA;AACpB,4GAAA,kBAAkB,OAAA;AAClB,8GAAA,oBAAoB,OAAA;AACpB,2GAAA,iBAAiB,OAAA;AAMnB,wDAA+E;AAAtE,mHAAA,kBAAkB,OAAA"}
|
package/src/lib/config.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export type LoadResolvedConfigOptions = {
|
|
|
2
2
|
env?: NodeJS.ProcessEnv;
|
|
3
3
|
homeDirectory?: string;
|
|
4
4
|
};
|
|
5
|
+
export declare const DEFAULT_API_BASE_URL = "https://api.reximo.app";
|
|
5
6
|
export declare const enum ConfigSource {
|
|
6
7
|
Env = "env",
|
|
7
8
|
Config = "config",
|
|
@@ -13,14 +14,29 @@ export type ResolvedConfig = {
|
|
|
13
14
|
configPath: string;
|
|
14
15
|
configFileFound: boolean;
|
|
15
16
|
apiBaseUrl: string | null;
|
|
16
|
-
|
|
17
|
+
accessToken: string | null;
|
|
18
|
+
refreshToken: string | null;
|
|
19
|
+
organizationId: string | null;
|
|
17
20
|
sources: {
|
|
18
21
|
profile: ConfigSource;
|
|
19
22
|
apiBaseUrl: ConfigSource;
|
|
20
|
-
|
|
23
|
+
accessToken: ConfigSource;
|
|
24
|
+
refreshToken: ConfigSource;
|
|
25
|
+
organizationId: ConfigSource;
|
|
21
26
|
configPath: ConfigSource.Env | ConfigSource.Default;
|
|
22
27
|
};
|
|
23
28
|
};
|
|
29
|
+
export type PersistedProfileConfig = {
|
|
30
|
+
apiBaseUrl?: string | null;
|
|
31
|
+
accessToken?: string | null;
|
|
32
|
+
refreshToken?: string | null;
|
|
33
|
+
organizationId?: string | null;
|
|
34
|
+
};
|
|
35
|
+
export type PersistedConfigFile = {
|
|
36
|
+
profile?: string;
|
|
37
|
+
profiles?: Record<string, PersistedProfileConfig>;
|
|
38
|
+
};
|
|
24
39
|
export declare function getDefaultConfigPath(homeDirectory?: string): string;
|
|
25
40
|
export declare function loadResolvedConfig(options?: LoadResolvedConfigOptions): ResolvedConfig;
|
|
41
|
+
export declare function saveProfileConfig(profileConfig: PersistedProfileConfig, options?: LoadResolvedConfigOptions): ResolvedConfig;
|
|
26
42
|
export declare function redactToken(token: string | null, includeSensitive: boolean): string | null;
|
package/src/lib/config.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_API_BASE_URL = void 0;
|
|
3
4
|
exports.getDefaultConfigPath = getDefaultConfigPath;
|
|
4
5
|
exports.loadResolvedConfig = loadResolvedConfig;
|
|
6
|
+
exports.saveProfileConfig = saveProfileConfig;
|
|
5
7
|
exports.redactToken = redactToken;
|
|
6
8
|
const tslib_1 = require("tslib");
|
|
7
9
|
const node_fs_1 = require("node:fs");
|
|
8
10
|
const node_os_1 = require("node:os");
|
|
9
11
|
const node_path_1 = tslib_1.__importDefault(require("node:path"));
|
|
12
|
+
exports.DEFAULT_API_BASE_URL = 'https://api.reximo.app';
|
|
10
13
|
function getDefaultConfigPath(homeDirectory = (0, node_os_1.homedir)()) {
|
|
11
14
|
return node_path_1.default.join(homeDirectory, '.reximo', 'config.json');
|
|
12
15
|
}
|
|
@@ -21,6 +24,10 @@ function readConfigFile(configPath) {
|
|
|
21
24
|
}
|
|
22
25
|
return parsed;
|
|
23
26
|
}
|
|
27
|
+
function writeConfigFile(configPath, configFile) {
|
|
28
|
+
(0, node_fs_1.mkdirSync)(node_path_1.default.dirname(configPath), { recursive: true });
|
|
29
|
+
(0, node_fs_1.writeFileSync)(configPath, `${JSON.stringify(configFile, null, 2)}\n`, 'utf8');
|
|
30
|
+
}
|
|
24
31
|
function getProfileConfig(configFile, profile) {
|
|
25
32
|
return configFile.profiles?.[profile] ?? {};
|
|
26
33
|
}
|
|
@@ -33,6 +40,24 @@ function resolveValueSource(valueFromEnv, valueFromConfig) {
|
|
|
33
40
|
}
|
|
34
41
|
return "unset" /* ConfigSource.Unset */;
|
|
35
42
|
}
|
|
43
|
+
function resolveProfileSource(profileFromEnv, configProfile) {
|
|
44
|
+
if (profileFromEnv) {
|
|
45
|
+
return "env" /* ConfigSource.Env */;
|
|
46
|
+
}
|
|
47
|
+
if (configProfile) {
|
|
48
|
+
return "config" /* ConfigSource.Config */;
|
|
49
|
+
}
|
|
50
|
+
return "default" /* ConfigSource.Default */;
|
|
51
|
+
}
|
|
52
|
+
function resolveApiBaseUrlSource(apiBaseUrlFromEnv, apiBaseUrlFromConfig) {
|
|
53
|
+
if (apiBaseUrlFromEnv) {
|
|
54
|
+
return "env" /* ConfigSource.Env */;
|
|
55
|
+
}
|
|
56
|
+
if (apiBaseUrlFromConfig) {
|
|
57
|
+
return "config" /* ConfigSource.Config */;
|
|
58
|
+
}
|
|
59
|
+
return "default" /* ConfigSource.Default */;
|
|
60
|
+
}
|
|
36
61
|
function loadResolvedConfig(options = {}) {
|
|
37
62
|
const env = options.env ?? process.env;
|
|
38
63
|
const configPathFromEnv = env['REXIMO_CONFIG'];
|
|
@@ -43,25 +68,51 @@ function loadResolvedConfig(options = {}) {
|
|
|
43
68
|
const profile = profileFromEnv ?? configFile.profile ?? 'default';
|
|
44
69
|
const profileConfig = getProfileConfig(configFile, profile);
|
|
45
70
|
const apiBaseUrlFromEnv = env['REXIMO_API_BASE_URL'];
|
|
46
|
-
const
|
|
71
|
+
const accessTokenFromEnv = env['REXIMO_TOKEN'];
|
|
72
|
+
const refreshTokenFromEnv = env['REXIMO_REFRESH_TOKEN'];
|
|
73
|
+
const organizationIdFromEnv = env['REXIMO_ORGANIZATION_ID'];
|
|
74
|
+
const apiBaseUrlFromConfig = profileConfig.apiBaseUrl;
|
|
75
|
+
const accessTokenFromConfig = profileConfig.accessToken ?? profileConfig.token;
|
|
47
76
|
return {
|
|
48
77
|
profile,
|
|
49
78
|
configPath,
|
|
50
79
|
configFileFound,
|
|
51
|
-
apiBaseUrl: apiBaseUrlFromEnv ??
|
|
52
|
-
|
|
80
|
+
apiBaseUrl: apiBaseUrlFromEnv ?? apiBaseUrlFromConfig ?? exports.DEFAULT_API_BASE_URL,
|
|
81
|
+
accessToken: accessTokenFromEnv ?? accessTokenFromConfig ?? null,
|
|
82
|
+
refreshToken: refreshTokenFromEnv ?? profileConfig.refreshToken ?? null,
|
|
83
|
+
organizationId: organizationIdFromEnv ?? profileConfig.organizationId ?? null,
|
|
53
84
|
sources: {
|
|
54
|
-
profile: profileFromEnv
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
apiBaseUrl: resolveValueSource(apiBaseUrlFromEnv, profileConfig.apiBaseUrl),
|
|
60
|
-
token: resolveValueSource(tokenFromEnv, profileConfig.token),
|
|
85
|
+
profile: resolveProfileSource(profileFromEnv, configFile.profile),
|
|
86
|
+
apiBaseUrl: resolveApiBaseUrlSource(apiBaseUrlFromEnv, apiBaseUrlFromConfig),
|
|
87
|
+
accessToken: resolveValueSource(accessTokenFromEnv, accessTokenFromConfig),
|
|
88
|
+
refreshToken: resolveValueSource(refreshTokenFromEnv, profileConfig.refreshToken),
|
|
89
|
+
organizationId: resolveValueSource(organizationIdFromEnv, profileConfig.organizationId),
|
|
61
90
|
configPath: configPathFromEnv ? "env" /* ConfigSource.Env */ : "default" /* ConfigSource.Default */
|
|
62
91
|
}
|
|
63
92
|
};
|
|
64
93
|
}
|
|
94
|
+
function saveProfileConfig(profileConfig, options = {}) {
|
|
95
|
+
const resolved = loadResolvedConfig(options);
|
|
96
|
+
const configFile = readConfigFile(resolved.configPath);
|
|
97
|
+
const profiles = { ...(configFile.profiles ?? {}) };
|
|
98
|
+
const existingProfile = { ...(profiles[resolved.profile] ?? {}) };
|
|
99
|
+
for (const [key, value] of Object.entries(profileConfig)) {
|
|
100
|
+
if (value === undefined) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (value === null) {
|
|
104
|
+
delete existingProfile[key];
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
existingProfile[key] = value;
|
|
108
|
+
}
|
|
109
|
+
profiles[resolved.profile] = existingProfile;
|
|
110
|
+
writeConfigFile(resolved.configPath, {
|
|
111
|
+
profile: configFile.profile ?? resolved.profile,
|
|
112
|
+
profiles
|
|
113
|
+
});
|
|
114
|
+
return loadResolvedConfig(options);
|
|
115
|
+
}
|
|
65
116
|
function redactToken(token, includeSensitive) {
|
|
66
117
|
if (!token) {
|
|
67
118
|
return null;
|
package/src/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../packages/reximo-cli/src/lib/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../packages/reximo-cli/src/lib/config.ts"],"names":[],"mappings":";;;AA6DA,oDAEC;AAuED,gDAiCC;AAED,8CAgCC;AAED,kCAMC;;AAjND,qCAA6E;AAC7E,qCAAkC;AAClC,kEAA6B;AAOhB,QAAA,oBAAoB,GAAG,wBAAwB,CAAC;AAoD7D,SAAgB,oBAAoB,CAAC,aAAa,GAAG,IAAA,iBAAO,GAAE;IAC5D,OAAO,mBAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB;IACxC,IAAI,CAAC,IAAA,oBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;IAE7C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,2BAA2B,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB,EAAE,UAA+B;IAC1E,IAAA,mBAAS,EAAC,mBAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,IAAA,uBAAa,EAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAsB,EAAE,OAAe;IAC/D,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,kBAAkB,CACzB,YAAgC,EAChC,eAAmC;IAEnC,IAAI,YAAY,EAAE,CAAC;QACjB,oCAAwB;IAC1B,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,0CAA2B;IAC7B,CAAC;IAED,wCAA0B;AAC5B,CAAC;AAED,SAAS,oBAAoB,CAC3B,cAAkC,EAClC,aAAiC;IAEjC,IAAI,cAAc,EAAE,CAAC;QACnB,oCAAwB;IAC1B,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,0CAA2B;IAC7B,CAAC;IAED,4CAA4B;AAC9B,CAAC;AAED,SAAS,uBAAuB,CAC9B,iBAAqC,EACrC,oBAAwC;IAExC,IAAI,iBAAiB,EAAE,CAAC;QACtB,oCAAwB;IAC1B,CAAC;IAED,IAAI,oBAAoB,EAAE,CAAC;QACzB,0CAA2B;IAC7B,CAAC;IAED,4CAA4B;AAC9B,CAAC;AAED,SAAgB,kBAAkB,CAAC,UAAqC,EAAE;IACxE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,iBAAiB,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,iBAAiB,IAAI,oBAAoB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACpF,MAAM,eAAe,GAAG,IAAA,oBAAU,EAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,cAAc,IAAI,UAAU,CAAC,OAAO,IAAI,SAAS,CAAC;IAClE,MAAM,aAAa,GAAG,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5D,MAAM,iBAAiB,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACrD,MAAM,kBAAkB,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC;IAC/C,MAAM,mBAAmB,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACxD,MAAM,qBAAqB,GAAG,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC5D,MAAM,oBAAoB,GAAG,aAAa,CAAC,UAAU,CAAC;IACtD,MAAM,qBAAqB,GAAG,aAAa,CAAC,WAAW,IAAI,aAAa,CAAC,KAAK,CAAC;IAE/E,OAAO;QACL,OAAO;QACP,UAAU;QACV,eAAe;QACf,UAAU,EAAE,iBAAiB,IAAI,oBAAoB,IAAI,4BAAoB;QAC7E,WAAW,EAAE,kBAAkB,IAAI,qBAAqB,IAAI,IAAI;QAChE,YAAY,EAAE,mBAAmB,IAAI,aAAa,CAAC,YAAY,IAAI,IAAI;QACvE,cAAc,EAAE,qBAAqB,IAAI,aAAa,CAAC,cAAc,IAAI,IAAI;QAC7E,OAAO,EAAE;YACP,OAAO,EAAE,oBAAoB,CAAC,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC;YACjE,UAAU,EAAE,uBAAuB,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;YAC5E,WAAW,EAAE,kBAAkB,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;YAC1E,YAAY,EAAE,kBAAkB,CAAC,mBAAmB,EAAE,aAAa,CAAC,YAAY,CAAC;YACjF,cAAc,EAAE,kBAAkB,CAAC,qBAAqB,EAAE,aAAa,CAAC,cAAc,CAAC;YACvF,UAAU,EAAE,iBAAiB,CAAC,CAAC,8BAAkB,CAAC,qCAAqB;SACxE;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAC/B,aAAqC,EACrC,UAAqC,EAAE;IAEvC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;IACpD,MAAM,eAAe,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IAElE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAEtD,EAAE,CAAC;QACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,eAAe,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,eAAe,CAAC;IAE7C,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE;QACnC,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;QAC/C,QAAQ;KACT,CAAC,CAAC;IAEH,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,WAAW,CAAC,KAAoB,EAAE,gBAAyB;IACzE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createDefaultPromptAdapter, type PromptAdapter, type PromptChoice } from './prompts';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDefaultPromptAdapter = void 0;
|
|
4
|
+
var prompts_1 = require("./prompts");
|
|
5
|
+
Object.defineProperty(exports, "createDefaultPromptAdapter", { enumerable: true, get: function () { return prompts_1.createDefaultPromptAdapter; } });
|
|
6
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../../packages/reximo-cli/src/lib/prompt.ts"],"names":[],"mappings":";;;AAAA,qCAA8F;AAArF,qHAAA,0BAA0B,OAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Writable } from './output';
|
|
2
|
+
export type PromptChoice = {
|
|
3
|
+
label: string;
|
|
4
|
+
value: string;
|
|
5
|
+
};
|
|
6
|
+
export type PromptAdapter = {
|
|
7
|
+
isInteractive(): boolean;
|
|
8
|
+
promptText(label: string): Promise<string>;
|
|
9
|
+
promptPassword(label: string): Promise<string>;
|
|
10
|
+
select(label: string, choices: PromptChoice[]): Promise<string>;
|
|
11
|
+
};
|
|
12
|
+
type CreateDefaultPromptAdapterOptions = {
|
|
13
|
+
stdin: NodeJS.ReadStream;
|
|
14
|
+
stdout: Writable;
|
|
15
|
+
};
|
|
16
|
+
export declare function createDefaultPromptAdapter(options: CreateDefaultPromptAdapterOptions): PromptAdapter;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDefaultPromptAdapter = createDefaultPromptAdapter;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const node_readline_1 = tslib_1.__importDefault(require("node:readline"));
|
|
6
|
+
const promises_1 = require("node:readline/promises");
|
|
7
|
+
function trimAnswer(answer) {
|
|
8
|
+
return answer.trim();
|
|
9
|
+
}
|
|
10
|
+
async function askQuestion(stdin, stdout, message) {
|
|
11
|
+
const rl = (0, promises_1.createInterface)({
|
|
12
|
+
input: stdin,
|
|
13
|
+
output: stdout
|
|
14
|
+
});
|
|
15
|
+
try {
|
|
16
|
+
return trimAnswer(await rl.question(message));
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
rl.close();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function askHiddenQuestion(stdin, stdout, message) {
|
|
23
|
+
if (!stdin.isTTY || typeof stdin.setRawMode !== 'function') {
|
|
24
|
+
return askQuestion(stdin, stdout, message);
|
|
25
|
+
}
|
|
26
|
+
node_readline_1.default.emitKeypressEvents(stdin);
|
|
27
|
+
const previousRawMode = stdin.isRaw;
|
|
28
|
+
stdin.setRawMode(true);
|
|
29
|
+
stdin.resume();
|
|
30
|
+
stdout.write(message);
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
let value = '';
|
|
33
|
+
const cleanup = () => {
|
|
34
|
+
stdin.removeListener('keypress', onKeypress);
|
|
35
|
+
stdin.setRawMode(previousRawMode ?? false);
|
|
36
|
+
stdin.pause();
|
|
37
|
+
stdout.write('\n');
|
|
38
|
+
};
|
|
39
|
+
const onKeypress = (chunk, key) => {
|
|
40
|
+
if (key.name === 'return' || key.name === 'enter') {
|
|
41
|
+
cleanup();
|
|
42
|
+
resolve(trimAnswer(value));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (key.name === 'backspace') {
|
|
46
|
+
if (value.length > 0) {
|
|
47
|
+
value = value.slice(0, -1);
|
|
48
|
+
stdout.write('\b \b');
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (key.ctrl && key.name === 'c') {
|
|
53
|
+
cleanup();
|
|
54
|
+
reject(new Error('Prompt cancelled'));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (chunk) {
|
|
58
|
+
value += chunk;
|
|
59
|
+
stdout.write('*');
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
stdin.on('keypress', onKeypress);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function createDefaultPromptAdapter(options) {
|
|
66
|
+
const { stdin, stdout } = options;
|
|
67
|
+
return {
|
|
68
|
+
isInteractive() {
|
|
69
|
+
const stdoutWithTty = stdout;
|
|
70
|
+
return Boolean(stdin.isTTY && stdoutWithTty.isTTY);
|
|
71
|
+
},
|
|
72
|
+
promptText(label) {
|
|
73
|
+
return askQuestion(stdin, stdout, `${label}: `);
|
|
74
|
+
},
|
|
75
|
+
promptPassword(label) {
|
|
76
|
+
return askHiddenQuestion(stdin, stdout, `${label}: `);
|
|
77
|
+
},
|
|
78
|
+
async select(label, choices) {
|
|
79
|
+
if (choices.length === 0) {
|
|
80
|
+
throw new Error('No choices available');
|
|
81
|
+
}
|
|
82
|
+
for (const [index, choice] of choices.entries()) {
|
|
83
|
+
stdout.write(`${index + 1}. ${choice.label}\n`);
|
|
84
|
+
}
|
|
85
|
+
const answer = await askQuestion(stdin, stdout, `${label} [1-${choices.length}]: `);
|
|
86
|
+
const selectedIndex = Number.parseInt(answer, 10);
|
|
87
|
+
if (!Number.isInteger(selectedIndex) || selectedIndex < 1 || selectedIndex > choices.length) {
|
|
88
|
+
throw new Error(`Invalid selection: ${answer}`);
|
|
89
|
+
}
|
|
90
|
+
const selectedChoice = choices[selectedIndex - 1];
|
|
91
|
+
if (!selectedChoice) {
|
|
92
|
+
throw new Error(`Invalid selection: ${answer}`);
|
|
93
|
+
}
|
|
94
|
+
return selectedChoice.value;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../../packages/reximo-cli/src/lib/prompts.ts"],"names":[],"mappings":"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"}
|
package/src/lib/run-cli.d.ts
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
+
import { loadResolvedConfig } from './config';
|
|
1
2
|
import { type Writable } from './output';
|
|
3
|
+
import { type PromptAdapter } from './prompts';
|
|
4
|
+
import { type ReximoClient } from '../client/reximo-client';
|
|
2
5
|
export type CliDependencies = {
|
|
3
6
|
stdout: Writable;
|
|
4
7
|
stderr: Writable;
|
|
8
|
+
stdin?: NodeJS.ReadStream;
|
|
5
9
|
env?: NodeJS.ProcessEnv;
|
|
6
10
|
homeDirectory?: string;
|
|
11
|
+
promptAdapter?: PromptAdapter;
|
|
12
|
+
clientFactory?: (config: ReturnType<typeof loadResolvedConfig>) => ReximoClient;
|
|
7
13
|
};
|
|
8
14
|
export declare function runCli(args: string[], dependencies?: CliDependencies): Promise<number>;
|
package/src/lib/run-cli.js
CHANGED
|
@@ -6,17 +6,27 @@ const node_process_1 = tslib_1.__importDefault(require("node:process"));
|
|
|
6
6
|
const commander_1 = require("commander");
|
|
7
7
|
const config_1 = require("./config");
|
|
8
8
|
const output_1 = require("./output");
|
|
9
|
+
const prompts_1 = require("./prompts");
|
|
9
10
|
const package_json_1 = tslib_1.__importDefault(require("../../package.json"));
|
|
10
11
|
const reximo_client_1 = require("../client/reximo-client");
|
|
11
12
|
function normalizeArgs(args) {
|
|
12
13
|
return args[0] === '--' ? args.slice(1) : args;
|
|
13
14
|
}
|
|
14
15
|
function toRuntimeDependencies(dependencies) {
|
|
16
|
+
const stdout = dependencies?.stdout ?? node_process_1.default.stdout;
|
|
17
|
+
const stdin = dependencies?.stdin ?? node_process_1.default.stdin;
|
|
15
18
|
return {
|
|
16
|
-
stdout
|
|
19
|
+
stdout,
|
|
17
20
|
stderr: dependencies?.stderr ?? node_process_1.default.stderr,
|
|
21
|
+
stdin,
|
|
18
22
|
env: dependencies?.env ?? node_process_1.default.env,
|
|
19
|
-
homeDirectory: dependencies?.homeDirectory ?? node_process_1.default.env['HOME'] ?? node_process_1.default.cwd()
|
|
23
|
+
homeDirectory: dependencies?.homeDirectory ?? node_process_1.default.env['HOME'] ?? node_process_1.default.cwd(),
|
|
24
|
+
promptAdapter: dependencies?.promptAdapter ??
|
|
25
|
+
(0, prompts_1.createDefaultPromptAdapter)({
|
|
26
|
+
stdin,
|
|
27
|
+
stdout
|
|
28
|
+
}),
|
|
29
|
+
clientFactory: dependencies?.clientFactory ?? reximo_client_1.createReximoClient
|
|
20
30
|
};
|
|
21
31
|
}
|
|
22
32
|
function getOutputMode(command) {
|
|
@@ -29,7 +39,9 @@ function renderConfigSummary(config, includeSensitive) {
|
|
|
29
39
|
configPath: config.configPath,
|
|
30
40
|
configFileFound: config.configFileFound,
|
|
31
41
|
apiBaseUrl: config.apiBaseUrl,
|
|
32
|
-
|
|
42
|
+
accessToken: (0, config_1.redactToken)(config.accessToken, includeSensitive),
|
|
43
|
+
refreshToken: (0, config_1.redactToken)(config.refreshToken, includeSensitive),
|
|
44
|
+
organizationId: config.organizationId,
|
|
33
45
|
sources: config.sources
|
|
34
46
|
};
|
|
35
47
|
}
|
|
@@ -42,6 +54,76 @@ function writeResult(command, dependencies, textLines, jsonValue) {
|
|
|
42
54
|
(0, output_1.writeLine)(dependencies.stdout, line);
|
|
43
55
|
}
|
|
44
56
|
}
|
|
57
|
+
function requireConfiguredToken(config, field) {
|
|
58
|
+
const value = config[field];
|
|
59
|
+
if (!value) {
|
|
60
|
+
throw new Error(field === "accessToken" /* ConfiguredTokenField.AccessToken */
|
|
61
|
+
? 'No access token is configured. Run `reximo login` first.'
|
|
62
|
+
: 'No refresh token is configured. Run `reximo login` first.');
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
function requireConfiguredOrganization(config) {
|
|
67
|
+
if (!config.organizationId) {
|
|
68
|
+
throw new Error('No organization is configured. Run `reximo login` first.');
|
|
69
|
+
}
|
|
70
|
+
return config.organizationId;
|
|
71
|
+
}
|
|
72
|
+
async function resolveRequiredValue(currentValue, label, prompt) {
|
|
73
|
+
if (currentValue?.trim()) {
|
|
74
|
+
return currentValue.trim();
|
|
75
|
+
}
|
|
76
|
+
const prompted = await prompt();
|
|
77
|
+
if (!prompted) {
|
|
78
|
+
throw new Error(`${label} is required`);
|
|
79
|
+
}
|
|
80
|
+
return prompted;
|
|
81
|
+
}
|
|
82
|
+
function chooseDefaultOrganization(organizations) {
|
|
83
|
+
const activeOrganizations = organizations.filter((organization) => organization.isActive);
|
|
84
|
+
if (activeOrganizations.length === 0) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
if (activeOrganizations.length === 1) {
|
|
88
|
+
return activeOrganizations[0] ?? null;
|
|
89
|
+
}
|
|
90
|
+
const defaults = activeOrganizations.filter((organization) => organization.isDefault);
|
|
91
|
+
return defaults.length === 1 ? (defaults[0] ?? null) : null;
|
|
92
|
+
}
|
|
93
|
+
function extractTenantIdFromAuthResponse(auth) {
|
|
94
|
+
const tenantId = auth.user?.tenantId;
|
|
95
|
+
if (typeof tenantId !== 'string') {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const normalized = tenantId.trim();
|
|
99
|
+
return normalized.length > 0 ? normalized : null;
|
|
100
|
+
}
|
|
101
|
+
async function resolveOrganizationContext(promptAdapter, organizations, organizationId) {
|
|
102
|
+
const activeOrganizations = organizations.filter((organization) => organization.isActive);
|
|
103
|
+
if (organizationId) {
|
|
104
|
+
const matched = activeOrganizations.find((organization) => organization.organizationId === organizationId);
|
|
105
|
+
if (!matched) {
|
|
106
|
+
throw new Error(`Organization ${organizationId} is not available for this user`);
|
|
107
|
+
}
|
|
108
|
+
return matched;
|
|
109
|
+
}
|
|
110
|
+
const defaultOrganization = chooseDefaultOrganization(activeOrganizations);
|
|
111
|
+
if (defaultOrganization) {
|
|
112
|
+
return defaultOrganization;
|
|
113
|
+
}
|
|
114
|
+
if (activeOrganizations.length === 0) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
if (!promptAdapter.isInteractive()) {
|
|
118
|
+
throw new Error('Multiple organizations are available. Re-run with --organization-id or use an interactive terminal.');
|
|
119
|
+
}
|
|
120
|
+
const choices = activeOrganizations.map((organization) => ({
|
|
121
|
+
value: organization.organizationId,
|
|
122
|
+
label: `${organization.displayName ?? organization.name} (${organization.organizationId})`
|
|
123
|
+
}));
|
|
124
|
+
const selectedOrganizationId = await promptAdapter.select('Select organization', choices);
|
|
125
|
+
return (activeOrganizations.find((organization) => organization.organizationId === selectedOrganizationId) ?? null);
|
|
126
|
+
}
|
|
45
127
|
function createProgram(dependencies) {
|
|
46
128
|
const configOptions = {
|
|
47
129
|
env: dependencies.env,
|
|
@@ -62,30 +144,21 @@ function createProgram(dependencies) {
|
|
|
62
144
|
dependencies.stderr.write(message);
|
|
63
145
|
}
|
|
64
146
|
});
|
|
65
|
-
program
|
|
66
|
-
.command('hello')
|
|
67
|
-
.description('Print a greeting to validate the CLI entrypoint.')
|
|
68
|
-
.option('--name <name>', 'Name to include in the greeting')
|
|
69
|
-
.action(function action(options) {
|
|
70
|
-
const greeting = options.name ? `Hello, ${options.name}.` : 'Hello from @reximo/cli.';
|
|
71
|
-
writeResult(this, dependencies, [greeting], {
|
|
72
|
-
command: 'hello',
|
|
73
|
-
greeting
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
147
|
program
|
|
77
148
|
.command('info')
|
|
78
149
|
.description('Show package and runtime information for diagnostics.')
|
|
79
150
|
.action(function action() {
|
|
80
151
|
const config = (0, config_1.loadResolvedConfig)(configOptions);
|
|
81
|
-
const client =
|
|
152
|
+
const client = dependencies.clientFactory(config);
|
|
82
153
|
writeResult(this, dependencies, [
|
|
83
154
|
`${package_json_1.default.name} ${package_json_1.default.version}`,
|
|
84
155
|
`Node: ${node_process_1.default.version}`,
|
|
85
156
|
`Platform: ${node_process_1.default.platform}/${node_process_1.default.arch}`,
|
|
86
157
|
`Profile: ${config.profile}`,
|
|
87
|
-
`API base URL: ${config.apiBaseUrl ??
|
|
88
|
-
`
|
|
158
|
+
`API base URL: ${config.apiBaseUrl ?? config_1.DEFAULT_API_BASE_URL}`,
|
|
159
|
+
`Access token configured: ${config.accessToken ? 'yes' : 'no'}`,
|
|
160
|
+
`Refresh token configured: ${config.refreshToken ? 'yes' : 'no'}`,
|
|
161
|
+
`Organization: ${config.organizationId ?? '(not configured)'}`
|
|
89
162
|
], {
|
|
90
163
|
command: 'info',
|
|
91
164
|
package: {
|
|
@@ -101,7 +174,9 @@ function createProgram(dependencies) {
|
|
|
101
174
|
profile: config.profile,
|
|
102
175
|
apiBaseUrl: config.apiBaseUrl,
|
|
103
176
|
configuredForApi: client.isConfigured(),
|
|
104
|
-
|
|
177
|
+
hasAccessToken: Boolean(config.accessToken),
|
|
178
|
+
hasRefreshToken: Boolean(config.refreshToken),
|
|
179
|
+
organizationId: config.organizationId
|
|
105
180
|
}
|
|
106
181
|
});
|
|
107
182
|
});
|
|
@@ -118,13 +193,115 @@ function createProgram(dependencies) {
|
|
|
118
193
|
`Profile: ${config.profile}`,
|
|
119
194
|
`Config path: ${config.configPath}`,
|
|
120
195
|
`Config file found: ${config.configFileFound ? 'yes' : 'no'}`,
|
|
121
|
-
`API base URL: ${config.apiBaseUrl ??
|
|
122
|
-
`
|
|
196
|
+
`API base URL: ${config.apiBaseUrl ?? config_1.DEFAULT_API_BASE_URL}`,
|
|
197
|
+
`Access token: ${(0, config_1.redactToken)(config.accessToken, Boolean(options.includeSensitive)) ?? '(not configured)'}`,
|
|
198
|
+
`Refresh token: ${(0, config_1.redactToken)(config.refreshToken, Boolean(options.includeSensitive)) ?? '(not configured)'}`,
|
|
199
|
+
`Organization: ${config.organizationId ?? '(not configured)'}`
|
|
123
200
|
], {
|
|
124
201
|
command: 'config.show',
|
|
125
202
|
config: renderConfigSummary(config, Boolean(options.includeSensitive))
|
|
126
203
|
});
|
|
127
204
|
});
|
|
205
|
+
program
|
|
206
|
+
.command('login')
|
|
207
|
+
.description('Authenticate with the Reximo API and save auth state for the active profile.')
|
|
208
|
+
.option('--email <email>', 'Email address to authenticate with')
|
|
209
|
+
.option('--password <password>', 'Password to authenticate with')
|
|
210
|
+
.option('--organization-id <organizationId>', 'Organization ID to use as x-tenant-id')
|
|
211
|
+
.action(async function action(options) {
|
|
212
|
+
const config = (0, config_1.loadResolvedConfig)(configOptions);
|
|
213
|
+
const client = dependencies.clientFactory(config);
|
|
214
|
+
const email = await resolveRequiredValue(options.email, 'Email', () => dependencies.promptAdapter.promptText('Email'));
|
|
215
|
+
const password = await resolveRequiredValue(options.password, 'Password', () => dependencies.promptAdapter.promptPassword('Password'));
|
|
216
|
+
const loginResponse = await client.login({
|
|
217
|
+
email,
|
|
218
|
+
password,
|
|
219
|
+
organizationId: options.organizationId ?? null
|
|
220
|
+
});
|
|
221
|
+
const initialOrganizationId = options.organizationId ?? extractTenantIdFromAuthResponse(loginResponse);
|
|
222
|
+
const organizations = await client.getMyOrganizations({
|
|
223
|
+
accessToken: loginResponse.accessToken,
|
|
224
|
+
organizationId: initialOrganizationId
|
|
225
|
+
});
|
|
226
|
+
const selectedOrganization = await resolveOrganizationContext(dependencies.promptAdapter, organizations, options.organizationId);
|
|
227
|
+
const shouldRefreshForOrganizationSwitch = Boolean(selectedOrganization?.organizationId) &&
|
|
228
|
+
selectedOrganization?.organizationId !== initialOrganizationId;
|
|
229
|
+
const scopedAuth = shouldRefreshForOrganizationSwitch && selectedOrganization?.organizationId
|
|
230
|
+
? await client.refreshToken({
|
|
231
|
+
refreshToken: loginResponse.refreshToken,
|
|
232
|
+
organizationId: selectedOrganization.organizationId
|
|
233
|
+
})
|
|
234
|
+
: loginResponse;
|
|
235
|
+
(0, config_1.saveProfileConfig)({
|
|
236
|
+
apiBaseUrl: config.apiBaseUrl,
|
|
237
|
+
accessToken: scopedAuth.accessToken,
|
|
238
|
+
refreshToken: scopedAuth.refreshToken,
|
|
239
|
+
organizationId: selectedOrganization?.organizationId ?? null
|
|
240
|
+
}, configOptions);
|
|
241
|
+
writeResult(this, dependencies, [
|
|
242
|
+
'Login successful.',
|
|
243
|
+
`Profile: ${config.profile}`,
|
|
244
|
+
`API base URL: ${config.apiBaseUrl ?? config_1.DEFAULT_API_BASE_URL}`,
|
|
245
|
+
`Organization: ${selectedOrganization?.organizationId ?? '(none selected)'}`,
|
|
246
|
+
'Access token saved: yes',
|
|
247
|
+
'Refresh token saved: yes'
|
|
248
|
+
], {
|
|
249
|
+
command: 'login',
|
|
250
|
+
profile: config.profile,
|
|
251
|
+
apiBaseUrl: config.apiBaseUrl ?? config_1.DEFAULT_API_BASE_URL,
|
|
252
|
+
organizationId: selectedOrganization?.organizationId ?? null,
|
|
253
|
+
accessTokenSaved: true,
|
|
254
|
+
refreshTokenSaved: true
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
program
|
|
258
|
+
.command('me')
|
|
259
|
+
.alias('profile')
|
|
260
|
+
.description('Display the current authenticated user profile from /api/v1/auth/me.')
|
|
261
|
+
.action(async function action() {
|
|
262
|
+
const config = (0, config_1.loadResolvedConfig)(configOptions);
|
|
263
|
+
const client = dependencies.clientFactory(config);
|
|
264
|
+
const profile = await client.getMe({
|
|
265
|
+
accessToken: requireConfiguredToken(config, "accessToken" /* ConfiguredTokenField.AccessToken */),
|
|
266
|
+
organizationId: requireConfiguredOrganization(config)
|
|
267
|
+
});
|
|
268
|
+
writeResult(this, dependencies, [
|
|
269
|
+
`User ID: ${profile.userId}`,
|
|
270
|
+
`Email: ${profile.email ?? '(not set)'}`,
|
|
271
|
+
`Name: ${profile.displayName ?? profile.name ?? '(not set)'}`,
|
|
272
|
+
`Organization: ${profile.tenantId}`,
|
|
273
|
+
`Roles: ${profile.roles?.join(', ') || '(none)'}`,
|
|
274
|
+
`Permissions: ${profile.permissions?.join(', ') || '(none)'}`
|
|
275
|
+
], {
|
|
276
|
+
command: 'me',
|
|
277
|
+
profile
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
program
|
|
281
|
+
.command('logout')
|
|
282
|
+
.description('Log out of the current profile and remove stored tokens.')
|
|
283
|
+
.action(async function action() {
|
|
284
|
+
const config = (0, config_1.loadResolvedConfig)(configOptions);
|
|
285
|
+
const client = dependencies.clientFactory(config);
|
|
286
|
+
const accessToken = requireConfiguredToken(config, "accessToken" /* ConfiguredTokenField.AccessToken */);
|
|
287
|
+
const refreshToken = requireConfiguredToken(config, "refreshToken" /* ConfiguredTokenField.RefreshToken */);
|
|
288
|
+
const organizationId = requireConfiguredOrganization(config);
|
|
289
|
+
const response = await client.logout({
|
|
290
|
+
accessToken,
|
|
291
|
+
refreshToken,
|
|
292
|
+
organizationId
|
|
293
|
+
});
|
|
294
|
+
(0, config_1.saveProfileConfig)({
|
|
295
|
+
apiBaseUrl: config.apiBaseUrl ?? config_1.DEFAULT_API_BASE_URL,
|
|
296
|
+
accessToken: null,
|
|
297
|
+
refreshToken: null
|
|
298
|
+
}, configOptions);
|
|
299
|
+
writeResult(this, dependencies, [response.message ?? 'Logged out successfully.'], {
|
|
300
|
+
command: 'logout',
|
|
301
|
+
message: response.message ?? 'Logged out successfully',
|
|
302
|
+
tokensCleared: true
|
|
303
|
+
});
|
|
304
|
+
});
|
|
128
305
|
return program;
|
|
129
306
|
}
|
|
130
307
|
async function runCli(args, dependencies) {
|
package/src/lib/run-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-cli.js","sourceRoot":"","sources":["../../../../../packages/reximo-cli/src/lib/run-cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run-cli.js","sourceRoot":"","sources":["../../../../../packages/reximo-cli/src/lib/run-cli.ts"],"names":[],"mappings":"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"}
|