@lightdash/cli 3.86.0 → 3.88.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +18 -0
  2. package/dist/.tsbuildinfo.build +1 -1
  3. package/dist/agentConnections/agentTokenProvider.d.ts.map +1 -1
  4. package/dist/agentConnections/agentTokenProvider.js +9 -5
  5. package/dist/agentConnections/commandPolicy.d.ts.map +1 -1
  6. package/dist/agentConnections/commandPolicy.js +1 -0
  7. package/dist/agentConnections/initialToken.d.ts.map +1 -1
  8. package/dist/agentConnections/initialToken.js +2 -0
  9. package/dist/agentConnections/personalRecovery.js +1 -1
  10. package/dist/analytics/analytics.js +1 -1
  11. package/dist/config.d.ts +2 -0
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +19 -11
  14. package/dist/credentials.d.ts +5 -0
  15. package/dist/credentials.d.ts.map +1 -1
  16. package/dist/credentials.js +11 -2
  17. package/dist/handlers/apps/createApp.d.ts.map +1 -1
  18. package/dist/handlers/apps/createApp.js +1 -3
  19. package/dist/handlers/apps/preview.d.ts.map +1 -1
  20. package/dist/handlers/apps/preview.js +12 -10
  21. package/dist/handlers/apps/previewProxy.d.ts +1 -0
  22. package/dist/handlers/apps/previewProxy.d.ts.map +1 -1
  23. package/dist/handlers/apps/previewProxy.js +70 -44
  24. package/dist/handlers/dbt/apiClient.d.ts.map +1 -1
  25. package/dist/handlers/dbt/apiClient.js +20 -12
  26. package/dist/handlers/diagnostics.d.ts.map +1 -1
  27. package/dist/handlers/diagnostics.js +2 -1
  28. package/dist/handlers/download.d.ts.map +1 -1
  29. package/dist/handlers/download.js +4 -9
  30. package/dist/handlers/login/pat.d.ts.map +1 -1
  31. package/dist/handlers/login/pat.js +2 -0
  32. package/dist/handlers/login.d.ts.map +1 -1
  33. package/dist/handlers/login.js +8 -2
  34. package/dist/handlers/logout.d.ts +3 -0
  35. package/dist/handlers/logout.d.ts.map +1 -0
  36. package/dist/handlers/logout.js +67 -0
  37. package/dist/handlers/oauthLogin.d.ts +1 -1
  38. package/dist/handlers/oauthLogin.d.ts.map +1 -1
  39. package/dist/handlers/oauthLogin.js +64 -31
  40. package/dist/handlers/renameHandler.d.ts.map +1 -1
  41. package/dist/handlers/renameHandler.js +3 -3
  42. package/dist/handlers/slugUpdate.d.ts.map +1 -1
  43. package/dist/handlers/slugUpdate.js +3 -3
  44. package/dist/handlers/utils.d.ts.map +1 -1
  45. package/dist/handlers/utils.js +1 -0
  46. package/dist/index.js +6 -0
  47. package/dist/personalLogin/fixtures.d.ts +3 -0
  48. package/dist/personalLogin/fixtures.d.ts.map +1 -0
  49. package/dist/personalLogin/fixtures.js +20 -0
  50. package/dist/personalLogin/instanceKey.d.ts +2 -0
  51. package/dist/personalLogin/instanceKey.d.ts.map +1 -0
  52. package/dist/personalLogin/instanceKey.js +23 -0
  53. package/dist/personalLogin/schema.d.ts +28 -0
  54. package/dist/personalLogin/schema.d.ts.map +1 -0
  55. package/dist/personalLogin/schema.js +69 -0
  56. package/dist/personalLogin/store.d.ts +24 -0
  57. package/dist/personalLogin/store.d.ts.map +1 -0
  58. package/dist/personalLogin/store.js +124 -0
  59. package/dist/personalLogin/tokenProvider.d.ts +31 -0
  60. package/dist/personalLogin/tokenProvider.d.ts.map +1 -0
  61. package/dist/personalLogin/tokenProvider.js +180 -0
  62. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/handlers/download.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/handlers/download.ts"],"names":[],"mappings":"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"}
