@parix/cli 0.1.8 → 0.1.9

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 (73) hide show
  1. package/dist/cli.cjs +4296 -35
  2. package/package.json +2 -2
  3. package/dist/cli.d.cts +0 -2
  4. package/dist/cli.d.ts +0 -2
  5. package/dist/cli.js +0 -36
  6. package/dist/commands/api.cjs +0 -81
  7. package/dist/commands/api.d.cts +0 -2
  8. package/dist/commands/api.d.ts +0 -2
  9. package/dist/commands/api.js +0 -78
  10. package/dist/commands/auth.cjs +0 -131
  11. package/dist/commands/auth.d.cts +0 -2
  12. package/dist/commands/auth.d.ts +0 -2
  13. package/dist/commands/auth.js +0 -128
  14. package/dist/commands/database.cjs +0 -259
  15. package/dist/commands/database.d.cts +0 -2
  16. package/dist/commands/database.d.ts +0 -2
  17. package/dist/commands/database.js +0 -256
  18. package/dist/commands/skill-content.cjs +0 -77
  19. package/dist/commands/skill-content.d.cts +0 -1
  20. package/dist/commands/skill-content.d.ts +0 -1
  21. package/dist/commands/skill-content.js +0 -74
  22. package/dist/commands/skill.cjs +0 -10
  23. package/dist/commands/skill.d.cts +0 -2
  24. package/dist/commands/skill.d.ts +0 -2
  25. package/dist/commands/skill.js +0 -7
  26. package/dist/commands/tb.cjs +0 -254
  27. package/dist/commands/tb.d.cts +0 -2
  28. package/dist/commands/tb.d.ts +0 -2
  29. package/dist/commands/tb.js +0 -251
  30. package/dist/lib/api-client.cjs +0 -44
  31. package/dist/lib/api-client.d.cts +0 -10
  32. package/dist/lib/api-client.d.ts +0 -10
  33. package/dist/lib/api-client.js +0 -40
  34. package/dist/lib/config.cjs +0 -24
  35. package/dist/lib/config.d.cts +0 -10
  36. package/dist/lib/config.d.ts +0 -10
  37. package/dist/lib/config.js +0 -18
  38. package/dist/lib/loopback-server.cjs +0 -180
  39. package/dist/lib/loopback-server.d.cts +0 -20
  40. package/dist/lib/loopback-server.d.ts +0 -20
  41. package/dist/lib/loopback-server.js +0 -177
  42. package/dist/lib/oauth-api.cjs +0 -73
  43. package/dist/lib/oauth-api.d.cts +0 -31
  44. package/dist/lib/oauth-api.d.ts +0 -31
  45. package/dist/lib/oauth-api.js +0 -68
  46. package/dist/lib/oauth-session.cjs +0 -108
  47. package/dist/lib/oauth-session.d.cts +0 -32
  48. package/dist/lib/oauth-session.d.ts +0 -32
  49. package/dist/lib/oauth-session.js +0 -103
  50. package/dist/lib/oauth.cjs +0 -58
  51. package/dist/lib/oauth.d.cts +0 -19
  52. package/dist/lib/oauth.d.ts +0 -19
  53. package/dist/lib/oauth.js +0 -49
  54. package/dist/lib/open-url.cjs +0 -38
  55. package/dist/lib/open-url.d.cts +0 -1
  56. package/dist/lib/open-url.d.ts +0 -1
  57. package/dist/lib/open-url.js +0 -32
  58. package/dist/lib/output.cjs +0 -20
  59. package/dist/lib/output.d.cts +0 -6
  60. package/dist/lib/output.d.ts +0 -6
  61. package/dist/lib/output.js +0 -15
  62. package/dist/lib/parix-api.cjs +0 -59
  63. package/dist/lib/parix-api.d.cts +0 -12
  64. package/dist/lib/parix-api.d.ts +0 -12
  65. package/dist/lib/parix-api.js +0 -55
  66. package/dist/lib/session.cjs +0 -80
  67. package/dist/lib/session.d.cts +0 -28
  68. package/dist/lib/session.d.ts +0 -28
  69. package/dist/lib/session.js +0 -74
  70. package/dist/lib/tb-payloads.cjs +0 -258
  71. package/dist/lib/tb-payloads.d.cts +0 -66
  72. package/dist/lib/tb-payloads.d.ts +0 -66
  73. package/dist/lib/tb-payloads.js +0 -249
