cloudops-cli 0.1.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 (86) hide show
  1. package/README.md +132 -0
  2. package/dist/api/api-client.d.ts +78 -0
  3. package/dist/api/api-client.d.ts.map +1 -0
  4. package/dist/api/api-client.js +197 -0
  5. package/dist/api/api-client.js.map +1 -0
  6. package/dist/api/index.d.ts +3 -0
  7. package/dist/api/index.d.ts.map +1 -0
  8. package/dist/api/index.js +8 -0
  9. package/dist/api/index.js.map +1 -0
  10. package/dist/auth/__mocks__/auth-handler.d.ts +27 -0
  11. package/dist/auth/__mocks__/auth-handler.d.ts.map +1 -0
  12. package/dist/auth/__mocks__/auth-handler.js +24 -0
  13. package/dist/auth/__mocks__/auth-handler.js.map +1 -0
  14. package/dist/auth/auth-handler.d.ts +80 -0
  15. package/dist/auth/auth-handler.d.ts.map +1 -0
  16. package/dist/auth/auth-handler.js +266 -0
  17. package/dist/auth/auth-handler.js.map +1 -0
  18. package/dist/auth/callback-server.d.ts +31 -0
  19. package/dist/auth/callback-server.d.ts.map +1 -0
  20. package/dist/auth/callback-server.js +143 -0
  21. package/dist/auth/callback-server.js.map +1 -0
  22. package/dist/auth/index.d.ts +3 -0
  23. package/dist/auth/index.d.ts.map +1 -0
  24. package/dist/auth/index.js +8 -0
  25. package/dist/auth/index.js.map +1 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +422 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/commands/accounts.d.ts +15 -0
  31. package/dist/commands/accounts.d.ts.map +1 -0
  32. package/dist/commands/accounts.js +307 -0
  33. package/dist/commands/accounts.js.map +1 -0
  34. package/dist/commands/audit.d.ts +23 -0
  35. package/dist/commands/audit.d.ts.map +1 -0
  36. package/dist/commands/audit.js +348 -0
  37. package/dist/commands/audit.js.map +1 -0
  38. package/dist/commands/config.d.ts +15 -0
  39. package/dist/commands/config.d.ts.map +1 -0
  40. package/dist/commands/config.js +148 -0
  41. package/dist/commands/config.js.map +1 -0
  42. package/dist/commands/incident.d.ts +59 -0
  43. package/dist/commands/incident.d.ts.map +1 -0
  44. package/dist/commands/incident.js +1032 -0
  45. package/dist/commands/incident.js.map +1 -0
  46. package/dist/commands/init.d.ts +9 -0
  47. package/dist/commands/init.d.ts.map +1 -0
  48. package/dist/commands/init.js +300 -0
  49. package/dist/commands/init.js.map +1 -0
  50. package/dist/commands/investigate.d.ts +15 -0
  51. package/dist/commands/investigate.d.ts.map +1 -0
  52. package/dist/commands/investigate.js +65 -0
  53. package/dist/commands/investigate.js.map +1 -0
  54. package/dist/commands/runbook.d.ts +20 -0
  55. package/dist/commands/runbook.d.ts.map +1 -0
  56. package/dist/commands/runbook.js +265 -0
  57. package/dist/commands/runbook.js.map +1 -0
  58. package/dist/config/__mocks__/config-handler.d.ts +11 -0
  59. package/dist/config/__mocks__/config-handler.d.ts.map +1 -0
  60. package/dist/config/__mocks__/config-handler.js +31 -0
  61. package/dist/config/__mocks__/config-handler.js.map +1 -0
  62. package/dist/config/certificate-pinning.d.ts +68 -0
  63. package/dist/config/certificate-pinning.d.ts.map +1 -0
  64. package/dist/config/certificate-pinning.js +249 -0
  65. package/dist/config/certificate-pinning.js.map +1 -0
  66. package/dist/config/config-handler.d.ts +45 -0
  67. package/dist/config/config-handler.d.ts.map +1 -0
  68. package/dist/config/config-handler.js +149 -0
  69. package/dist/config/config-handler.js.map +1 -0
  70. package/dist/config/index.d.ts +2 -0
  71. package/dist/config/index.d.ts.map +1 -0
  72. package/dist/config/index.js +7 -0
  73. package/dist/config/index.js.map +1 -0
  74. package/dist/index.d.ts +4 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +25 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/types/cli-options.d.ts +31 -0
  79. package/dist/types/cli-options.d.ts.map +1 -0
  80. package/dist/types/cli-options.js +3 -0
  81. package/dist/types/cli-options.js.map +1 -0
  82. package/dist/utils/output-formatter.d.ts +67 -0
  83. package/dist/utils/output-formatter.d.ts.map +1 -0
  84. package/dist/utils/output-formatter.js +147 -0
  85. package/dist/utils/output-formatter.js.map +1 -0
  86. package/package.json +65 -0
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AuthHandler = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const crypto = __importStar(require("crypto"));
41
+ const oidc = __importStar(require("openid-client"));
42
+ /**
43
+ * Authentication handler for CLI
44
+ * Manages OAuth/SSO flow and secure token storage
45
+ */
46
+ class AuthHandler {
47
+ tokenDir;
48
+ tokenFile;
49
+ encryptionKey;
50
+ constructor(configDir) {
51
+ this.tokenDir = configDir || path.join(os.homedir(), '.cloudops');
52
+ this.tokenFile = path.join(this.tokenDir, '.tokens');
53
+ // Generate or load encryption key for token storage
54
+ this.encryptionKey = this.getOrCreateEncryptionKey();
55
+ }
56
+ /**
57
+ * Start OAuth/SSO authentication flow
58
+ * Returns the authorization URL for the user to visit
59
+ */
60
+ async startAuthFlow(issuerUrl, clientId, redirectUri = 'http://localhost:8080/callback') {
61
+ // Discover OIDC configuration
62
+ const config = await oidc.discovery(new URL(issuerUrl), clientId);
63
+ // Generate PKCE code verifier and challenge
64
+ const codeVerifier = oidc.randomPKCECodeVerifier();
65
+ const codeChallenge = await oidc.calculatePKCECodeChallenge(codeVerifier);
66
+ // Generate state for CSRF protection
67
+ const state = oidc.randomState();
68
+ const authUrl = oidc.buildAuthorizationUrl(config, {
69
+ redirect_uri: redirectUri,
70
+ scope: 'openid profile email',
71
+ code_challenge: codeChallenge,
72
+ code_challenge_method: 'S256',
73
+ state,
74
+ });
75
+ return {
76
+ authUrl: authUrl.href,
77
+ codeVerifier,
78
+ state,
79
+ };
80
+ }
81
+ /**
82
+ * Complete OAuth/SSO authentication flow
83
+ * Exchange authorization code for tokens
84
+ */
85
+ async completeAuthFlow(issuerUrl, clientId, code, codeVerifier, redirectUri = 'http://localhost:8080/callback') {
86
+ // Discover OIDC configuration
87
+ const config = await oidc.discovery(new URL(issuerUrl), clientId);
88
+ try {
89
+ const currentUrl = new URL(redirectUri);
90
+ currentUrl.searchParams.set('code', code);
91
+ const tokens = await oidc.authorizationCodeGrant(config, currentUrl, {
92
+ pkceCodeVerifier: codeVerifier,
93
+ expectedState: undefined, // State validation done by callback server
94
+ });
95
+ const tokenResponse = {
96
+ accessToken: tokens.access_token,
97
+ refreshToken: tokens.refresh_token,
98
+ idToken: tokens.id_token,
99
+ expiresIn: tokens.expires_in || 3600,
100
+ tokenType: tokens.token_type || 'Bearer',
101
+ };
102
+ // Store tokens securely
103
+ await this.storeTokens(tokenResponse);
104
+ }
105
+ catch (error) {
106
+ throw new Error(`Failed to exchange code for tokens: ${error instanceof Error ? error.message : 'Unknown error'}`);
107
+ }
108
+ }
109
+ /**
110
+ * Get current access token, refreshing if necessary
111
+ */
112
+ async getAccessToken(issuerUrl, clientId) {
113
+ const tokens = await this.loadTokens();
114
+ if (!tokens) {
115
+ return null;
116
+ }
117
+ // Check if token is expired or will expire in the next 5 minutes
118
+ const now = Math.floor(Date.now() / 1000);
119
+ const expiryBuffer = 300; // 5 minutes
120
+ if (tokens.expiresAt > now + expiryBuffer) {
121
+ // Token is still valid
122
+ return tokens.accessToken;
123
+ }
124
+ // Token is expired or expiring soon, try to refresh
125
+ if (tokens.refreshToken && issuerUrl && clientId) {
126
+ try {
127
+ await this.refreshToken(issuerUrl, clientId, tokens.refreshToken);
128
+ const refreshedTokens = await this.loadTokens();
129
+ return refreshedTokens?.accessToken || null;
130
+ }
131
+ catch (error) {
132
+ // Refresh failed, user needs to re-authenticate
133
+ console.error('Token refresh failed:', error);
134
+ return null;
135
+ }
136
+ }
137
+ return null;
138
+ }
139
+ /**
140
+ * Refresh access token using refresh token
141
+ */
142
+ async refreshToken(issuerUrl, clientId, refreshToken) {
143
+ // Discover OIDC configuration
144
+ const config = await oidc.discovery(new URL(issuerUrl), clientId);
145
+ try {
146
+ const tokens = await oidc.refreshTokenGrant(config, refreshToken);
147
+ const tokenResponse = {
148
+ accessToken: tokens.access_token,
149
+ refreshToken: tokens.refresh_token,
150
+ idToken: tokens.id_token,
151
+ expiresIn: tokens.expires_in || 3600,
152
+ tokenType: tokens.token_type || 'Bearer',
153
+ };
154
+ // Store refreshed tokens
155
+ await this.storeTokens(tokenResponse);
156
+ }
157
+ catch (error) {
158
+ throw new Error(`Failed to refresh token: ${error instanceof Error ? error.message : 'Unknown error'}`);
159
+ }
160
+ }
161
+ /**
162
+ * Check if user is authenticated
163
+ */
164
+ async isAuthenticated() {
165
+ const tokens = await this.loadTokens();
166
+ if (!tokens) {
167
+ return false;
168
+ }
169
+ const now = Math.floor(Date.now() / 1000);
170
+ return tokens.expiresAt > now;
171
+ }
172
+ /**
173
+ * Clear stored tokens (logout)
174
+ */
175
+ async clearTokens() {
176
+ if (fs.existsSync(this.tokenFile)) {
177
+ fs.unlinkSync(this.tokenFile);
178
+ }
179
+ }
180
+ /**
181
+ * Store tokens securely (encrypted)
182
+ */
183
+ async storeTokens(tokens) {
184
+ const now = Math.floor(Date.now() / 1000);
185
+ const storage = {
186
+ accessToken: tokens.accessToken,
187
+ refreshToken: tokens.refreshToken,
188
+ expiresAt: now + tokens.expiresIn,
189
+ tokenType: tokens.tokenType,
190
+ };
191
+ // Encrypt token data
192
+ const encrypted = this.encrypt(JSON.stringify(storage));
193
+ // Ensure directory exists
194
+ if (!fs.existsSync(this.tokenDir)) {
195
+ fs.mkdirSync(this.tokenDir, { recursive: true, mode: 0o700 });
196
+ }
197
+ // Write encrypted tokens to file with restricted permissions
198
+ fs.writeFileSync(this.tokenFile, encrypted, { mode: 0o600 });
199
+ }
200
+ /**
201
+ * Load tokens from secure storage (decrypted)
202
+ */
203
+ async loadTokens() {
204
+ if (!fs.existsSync(this.tokenFile)) {
205
+ return null;
206
+ }
207
+ try {
208
+ const encrypted = fs.readFileSync(this.tokenFile, 'utf8');
209
+ const decrypted = this.decrypt(encrypted);
210
+ return JSON.parse(decrypted);
211
+ }
212
+ catch (error) {
213
+ console.error('Failed to load tokens:', error);
214
+ return null;
215
+ }
216
+ }
217
+ /**
218
+ * Get or create encryption key for token storage
219
+ */
220
+ getOrCreateEncryptionKey() {
221
+ const keyFile = path.join(this.tokenDir, '.key');
222
+ if (fs.existsSync(keyFile)) {
223
+ return fs.readFileSync(keyFile);
224
+ }
225
+ // Generate new encryption key
226
+ const key = crypto.randomBytes(32); // 256-bit key for AES-256
227
+ // Ensure directory exists
228
+ if (!fs.existsSync(this.tokenDir)) {
229
+ fs.mkdirSync(this.tokenDir, { recursive: true, mode: 0o700 });
230
+ }
231
+ // Store key with restricted permissions
232
+ fs.writeFileSync(keyFile, key, { mode: 0o600 });
233
+ return key;
234
+ }
235
+ /**
236
+ * Encrypt data using AES-256-GCM
237
+ */
238
+ encrypt(plaintext) {
239
+ const iv = crypto.randomBytes(16);
240
+ const cipher = crypto.createCipheriv('aes-256-gcm', this.encryptionKey, iv);
241
+ let encrypted = cipher.update(plaintext, 'utf8', 'hex');
242
+ encrypted += cipher.final('hex');
243
+ const authTag = cipher.getAuthTag();
244
+ // Return IV + authTag + encrypted data
245
+ return iv.toString('hex') + ':' + authTag.toString('hex') + ':' + encrypted;
246
+ }
247
+ /**
248
+ * Decrypt data using AES-256-GCM
249
+ */
250
+ decrypt(ciphertext) {
251
+ const parts = ciphertext.split(':');
252
+ if (parts.length !== 3) {
253
+ throw new Error('Invalid ciphertext format');
254
+ }
255
+ const iv = Buffer.from(parts[0], 'hex');
256
+ const authTag = Buffer.from(parts[1], 'hex');
257
+ const encrypted = parts[2];
258
+ const decipher = crypto.createDecipheriv('aes-256-gcm', this.encryptionKey, iv);
259
+ decipher.setAuthTag(authTag);
260
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
261
+ decrypted += decipher.final('utf8');
262
+ return decrypted;
263
+ }
264
+ }
265
+ exports.AuthHandler = AuthHandler;
266
+ //# sourceMappingURL=auth-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-handler.js","sourceRoot":"","sources":["../../src/auth/auth-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Callback result from OAuth flow
3
+ */
4
+ export interface CallbackResult {
5
+ code?: string;
6
+ state?: string;
7
+ error?: string;
8
+ errorDescription?: string;
9
+ }
10
+ /**
11
+ * Simple HTTP server to handle OAuth callback
12
+ */
13
+ export declare class CallbackServer {
14
+ private server;
15
+ private port;
16
+ constructor(port?: number);
17
+ /**
18
+ * Start the callback server and wait for OAuth response
19
+ * Returns a promise that resolves with the callback result
20
+ */
21
+ waitForCallback(expectedState: string, timeoutMs?: number): Promise<CallbackResult>;
22
+ /**
23
+ * Stop the callback server
24
+ */
25
+ stop(): void;
26
+ /**
27
+ * Get the callback URL for this server
28
+ */
29
+ getCallbackUrl(): string;
30
+ }
31
+ //# sourceMappingURL=callback-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.d.ts","sourceRoot":"","sources":["../../src/auth/callback-server.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,GAAE,MAAa;IAI/B;;;OAGG;IACG,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,GAAE,MAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAkFjG;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CallbackServer = void 0;
37
+ const http = __importStar(require("http"));
38
+ const url = __importStar(require("url"));
39
+ /**
40
+ * Simple HTTP server to handle OAuth callback
41
+ */
42
+ class CallbackServer {
43
+ server = null;
44
+ port;
45
+ constructor(port = 8080) {
46
+ this.port = port;
47
+ }
48
+ /**
49
+ * Start the callback server and wait for OAuth response
50
+ * Returns a promise that resolves with the callback result
51
+ */
52
+ async waitForCallback(expectedState, timeoutMs = 120000) {
53
+ return new Promise((resolve, reject) => {
54
+ const timeout = setTimeout(() => {
55
+ this.stop();
56
+ reject(new Error('Authentication timeout - no callback received'));
57
+ }, timeoutMs);
58
+ this.server = http.createServer((req, res) => {
59
+ const parsedUrl = url.parse(req.url || '', true);
60
+ if (parsedUrl.pathname === '/callback') {
61
+ const query = parsedUrl.query;
62
+ // Send response to browser
63
+ res.writeHead(200, { 'Content-Type': 'text/html' });
64
+ if (query.error) {
65
+ res.end(`
66
+ <html>
67
+ <head><title>Authentication Failed</title></head>
68
+ <body>
69
+ <h1>Authentication Failed</h1>
70
+ <p>Error: ${query.error}</p>
71
+ <p>${query.error_description || ''}</p>
72
+ <p>You can close this window and return to the CLI.</p>
73
+ </body>
74
+ </html>
75
+ `);
76
+ }
77
+ else {
78
+ res.end(`
79
+ <html>
80
+ <head><title>Authentication Successful</title></head>
81
+ <body>
82
+ <h1>Authentication Successful!</h1>
83
+ <p>You can close this window and return to the CLI.</p>
84
+ </body>
85
+ </html>
86
+ `);
87
+ }
88
+ // Clear timeout
89
+ clearTimeout(timeout);
90
+ // Stop server
91
+ this.stop();
92
+ // Validate state to prevent CSRF
93
+ if (query.state !== expectedState) {
94
+ reject(new Error('State mismatch - possible CSRF attack'));
95
+ return;
96
+ }
97
+ // Resolve with callback result
98
+ if (query.error) {
99
+ resolve({
100
+ error: query.error,
101
+ errorDescription: query.error_description,
102
+ });
103
+ }
104
+ else {
105
+ resolve({
106
+ code: query.code,
107
+ state: query.state,
108
+ });
109
+ }
110
+ }
111
+ else {
112
+ // Unknown path
113
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
114
+ res.end('Not Found');
115
+ }
116
+ });
117
+ this.server.listen(this.port, () => {
118
+ console.log(`Callback server listening on http://localhost:${this.port}`);
119
+ });
120
+ this.server.on('error', (error) => {
121
+ clearTimeout(timeout);
122
+ reject(new Error(`Failed to start callback server: ${error.message}`));
123
+ });
124
+ });
125
+ }
126
+ /**
127
+ * Stop the callback server
128
+ */
129
+ stop() {
130
+ if (this.server) {
131
+ this.server.close();
132
+ this.server = null;
133
+ }
134
+ }
135
+ /**
136
+ * Get the callback URL for this server
137
+ */
138
+ getCallbackUrl() {
139
+ return `http://localhost:${this.port}/callback`;
140
+ }
141
+ }
142
+ exports.CallbackServer = CallbackServer;
143
+ //# sourceMappingURL=callback-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.js","sourceRoot":"","sources":["../../src/auth/callback-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { AuthHandler, TokenStorage } from './auth-handler';
2
+ export { CallbackServer, CallbackResult } from './callback-server';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CallbackServer = exports.AuthHandler = void 0;
4
+ var auth_handler_1 = require("./auth-handler");
5
+ Object.defineProperty(exports, "AuthHandler", { enumerable: true, get: function () { return auth_handler_1.AuthHandler; } });
6
+ var callback_server_1 = require("./callback-server");
7
+ Object.defineProperty(exports, "CallbackServer", { enumerable: true, get: function () { return callback_server_1.CallbackServer; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":";;;AAAA,+CAA2D;AAAlD,2GAAA,WAAW,OAAA;AACpB,qDAAmE;AAA1D,iHAAA,cAAc,OAAA"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}