@@ -1272,12 +1272,7 @@ const downloadHandler = async (options) => {
1272
1272
  const config = await ((0, credentials_1.getAgentConnectionSelection)() === null
1273
1273
  ? (0, config_1.getConfig)()
1274
1274
  : (0, config_1.getConfig)({ readOnly: true }));
1275
- if ((0, credentials_1.getAgentConnectionSelection)() !== null) {
1276
- await (0, credentials_1.resolveCredential)(config);
1277
- }
1278
- else if (!config.context?.apiKey || !config.context.serverUrl) {
1279
- throw new common_1.AuthorizationError(`Not logged in. Run 'lightdash login --help'`);
1280
- }
1275
+ await (0, credentials_1.resolveCredential)(config);
1281
1276
  if (isOrganizationDownload) {
1282
1277
  await (0, organizationContent_1.downloadOrganizationContent)({
1283
1278
  customPath: options.path,
@@ -2381,9 +2376,9 @@ const uploadHandler = async (options) => {
2381
2376
  const config = await ((0, credentials_1.getAgentConnectionSelection)() === null
2382
2377
  ? (0, config_1.getConfig)()
2383
2378
  : (0, config_1.getConfig)({ readOnly: true }));
2384
- if (!config.context?.apiKey || !config.context.serverUrl) {
2385
- throw new common_1.AuthorizationError(`Not logged in. Run 'lightdash login --help'`);
2386
- }
2379
+ await (0, credentials_1.resolveCredential)(config);
2380
+ if (!config.context?.serverUrl)
2381
+ throw new Error("Not logged in. Run 'lightdash login --help'");
2387
2382
  if (isOrganizationUpload) {
2388
2383
  await (0, organizationContent_1.uploadOrganizationContent)({
2389
2384
  customPath: contentPathOption,
@@ -1 +1 @@
1
- {"version":3,"file":"pat.d.ts","sourceRoot":"","sources":["../../../src/handlers/login/pat.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,2BAA2B,YAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAC1B,MAAM,kBACI,MAAM,KACtB,OAAO,CAAC,MAAM,CA0BhB,CAAC"}
1
+ {"version":3,"file":"pat.d.ts","sourceRoot":"","sources":["../../../src/handlers/login/pat.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,2BAA2B,YAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAC1B,MAAM,kBACI,MAAM,KACtB,OAAO,CAAC,MAAM,CA2BhB,CAAC"}
@@ -5,6 +5,7 @@ const tslib_1 = require("tslib");
5
5
  const common_1 = require("@lightdash/common");
6
6
  const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
7
7
  const credentials_1 = require("../../credentials");
8
+ const env_1 = require("../../env");
8
9
  const generatePersonalAccessToken = async (headers, url, hoursToExpire = 720) => {
9
10
  (0, credentials_1.refuseAgentConnection)(true);
10
11
  const patUrl = new URL(`/api/v1/user/me/personal-access-tokens`, url).href;
@@ -21,6 +22,7 @@ const generatePersonalAccessToken = async (headers, url, hoursToExpire = 720) =>
21
22
  headers: {
22
23
  'Content-Type': 'application/json',
23
24
  ...headers,
25
+ 'User-Agent': `lightdash-cli/${env_1.CLI_VERSION}`,
24
26
  },
25
27
  });
26
28
  if (!patResponse.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/handlers/login.ts"],"names":[],"mappings":"AAmBA,KAAK,YAAY,GAAG;IAChB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AA8CF;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,UACzB,MAAM,GAAG,SAAS,QACpB,MAAM,CAAC,UAAU,KACvB,OAGF,CAAC;AA6HF,eAAO,MAAM,KAAK,aACJ,MAAM,GAAG,SAAS,WACnB,YAAY,kBAqKxB,CAAC"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/handlers/login.ts"],"names":[],"mappings":"AAqBA,KAAK,YAAY,GAAG;IAChB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AA8CF;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,UACzB,MAAM,GAAG,SAAS,QACpB,MAAM,CAAC,UAAU,KACvB,OAGF,CAAC;AA8HF,eAAO,MAAM,KAAK,aACJ,MAAM,GAAG,SAAS,WACnB,YAAY,kBAuKxB,CAAC"}
@@ -9,7 +9,9 @@ const url_1 = require("url");
9
9
  const analytics_1 = require("../analytics/analytics");
10
10
  const config_1 = require("../config");
11
11
  const credentials_1 = require("../credentials");
12
+ const env_1 = require("../env");
12
13
  const globalState_1 = tslib_1.__importDefault(require("../globalState"));
14
+ const store_1 = require("../personalLogin/store");
13
15
  const styles = tslib_1.__importStar(require("../styles"));
14
16
  const apiClient_1 = require("./dbt/apiClient");
15
17
  const oauthLogin_1 = require("./oauthLogin");
@@ -116,6 +118,7 @@ const loginWithEmailPassword = async (url, email, password) => {
116
118
  headers: {
117
119
  'Content-Type': 'application/json',
118
120
  Cookie: cookies,
121
+ 'User-Agent': `lightdash-cli/${env_1.CLI_VERSION}`,
119
122
  },
120
123
  body: JSON.stringify({
121
124
  description: 'Lightdash CLI',
@@ -216,7 +219,10 @@ const login = async (urlInput, options) => {
216
219
  else {
217
220
  loginResult = await (0, oauthLogin_1.loginWithOauth)(url, options.oauthPort);
218
221
  }
219
- const { userUuid, token, organizationUuid } = loginResult;
222
+ const { userUuid, organizationUuid } = loginResult;
223
+ const token = 'token' in loginResult ? loginResult.token : undefined;
224
+ if (token !== undefined)
225
+ await new store_1.PersonalLoginStore().remove(url);
220
226
  globalState_1.default.debug(`> Logged in with userUuid: ${userUuid}`);
221
227
  await analytics_1.LightdashAnalytics.track({
222
228
  event: 'login.completed',
@@ -229,7 +235,7 @@ const login = async (urlInput, options) => {
229
235
  });
230
236
  await (0, config_1.setContext)({
231
237
  serverUrl: url,
232
- apiKey: token,
238
+ ...(token === undefined ? {} : { apiKey: token }),
233
239
  });
234
240
  await analytics_1.LightdashAnalytics.identify({ organizationId: organizationUuid });
235
241
  globalState_1.default.debug(`> Saved config on: ${config_1.configFilePath}`);
@@ -0,0 +1,3 @@
1
+ export declare const logoutUnreachable = "The server could not confirm logout. The server-side session will remain until it expires. Your local login was kept so you can retry `lightdash logout`.";
2
+ export declare const logout: () => Promise<void>;
3
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/handlers/logout.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,iBAAiB,8JACiI,CAAC;AAChK,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,IAAI,CA6D3C,CAAC"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logout = exports.logoutUnreachable = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
6
+ const stream_1 = require("stream");
7
+ const config_1 = require("../config");
8
+ const credentials_1 = require("../credentials");
9
+ const instanceKey_1 = require("../personalLogin/instanceKey");
10
+ const store_1 = require("../personalLogin/store");
11
+ const tokenProvider_1 = require("../personalLogin/tokenProvider");
12
+ exports.logoutUnreachable = 'The server could not confirm logout. The server-side session will remain until it expires. Your local login was kept so you can retry `lightdash logout`.';
13
+ const logout = async () => {
14
+ (0, credentials_1.refuseAgentConnection)(true);
15
+ const config = await (0, config_1.getConfig)();
16
+ const rawConfig = await (0, config_1.getRawConfig)();
17
+ const savedKey = rawConfig.context?.apiKey;
18
+ const environmentKey = process.env.LIGHTDASH_API_KEY;
19
+ const environmentOverride = !!environmentKey && config.context?.apiKey === environmentKey;
20
+ if (!config.context?.serverUrl)
21
+ throw new Error("Not logged in. Run 'lightdash login --help'");
22
+ const instance = (0, instanceKey_1.personalInstanceKey)(config.context.serverUrl);
23
+ const personal = await new store_1.PersonalLoginStore().withLock(async (locked) => {
24
+ const login = await locked.read(instance);
25
+ if (login === null)
26
+ return false;
27
+ const revoke = async (token, hint) => {
28
+ try {
29
+ const response = await (0, node_fetch_1.default)(`${instance}/api/v1/oauth/revoke`, {
30
+ method: 'POST',
31
+ headers: (0, tokenProvider_1.oauthHeaders)(),
32
+ redirect: 'error',
33
+ signal: AbortSignal.timeout(15_000),
34
+ body: new URLSearchParams({
35
+ token,
36
+ token_type_hint: hint,
37
+ client_id: 'lightdash-cli',
38
+ }),
39
+ });
40
+ if (!response.ok &&
41
+ (response.status < 400 || response.status >= 500))
42
+ throw new Error(exports.logoutUnreachable);
43
+ if (response.body instanceof stream_1.Readable)
44
+ response.body.destroy();
45
+ }
46
+ catch {
47
+ throw new Error(exports.logoutUnreachable);
48
+ }
49
+ };
50
+ await revoke(login.tokens.refreshToken, 'refresh_token');
51
+ await revoke(login.tokens.accessToken, 'access_token');
52
+ await locked.remove(instance);
53
+ await locked.clearJournal(instance);
54
+ return true;
55
+ });
56
+ if (!personal && !savedKey && !environmentOverride)
57
+ throw new Error("Not logged in. Run 'lightdash login --help'");
58
+ await (0, config_1.unsetApiKey)();
59
+ if (savedKey)
60
+ console.error('The saved API key was removed. A personal access token is not revoked by logout.');
61
+ if (environmentOverride) {
62
+ console.error('LIGHTDASH_API_KEY is set in the environment and stays active until unset.');
63
+ }
64
+ else
65
+ console.error(`Logged out of ${instance}`);
66
+ };
67
+ exports.logout = logout;
@@ -1,6 +1,6 @@
1
1
  export declare const loginWithOauth: (url: string, oauthPort?: number) => Promise<{
2
2
  userUuid: string;
3
3
  organizationUuid: string;
4
- token: string;
4
+ credential: 'personal_oauth';
5
5
  }>;
6
6
  //# sourceMappingURL=oauthLogin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauthLogin.d.ts","sourceRoot":"","sources":["../../src/handlers/oauthLogin.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,cAAc,QAClB,MAAM,cACC,MAAM,KACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAqPvE,CAAC"}
1
+ {"version":3,"file":"oauthLogin.d.ts","sourceRoot":"","sources":["../../src/handlers/oauthLogin.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,cAAc,QAClB,MAAM,cACC,MAAM,KACnB,OAAO,CAAC;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,gBAAgB,CAAC;CAChC,CAmRA,CAAC"}
@@ -7,13 +7,17 @@ const http = tslib_1.__importStar(require("http"));
7
7
  const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
8
8
  const openid_client_1 = require("openid-client");
9
9
  const url_1 = require("url");
10
+ const uuid_1 = require("uuid");
10
11
  const credentials_1 = require("../credentials");
11
12
  const globalState_1 = tslib_1.__importDefault(require("../globalState"));
13
+ const instanceKey_1 = require("../personalLogin/instanceKey");
14
+ const store_1 = require("../personalLogin/store");
15
+ const tokenProvider_1 = require("../personalLogin/tokenProvider");
12
16
  const styles = tslib_1.__importStar(require("../styles"));
13
17
  const oauth_1 = require("./login/oauth");
14
- const pat_1 = require("./login/pat");
15
18
  const loginWithOauth = async (url, oauthPort) => {
16
19
  (0, credentials_1.refuseAgentConnection)(true);
20
+ const instanceUrl = (0, instanceKey_1.personalInstanceKey)(url);
17
21
  // Create a promise that will be resolved when we get the authorization code
18
22
  let resolveAuth;
19
23
  let rejectAuth;
@@ -103,11 +107,12 @@ const loginWithOauth = async (url, oauthPort) => {
103
107
  const redirectUri = `http://localhost:${port}/callback`;
104
108
  globalState_1.default.debug(`> Starting CLI callback server on URI: ${redirectUri}`);
105
109
  // Create OAuth2 issuer and client using openid-client
106
- const issuerUrl = new url_1.URL('/api/v1/oauth', url).href;
110
+ const issuerUrl = new url_1.URL(`${instanceUrl}/api/v1/oauth`).href;
107
111
  const issuer = new openid_client_1.Issuer({
108
112
  issuer: issuerUrl,
109
- authorization_endpoint: new url_1.URL('/api/v1/oauth/authorize', url).href,
110
- token_endpoint: new url_1.URL('/api/v1/oauth/token', url).href,
113
+ authorization_endpoint: new url_1.URL(`${instanceUrl}/api/v1/oauth/authorize`)
114
+ .href,
115
+ token_endpoint: new url_1.URL(`${instanceUrl}/api/v1/oauth/token`).href,
111
116
  });
112
117
  const client = new issuer.Client({
113
118
  client_id: 'lightdash-cli',
@@ -135,12 +140,13 @@ const loginWithOauth = async (url, oauthPort) => {
135
140
  globalState_1.default.debug(`> Got authorization code`);
136
141
  globalState_1.default.debug(`> Getting token for authorization code`);
137
142
  // Exchange the authorization code for an access token manually (pure OAuth2)
138
- const tokenUrl = new url_1.URL('/api/v1/oauth/token', url);
143
+ const tokenUrl = new url_1.URL(`${instanceUrl}/api/v1/oauth/token`);
144
+ const startedAt = Date.now();
139
145
  const tokenResponse = await (0, node_fetch_1.default)(tokenUrl.href, {
140
146
  method: 'POST',
141
- headers: {
142
- 'Content-Type': 'application/x-www-form-urlencoded',
143
- },
147
+ headers: (0, tokenProvider_1.oauthHeaders)(),
148
+ redirect: 'error',
149
+ signal: AbortSignal.timeout(15_000),
144
150
  body: new URLSearchParams({
145
151
  grant_type: 'authorization_code',
146
152
  code,
@@ -150,40 +156,67 @@ const loginWithOauth = async (url, oauthPort) => {
150
156
  }),
151
157
  });
152
158
  if (!tokenResponse.ok) {
153
- const errorText = await tokenResponse.text();
154
- throw new common_1.AuthorizationError(`Token exchange failed: ${tokenResponse.status} ${errorText}`);
159
+ throw new common_1.AuthorizationError(`Token exchange failed: ${tokenResponse.status}`);
155
160
  }
156
- const tokenData = await tokenResponse.json();
157
- const { access_token: accessToken } = tokenData;
158
- if (!accessToken) {
159
- throw new common_1.AuthorizationError('No access token received from OAuth server');
161
+ let tokenData;
162
+ try {
163
+ tokenData = await tokenResponse.json();
160
164
  }
161
- globalState_1.default.debug(`> Got OAuth access token`);
162
- globalState_1.default.debug(`> Creating PAT for user`);
163
- // Generate a new PAT from this access token
164
- const pat = await (0, pat_1.generatePersonalAccessToken)({
165
- Authorization: `Bearer ${accessToken}`,
166
- }, url, 8);
167
- globalState_1.default.debug(`> Got PAT`);
168
- // Get user information using the PAT
169
- const userInfoUrl = new url_1.URL('/api/v1/user', url);
165
+ catch {
166
+ throw new common_1.AuthorizationError('The server returned an invalid token response. No login was saved.');
167
+ }
168
+ const token = (0, tokenProvider_1.parseTokenResponse)(tokenData);
169
+ const expiry = (0, tokenProvider_1.tokenExpiry)(token, startedAt, tokenResponse.headers.get('date'), null);
170
+ const userInfoUrl = new url_1.URL(`${instanceUrl}/api/v1/user`);
170
171
  const userResponse = await (0, node_fetch_1.default)(userInfoUrl.href, {
171
172
  method: 'GET',
173
+ redirect: 'error',
174
+ signal: AbortSignal.timeout(15_000),
172
175
  headers: {
173
- Authorization: `ApiKey ${pat}`,
176
+ Authorization: `Bearer ${token.access_token}`,
174
177
  },
175
178
  });
176
179
  if (!userResponse.ok) {
177
180
  throw new common_1.AuthorizationError(`Failed to get user info: ${userResponse.status}`);
178
181
  }
179
- const userData = await userResponse.json();
180
- const { userUuid, organizationUuid, firstName, lastName, email } = userData.results;
181
- globalState_1.default.debug(`> Got user info for user ${firstName} ${lastName} (${email}): ${userUuid} in organization ${organizationUuid}`);
182
- return {
183
- userUuid,
182
+ let userData;
183
+ try {
184
+ userData = await userResponse.json();
185
+ }
186
+ catch {
187
+ throw new common_1.AuthorizationError('The server returned invalid user information. No login was saved.');
188
+ }
189
+ if (typeof userData !== 'object' ||
190
+ userData === null ||
191
+ !('results' in userData) ||
192
+ typeof userData.results !== 'object' ||
193
+ userData.results === null ||
194
+ !('userUuid' in userData.results) ||
195
+ typeof userData.results.userUuid !== 'string' ||
196
+ !(0, uuid_1.validate)(userData.results.userUuid) ||
197
+ !('organizationUuid' in userData.results) ||
198
+ typeof userData.results.organizationUuid !== 'string' ||
199
+ !(0, uuid_1.validate)(userData.results.organizationUuid))
200
+ throw new common_1.AuthorizationError('The server returned invalid user information. No login was saved.');
201
+ const { userUuid, organizationUuid } = userData.results;
202
+ globalState_1.default.debug(`> Got user info: ${userUuid} in organization ${organizationUuid}`);
203
+ await new store_1.PersonalLoginStore().save(instanceUrl, {
204
+ clientId: 'lightdash-cli',
205
+ personUuid: userUuid,
184
206
  organizationUuid,
185
- token: pat,
186
- };
207
+ tokens: {
208
+ accessToken: token.access_token,
209
+ refreshToken: token.refresh_token,
210
+ accessTokenIssuedAt: expiry.accessTokenIssuedAt,
211
+ accessTokenExpiresAt: expiry.accessTokenExpiresAt,
212
+ scopes: token.scope.split(' '),
213
+ generation: 1,
214
+ lastRefreshAttemptUuid: null,
215
+ },
216
+ sessionExpiresAt: expiry.sessionExpiresAt,
217
+ refreshState: { kind: 'idle' },
218
+ });
219
+ return { userUuid, organizationUuid, credential: 'personal_oauth' };
187
220
  }
188
221
  finally {
189
222
  // Clean up the server
@@ -1 +1 @@
1
- {"version":3,"file":"renameHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/renameHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,UAAU,EAEb,MAAM,mBAAmB,CAAC;AAoB3B,KAAK,oBAAoB,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACrB,CAAC;AAwCF,eAAO,MAAM,aAAa,YAAmB,oBAAoB,kBAyNhE,CAAC"}
1
+ {"version":3,"file":"renameHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/renameHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,UAAU,EAEb,MAAM,mBAAmB,CAAC;AAoB3B,KAAK,oBAAoB,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACrB,CAAC;AAwCF,eAAO,MAAM,aAAa,YAAmB,oBAAoB,kBAuNhE,CAAC"}
@@ -44,9 +44,9 @@ const renameHandler = async (options) => {
44
44
  const executionId = (0, uuid_1.v4)();
45
45
  const startTime = Date.now();
46
46
  const config = await (0, config_1.getConfig)();
47
- if (!config.context?.apiKey || !config.context.serverUrl) {
48
- throw new common_1.AuthorizationError(`Not logged in. Run 'lightdash login --help'`);
49
- }
47
+ await (0, credentials_1.resolveCredential)(config);
48
+ if (!config.context?.serverUrl)
49
+ throw new Error("Not logged in. Run 'lightdash login --help'");
50
50
  const overrideProjectUuid = await (0, selectProject_1.resolveProjectOverride)(config, options.project);
51
51
  const projectUuid = overrideProjectUuid ||
52
52
  config.context.previewProject ||
@@ -1 +1 @@
1
- {"version":3,"file":"slugUpdate.d.ts","sourceRoot":"","sources":["../../src/handlers/slugUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,WAAW,EAKX,KAAK,wBAAwB,EAChC,MAAM,mBAAmB,CAAC;AAa3B,KAAK,iBAAiB,GAAG;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACvB,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,SAAS,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,QAAQ,EACF;QACI,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC;QACxD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACjC,GACD,SAAS,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAIF,MAAM,MAAM,yBAAyB,GAAG;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAyFF,eAAO,MAAM,mBAAmB,eAChB,MAAM,GAAG,SAAS,QACxB,MAAM,MACR,MAAM,iBACI,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,KACxD,OAAO,CAAC,mBAAmB,CA2L7B,CAAC;AAEF,eAAO,MAAM,6BAA6B,SAChC,mBAAmB,cACb,MAAM,GAAG,SAAS,KAC/B,yBAAyB,EAuB3B,CAAC;AAuDF,eAAO,MAAM,oBAAoB,SACvB,mBAAmB,KAC1B,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAuD7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,gBACb,MAAM,WACV,wBAAwB,KAClC,OAAO,CAAC,IAAI,CAmBd,CAAC;AAEF,eAAO,MAAM,iBAAiB,gBACb,MAAM,cACP,MAAM,GAAG,SAAS,QACxB,MAAM,MACR,MAAM,iBACI,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,KACxD,OAAO,CAAC,mBAAmB,CAuB7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,YACjB,iBAAiB,KAC3B,OAAO,CAAC,IAAI,CAyDd,CAAC"}
1
+ {"version":3,"file":"slugUpdate.d.ts","sourceRoot":"","sources":["../../src/handlers/slugUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,WAAW,EAKX,KAAK,wBAAwB,EAChC,MAAM,mBAAmB,CAAC;AAa3B,KAAK,iBAAiB,GAAG;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACvB,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,SAAS,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,QAAQ,EACF;QACI,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC;QACxD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACjC,GACD,SAAS,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAIF,MAAM,MAAM,yBAAyB,GAAG;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAyFF,eAAO,MAAM,mBAAmB,eAChB,MAAM,GAAG,SAAS,QACxB,MAAM,MACR,MAAM,iBACI,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,KACxD,OAAO,CAAC,mBAAmB,CA2L7B,CAAC;AAEF,eAAO,MAAM,6BAA6B,SAChC,mBAAmB,cACb,MAAM,GAAG,SAAS,KAC/B,yBAAyB,EAuB3B,CAAC;AAuDF,eAAO,MAAM,oBAAoB,SACvB,mBAAmB,KAC1B,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAuD7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,gBACb,MAAM,WACV,wBAAwB,KAClC,OAAO,CAAC,IAAI,CAmBd,CAAC;AAEF,eAAO,MAAM,iBAAiB,gBACb,MAAM,cACP,MAAM,GAAG,SAAS,QACxB,MAAM,MACR,MAAM,iBACI,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,KACxD,OAAO,CAAC,mBAAmB,CAuB7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,YACjB,iBAAiB,KAC3B,OAAO,CAAC,IAAI,CAuDd,CAAC"}
@@ -342,9 +342,9 @@ const slugUpdateHandler = async (options) => {
342
342
  globalState_1.default.setVerbose(options.verbose);
343
343
  await (0, apiClient_1.checkLightdashVersion)();
344
344
  const config = await (0, config_1.getConfig)();
345
- if (!config.context?.apiKey || !config.context.serverUrl) {
346
- throw new common_1.AuthorizationError(`Not logged in. Run 'lightdash login --help'`);
347
- }
345
+ await (0, credentials_1.resolveCredential)(config);
346
+ if (!config.context?.serverUrl)
347
+ throw new Error("Not logged in. Run 'lightdash login --help'");
348
348
  const selection = await (0, selectProject_1.selectProject)(config, options.project);
349
349
  if (!selection) {
350
350
  throw new common_1.ParameterError('No project selected. Run lightdash config set-project');
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/handlers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,yBAAyB,EACzB,4BAA4B,EAC5B,aAAa,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGH,KAAK,UAAU,EAClB,MAAM,gBAAgB,CAAC;AAQxB,KAAK,aAAa,GAAG;IACjB,cAAc,EAAE,kBAAkB,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,CAAC,4BAA4B,CAAC,EAAE,aAAa,CAAC;IAC9C,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACvC,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAWtE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,UAM1C;AAqBD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,iBAiBhD;AAED,wBAAgB,sBAAsB,CAClC,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAClC,aAAa,CAOf"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/handlers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,yBAAyB,EACzB,4BAA4B,EAC5B,aAAa,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGH,KAAK,UAAU,EAClB,MAAM,gBAAgB,CAAC;AAQxB,KAAK,aAAa,GAAG;IACjB,cAAc,EAAE,kBAAkB,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,CAAC,4BAA4B,CAAC,EAAE,aAAa,CAAC;IAC9C,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACvC,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAYtE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,UAM1C;AAqBD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,iBAiBhD;AAED,wBAAgB,sBAAsB,CAClC,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAClC,aAAa,CAOf"}
@@ -17,6 +17,7 @@ function getCredentialAuthHeader(credential) {
17
17
  switch (credential.kind) {
18
18
  case 'human_api_key':
19
19
  return `${TokenType.ApiKey} ${credential.token}`;
20
+ case 'personal_oauth':
20
21
  case 'service_account':
21
22
  case 'agent_connection':
22
23
  return `${TokenType.Bearer} ${credential.token}`;
package/dist/index.js CHANGED
@@ -31,6 +31,7 @@ const installSkills_1 = require("./handlers/installSkills");
31
31
  const lint_1 = require("./handlers/lint");
32
32
  const listProjects_1 = require("./handlers/listProjects");
33
33
  const login_1 = require("./handlers/login");
34
+ const logout_1 = require("./handlers/logout");
34
35
  const preAggregateAudit_1 = require("./handlers/preAggregateAudit");
35
36
  const preAggregateCheckExternal_1 = require("./handlers/preAggregateCheckExternal");
36
37
  const preview_2 = require("./handlers/preview");
@@ -167,6 +168,11 @@ ${styles.bold('Examples:')}
167
168
  .option('--oauth-port <port>', 'Port for the local OAuth callback server (default: random available port)', parseOAuthPortArgument, undefined)
168
169
  .option('--verbose', undefined, false)
169
170
  .action(login_1.login);
171
+ commander_1.program
172
+ .command('logout')
173
+ .description('Logs out of the configured instance and revokes a browser login session')
174
+ .addHelpText('after', '\nBrowser login sessions are revoked on the server. Saved API keys are removed locally; personal access tokens must be revoked in your account settings.\n')
175
+ .action(logout_1.logout);
170
176
  const agentProgram = commander_1.program
171
177
  .command('agent')
172
178
  .description('Connect your agent to the warehouse and check its status');
@@ -0,0 +1,3 @@
1
+ import { type PersonalLogin } from './schema';
2
+ export declare const loginFixture: () => PersonalLogin;
3
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/personalLogin/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,eAAO,MAAM,YAAY,QAAO,aAe9B,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loginFixture = void 0;
4
+ const loginFixture = () => ({
5
+ clientId: 'lightdash-cli',
6
+ personUuid: '22222222-2222-4222-8222-222222222222',
7
+ organizationUuid: '11111111-1111-4111-8111-111111111111',
8
+ tokens: {
9
+ accessToken: 'personal-access',
10
+ accessTokenIssuedAt: new Date(Date.now() - 1000).toISOString(),
11
+ accessTokenExpiresAt: new Date(Date.now() + 3_600_000).toISOString(),
12
+ refreshToken: 'personal-refresh',
13
+ scopes: ['read', 'write'],
14
+ generation: 1,
15
+ lastRefreshAttemptUuid: null,
16
+ },
17
+ sessionExpiresAt: new Date(Date.now() + 8 * 3_600_000).toISOString(),
18
+ refreshState: { kind: 'idle' },
19
+ });
20
+ exports.loginFixture = loginFixture;
@@ -0,0 +1,2 @@
1
+ export declare const personalInstanceKey: (value: string) => string;
2
+ //# sourceMappingURL=instanceKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instanceKey.d.ts","sourceRoot":"","sources":["../../src/personalLogin/instanceKey.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,UAAW,MAAM,KAAG,MAmBnD,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.personalInstanceKey = void 0;
4
+ const personalInstanceKey = (value) => {
5
+ try {
6
+ const url = new URL(value);
7
+ if (!/^https?:\/\/[^/?#\\\s@]+\/?$/i.test(value) ||
8
+ !['http:', 'https:'].includes(url.protocol) ||
9
+ url.username !== '' ||
10
+ url.password !== '' ||
11
+ url.pathname !== '/' ||
12
+ url.search !== '' ||
13
+ url.hash !== '' ||
14
+ value.includes('?') ||
15
+ value.includes('#'))
16
+ throw new Error();
17
+ return url.origin;
18
+ }
19
+ catch {
20
+ throw new Error('Invalid personal login instance URL.');
21
+ }
22
+ };
23
+ exports.personalInstanceKey = personalInstanceKey;
@@ -0,0 +1,28 @@
1
+ export type PersonalLogin = {
2
+ clientId: 'lightdash-cli';
3
+ personUuid: string;
4
+ organizationUuid: string;
5
+ tokens: {
6
+ accessToken: string;
7
+ accessTokenIssuedAt: string;
8
+ accessTokenExpiresAt: string;
9
+ refreshToken: string;
10
+ scopes: string[];
11
+ generation: number;
12
+ lastRefreshAttemptUuid: string | null;
13
+ };
14
+ sessionExpiresAt: string;
15
+ refreshState: {
16
+ kind: 'idle';
17
+ } | {
18
+ kind: 'in_progress';
19
+ attemptUuid: string;
20
+ startedAt: string;
21
+ } | {
22
+ kind: 'login_required';
23
+ since: string;
24
+ };
25
+ };
26
+ export declare const invalidLogin: () => Error;
27
+ export declare const validatePersonalLogin: (value: unknown) => PersonalLogin;
28
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/personalLogin/schema.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;KACzC,CAAC;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EACN;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAChB;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAC/D;QAAE,IAAI,EAAE,gBAAgB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD,CAAC;AACF,eAAO,MAAM,YAAY,QAAO,KAC0C,CAAC;AAsD3E,eAAO,MAAM,qBAAqB,UAAW,OAAO,KAAG,aAUtD,CAAC"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validatePersonalLogin = exports.invalidLogin = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const ajv_1 = tslib_1.__importDefault(require("ajv"));
6
+ const ajv_formats_1 = tslib_1.__importDefault(require("ajv-formats"));
7
+ const invalidLogin = () => new Error('Invalid personal login data. Run `lightdash login` again.');
8
+ exports.invalidLogin = invalidLogin;
9
+ const text = { type: 'string', minLength: 1, maxLength: 16384 };
10
+ const uuid = { type: 'string', format: 'uuid' };
11
+ const date = {
12
+ type: 'string',
13
+ format: 'date-time',
14
+ pattern: '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:[0-5]\\d\\.\\d{3}Z$',
15
+ };
16
+ const object = (properties) => ({
17
+ type: 'object',
18
+ additionalProperties: false,
19
+ properties,
20
+ required: Object.keys(properties),
21
+ });
22
+ const ajv = new ajv_1.default();
23
+ (0, ajv_formats_1.default)(ajv);
24
+ const validate = ajv.compile(object({
25
+ clientId: { const: 'lightdash-cli' },
26
+ personUuid: uuid,
27
+ organizationUuid: uuid,
28
+ tokens: object({
29
+ accessToken: text,
30
+ accessTokenIssuedAt: date,
31
+ accessTokenExpiresAt: date,
32
+ refreshToken: text,
33
+ scopes: {
34
+ type: 'array',
35
+ items: { enum: ['read', 'write'] },
36
+ minItems: 2,
37
+ maxItems: 2,
38
+ uniqueItems: true,
39
+ },
40
+ generation: {
41
+ type: 'integer',
42
+ minimum: 1,
43
+ maximum: Number.MAX_SAFE_INTEGER,
44
+ },
45
+ lastRefreshAttemptUuid: { anyOf: [uuid, { type: 'null' }] },
46
+ }),
47
+ sessionExpiresAt: date,
48
+ refreshState: {
49
+ oneOf: [
50
+ object({ kind: { const: 'idle' } }),
51
+ object({
52
+ kind: { const: 'in_progress' },
53
+ attemptUuid: uuid,
54
+ startedAt: date,
55
+ }),
56
+ object({ kind: { const: 'login_required' }, since: date }),
57
+ ],
58
+ },
59
+ }));
60
+ const validatePersonalLogin = (value) => {
61
+ if (!validate(value) ||
62
+ Date.parse(value.tokens.accessTokenExpiresAt) >
63
+ Date.parse(value.sessionExpiresAt) ||
64
+ Date.parse(value.tokens.accessTokenIssuedAt) >=
65
+ Date.parse(value.tokens.accessTokenExpiresAt))
66
+ throw (0, exports.invalidLogin)();
67
+ return value;
68
+ };
69
+ exports.validatePersonalLogin = validatePersonalLogin;