@@ -1,68 +0,0 @@
1
- import { buildOAuthCallbackUrl, buildOAuthTokenUrl, buildOAuthUserInfoUrl, PARIX_CLIENT_ID } from "./oauth.js";
2
- const WHITESPACE_REGEX = /\s+/;
3
- export async function exchangeAuthorizationCode(input) {
4
- const body = new URLSearchParams({
5
- client_id: PARIX_CLIENT_ID,
6
- code: input.code,
7
- code_verifier: input.codeVerifier,
8
- grant_type: 'authorization_code',
9
- redirect_uri: buildOAuthCallbackUrl(input.baseUrl),
10
- });
11
- const response = await fetch(buildOAuthTokenUrl(input.baseUrl), {
12
- body,
13
- headers: {
14
- 'content-type': 'application/x-www-form-urlencoded',
15
- },
16
- method: 'POST',
17
- });
18
- return await parseTokenResponse(response);
19
- }
20
- export async function refreshOAuthTokens(input) {
21
- const body = new URLSearchParams({
22
- client_id: PARIX_CLIENT_ID,
23
- grant_type: 'refresh_token',
24
- refresh_token: input.refreshToken,
25
- });
26
- const response = await fetch(buildOAuthTokenUrl(input.baseUrl), {
27
- body,
28
- headers: {
29
- 'content-type': 'application/x-www-form-urlencoded',
30
- },
31
- method: 'POST',
32
- });
33
- return await parseTokenResponse(response);
34
- }
35
- export async function fetchOAuthUserInfo(input) {
36
- const response = await fetch(buildOAuthUserInfoUrl(input.baseUrl), {
37
- headers: {
38
- authorization: `Bearer ${input.accessToken}`,
39
- },
40
- });
41
- if (!response.ok) {
42
- throw new Error(await readErrorMessage(response, 'Unable to fetch the authenticated user.'));
43
- }
44
- return (await response.json());
45
- }
46
- async function parseTokenResponse(response) {
47
- if (!response.ok) {
48
- throw new Error(await readErrorMessage(response, 'Unable to exchange OAuth tokens.'));
49
- }
50
- const payload = (await response.json());
51
- return {
52
- accessToken: payload.access_token,
53
- expiresIn: payload.expires_in,
54
- refreshToken: payload.refresh_token ?? null,
55
- scope: payload.scope?.split(WHITESPACE_REGEX).filter(Boolean) ?? [],
56
- tokenType: payload.token_type,
57
- };
58
- }
59
- async function readErrorMessage(response, fallback) {
60
- try {
61
- const payload = (await response.clone().json());
62
- return payload.error_description ?? payload.message ?? payload.error ?? fallback;
63
- }
64
- catch {
65
- const text = await response.text();
66
- return text.trim() || fallback;
67
- }
68
- }
@@ -1,108 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createStoredSession = createStoredSession;
4
- exports.hydrateStoredSessionOrganization = hydrateStoredSessionOrganization;
5
- exports.ensureFreshSession = ensureFreshSession;
6
- const oauth_api_1 = require("./oauth-api.cjs");
7
- const session_1 = require("./session.cjs");
8
- const REFRESH_BUFFER_MS = 60_000;
9
- async function createStoredSession(input) {
10
- const now = new Date();
11
- const [userInfo, resolvedOrganization] = await Promise.all([
12
- (0, oauth_api_1.fetchOAuthUserInfo)({
13
- accessToken: input.tokenSet.accessToken,
14
- baseUrl: input.baseUrl,
15
- }),
16
- fetchResolvedSessionOrganization({
17
- accessToken: input.tokenSet.accessToken,
18
- baseUrl: input.baseUrl,
19
- }).catch(() => null),
20
- ]);
21
- return {
22
- version: 2,
23
- accessToken: input.tokenSet.accessToken,
24
- accessTokenExpiresAt: new Date(now.getTime() + input.tokenSet.expiresIn * 1000).toISOString(),
25
- baseUrl: input.baseUrl,
26
- createdAt: input.createdAt ?? now.toISOString(),
27
- refreshToken: input.tokenSet.refreshToken,
28
- scopes: input.tokenSet.scope,
29
- tokenType: input.tokenSet.tokenType,
30
- updatedAt: now.toISOString(),
31
- user: {
32
- email: userInfo.email ?? null,
33
- emailVerified: userInfo.email_verified ?? null,
34
- id: userInfo.sub,
35
- image: userInfo.picture ?? null,
36
- name: userInfo.name ?? null,
37
- },
38
- organization: {
39
- id: resolvedOrganization?.id ?? userInfo.organization_id ?? null,
40
- memberRole: resolvedOrganization?.memberRole ?? userInfo.member_role ?? null,
41
- name: resolvedOrganization?.name ?? userInfo.organization_name ?? null,
42
- slug: resolvedOrganization?.slug ?? userInfo.organization_slug ?? null,
43
- },
44
- };
45
- }
46
- async function hydrateStoredSessionOrganization(session) {
47
- const resolvedOrganization = await fetchResolvedSessionOrganization({
48
- accessToken: session.accessToken,
49
- baseUrl: session.baseUrl,
50
- }).catch(() => null);
51
- if (!resolvedOrganization || organizationsEqual(session.organization, resolvedOrganization)) {
52
- return session;
53
- }
54
- const nextSession = {
55
- ...session,
56
- organization: resolvedOrganization,
57
- updatedAt: new Date().toISOString(),
58
- };
59
- await (0, session_1.writeStoredSession)(nextSession);
60
- return nextSession;
61
- }
62
- async function ensureFreshSession(session) {
63
- if (!shouldRefresh(session)) {
64
- return session;
65
- }
66
- if (!session.refreshToken) {
67
- throw new Error('The local session has expired and cannot be refreshed. Run `parix auth login` again.');
68
- }
69
- const refreshedTokens = await (0, oauth_api_1.refreshOAuthTokens)({
70
- baseUrl: session.baseUrl,
71
- refreshToken: session.refreshToken,
72
- });
73
- const updatedSession = await createStoredSession({
74
- baseUrl: session.baseUrl,
75
- createdAt: session.createdAt,
76
- tokenSet: refreshedTokens,
77
- });
78
- await (0, session_1.writeStoredSession)(updatedSession);
79
- return updatedSession;
80
- }
81
- function shouldRefresh(session) {
82
- const expiresAt = Date.parse(session.accessTokenExpiresAt);
83
- return Number.isNaN(expiresAt) || expiresAt <= Date.now() + REFRESH_BUFFER_MS;
84
- }
85
- async function fetchResolvedSessionOrganization(input) {
86
- const response = await fetch(new URL('/api/v1/session', input.baseUrl), {
87
- headers: {
88
- authorization: `Bearer ${input.accessToken}`,
89
- },
90
- });
91
- if (!response.ok) {
92
- throw new Error('Unable to resolve the authenticated organization.');
93
- }
94
- const payload = (await response.json());
95
- const organization = payload.auth?.organization;
96
- if (!organization) {
97
- return null;
98
- }
99
- return {
100
- id: typeof organization.id === 'string' ? organization.id : null,
101
- memberRole: typeof organization.memberRole === 'string' ? organization.memberRole : null,
102
- name: typeof organization.name === 'string' ? organization.name : null,
103
- slug: typeof organization.slug === 'string' ? organization.slug : null,
104
- };
105
- }
106
- function organizationsEqual(left, right) {
107
- return (left.id === right.id && left.memberRole === right.memberRole && left.name === right.name && left.slug === right.slug);
108
- }
@@ -1,32 +0,0 @@
1
- import type { OAuthTokenSet } from "./oauth-api.cjs";
2
- import type { StoredSession } from "./session.cjs";
3
- export declare function createStoredSession(input: {
4
- baseUrl: string;
5
- createdAt?: string;
6
- tokenSet: OAuthTokenSet;
7
- }): Promise<{
8
- version: 2;
9
- accessToken: string;
10
- accessTokenExpiresAt: string;
11
- baseUrl: string;
12
- createdAt: string;
13
- refreshToken: string | null;
14
- scopes: string[];
15
- tokenType: string;
16
- updatedAt: string;
17
- user: {
18
- email: string | null;
19
- emailVerified: boolean | null;
20
- id: string;
21
- image: string | null;
22
- name: string | null;
23
- };
24
- organization: {
25
- id: string | null;
26
- memberRole: string | null;
27
- name: string | null;
28
- slug: string | null;
29
- };
30
- }>;
31
- export declare function hydrateStoredSessionOrganization(session: StoredSession): Promise<StoredSession>;
32
- export declare function ensureFreshSession(session: StoredSession): Promise<StoredSession>;
@@ -1,32 +0,0 @@
1
- import type { OAuthTokenSet } from "./oauth-api.js";
2
- import type { StoredSession } from "./session.js";
3
- export declare function createStoredSession(input: {
4
- baseUrl: string;
5
- createdAt?: string;
6
- tokenSet: OAuthTokenSet;
7
- }): Promise<{
8
- version: 2;
9
- accessToken: string;
10
- accessTokenExpiresAt: string;
11
- baseUrl: string;
12
- createdAt: string;
13
- refreshToken: string | null;
14
- scopes: string[];
15
- tokenType: string;
16
- updatedAt: string;
17
- user: {
18
- email: string | null;
19
- emailVerified: boolean | null;
20
- id: string;
21
- image: string | null;
22
- name: string | null;
23
- };
24
- organization: {
25
- id: string | null;
26
- memberRole: string | null;
27
- name: string | null;
28
- slug: string | null;
29
- };
30
- }>;
31
- export declare function hydrateStoredSessionOrganization(session: StoredSession): Promise<StoredSession>;
32
- export declare function ensureFreshSession(session: StoredSession): Promise<StoredSession>;
@@ -1,103 +0,0 @@
1
- import { fetchOAuthUserInfo, refreshOAuthTokens } from "./oauth-api.js";
2
- import { writeStoredSession } from "./session.js";
3
- const REFRESH_BUFFER_MS = 60_000;
4
- export async function createStoredSession(input) {
5
- const now = new Date();
6
- const [userInfo, resolvedOrganization] = await Promise.all([
7
- fetchOAuthUserInfo({
8
- accessToken: input.tokenSet.accessToken,
9
- baseUrl: input.baseUrl,
10
- }),
11
- fetchResolvedSessionOrganization({
12
- accessToken: input.tokenSet.accessToken,
13
- baseUrl: input.baseUrl,
14
- }).catch(() => null),
15
- ]);
16
- return {
17
- version: 2,
18
- accessToken: input.tokenSet.accessToken,
19
- accessTokenExpiresAt: new Date(now.getTime() + input.tokenSet.expiresIn * 1000).toISOString(),
20
- baseUrl: input.baseUrl,
21
- createdAt: input.createdAt ?? now.toISOString(),
22
- refreshToken: input.tokenSet.refreshToken,
23
- scopes: input.tokenSet.scope,
24
- tokenType: input.tokenSet.tokenType,
25
- updatedAt: now.toISOString(),
26
- user: {
27
- email: userInfo.email ?? null,
28
- emailVerified: userInfo.email_verified ?? null,
29
- id: userInfo.sub,
30
- image: userInfo.picture ?? null,
31
- name: userInfo.name ?? null,
32
- },
33
- organization: {
34
- id: resolvedOrganization?.id ?? userInfo.organization_id ?? null,
35
- memberRole: resolvedOrganization?.memberRole ?? userInfo.member_role ?? null,
36
- name: resolvedOrganization?.name ?? userInfo.organization_name ?? null,
37
- slug: resolvedOrganization?.slug ?? userInfo.organization_slug ?? null,
38
- },
39
- };
40
- }
41
- export async function hydrateStoredSessionOrganization(session) {
42
- const resolvedOrganization = await fetchResolvedSessionOrganization({
43
- accessToken: session.accessToken,
44
- baseUrl: session.baseUrl,
45
- }).catch(() => null);
46
- if (!resolvedOrganization || organizationsEqual(session.organization, resolvedOrganization)) {
47
- return session;
48
- }
49
- const nextSession = {
50
- ...session,
51
- organization: resolvedOrganization,
52
- updatedAt: new Date().toISOString(),
53
- };
54
- await writeStoredSession(nextSession);
55
- return nextSession;
56
- }
57
- export async function ensureFreshSession(session) {
58
- if (!shouldRefresh(session)) {
59
- return session;
60
- }
61
- if (!session.refreshToken) {
62
- throw new Error('The local session has expired and cannot be refreshed. Run `parix auth login` again.');
63
- }
64
- const refreshedTokens = await refreshOAuthTokens({
65
- baseUrl: session.baseUrl,
66
- refreshToken: session.refreshToken,
67
- });
68
- const updatedSession = await createStoredSession({
69
- baseUrl: session.baseUrl,
70
- createdAt: session.createdAt,
71
- tokenSet: refreshedTokens,
72
- });
73
- await writeStoredSession(updatedSession);
74
- return updatedSession;
75
- }
76
- function shouldRefresh(session) {
77
- const expiresAt = Date.parse(session.accessTokenExpiresAt);
78
- return Number.isNaN(expiresAt) || expiresAt <= Date.now() + REFRESH_BUFFER_MS;
79
- }
80
- async function fetchResolvedSessionOrganization(input) {
81
- const response = await fetch(new URL('/api/v1/session', input.baseUrl), {
82
- headers: {
83
- authorization: `Bearer ${input.accessToken}`,
84
- },
85
- });
86
- if (!response.ok) {
87
- throw new Error('Unable to resolve the authenticated organization.');
88
- }
89
- const payload = (await response.json());
90
- const organization = payload.auth?.organization;
91
- if (!organization) {
92
- return null;
93
- }
94
- return {
95
- id: typeof organization.id === 'string' ? organization.id : null,
96
- memberRole: typeof organization.memberRole === 'string' ? organization.memberRole : null,
97
- name: typeof organization.name === 'string' ? organization.name : null,
98
- slug: typeof organization.slug === 'string' ? organization.slug : null,
99
- };
100
- }
101
- function organizationsEqual(left, right) {
102
- return (left.id === right.id && left.memberRole === right.memberRole && left.name === right.name && left.slug === right.slug);
103
- }
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PARIX_DEFAULT_SCOPES = exports.CLI_OAUTH_CONSENT_GRANTED_PATH = exports.PARIX_LOCAL_CALLBACK_PATH = exports.PARIX_CLIENT_ID = void 0;
4
- exports.createPkcePair = createPkcePair;
5
- exports.buildAuthorizeUrl = buildAuthorizeUrl;
6
- exports.buildCliState = buildCliState;
7
- exports.buildOAuthCallbackUrl = buildOAuthCallbackUrl;
8
- exports.buildOAuthTokenUrl = buildOAuthTokenUrl;
9
- exports.buildOAuthUserInfoUrl = buildOAuthUserInfoUrl;
10
- const node_buffer_1 = require("node:buffer");
11
- const node_crypto_1 = require("node:crypto");
12
- const config_1 = require("./config.cjs");
13
- exports.PARIX_CLIENT_ID = 'parix';
14
- exports.PARIX_LOCAL_CALLBACK_PATH = '/callback';
15
- exports.CLI_OAUTH_CONSENT_GRANTED_PATH = '/cli-oauth-consent-granted';
16
- exports.PARIX_DEFAULT_SCOPES = [
17
- 'openid',
18
- 'profile',
19
- 'email',
20
- 'offline_access',
21
- 'org:read',
22
- 'db:read',
23
- 'db:write',
24
- 'billing:read',
25
- ];
26
- function createPkcePair() {
27
- const codeVerifier = (0, node_crypto_1.randomBytes)(32).toString('base64url');
28
- const codeChallenge = (0, node_crypto_1.createHash)('sha256').update(codeVerifier).digest('base64url');
29
- return {
30
- codeChallenge,
31
- codeVerifier,
32
- };
33
- }
34
- function buildAuthorizeUrl(input) {
35
- const url = new URL('/api/oauth/cli/authorize', (0, config_1.trimTrailingSlash)(input.baseUrl));
36
- url.searchParams.set('state', input.state);
37
- url.searchParams.set('code_challenge', input.codeChallenge);
38
- url.searchParams.set('code_challenge_method', 'S256');
39
- if (input.prompt) {
40
- url.searchParams.set('prompt', input.prompt);
41
- }
42
- return url.toString();
43
- }
44
- function buildCliState(redirectUri) {
45
- return node_buffer_1.Buffer.from(JSON.stringify({
46
- nonce: (0, node_crypto_1.randomBytes)(16).toString('hex'),
47
- redirectUri,
48
- }), 'utf8').toString('base64url');
49
- }
50
- function buildOAuthCallbackUrl(baseUrl) {
51
- return new URL('/api/oauth/cli/callback', (0, config_1.trimTrailingSlash)(baseUrl)).toString();
52
- }
53
- function buildOAuthTokenUrl(baseUrl) {
54
- return new URL('/api/auth/oauth2/token', (0, config_1.trimTrailingSlash)(baseUrl)).toString();
55
- }
56
- function buildOAuthUserInfoUrl(baseUrl) {
57
- return new URL('/api/auth/oauth2/userinfo', (0, config_1.trimTrailingSlash)(baseUrl)).toString();
58
- }
@@ -1,19 +0,0 @@
1
- export declare const PARIX_CLIENT_ID = "parix";
2
- export declare const PARIX_LOCAL_CALLBACK_PATH = "/callback";
3
- export declare const CLI_OAUTH_CONSENT_GRANTED_PATH = "/cli-oauth-consent-granted";
4
- export declare const PARIX_DEFAULT_SCOPES: readonly ["openid", "profile", "email", "offline_access", "org:read", "db:read", "db:write", "billing:read"];
5
- export interface PkcePair {
6
- codeChallenge: string;
7
- codeVerifier: string;
8
- }
9
- export declare function createPkcePair(): PkcePair;
10
- export declare function buildAuthorizeUrl(input: {
11
- baseUrl: string;
12
- codeChallenge: string;
13
- prompt?: string;
14
- state: string;
15
- }): string;
16
- export declare function buildCliState(redirectUri: string): string;
17
- export declare function buildOAuthCallbackUrl(baseUrl: string): string;
18
- export declare function buildOAuthTokenUrl(baseUrl: string): string;
19
- export declare function buildOAuthUserInfoUrl(baseUrl: string): string;
@@ -1,19 +0,0 @@
1
- export declare const PARIX_CLIENT_ID = "parix";
2
- export declare const PARIX_LOCAL_CALLBACK_PATH = "/callback";
3
- export declare const CLI_OAUTH_CONSENT_GRANTED_PATH = "/cli-oauth-consent-granted";
4
- export declare const PARIX_DEFAULT_SCOPES: readonly ["openid", "profile", "email", "offline_access", "org:read", "db:read", "db:write", "billing:read"];
5
- export interface PkcePair {
6
- codeChallenge: string;
7
- codeVerifier: string;
8
- }
9
- export declare function createPkcePair(): PkcePair;
10
- export declare function buildAuthorizeUrl(input: {
11
- baseUrl: string;
12
- codeChallenge: string;
13
- prompt?: string;
14
- state: string;
15
- }): string;
16
- export declare function buildCliState(redirectUri: string): string;
17
- export declare function buildOAuthCallbackUrl(baseUrl: string): string;
18
- export declare function buildOAuthTokenUrl(baseUrl: string): string;
19
- export declare function buildOAuthUserInfoUrl(baseUrl: string): string;
package/dist/lib/oauth.js DELETED
@@ -1,49 +0,0 @@
1
- import { Buffer } from 'node:buffer';
2
- import { createHash, randomBytes } from 'node:crypto';
3
- import { trimTrailingSlash } from "./config.js";
4
- export const PARIX_CLIENT_ID = 'parix';
5
- export const PARIX_LOCAL_CALLBACK_PATH = '/callback';
6
- export const CLI_OAUTH_CONSENT_GRANTED_PATH = '/cli-oauth-consent-granted';
7
- export const PARIX_DEFAULT_SCOPES = [
8
- 'openid',
9
- 'profile',
10
- 'email',
11
- 'offline_access',
12
- 'org:read',
13
- 'db:read',
14
- 'db:write',
15
- 'billing:read',
16
- ];
17
- export function createPkcePair() {
18
- const codeVerifier = randomBytes(32).toString('base64url');
19
- const codeChallenge = createHash('sha256').update(codeVerifier).digest('base64url');
20
- return {
21
- codeChallenge,
22
- codeVerifier,
23
- };
24
- }
25
- export function buildAuthorizeUrl(input) {
26
- const url = new URL('/api/oauth/cli/authorize', trimTrailingSlash(input.baseUrl));
27
- url.searchParams.set('state', input.state);
28
- url.searchParams.set('code_challenge', input.codeChallenge);
29
- url.searchParams.set('code_challenge_method', 'S256');
30
- if (input.prompt) {
31
- url.searchParams.set('prompt', input.prompt);
32
- }
33
- return url.toString();
34
- }
35
- export function buildCliState(redirectUri) {
36
- return Buffer.from(JSON.stringify({
37
- nonce: randomBytes(16).toString('hex'),
38
- redirectUri,
39
- }), 'utf8').toString('base64url');
40
- }
41
- export function buildOAuthCallbackUrl(baseUrl) {
42
- return new URL('/api/oauth/cli/callback', trimTrailingSlash(baseUrl)).toString();
43
- }
44
- export function buildOAuthTokenUrl(baseUrl) {
45
- return new URL('/api/auth/oauth2/token', trimTrailingSlash(baseUrl)).toString();
46
- }
47
- export function buildOAuthUserInfoUrl(baseUrl) {
48
- return new URL('/api/auth/oauth2/userinfo', trimTrailingSlash(baseUrl)).toString();
49
- }
@@ -1,38 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.openUrlInBrowser = openUrlInBrowser;
7
- const node_child_process_1 = require("node:child_process");
8
- const node_process_1 = __importDefault(require("node:process"));
9
- async function openUrlInBrowser(url) {
10
- const command = getOpenCommand(url);
11
- if (!command) {
12
- return false;
13
- }
14
- try {
15
- const child = (0, node_child_process_1.spawn)(command.bin, command.args, {
16
- detached: true,
17
- stdio: 'ignore',
18
- windowsHide: true,
19
- });
20
- child.unref();
21
- return true;
22
- }
23
- catch {
24
- return false;
25
- }
26
- }
27
- function getOpenCommand(url) {
28
- if (node_process_1.default.platform === 'darwin') {
29
- return { bin: 'open', args: [url] };
30
- }
31
- if (node_process_1.default.platform === 'win32') {
32
- return { bin: 'cmd', args: ['/c', 'start', '', url] };
33
- }
34
- if (node_process_1.default.platform === 'linux') {
35
- return { bin: 'xdg-open', args: [url] };
36
- }
37
- return null;
38
- }
@@ -1 +0,0 @@
1
- export declare function openUrlInBrowser(url: string): Promise<boolean>;
@@ -1 +0,0 @@
1
- export declare function openUrlInBrowser(url: string): Promise<boolean>;
@@ -1,32 +0,0 @@
1
- import { spawn } from 'node:child_process';
2
- import process from 'node:process';
3
- export async function openUrlInBrowser(url) {
4
- const command = getOpenCommand(url);
5
- if (!command) {
6
- return false;
7
- }
8
- try {
9
- const child = spawn(command.bin, command.args, {
10
- detached: true,
11
- stdio: 'ignore',
12
- windowsHide: true,
13
- });
14
- child.unref();
15
- return true;
16
- }
17
- catch {
18
- return false;
19
- }
20
- }
21
- function getOpenCommand(url) {
22
- if (process.platform === 'darwin') {
23
- return { bin: 'open', args: [url] };
24
- }
25
- if (process.platform === 'win32') {
26
- return { bin: 'cmd', args: ['/c', 'start', '', url] };
27
- }
28
- if (process.platform === 'linux') {
29
- return { bin: 'xdg-open', args: [url] };
30
- }
31
- return null;
32
- }
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.printJson = printJson;
4
- exports.printKeyValues = printKeyValues;
5
- exports.printTable = printTable;
6
- const prompts_1 = require("@clack/prompts");
7
- function printJson(value) {
8
- prompts_1.log.message(JSON.stringify(value, null, 2));
9
- }
10
- function printKeyValues(entries) {
11
- const keyWidth = Math.max(...entries.map(([key]) => key.length), 0);
12
- prompts_1.log.message(entries.map(([key, value]) => `${key.padEnd(keyWidth)} ${value}`).join('\n'));
13
- }
14
- function printTable(input) {
15
- const widths = input.columns.map((column, index) => Math.max(column.length, ...input.rows.map((row) => row[index]?.length ?? 0)));
16
- const header = input.columns.map((column, index) => column.padEnd(widths[index] ?? 0)).join(' ');
17
- const divider = widths.map((width) => '-'.repeat(width)).join(' ');
18
- const rows = input.rows.map((row) => row.map((value, index) => value.padEnd(widths[index] ?? 0)).join(' '));
19
- prompts_1.log.message([header, divider, ...rows].join('\n'));
20
- }
@@ -1,6 +0,0 @@
1
- export declare function printJson(value: unknown): void;
2
- export declare function printKeyValues(entries: Array<[string, string]>): void;
3
- export declare function printTable(input: {
4
- columns: string[];
5
- rows: string[][];
6
- }): void;
@@ -1,6 +0,0 @@
1
- export declare function printJson(value: unknown): void;
2
- export declare function printKeyValues(entries: Array<[string, string]>): void;
3
- export declare function printTable(input: {
4
- columns: string[];
5
- rows: string[][];
6
- }): void;
@@ -1,15 +0,0 @@
1
- import { log } from '@clack/prompts';
2
- export function printJson(value) {
3
- log.message(JSON.stringify(value, null, 2));
4
- }
5
- export function printKeyValues(entries) {
6
- const keyWidth = Math.max(...entries.map(([key]) => key.length), 0);
7
- log.message(entries.map(([key, value]) => `${key.padEnd(keyWidth)} ${value}`).join('\n'));
8
- }
9
- export function printTable(input) {
10
- const widths = input.columns.map((column, index) => Math.max(column.length, ...input.rows.map((row) => row[index]?.length ?? 0)));
11
- const header = input.columns.map((column, index) => column.padEnd(widths[index] ?? 0)).join(' ');
12
- const divider = widths.map((width) => '-'.repeat(width)).join(' ');
13
- const rows = input.rows.map((row) => row.map((value, index) => value.padEnd(widths[index] ?? 0)).join(' '));
14
- log.message([header, divider, ...rows].join('\n'));
15
- }