akundigital 0.2.0 → 0.4.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/README.md +3 -0
- package/dist/auth.d.ts +33 -0
- package/dist/auth.js +102 -1
- package/dist/auth.js.map +1 -1
- package/dist/commands.js +71 -8
- package/dist/commands.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,7 +16,10 @@ The CLI provides these commands:
|
|
|
16
16
|
- `help` — show available commands
|
|
17
17
|
- `version` — show the installed version
|
|
18
18
|
- `login <email> <password>` — authenticate with AkunDigital and save tokens locally
|
|
19
|
+
- `login --device` — browser-assisted login: prints a verification URL and code, then waits for approval in a browser (useful on headless/remote machines)
|
|
19
20
|
- `profile` — fetch and print the current user profile
|
|
21
|
+
- `orders` — list your most recent orders (max 10, newest first)
|
|
22
|
+
- `subscriptions` — list subscriptions (admin, max 10)
|
|
20
23
|
|
|
21
24
|
Authentication tokens are stored in `~/.config/akundigital/tokens.json`. Expired access tokens are refreshed automatically with the saved refresh token.
|
|
22
25
|
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
import type { TokenSet, TokenStore } from "./token-store.js";
|
|
2
2
|
type FetchLike = typeof fetch;
|
|
3
3
|
export declare const login: (email: string, password: string, tokenStore: TokenStore, fetchImpl?: FetchLike, clientId?: string) => Promise<TokenSet>;
|
|
4
|
+
export type DevicePrompt = {
|
|
5
|
+
verificationUri: string;
|
|
6
|
+
userCode: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const loginWithDevice: (tokenStore: TokenStore, fetchImpl?: FetchLike, onPrompt?: (prompt: DevicePrompt) => void, sleepImpl?: (milliseconds: number) => Promise<void>) => Promise<TokenSet>;
|
|
4
9
|
export declare const getProfile: (tokenStore: TokenStore, fetchImpl?: FetchLike, clientId?: string, now?: number) => Promise<unknown>;
|
|
10
|
+
export type Order = {
|
|
11
|
+
id: string;
|
|
12
|
+
platform_name: string;
|
|
13
|
+
plan_type: string;
|
|
14
|
+
plan_duration: number;
|
|
15
|
+
status: string;
|
|
16
|
+
total_amount?: number;
|
|
17
|
+
created_at: string;
|
|
18
|
+
};
|
|
19
|
+
export declare const maxOrdersLimit = 10;
|
|
20
|
+
export declare const getOrders: (tokenStore: TokenStore, fetchImpl?: FetchLike, clientId?: string, now?: number) => Promise<Order[]>;
|
|
21
|
+
export type Subscription = {
|
|
22
|
+
id: string;
|
|
23
|
+
user_id: string;
|
|
24
|
+
platform_slug: string;
|
|
25
|
+
platform_name: string;
|
|
26
|
+
order_id: string;
|
|
27
|
+
plan_type: string;
|
|
28
|
+
plan_duration: number;
|
|
29
|
+
status: string;
|
|
30
|
+
credential_id?: string;
|
|
31
|
+
credential_slot_id?: string;
|
|
32
|
+
subscription_expires_at?: string;
|
|
33
|
+
created_at: string;
|
|
34
|
+
updated_at: string;
|
|
35
|
+
};
|
|
36
|
+
export declare const maxSubscriptionsLimit = 10;
|
|
37
|
+
export declare const getSubscriptions: (tokenStore: TokenStore, fetchImpl?: FetchLike, clientId?: string, now?: number) => Promise<Subscription[]>;
|
|
5
38
|
export {};
|
package/dist/auth.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { createTokenSet, isTokenExpired } from "./token-store.js";
|
|
2
2
|
const cognitoEndpoint = "https://cognito-idp.ap-southeast-3.amazonaws.com/";
|
|
3
3
|
const defaultClientId = "6vcd500elmtpkiks9qp83vs8fh";
|
|
4
|
-
const
|
|
4
|
+
const apiBaseUrl = "https://6cr9nj44pd.execute-api.ap-southeast-3.amazonaws.com";
|
|
5
|
+
const profileEndpoint = `${apiBaseUrl}/v1/profile`;
|
|
6
|
+
const ordersEndpoint = `${apiBaseUrl}/v1/orders`;
|
|
7
|
+
const subscriptionsEndpoint = `${apiBaseUrl}/v1/admin/subscriptions`;
|
|
8
|
+
const deviceStartEndpoint = `${apiBaseUrl}/v1/auth/cli/device`;
|
|
9
|
+
const deviceTokenEndpoint = `${apiBaseUrl}/v1/auth/cli/token`;
|
|
5
10
|
const requestCognito = async (target, parameters, fetchImpl, clientId) => {
|
|
6
11
|
const response = await fetchImpl(cognitoEndpoint, {
|
|
7
12
|
method: "POST",
|
|
@@ -35,6 +40,54 @@ export const login = async (email, password, tokenStore, fetchImpl = fetch, clie
|
|
|
35
40
|
await tokenStore.save(tokens);
|
|
36
41
|
return tokens;
|
|
37
42
|
};
|
|
43
|
+
const sleep = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
44
|
+
const startDeviceLogin = async (fetchImpl) => {
|
|
45
|
+
const response = await fetchImpl(deviceStartEndpoint, {
|
|
46
|
+
method: "POST",
|
|
47
|
+
headers: { "Content-Type": "application/json" },
|
|
48
|
+
body: JSON.stringify({}),
|
|
49
|
+
});
|
|
50
|
+
const body = await response.json();
|
|
51
|
+
if (!response.ok || !body.success || !body.data) {
|
|
52
|
+
throw new Error(body.error ?? "Failed to start device login");
|
|
53
|
+
}
|
|
54
|
+
return body.data;
|
|
55
|
+
};
|
|
56
|
+
const pollDeviceToken = async (deviceCode, fetchImpl) => {
|
|
57
|
+
const response = await fetchImpl(deviceTokenEndpoint, {
|
|
58
|
+
method: "POST",
|
|
59
|
+
headers: { "Content-Type": "application/json" },
|
|
60
|
+
body: JSON.stringify({ device_code: deviceCode }),
|
|
61
|
+
});
|
|
62
|
+
const body = await response.json();
|
|
63
|
+
if (body.success && body.data) {
|
|
64
|
+
return body.data;
|
|
65
|
+
}
|
|
66
|
+
if (body.code === "AUTHORIZATION_PENDING") {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
throw new Error(body.error ?? "Device login failed");
|
|
70
|
+
};
|
|
71
|
+
export const loginWithDevice = async (tokenStore, fetchImpl = fetch, onPrompt, sleepImpl = sleep) => {
|
|
72
|
+
const session = await startDeviceLogin(fetchImpl);
|
|
73
|
+
onPrompt?.({ verificationUri: session.verification_uri, userCode: session.user_code });
|
|
74
|
+
const deadline = Date.now() + session.expires_in * 1000;
|
|
75
|
+
while (Date.now() < deadline) {
|
|
76
|
+
await sleepImpl(session.interval * 1000);
|
|
77
|
+
const result = await pollDeviceToken(session.device_code, fetchImpl);
|
|
78
|
+
if (result) {
|
|
79
|
+
const tokens = createTokenSet({
|
|
80
|
+
AccessToken: result.access_token,
|
|
81
|
+
IdToken: result.id_token,
|
|
82
|
+
RefreshToken: result.refresh_token,
|
|
83
|
+
ExpiresIn: result.expires_in,
|
|
84
|
+
}, result.refresh_token);
|
|
85
|
+
await tokenStore.save(tokens);
|
|
86
|
+
return tokens;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
throw new Error("Device login timed out. Run `akundigital login --device` again.");
|
|
90
|
+
};
|
|
38
91
|
const refresh = async (tokens, tokenStore, fetchImpl, clientId) => {
|
|
39
92
|
const response = await requestCognito("REFRESH_TOKEN_AUTH", { REFRESH_TOKEN: tokens.refreshToken }, fetchImpl, clientId);
|
|
40
93
|
const result = getAuthenticationResult(response);
|
|
@@ -65,4 +118,52 @@ export const getProfile = async (tokenStore, fetchImpl = fetch, clientId = defau
|
|
|
65
118
|
}
|
|
66
119
|
return body.data ?? body;
|
|
67
120
|
};
|
|
121
|
+
export const maxOrdersLimit = 10;
|
|
122
|
+
export const getOrders = async (tokenStore, fetchImpl = fetch, clientId = defaultClientId, now = Date.now()) => {
|
|
123
|
+
let tokens = await tokenStore.load();
|
|
124
|
+
if (!tokens) {
|
|
125
|
+
throw new Error("Not logged in. Run `akundigital login <email> <password>` first.");
|
|
126
|
+
}
|
|
127
|
+
if (isTokenExpired(tokens, now)) {
|
|
128
|
+
tokens = await refresh(tokens, tokenStore, fetchImpl, clientId);
|
|
129
|
+
}
|
|
130
|
+
let response = await fetchImpl(ordersEndpoint, {
|
|
131
|
+
headers: { Authorization: `Bearer ${tokens.accessToken}` },
|
|
132
|
+
});
|
|
133
|
+
if (response.status === 401) {
|
|
134
|
+
tokens = await refresh(tokens, tokenStore, fetchImpl, clientId);
|
|
135
|
+
response = await fetchImpl(ordersEndpoint, {
|
|
136
|
+
headers: { Authorization: `Bearer ${tokens.accessToken}` },
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
const body = await response.json();
|
|
140
|
+
if (!response.ok || !body.success || !body.data) {
|
|
141
|
+
throw new Error(body.error ?? "Failed to get orders");
|
|
142
|
+
}
|
|
143
|
+
return body.data.orders.slice(0, maxOrdersLimit);
|
|
144
|
+
};
|
|
145
|
+
export const maxSubscriptionsLimit = 10;
|
|
146
|
+
export const getSubscriptions = async (tokenStore, fetchImpl = fetch, clientId = defaultClientId, now = Date.now()) => {
|
|
147
|
+
let tokens = await tokenStore.load();
|
|
148
|
+
if (!tokens) {
|
|
149
|
+
throw new Error("Not logged in. Run `akundigital login <email> <password>` first.");
|
|
150
|
+
}
|
|
151
|
+
if (isTokenExpired(tokens, now)) {
|
|
152
|
+
tokens = await refresh(tokens, tokenStore, fetchImpl, clientId);
|
|
153
|
+
}
|
|
154
|
+
let response = await fetchImpl(subscriptionsEndpoint, {
|
|
155
|
+
headers: { Authorization: `Bearer ${tokens.accessToken}` },
|
|
156
|
+
});
|
|
157
|
+
if (response.status === 401) {
|
|
158
|
+
tokens = await refresh(tokens, tokenStore, fetchImpl, clientId);
|
|
159
|
+
response = await fetchImpl(subscriptionsEndpoint, {
|
|
160
|
+
headers: { Authorization: `Bearer ${tokens.accessToken}` },
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
const body = await response.json();
|
|
164
|
+
if (!response.ok || !body.success || !body.data) {
|
|
165
|
+
throw new Error(body.error ?? "Failed to get subscriptions");
|
|
166
|
+
}
|
|
167
|
+
return body.data.subscriptions.slice(0, maxSubscriptionsLimit);
|
|
168
|
+
};
|
|
68
169
|
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,eAAe,GAAG,mDAAmD,CAAC;AAC5E,MAAM,eAAe,GAAG,4BAA4B,CAAC;AACrD,MAAM,eAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,eAAe,GAAG,mDAAmD,CAAC;AAC5E,MAAM,eAAe,GAAG,4BAA4B,CAAC;AACrD,MAAM,UAAU,GAAG,6DAA6D,CAAC;AACjF,MAAM,eAAe,GAAG,GAAG,UAAU,aAAa,CAAC;AACnD,MAAM,cAAc,GAAG,GAAG,UAAU,YAAY,CAAC;AACjD,MAAM,qBAAqB,GAAG,GAAG,UAAU,yBAAyB,CAAC;AACrE,MAAM,mBAAmB,GAAG,GAAG,UAAU,qBAAqB,CAAC;AAC/D,MAAM,mBAAmB,GAAG,GAAG,UAAU,oBAAoB,CAAC;AAiB9D,MAAM,cAAc,GAAG,KAAK,EAC1B,MAAmD,EACnD,UAAkC,EAClC,SAAoB,EACpB,QAAgB,EACU,EAAE;IAC5B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,eAAe,EAAE;QAChD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,4BAA4B;YAC5C,cAAc,EAAE,gDAAgD;SACjE;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;KAC3F,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAqB,CAAC;IACtD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,QAAyB,EAKxD,EAAE;IACF,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,WAAW,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,aAAa,IAAI,sCAAsC,CAAC,CAAC;IACxG,CAAC;IACD,OAAO;QACL,WAAW,EAAE,QAAQ,CAAC,oBAAoB,CAAC,WAAW;QACtD,OAAO,EAAE,QAAQ,CAAC,oBAAoB,CAAC,OAAO;QAC9C,YAAY,EAAE,QAAQ,CAAC,oBAAoB,CAAC,YAAY;QACxD,SAAS,EAAE,QAAQ,CAAC,oBAAoB,CAAC,SAAS;KACnD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,EACxB,KAAa,EACb,QAAgB,EAChB,UAAsB,EACtB,YAAuB,KAAK,EAC5B,QAAQ,GAAG,eAAe,EACP,EAAE;IACrB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC1H,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AA6BF,MAAM,KAAK,GAAG,CAAC,YAAoB,EAAiB,EAAE,CACpD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AAE9D,MAAM,gBAAgB,GAAG,KAAK,EAAE,SAAoB,EAAgC,EAAE;IACpF,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,mBAAmB,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;KACzB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAsC,CAAC;IACvE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,8BAA8B,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,EAAE,UAAkB,EAAE,SAAoB,EAA4C,EAAE;IACnH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,mBAAmB,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;KAClD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAsC,CAAC;IACvE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,UAAsB,EACtB,YAAuB,KAAK,EAC5B,QAAyC,EACzC,YAAqD,KAAK,EACvC,EAAE;IACrB,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAClD,QAAQ,EAAE,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,gBAAgB,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAEvF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IACxD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACrE,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,cAAc,CAAC;gBAC5B,WAAW,EAAE,MAAM,CAAC,YAAY;gBAChC,OAAO,EAAE,MAAM,CAAC,QAAQ;gBACxB,YAAY,EAAE,MAAM,CAAC,aAAa;gBAClC,SAAS,EAAE,MAAM,CAAC,UAAU;aAC7B,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YACzB,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,KAAK,EACnB,MAAgB,EAChB,UAAsB,EACtB,SAAoB,EACpB,QAAgB,EACG,EAAE;IACrB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,oBAAoB,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzH,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IACpE,MAAM,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACvC,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,UAAsB,EACtB,YAAuB,KAAK,EAC5B,QAAQ,GAAG,eAAe,EAC1B,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EACE,EAAE;IACpB,IAAI,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,QAAQ,GAAG,MAAM,SAAS,CAAC,eAAe,EAAE;QAC9C,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE,EAAE;KAC3D,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChE,QAAQ,GAAG,MAAM,SAAS,CAAC,eAAe,EAAE;YAC1C,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE,EAAE;SAC3D,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAwC,CAAC;IACzE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,uBAAuB,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AAC3B,CAAC,CAAC;AAYF,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,UAAsB,EACtB,YAAuB,KAAK,EAC5B,QAAQ,GAAG,eAAe,EAC1B,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EACE,EAAE;IACpB,IAAI,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,QAAQ,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE;QAC7C,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE,EAAE;KAC3D,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChE,QAAQ,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE;YACzC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE,EAAE;SAC3D,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAsC,CAAC;IACvE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,sBAAsB,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AACnD,CAAC,CAAC;AAkBF,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,UAAsB,EACtB,YAAuB,KAAK,EAC5B,QAAQ,GAAG,eAAe,EAC1B,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EACS,EAAE;IAC3B,IAAI,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,QAAQ,GAAG,MAAM,SAAS,CAAC,qBAAqB,EAAE;QACpD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE,EAAE;KAC3D,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChE,QAAQ,GAAG,MAAM,SAAS,CAAC,qBAAqB,EAAE;YAChD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE,EAAE;SAC3D,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAoD,CAAC;IACrF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,6BAA6B,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;AACjE,CAAC,CAAC"}
|
package/dist/commands.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getProfile, login } from "./auth.js";
|
|
1
|
+
import { getOrders, getProfile, getSubscriptions, login, loginWithDevice } from "./auth.js";
|
|
2
2
|
import { createTokenStore } from "./token-store.js";
|
|
3
3
|
export const createCommands = (version) => ({
|
|
4
4
|
help: {
|
|
@@ -8,10 +8,12 @@ export const createCommands = (version) => ({
|
|
|
8
8
|
"Usage: akundigital <command> [arguments]",
|
|
9
9
|
"",
|
|
10
10
|
"Commands:",
|
|
11
|
-
" help
|
|
12
|
-
" version
|
|
13
|
-
" login
|
|
14
|
-
" profile
|
|
11
|
+
" help Show available commands",
|
|
12
|
+
" version Show the installed version",
|
|
13
|
+
" login Log in with email and password, or `login --device` for browser-assisted login",
|
|
14
|
+
" profile Show the current user profile",
|
|
15
|
+
" orders List your most recent orders (max 10)",
|
|
16
|
+
" subscriptions List subscriptions (admin, max 10)",
|
|
15
17
|
"",
|
|
16
18
|
"Run `akundigital <command> --help` for command-specific help.",
|
|
17
19
|
].join("\n"));
|
|
@@ -26,10 +28,27 @@ export const createCommands = (version) => ({
|
|
|
26
28
|
},
|
|
27
29
|
},
|
|
28
30
|
login: {
|
|
29
|
-
description: "Log in with email and password",
|
|
31
|
+
description: "Log in with email and password, or `login --device` for browser-assisted login",
|
|
30
32
|
run: async ({ args, output, error }) => {
|
|
31
|
-
if (args.
|
|
32
|
-
error("Usage: akundigital login <email> <password
|
|
33
|
+
if (args.includes("--help")) {
|
|
34
|
+
error("Usage: akundigital login <email> <password>\n or: akundigital login --device");
|
|
35
|
+
return 1;
|
|
36
|
+
}
|
|
37
|
+
if (args.includes("--device")) {
|
|
38
|
+
try {
|
|
39
|
+
await loginWithDevice(createTokenStore(), fetch, ({ verificationUri, userCode }) => {
|
|
40
|
+
output(`Open ${verificationUri} in a browser and enter code: ${userCode}`);
|
|
41
|
+
});
|
|
42
|
+
output("Logged in successfully.");
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
catch (loginError) {
|
|
46
|
+
error(loginError instanceof Error ? loginError.message : "Authentication failed");
|
|
47
|
+
return 1;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (args.length !== 2) {
|
|
51
|
+
error("Usage: akundigital login <email> <password>\n or: akundigital login --device");
|
|
33
52
|
return 1;
|
|
34
53
|
}
|
|
35
54
|
try {
|
|
@@ -61,6 +80,50 @@ export const createCommands = (version) => ({
|
|
|
61
80
|
}
|
|
62
81
|
},
|
|
63
82
|
},
|
|
83
|
+
orders: {
|
|
84
|
+
description: "List your most recent orders (max 10)",
|
|
85
|
+
run: async ({ args, output, error }) => {
|
|
86
|
+
if (args.length !== 0) {
|
|
87
|
+
error("Usage: akundigital orders");
|
|
88
|
+
return 1;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const orders = await getOrders(createTokenStore());
|
|
92
|
+
if (orders.length === 0) {
|
|
93
|
+
output("No orders found.");
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
output(JSON.stringify(orders, null, 2));
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
catch (ordersError) {
|
|
100
|
+
error(ordersError instanceof Error ? ordersError.message : "Failed to get orders");
|
|
101
|
+
return 1;
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
subscriptions: {
|
|
106
|
+
description: "List subscriptions (admin, max 10)",
|
|
107
|
+
run: async ({ args, output, error }) => {
|
|
108
|
+
if (args.length !== 0) {
|
|
109
|
+
error("Usage: akundigital subscriptions");
|
|
110
|
+
return 1;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const subscriptions = await getSubscriptions(createTokenStore());
|
|
114
|
+
if (subscriptions.length === 0) {
|
|
115
|
+
output("No subscriptions found.");
|
|
116
|
+
return 0;
|
|
117
|
+
}
|
|
118
|
+
output(JSON.stringify(subscriptions, null, 2));
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
catch (subscriptionsError) {
|
|
122
|
+
error(subscriptionsError instanceof Error ? subscriptionsError.message : "Failed to get subscriptions");
|
|
123
|
+
return 1;
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
},
|
|
64
127
|
});
|
|
65
128
|
export const runCommand = async (commandName, args, version, output, error) => {
|
|
66
129
|
const commands = createCommands(version);
|
package/dist/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAapD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAA2B,EAAE,CAAC,CAAC;IAC3E,IAAI,EAAE;QACJ,WAAW,EAAE,yBAAyB;QACtC,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACxB,MAAM,CAAC;gBACL,0CAA0C;gBAC1C,EAAE;gBACF,WAAW;gBACX,0CAA0C;gBAC1C,6CAA6C;gBAC7C,iGAAiG;gBACjG,gDAAgD;gBAChD,wDAAwD;gBACxD,qDAAqD;gBACrD,EAAE;gBACF,+DAA+D;aAChE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACd,OAAO,CAAC,CAAC;QACX,CAAC;KACF;IACD,OAAO,EAAE;QACP,WAAW,EAAE,4BAA4B;QACzC,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACxB,MAAM,CAAC,OAAO,CAAC,CAAC;YAChB,OAAO,CAAC,CAAC;QACX,CAAC;KACF;IACD,KAAK,EAAE;QACL,WAAW,EAAE,gFAAgF;QAC7F,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,KAAK,CAAC,gFAAgF,CAAC,CAAC;gBACxF,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,eAAe,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,EAAE;wBACjF,MAAM,CAAC,QAAQ,eAAe,iCAAiC,QAAQ,EAAE,CAAC,CAAC;oBAC7E,CAAC,CAAC,CAAC;oBACH,MAAM,CAAC,yBAAyB,CAAC,CAAC;oBAClC,OAAO,CAAC,CAAC;gBACX,CAAC;gBAAC,OAAO,UAAU,EAAE,CAAC;oBACpB,KAAK,CAAC,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;oBAClF,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,KAAK,CAAC,gFAAgF,CAAC,CAAC;gBACxF,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBAClD,MAAM,CAAC,yBAAyB,CAAC,CAAC;gBAClC,OAAO,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,KAAK,CAAC,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;gBAClF,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;KACF;IACD,OAAO,EAAE;QACP,WAAW,EAAE,+BAA+B;QAC5C,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBACpC,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACrD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACzC,OAAO,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,KAAK,CAAC,YAAY,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;gBACtF,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;KACF;IACD,MAAM,EAAE;QACN,WAAW,EAAE,uCAAuC;QACpD,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBACnC,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxB,MAAM,CAAC,kBAAkB,CAAC,CAAC;oBAC3B,OAAO,CAAC,CAAC;gBACX,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACxC,OAAO,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,KAAK,CAAC,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;gBACnF,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;KACF;IACD,aAAa,EAAE;QACb,WAAW,EAAE,oCAAoC;QACjD,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBAC1C,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACjE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/B,MAAM,CAAC,yBAAyB,CAAC,CAAC;oBAClC,OAAO,CAAC,CAAC;gBACX,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,kBAAkB,EAAE,CAAC;gBAC5B,KAAK,CAAC,kBAAkB,YAAY,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC;gBACxG,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;KACF;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,WAA+B,EAC/B,IAAc,EACd,OAAe,EACf,MAAiC,EACjC,KAAgC,EACf,EAAE;IACnB,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEzC,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACrE,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,WAAW,KAAK,WAAW,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACxD,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;QACzC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9C,CAAC,CAAC"}
|