@quantiya/codevibe-core 1.0.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 (49) hide show
  1. package/README.md +178 -0
  2. package/bin/codevibe.js +7 -0
  3. package/dist/appsync/appsync-client.d.ts +132 -0
  4. package/dist/appsync/appsync-client.js +568 -0
  5. package/dist/appsync/index.d.ts +2 -0
  6. package/dist/appsync/index.js +10 -0
  7. package/dist/appsync/queries.d.ts +16 -0
  8. package/dist/appsync/queries.js +189 -0
  9. package/dist/auth/auth-cli.d.ts +5 -0
  10. package/dist/auth/auth-cli.js +217 -0
  11. package/dist/auth/auth-service.d.ts +53 -0
  12. package/dist/auth/auth-service.js +310 -0
  13. package/dist/auth/index.d.ts +2 -0
  14. package/dist/auth/index.js +9 -0
  15. package/dist/config/config.d.ts +53 -0
  16. package/dist/config/config.js +123 -0
  17. package/dist/config/index.d.ts +2 -0
  18. package/dist/config/index.js +8 -0
  19. package/dist/crypto/crypto-service.d.ts +118 -0
  20. package/dist/crypto/crypto-service.js +284 -0
  21. package/dist/crypto/index.d.ts +1 -0
  22. package/dist/crypto/index.js +9 -0
  23. package/dist/index.d.ts +14 -0
  24. package/dist/index.js +68 -0
  25. package/dist/keychain/index.d.ts +1 -0
  26. package/dist/keychain/index.js +8 -0
  27. package/dist/keychain/keychain-manager.d.ts +125 -0
  28. package/dist/keychain/keychain-manager.js +375 -0
  29. package/dist/logger/index.d.ts +1 -0
  30. package/dist/logger/index.js +8 -0
  31. package/dist/logger/logger.d.ts +35 -0
  32. package/dist/logger/logger.js +142 -0
  33. package/dist/prompt-parser.d.ts +39 -0
  34. package/dist/prompt-parser.js +236 -0
  35. package/dist/session/index.d.ts +2 -0
  36. package/dist/session/index.js +7 -0
  37. package/dist/session/session-resume.d.ts +55 -0
  38. package/dist/session/session-resume.js +151 -0
  39. package/dist/types/auth.d.ts +15 -0
  40. package/dist/types/auth.js +3 -0
  41. package/dist/types/encryption.d.ts +54 -0
  42. package/dist/types/encryption.js +3 -0
  43. package/dist/types/events.d.ts +74 -0
  44. package/dist/types/events.js +28 -0
  45. package/dist/types/index.d.ts +4 -0
  46. package/dist/types/index.js +22 -0
  47. package/dist/types/session.d.ts +59 -0
  48. package/dist/types/session.js +22 -0
  49. package/package.json +51 -0
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ //
3
+ // auth-service.ts
4
+ // CodeVibe Core
5
+ //
6
+ // OAuth authentication service
7
+ //
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.authService = exports.AuthService = void 0;
43
+ const crypto = __importStar(require("crypto"));
44
+ const http = __importStar(require("http"));
45
+ const child_process_1 = require("child_process");
46
+ const config_1 = require("../config");
47
+ const keychain_1 = require("../keychain");
48
+ const logger_1 = require("../logger");
49
+ const CALLBACK_PORT = 8080;
50
+ const CALLBACK_PATH = '/callback';
51
+ const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
52
+ /**
53
+ * Authentication service for OAuth flows
54
+ */
55
+ class AuthService {
56
+ constructor() { }
57
+ static getInstance() {
58
+ if (!AuthService.instance) {
59
+ AuthService.instance = new AuthService();
60
+ }
61
+ return AuthService.instance;
62
+ }
63
+ /**
64
+ * Open URL in default browser
65
+ */
66
+ openBrowser(url) {
67
+ (0, child_process_1.spawn)('open', [url], { detached: true, stdio: 'ignore' }).unref();
68
+ }
69
+ /**
70
+ * Generate state for CSRF protection
71
+ */
72
+ generateState() {
73
+ return crypto.randomBytes(32).toString('hex');
74
+ }
75
+ /**
76
+ * Build authorization URL
77
+ */
78
+ buildAuthUrl(state) {
79
+ const config = (0, config_1.getConfig)();
80
+ const params = new URLSearchParams({
81
+ client_id: config.aws.cognitoClientId,
82
+ response_type: 'code',
83
+ scope: 'email openid profile',
84
+ redirect_uri: REDIRECT_URI,
85
+ state: state,
86
+ });
87
+ return `https://${config.aws.cognitoDomain}/oauth2/authorize?${params.toString()}`;
88
+ }
89
+ /**
90
+ * Exchange authorization code for tokens
91
+ */
92
+ async exchangeCodeForTokens(code) {
93
+ const config = (0, config_1.getConfig)();
94
+ const tokenUrl = `https://${config.aws.cognitoDomain}/oauth2/token`;
95
+ const params = new URLSearchParams({
96
+ grant_type: 'authorization_code',
97
+ client_id: config.aws.cognitoClientId,
98
+ code: code,
99
+ redirect_uri: REDIRECT_URI,
100
+ });
101
+ const response = await fetch(tokenUrl, {
102
+ method: 'POST',
103
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
104
+ body: params.toString(),
105
+ });
106
+ if (!response.ok) {
107
+ const errorText = await response.text();
108
+ throw new Error(`Token exchange failed: ${response.status} ${errorText}`);
109
+ }
110
+ const data = await response.json();
111
+ return {
112
+ accessToken: data.access_token,
113
+ idToken: data.id_token,
114
+ refreshToken: data.refresh_token,
115
+ expiresIn: data.expires_in,
116
+ };
117
+ }
118
+ /**
119
+ * Decode JWT payload
120
+ */
121
+ decodeJwt(token) {
122
+ const parts = token.split('.');
123
+ if (parts.length !== 3)
124
+ throw new Error('Invalid JWT');
125
+ return JSON.parse(Buffer.from(parts[1], 'base64').toString('utf-8'));
126
+ }
127
+ /**
128
+ * Refresh tokens
129
+ */
130
+ async refreshTokens(refreshToken) {
131
+ const config = (0, config_1.getConfig)();
132
+ const tokenUrl = `https://${config.aws.cognitoDomain}/oauth2/token`;
133
+ const params = new URLSearchParams({
134
+ grant_type: 'refresh_token',
135
+ client_id: config.aws.cognitoClientId,
136
+ refresh_token: refreshToken,
137
+ });
138
+ const response = await fetch(tokenUrl, {
139
+ method: 'POST',
140
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
141
+ body: params.toString(),
142
+ });
143
+ if (!response.ok) {
144
+ throw new Error(`Token refresh failed: ${response.status}`);
145
+ }
146
+ const data = await response.json();
147
+ return {
148
+ accessToken: data.access_token,
149
+ idToken: data.id_token,
150
+ expiresIn: data.expires_in,
151
+ };
152
+ }
153
+ /**
154
+ * Login via OAuth browser flow
155
+ */
156
+ async login() {
157
+ // Check if already logged in
158
+ const existing = await keychain_1.keychainManager.getTokens((0, config_1.getEnvironment)());
159
+ if (existing && !keychain_1.keychainManager.isTokenExpired(existing)) {
160
+ return existing;
161
+ }
162
+ const state = this.generateState();
163
+ const authUrl = this.buildAuthUrl(state);
164
+ return new Promise((resolve, reject) => {
165
+ const server = http.createServer(async (req, res) => {
166
+ if (!req.url?.startsWith(CALLBACK_PATH)) {
167
+ res.writeHead(404);
168
+ res.end('Not found');
169
+ return;
170
+ }
171
+ try {
172
+ const url = new URL(req.url, `http://localhost:${CALLBACK_PORT}`);
173
+ const code = url.searchParams.get('code');
174
+ const returnedState = url.searchParams.get('state');
175
+ const error = url.searchParams.get('error');
176
+ if (error) {
177
+ throw new Error(`OAuth error: ${error}`);
178
+ }
179
+ if (returnedState !== state) {
180
+ throw new Error('State mismatch');
181
+ }
182
+ if (!code) {
183
+ throw new Error('No authorization code');
184
+ }
185
+ const tokens = await this.exchangeCodeForTokens(code);
186
+ const idPayload = this.decodeJwt(tokens.idToken);
187
+ const tokenData = {
188
+ accessToken: tokens.accessToken,
189
+ idToken: tokens.idToken,
190
+ refreshToken: tokens.refreshToken,
191
+ expiresAt: Date.now() + (tokens.expiresIn * 1000),
192
+ userId: idPayload.sub,
193
+ email: idPayload.email || 'unknown',
194
+ };
195
+ await keychain_1.keychainManager.setTokens(tokenData, (0, config_1.getEnvironment)());
196
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
197
+ res.end(`
198
+ <!DOCTYPE html>
199
+ <html>
200
+ <head><title>Success</title></head>
201
+ <body style="font-family: system-ui; max-width: 600px; margin: 50px auto; text-align: center;">
202
+ <h1 style="color: #22c55e;">&#10003; Authentication Successful</h1>
203
+ <p>You can close this window.</p>
204
+ </body>
205
+ </html>
206
+ `);
207
+ setTimeout(() => {
208
+ server.close(() => resolve(tokenData));
209
+ }, 500);
210
+ }
211
+ catch (err) {
212
+ res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
213
+ res.end(`
214
+ <!DOCTYPE html>
215
+ <html>
216
+ <head><title>Error</title></head>
217
+ <body style="font-family: system-ui; max-width: 600px; margin: 50px auto; text-align: center;">
218
+ <h1 style="color: #ef4444;">&#10007; Authentication Failed</h1>
219
+ <p>${err.message}</p>
220
+ </body>
221
+ </html>
222
+ `);
223
+ setTimeout(() => {
224
+ server.close(() => reject(err));
225
+ }, 500);
226
+ }
227
+ });
228
+ server.on('error', (err) => {
229
+ if (err.code === 'EADDRINUSE') {
230
+ reject(new Error(`Port ${CALLBACK_PORT} is in use`));
231
+ }
232
+ else {
233
+ reject(err);
234
+ }
235
+ });
236
+ server.listen(CALLBACK_PORT, 'localhost', () => {
237
+ logger_1.logger.info('[AuthService] Callback server started');
238
+ this.openBrowser(authUrl);
239
+ });
240
+ // Timeout
241
+ setTimeout(() => {
242
+ server.close(() => reject(new Error('Login timeout')));
243
+ }, 2 * 60 * 1000);
244
+ });
245
+ }
246
+ /**
247
+ * Logout
248
+ */
249
+ async logout() {
250
+ const config = (0, config_1.getConfig)();
251
+ const deleted = await keychain_1.keychainManager.deleteTokens((0, config_1.getEnvironment)());
252
+ if (deleted) {
253
+ // Start temporary server to handle signout callback
254
+ return new Promise((resolve) => {
255
+ const server = http.createServer((req, res) => {
256
+ if (req.url?.startsWith('/signout')) {
257
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
258
+ res.end(`
259
+ <!DOCTYPE html>
260
+ <html>
261
+ <head><title>Signed Out</title></head>
262
+ <body style="font-family: system-ui; max-width: 600px; margin: 50px auto; text-align: center;">
263
+ <h1 style="color: #22c55e;">&#10003; Signed Out</h1>
264
+ <p>You can close this window.</p>
265
+ </body>
266
+ </html>
267
+ `);
268
+ setTimeout(() => {
269
+ server.close(() => resolve(true));
270
+ }, 500);
271
+ }
272
+ else {
273
+ res.writeHead(404);
274
+ res.end('Not found');
275
+ }
276
+ });
277
+ server.on('error', () => {
278
+ resolve(true); // Still return true since tokens were deleted
279
+ });
280
+ server.listen(CALLBACK_PORT, 'localhost', () => {
281
+ const logoutUrl = `https://${config.aws.cognitoDomain}/logout?` +
282
+ `client_id=${config.aws.cognitoClientId}&` +
283
+ `logout_uri=${encodeURIComponent(REDIRECT_URI.replace('/callback', '/signout'))}`;
284
+ this.openBrowser(logoutUrl);
285
+ });
286
+ // Timeout after 30 seconds
287
+ setTimeout(() => {
288
+ server.close(() => resolve(true));
289
+ }, 30 * 1000);
290
+ });
291
+ }
292
+ return deleted;
293
+ }
294
+ /**
295
+ * Get current auth status
296
+ */
297
+ async getStatus() {
298
+ const tokens = await keychain_1.keychainManager.getTokens((0, config_1.getEnvironment)());
299
+ if (!tokens) {
300
+ return { authenticated: false };
301
+ }
302
+ return {
303
+ authenticated: !keychain_1.keychainManager.isTokenExpired(tokens),
304
+ tokens,
305
+ };
306
+ }
307
+ }
308
+ exports.AuthService = AuthService;
309
+ exports.authService = AuthService.getInstance();
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1dGgvYXV0aC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxFQUFFO0FBQ0Ysa0JBQWtCO0FBQ2xCLGdCQUFnQjtBQUNoQixFQUFFO0FBQ0YsK0JBQStCO0FBQy9CLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVGLCtDQUFpQztBQUNqQywyQ0FBNkI7QUFDN0IsaURBQXNDO0FBQ3RDLHNDQUFzRDtBQUN0RCwwQ0FBOEM7QUFDOUMsc0NBQW1DO0FBR25DLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7QUFDbEMsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLGFBQWEsR0FBRyxhQUFhLEVBQUUsQ0FBQztBQUV6RTs7R0FFRztBQUNILE1BQWEsV0FBVztJQUd0QixnQkFBdUIsQ0FBQztJQUV4QixNQUFNLENBQUMsV0FBVztRQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLFdBQVcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNLLFdBQVcsQ0FBQyxHQUFXO1FBQzdCLElBQUEscUJBQUssRUFBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYTtRQUNuQixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7T0FF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LEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDcEMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNoQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsU0FBUztRQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sMEJBQWUsQ0FBQyxTQUFTLENBQUMsSUFBQSx1QkFBYyxHQUFFLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFFRCxPQUFPO1lBQ0wsYUFBYSxFQUFFLENBQUMsMEJBQWUsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQ3RELE1BQU07U0FDUCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBeFRELGtDQXdUQztBQUVZLFFBQUEsV0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vXG4vLyBhdXRoLXNlcnZpY2UudHNcbi8vIENvZGVWaWJlIENvcmVcbi8vXG4vLyBPQXV0aCBhdXRoZW50aWNhdGlvbiBzZXJ2aWNlXG4vL1xuXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZ2V0Q29uZmlnLCBnZXRFbnZpcm9ubWVudCB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBrZXljaGFpbk1hbmFnZXIgfSBmcm9tICcuLi9rZXljaGFpbic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgVG9rZW5EYXRhIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBDQUxMQkFDS19QT1JUID0gODA4MDtcbmNvbnN0IENBTExCQUNLX1BBVEggPSAnL2NhbGxiYWNrJztcbmNvbnN0IFJFRElSRUNUX1VSSSA9IGBodHRwOi8vbG9jYWxob3N0OiR7Q0FMTEJBQ0tfUE9SVH0ke0NBTExCQUNLX1BBVEh9YDtcblxuLyoqXG4gKiBBdXRoZW50aWNhdGlvbiBzZXJ2aWNlIGZvciBPQXV0aCBmbG93c1xuICovXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQXV0aFNlcnZpY2U7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKCk6IEF1dGhTZXJ2aWNlIHtcbiAgICBpZiAoIUF1dGhTZXJ2aWNlLmluc3RhbmNlKSB7XG4gICAgICBBdXRoU2VydmljZS5pbnN0YW5jZSA9IG5ldyBBdXRoU2VydmljZSgpO1xuICAgIH1cbiAgICByZXR1cm4gQXV0aFNlcnZpY2UuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBVUkwgaW4gZGVmYXVsdCBicm93c2VyXG4gICAqL1xuICBwcml2YXRlIG9wZW5Ccm93c2VyKHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgc3Bhd24oJ29wZW4nLCBbdXJsXSwgeyBkZXRhY2hlZDogdHJ1ZSwgc3RkaW86ICdpZ25vcmUnIH0pLnVucmVmKCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgc3RhdGUgZm9yIENTUkYgcHJvdGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZVN0YXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21CeXRlcygzMikudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGF1dGhvcml6YXRpb24gVVJMXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQXV0aFVybChzdGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgIGNsaWVudF9pZDogY29uZmlnLmF3cy5jb2duaXRvQ2xpZW50SWQsXG4gICAgICByZXNwb25zZV90eXBlOiAnY29kZScsXG4gICAgICBzY29wZTogJ2VtYWlsIG9wZW5pZCBwcm9maWxlJyxcbiAgICAgIHJlZGlyZWN0X3VyaTogUkVESVJFQ1RfVVJJLFxuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGBodHRwczovLyR7Y29uZmlnLmF3cy5jb2duaXRvRG9tYWlufS9vYXV0aDIvYXV0aG9yaXplPyR7cGFyYW1zLnRvU3RyaW5nKCl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNoYW5nZSBhdXRob3JpemF0aW9uIGNvZGUgZm9yIHRva2Vuc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGNoYW5nZUNvZGVGb3JUb2tlbnMoY29kZTogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICBpZFRva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgZXhwaXJlc0luOiBudW1iZXI7XG4gIH0+IHtcbiAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTtcbiAgICBjb25zdCB0b2tlblVybCA9IGBodHRwczovLyR7Y29uZmlnLmF3cy5jb2duaXRvRG9tYWlufS9vYXV0aDIvdG9rZW5gO1xuXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgIGNsaWVudF9pZDogY29uZmlnLmF3cy5jb2duaXRvQ2xpZW50SWQsXG4gICAgICBjb2RlOiBjb2RlLFxuICAgICAgcmVkaXJlY3RfdXJpOiBSRURJUkVDVF9VUkksXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRva2VuVXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIH0sXG4gICAgICBib2R5OiBwYXJhbXMudG9TdHJpbmcoKSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVG9rZW4gZXhjaGFuZ2UgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtlcnJvclRleHR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyB7XG4gICAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAgIGlkX3Rva2VuOiBzdHJpbmc7XG4gICAgICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XG4gICAgICBleHBpcmVzX2luOiBudW1iZXI7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY2Nlc3NUb2tlbjogZGF0YS5hY2Nlc3NfdG9rZW4sXG4gICAgICBpZFRva2VuOiBkYXRhLmlkX3Rva2VuLFxuICAgICAgcmVmcmVzaFRva2VuOiBkYXRhLnJlZnJlc2hfdG9rZW4sXG4gICAgICBleHBpcmVzSW46IGRhdGEuZXhwaXJlc19pbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBKV1QgcGF5bG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvZGVKd3QodG9rZW46IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdCgnLicpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBKV1QnKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShwYXJ0c1sxXSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRva2Vuc1xuICAgKi9cbiAgYXN5bmMgcmVmcmVzaFRva2VucyhyZWZyZXNoVG9rZW46IHN0cmluZyk6IFByb21pc2U8e1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgaWRUb2tlbjogc3RyaW5nO1xuICAgIGV4cGlyZXNJbjogbnVtYmVyO1xuICB9PiB7XG4gICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgdG9rZW5VcmwgPSBgaHR0cHM6Ly8ke2NvbmZpZy5hd3MuY29nbml0b0RvbWFpbn0vb2F1dGgyL3Rva2VuYDtcblxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgZ3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgY2xpZW50X2lkOiBjb25maWcuYXdzLmNvZ25pdG9DbGllbnRJZCxcbiAgICAgIHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbixcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godG9rZW5VcmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfSxcbiAgICAgIGJvZHk6IHBhcmFtcy50b1N0cmluZygpLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUb2tlbiByZWZyZXNoIGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyB7XG4gICAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAgIGlkX3Rva2VuOiBzdHJpbmc7XG4gICAgICBleHBpcmVzX2luOiBudW1iZXI7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY2Nlc3NUb2tlbjogZGF0YS5hY2Nlc3NfdG9rZW4sXG4gICAgICBpZFRva2VuOiBkYXRhLmlkX3Rva2VuLFxuICAgICAgZXhwaXJlc0luOiBkYXRhLmV4cGlyZXNfaW4sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dpbiB2aWEgT0F1dGggYnJvd3NlciBmbG93XG4gICAqL1xuICBhc3luYyBsb2dpbigpOiBQcm9taXNlPFRva2VuRGF0YSB8IG51bGw+IHtcbiAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGxvZ2dlZCBpblxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQga2V5Y2hhaW5NYW5hZ2VyLmdldFRva2VucyhnZXRFbnZpcm9ubWVudCgpKTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgIWtleWNoYWluTWFuYWdlci5pc1Rva2VuRXhwaXJlZChleGlzdGluZykpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2VuZXJhdGVTdGF0ZSgpO1xuICAgIGNvbnN0IGF1dGhVcmwgPSB0aGlzLmJ1aWxkQXV0aFVybChzdGF0ZSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGlmICghcmVxLnVybD8uc3RhcnRzV2l0aChDQUxMQkFDS19QQVRIKSkge1xuICAgICAgICAgIHJlcy53cml0ZUhlYWQoNDA0KTtcbiAgICAgICAgICByZXMuZW5kKCdOb3QgZm91bmQnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLnVybCwgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtDQUxMQkFDS19QT1JUfWApO1xuICAgICAgICAgIGNvbnN0IGNvZGUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgnY29kZScpO1xuICAgICAgICAgIGNvbnN0IHJldHVybmVkU3RhdGUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgnc3RhdGUnKTtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCdlcnJvcicpO1xuXG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9BdXRoIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXR1cm5lZFN0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGF0ZSBtaXNtYXRjaCcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdXRob3JpemF0aW9uIGNvZGUnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCB0aGlzLmV4Y2hhbmdlQ29kZUZvclRva2Vucyhjb2RlKTtcbiAgICAgICAgICBjb25zdCBpZFBheWxvYWQgPSB0aGlzLmRlY29kZUp3dCh0b2tlbnMuaWRUb2tlbik7XG5cbiAgICAgICAgICBjb25zdCB0b2tlbkRhdGE6IFRva2VuRGF0YSA9IHtcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICBpZFRva2VuOiB0b2tlbnMuaWRUb2tlbixcbiAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogdG9rZW5zLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArICh0b2tlbnMuZXhwaXJlc0luICogMTAwMCksXG4gICAgICAgICAgICB1c2VySWQ6IGlkUGF5bG9hZC5zdWIsXG4gICAgICAgICAgICBlbWFpbDogaWRQYXlsb2FkLmVtYWlsIHx8ICd1bmtub3duJyxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgYXdhaXQga2V5Y2hhaW5NYW5hZ2VyLnNldFRva2Vucyh0b2tlbkRhdGEsIGdldEVudmlyb25tZW50KCkpO1xuXG4gICAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHsgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnIH0pO1xuICAgICAgICAgIHJlcy5lbmQoYFxuICAgICAgICAgICAgPCFET0NUWVBFIGh0bWw+XG4gICAgICAgICAgICA8aHRtbD5cbiAgICAgICAgICAgIDxoZWFkPjx0aXRsZT5TdWNjZXNzPC90aXRsZT48L2hlYWQ+XG4gICAgICAgICAgICA8Ym9keSBzdHlsZT1cImZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7IG1heC13aWR0aDogNjAwcHg7IG1hcmdpbjogNTBweCBhdXRvOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgIDxoMSBzdHlsZT1cImNvbG9yOiAjMjJjNTVlO1wiPiYjMTAwMDM7IEF1dGhlbnRpY2F0aW9uIFN1Y2Nlc3NmdWw8L2gxPlxuICAgICAgICAgICAgICA8cD5Zb3UgY2FuIGNsb3NlIHRoaXMgd2luZG93LjwvcD5cbiAgICAgICAgICAgIDwvYm9keT5cbiAgICAgICAgICAgIDwvaHRtbD5cbiAgICAgICAgICBgKTtcblxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHJlc29sdmUodG9rZW5EYXRhKSk7XG4gICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICByZXMud3JpdGVIZWFkKDQwMCwgeyAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcgfSk7XG4gICAgICAgICAgcmVzLmVuZChgXG4gICAgICAgICAgICA8IURPQ1RZUEUgaHRtbD5cbiAgICAgICAgICAgIDxodG1sPlxuICAgICAgICAgICAgPGhlYWQ+PHRpdGxlPkVycm9yPC90aXRsZT48L2hlYWQ+XG4gICAgICAgICAgICA8Ym9keSBzdHlsZT1cImZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7IG1heC13aWR0aDogNjAwcHg7IG1hcmdpbjogNTBweCBhdXRvOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgIDxoMSBzdHlsZT1cImNvbG9yOiAjZWY0NDQ0O1wiPiYjMTAwMDc7IEF1dGhlbnRpY2F0aW9uIEZhaWxlZDwvaDE+XG4gICAgICAgICAgICAgIDxwPiR7ZXJyLm1lc3NhZ2V9PC9wPlxuICAgICAgICAgICAgPC9ib2R5PlxuICAgICAgICAgICAgPC9odG1sPlxuICAgICAgICAgIGApO1xuXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4gcmVqZWN0KGVycikpO1xuICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIub24oJ2Vycm9yJywgKGVycjogYW55KSA9PiB7XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUG9ydCAke0NBTExCQUNLX1BPUlR9IGlzIGluIHVzZWApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5saXN0ZW4oQ0FMTEJBQ0tfUE9SVCwgJ2xvY2FsaG9zdCcsICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tBdXRoU2VydmljZV0gQ2FsbGJhY2sgc2VydmVyIHN0YXJ0ZWQnKTtcbiAgICAgICAgdGhpcy5vcGVuQnJvd3NlcihhdXRoVXJsKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaW1lb3V0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0xvZ2luIHRpbWVvdXQnKSkpO1xuICAgICAgfSwgMiAqIDYwICogMTAwMCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9nb3V0XG4gICAqL1xuICBhc3luYyBsb2dvdXQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgZGVsZXRlZCA9IGF3YWl0IGtleWNoYWluTWFuYWdlci5kZWxldGVUb2tlbnMoZ2V0RW52aXJvbm1lbnQoKSk7XG5cbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgLy8gU3RhcnQgdGVtcG9yYXJ5IHNlcnZlciB0byBoYW5kbGUgc2lnbm91dCBjYWxsYmFja1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKChyZXEsIHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXEudXJsPy5zdGFydHNXaXRoKCcvc2lnbm91dCcpKSB7XG4gICAgICAgICAgICByZXMud3JpdGVIZWFkKDIwMCwgeyAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcgfSk7XG4gICAgICAgICAgICByZXMuZW5kKGBcbiAgICAgICAgICAgICAgPCFET0NUWVBFIGh0bWw+XG4gICAgICAgICAgICAgIDxodG1sPlxuICAgICAgICAgICAgICA8aGVhZD48dGl0bGU+U2lnbmVkIE91dDwvdGl0bGU+PC9oZWFkPlxuICAgICAgICAgICAgICA8Ym9keSBzdHlsZT1cImZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7IG1heC13aWR0aDogNjAwcHg7IG1hcmdpbjogNTBweCBhdXRvOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgPGgxIHN0eWxlPVwiY29sb3I6ICMyMmM1NWU7XCI+JiMxMDAwMzsgU2lnbmVkIE91dDwvaDE+XG4gICAgICAgICAgICAgICAgPHA+WW91IGNhbiBjbG9zZSB0aGlzIHdpbmRvdy48L3A+XG4gICAgICAgICAgICAgIDwvYm9keT5cbiAgICAgICAgICAgICAgPC9odG1sPlxuICAgICAgICAgICAgYCk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4gcmVzb2x2ZSh0cnVlKSk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMud3JpdGVIZWFkKDQwNCk7XG4gICAgICAgICAgICByZXMuZW5kKCdOb3QgZm91bmQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNlcnZlci5vbignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTsgLy8gU3RpbGwgcmV0dXJuIHRydWUgc2luY2UgdG9rZW5zIHdlcmUgZGVsZXRlZFxuICAgICAgICB9KTtcblxuICAgICAgICBzZXJ2ZXIubGlzdGVuKENBTExCQUNLX1BPUlQsICdsb2NhbGhvc3QnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9nb3V0VXJsID0gYGh0dHBzOi8vJHtjb25maWcuYXdzLmNvZ25pdG9Eb21haW59L2xvZ291dD9gICtcbiAgICAgICAgICAgIGBjbGllbnRfaWQ9JHtjb25maWcuYXdzLmNvZ25pdG9DbGllbnRJZH0mYCArXG4gICAgICAgICAgICBgbG9nb3V0X3VyaT0ke2VuY29kZVVSSUNvbXBvbmVudChSRURJUkVDVF9VUkkucmVwbGFjZSgnL2NhbGxiYWNrJywgJy9zaWdub3V0JykpfWA7XG5cbiAgICAgICAgICB0aGlzLm9wZW5Ccm93c2VyKGxvZ291dFVybCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRpbWVvdXQgYWZ0ZXIgMzAgc2Vjb25kc1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4gcmVzb2x2ZSh0cnVlKSk7XG4gICAgICAgIH0sIDMwICogMTAwMCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBhdXRoIHN0YXR1c1xuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHVzKCk6IFByb21pc2U8eyBhdXRoZW50aWNhdGVkOiBib29sZWFuOyB0b2tlbnM/OiBUb2tlbkRhdGEgfT4ge1xuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IGtleWNoYWluTWFuYWdlci5nZXRUb2tlbnMoZ2V0RW52aXJvbm1lbnQoKSk7XG4gICAgaWYgKCF0b2tlbnMpIHtcbiAgICAgIHJldHVybiB7IGF1dGhlbnRpY2F0ZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGF1dGhlbnRpY2F0ZWQ6ICFrZXljaGFpbk1hbmFnZXIuaXNUb2tlbkV4cGlyZWQodG9rZW5zKSxcbiAgICAgIHRva2VucyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBhdXRoU2VydmljZSA9IEF1dGhTZXJ2aWNlLmdldEluc3RhbmNlKCk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export { AuthService, authService } from './auth-service';
2
+ export { runAuthCli } from './auth-cli';
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runAuthCli = exports.authService = exports.AuthService = void 0;
4
+ var auth_service_1 = require("./auth-service");
5
+ Object.defineProperty(exports, "AuthService", { enumerable: true, get: function () { return auth_service_1.AuthService; } });
6
+ Object.defineProperty(exports, "authService", { enumerable: true, get: function () { return auth_service_1.authService; } });
7
+ var auth_cli_1 = require("./auth-cli");
8
+ Object.defineProperty(exports, "runAuthCli", { enumerable: true, get: function () { return auth_cli_1.runAuthCli; } });
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXV0aC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQ0FBMEQ7QUFBakQsMkdBQUEsV0FBVyxPQUFBO0FBQUUsMkdBQUEsV0FBVyxPQUFBO0FBQ2pDLHVDQUF3QztBQUEvQixzR0FBQSxVQUFVLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBBdXRoU2VydmljZSwgYXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGgtc2VydmljZSc7XG5leHBvcnQgeyBydW5BdXRoQ2xpIH0gZnJvbSAnLi9hdXRoLWNsaSc7XG4iXX0=
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Environment type
3
+ */
4
+ export type Environment = 'development' | 'production';
5
+ /**
6
+ * Configuration interface
7
+ */
8
+ export interface Config {
9
+ environment: Environment;
10
+ aws: {
11
+ region: string;
12
+ appsyncUrl: string;
13
+ cognitoUserPoolId: string;
14
+ cognitoClientId: string;
15
+ cognitoDomain: string;
16
+ };
17
+ keychain: {
18
+ serviceName: string;
19
+ };
20
+ server: {
21
+ port: number;
22
+ host: string;
23
+ dynamicPort: boolean;
24
+ };
25
+ claude: {
26
+ command: string;
27
+ defaultTimeout: number;
28
+ };
29
+ codex: {
30
+ command: string;
31
+ defaultTimeout: number;
32
+ sessionsDir: string;
33
+ approvalTimeoutMs: number;
34
+ };
35
+ gemini: {
36
+ command: string;
37
+ defaultTimeout: number;
38
+ transcriptDir: string;
39
+ };
40
+ }
41
+ /**
42
+ * Get environment from process.env.ENVIRONMENT, defaults to 'production'
43
+ */
44
+ export declare function getEnvironment(): Environment;
45
+ /**
46
+ * Load configuration for specific environment
47
+ * If no environment specified, uses process.env.ENVIRONMENT or defaults to 'production'
48
+ */
49
+ export declare function loadConfig(environment?: Environment): Config;
50
+ /**
51
+ * Get current configuration (auto-initializes if not already loaded)
52
+ */
53
+ export declare function getConfig(): Config;
@@ -0,0 +1,123 @@
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.getEnvironment = getEnvironment;
7
+ exports.loadConfig = loadConfig;
8
+ exports.getConfig = getConfig;
9
+ const os_1 = __importDefault(require("os"));
10
+ const path_1 = __importDefault(require("path"));
11
+ // Default configuration values
12
+ const DEFAULT_CONFIG = {
13
+ development: {
14
+ environment: 'development',
15
+ aws: {
16
+ region: 'us-east-1',
17
+ appsyncUrl: 'https://te6rjr37sbfpjc4fiunmb2tgy4.appsync-api.us-east-1.amazonaws.com/graphql',
18
+ cognitoUserPoolId: 'us-east-1_yVwWDPvvJ',
19
+ cognitoClientId: 'e9r5apv6v5uui3l928r2ris0r',
20
+ cognitoDomain: 'codevibe-development.auth.us-east-1.amazoncognito.com',
21
+ },
22
+ keychain: {
23
+ serviceName: 'ai.quantiya.app.codevibe',
24
+ },
25
+ server: {
26
+ port: 3456,
27
+ host: '127.0.0.1',
28
+ dynamicPort: true,
29
+ },
30
+ claude: {
31
+ command: 'claude',
32
+ defaultTimeout: 60000,
33
+ },
34
+ codex: {
35
+ command: 'codex',
36
+ defaultTimeout: 60000,
37
+ sessionsDir: path_1.default.join(os_1.default.homedir(), '.codex', 'sessions'),
38
+ approvalTimeoutMs: 5000,
39
+ },
40
+ gemini: {
41
+ command: 'gemini',
42
+ defaultTimeout: 60000,
43
+ transcriptDir: path_1.default.join(os_1.default.homedir(), '.gemini', 'tmp'),
44
+ },
45
+ },
46
+ production: {
47
+ environment: 'production',
48
+ aws: {
49
+ region: 'us-east-1',
50
+ appsyncUrl: 'https://jwhyxq4sgrgcdosewp5k4ns5ca.appsync-api.us-east-1.amazonaws.com/graphql',
51
+ cognitoUserPoolId: 'us-east-1_mNRO0j5og',
52
+ cognitoClientId: '5p04dbc9ojptc5r8n7605fg78f',
53
+ cognitoDomain: 'codevibe-production.auth.us-east-1.amazoncognito.com',
54
+ },
55
+ keychain: {
56
+ serviceName: 'ai.quantiya.app.codevibe',
57
+ },
58
+ server: {
59
+ port: 3456,
60
+ host: '127.0.0.1',
61
+ dynamicPort: true,
62
+ },
63
+ claude: {
64
+ command: 'claude',
65
+ defaultTimeout: 60000,
66
+ },
67
+ codex: {
68
+ command: 'codex',
69
+ defaultTimeout: 60000,
70
+ sessionsDir: path_1.default.join(os_1.default.homedir(), '.codex', 'sessions'),
71
+ approvalTimeoutMs: 5000,
72
+ },
73
+ gemini: {
74
+ command: 'gemini',
75
+ defaultTimeout: 60000,
76
+ transcriptDir: path_1.default.join(os_1.default.homedir(), '.gemini', 'tmp'),
77
+ },
78
+ },
79
+ };
80
+ // Current configuration (mutable, lazy-initialized)
81
+ let currentConfig = null;
82
+ let configInitialized = false;
83
+ /**
84
+ * Get environment from process.env.ENVIRONMENT, defaults to 'production'
85
+ */
86
+ function getEnvironment() {
87
+ const env = process.env.ENVIRONMENT;
88
+ if (env === 'development' || env === 'production') {
89
+ return env;
90
+ }
91
+ return 'production';
92
+ }
93
+ /**
94
+ * Load configuration for specific environment
95
+ * If no environment specified, uses process.env.ENVIRONMENT or defaults to 'production'
96
+ */
97
+ function loadConfig(environment) {
98
+ const env = environment || getEnvironment();
99
+ currentConfig = {
100
+ ...DEFAULT_CONFIG[env],
101
+ // Allow environment variable overrides
102
+ aws: {
103
+ ...DEFAULT_CONFIG[env].aws,
104
+ region: process.env.AWS_REGION || DEFAULT_CONFIG[env].aws.region,
105
+ appsyncUrl: process.env.APPSYNC_URL || DEFAULT_CONFIG[env].aws.appsyncUrl,
106
+ cognitoUserPoolId: process.env.COGNITO_USER_POOL_ID || DEFAULT_CONFIG[env].aws.cognitoUserPoolId,
107
+ cognitoClientId: process.env.COGNITO_CLIENT_ID || DEFAULT_CONFIG[env].aws.cognitoClientId,
108
+ cognitoDomain: process.env.COGNITO_DOMAIN || DEFAULT_CONFIG[env].aws.cognitoDomain,
109
+ },
110
+ };
111
+ configInitialized = true;
112
+ return currentConfig;
113
+ }
114
+ /**
115
+ * Get current configuration (auto-initializes if not already loaded)
116
+ */
117
+ function getConfig() {
118
+ if (!configInitialized || !currentConfig) {
119
+ loadConfig();
120
+ }
121
+ return currentConfig;
122
+ }
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE4SEEsd0NBTUM7QUFNRCxnQ0FnQkM7QUFLRCw4QkFLQztBQXBLRCw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBZ0R4QiwrQkFBK0I7QUFDL0IsTUFBTSxjQUFjLEdBQWdDO0lBQ2xELFdBQVcsRUFBRTtRQUNYLFdBQVcsRUFBRSxhQUFhO1FBQzFCLEdBQUcsRUFBRTtZQUNILE1BQU0sRUFBRSxXQUFXO1lBQ25CLFVBQVUsRUFBRSxnRkFBZ0Y7WUFDNUYsaUJBQWlCLEVBQUUscUJBQXFCO1lBQ3hDLGVBQWUsRUFBRSwyQkFBMkI7WUFDNUMsYUFBYSxFQUFFLHVEQUF1RDtTQUN2RTtRQUNELFFBQVEsRUFBRTtZQUNSLFdBQVcsRUFBRSwwQkFBMEI7U0FDeEM7UUFDRCxNQUFNLEVBQUU7WUFDTixJQUFJLEVBQUUsSUFBSTtZQUNWLElBQUksRUFBRSxXQUFXO1lBQ2pCLFdBQVcsRUFBRSxJQUFJO1NBQ2xCO1FBQ0QsTUFBTSxFQUFFO1lBQ04sT0FBTyxFQUFFLFFBQVE7WUFDakIsY0FBYyxFQUFFLEtBQUs7U0FDdEI7UUFDRCxLQUFLLEVBQUU7WUFDTCxPQUFPLEVBQUUsT0FBTztZQUNoQixjQUFjLEVBQUUsS0FBSztZQUNyQixXQUFXLEVBQUUsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUMxRCxpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCO1FBQ0QsTUFBTSxFQUFFO1lBQ04sT0FBTyxFQUFFLFFBQVE7WUFDakIsY0FBYyxFQUFFLEtBQUs7WUFDckIsYUFBYSxFQUFFLGNBQUksQ0FBQyxJQUFJLENBQUMsWUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUM7U0FDekQ7S0FDRjtJQUNELFVBQVUsRUFB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Y2VzQ29udGVudCI6WyJpbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbi8qKlxuICogRW52aXJvbm1lbnQgdHlwZVxuICovXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudCA9ICdkZXZlbG9wbWVudCcgfCAncHJvZHVjdGlvbic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25maWcge1xuICBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIGF3czoge1xuICAgIHJlZ2lvbjogc3RyaW5nO1xuICAgIGFwcHN5bmNVcmw6IHN0cmluZztcbiAgICBjb2duaXRvVXNlclBvb2xJZDogc3RyaW5nO1xuICAgIGNvZ25pdG9DbGllbnRJZDogc3RyaW5nO1xuICAgIGNvZ25pdG9Eb21haW46IHN0cmluZztcbiAgfTtcbiAga2V5Y2hhaW46IHtcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICB9O1xuICAvLyBQbHVnaW4tc3BlY2lmaWMgc2VydmVyIGNvbmZpZ3VyYXRpb25cbiAgc2VydmVyOiB7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIGhvc3Q6IHN0cmluZztcbiAgICBkeW5hbWljUG9ydDogYm9vbGVhbjtcbiAgfTtcbiAgLy8gQ2xhdWRlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25cbiAgY2xhdWRlOiB7XG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIGRlZmF1bHRUaW1lb3V0OiBudW1iZXI7XG4gIH07XG4gIC8vIENvZGV4LXNwZWNpZmljIGNvbmZpZ3VyYXRpb25cbiAgY29kZXg6IHtcbiAgICBjb21tYW5kOiBzdHJpbmc7XG4gICAgZGVmYXVsdFRpbWVvdXQ6IG51bWJlcjtcbiAgICBzZXNzaW9uc0Rpcjogc3RyaW5nO1xuICAgIGFwcHJvdmFsVGltZW91dE1zOiBudW1iZXI7XG4gIH07XG4gIC8vIEdlbWluaS1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gIGdlbWluaToge1xuICAgIGNvbW1hbmQ6IHN0cmluZztcbiAgICBkZWZhdWx0VGltZW91dDogbnVtYmVyO1xuICAgIHRyYW5zY3JpcHREaXI6IHN0cmluZztcbiAgfTtcbn1cblxuLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uIHZhbHVlc1xuY29uc3QgREVGQVVMVF9DT05GSUc6IFJlY29yZDxFbnZpcm9ubWVudCwgQ29uZmlnPiA9IHtcbiAgZGV2ZWxvcG1lbnQ6IHtcbiAgICBlbnZpcm9ubWVudDogJ2RldmVsb3BtZW50JyxcbiAgICBhd3M6IHtcbiAgICAgIHJlZ2lvbjogJ3VzLWVhc3QtMScsXG4gICAgICBhcHBzeW5jVXJsOiAnaHR0cHM6Ly90ZTZyanIzN3NiZnBqYzRmaXVubWIydGd5NC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbS9ncmFwaHFsJyxcbiAgICAgIGNvZ25pdG9Vc2VyUG9vbElkOiAndXMtZWFzdC0xX3lWd1dEUHZ2SicsXG4gICAgICBjb2duaXRvQ2xpZW50SWQ6ICdlOXI1YXB2NnY1dXVpM2w5MjhyMnJpczByJyxcbiAgICAgIGNvZ25pdG9Eb21haW46ICdjb2RldmliZS1kZXZlbG9wbWVudC5hdXRoLnVzLWVhc3QtMS5hbWF6b25jb2duaXRvLmNvbScsXG4gICAgfSxcbiAgICBrZXljaGFpbjoge1xuICAgICAgc2VydmljZU5hbWU6ICdhaS5xdWFudGl5YS5hcHAuY29kZXZpYmUnLFxuICAgIH0sXG4gICAgc2VydmVyOiB7XG4gICAgICBwb3J0OiAzNDU2LFxuICAgICAgaG9zdDogJzEyNy4wLjAuMScsXG4gICAgICBkeW5hbWljUG9ydDogdHJ1ZSxcbiAgICB9LFxuICAgIGNsYXVkZToge1xuICAgICAgY29tbWFuZDogJ2NsYXVkZScsXG4gICAgICBkZWZhdWx0VGltZW91dDogNjAwMDAsXG4gICAgfSxcbiAgICBjb2RleDoge1xuICAgICAgY29tbWFuZDogJ2NvZGV4JyxcbiAgICAgIGRlZmF1bHRUaW1lb3V0OiA2MDAwMCxcbiAgICAgIHNlc3Npb25zRGlyOiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNvZGV4JywgJ3Nlc3Npb25zJyksXG4gICAgICBhcHByb3ZhbFRpbWVvdXRNczogNTAwMCxcbiAgICB9LFxuICAgIGdlbWluaToge1xuICAgICAgY29tbWFuZDogJ2dlbWluaScsXG4gICAgICBkZWZhdWx0VGltZW91dDogNjAwMDAsXG4gICAgICB0cmFuc2NyaXB0RGlyOiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmdlbWluaScsICd0bXAnKSxcbiAgICB9LFxuICB9LFxuICBwcm9kdWN0aW9uOiB7XG4gICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcbiAgICBhd3M6IHtcbiAgICAgIHJlZ2lvbjogJ3VzLWVhc3QtMScsXG4gICAgICBhcHBzeW5jVXJsOiAnaHR0cHM6Ly9qd2h5eHE0c2dyZ2Nkb3Nld3A1azRuczVjYS5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbS9ncmFwaHFsJyxcbiAgICAgIGNvZ25pdG9Vc2VyUG9vbElkOiAndXMtZWFzdC0xX21OUk8wajVvZycsXG4gICAgICBjb2duaXRvQ2xpZW50SWQ6ICc1cDA0ZGJjOW9qcHRjNXI4bjc2MDVmZzc4ZicsXG4gICAgICBjb2duaXRvRG9tYWluOiAnY29kZXZpYmUtcHJvZHVjdGlvbi5hdXRoLnVzLWVhc3QtMS5hbWF6b25jb2duaXRvLmNvbScsXG4gICAgfSxcbiAgICBrZXljaGFpbjoge1xuICAgICAgc2VydmljZU5hbWU6ICdhaS5xdWFudGl5YS5hcHAuY29kZXZpYmUnLFxuICAgIH0sXG4gICAgc2VydmVyOiB7XG4gICAgICBwb3J0OiAzNDU2LFxuICAgICAgaG9zdDogJzEyNy4wLjAuMScsXG4gICAgICBkeW5hbWljUG9ydDogdHJ1ZSxcbiAgICB9LFxuICAgIGNsYXVkZToge1xuICAgICAgY29tbWFuZDogJ2NsYXVkZScsXG4gICAgICBkZWZhdWx0VGltZW91dDogNjAwMDAsXG4gICAgfSxcbiAgICBjb2RleDoge1xuICAgICAgY29tbWFuZDogJ2NvZGV4JyxcbiAgICAgIGRlZmF1bHRUaW1lb3V0OiA2MDAwMCxcbiAgICAgIHNlc3Npb25zRGlyOiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNvZGV4JywgJ3Nlc3Npb25zJyksXG4gICAgICBhcHByb3ZhbFRpbWVvdXRNczogNTAwMCxcbiAgICB9LFxuICAgIGdlbWluaToge1xuICAgICAgY29tbWFuZDogJ2dlbWluaScsXG4gICAgICBkZWZhdWx0VGltZW91dDogNjAwMDAsXG4gICAgICB0cmFuc2NyaXB0RGlyOiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmdlbWluaScsICd0bXAnKSxcbiAgICB9LFxuICB9LFxufTtcblxuLy8gQ3VycmVudCBjb25maWd1cmF0aW9uIChtdXRhYmxlLCBsYXp5LWluaXRpYWxpemVkKVxubGV0IGN1cnJlbnRDb25maWc6IENvbmZpZyB8IG51bGwgPSBudWxsO1xubGV0IGNvbmZpZ0luaXRpYWxpemVkID0gZmFsc2U7XG5cbi8qKlxuICogR2V0IGVudmlyb25tZW50IGZyb20gcHJvY2Vzcy5lbnYuRU5WSVJPTk1FTlQsIGRlZmF1bHRzIHRvICdwcm9kdWN0aW9uJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW52aXJvbm1lbnQoKTogRW52aXJvbm1lbnQge1xuICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudi5FTlZJUk9OTUVOVCBhcyBFbnZpcm9ubWVudDtcbiAgaWYgKGVudiA9PT0gJ2RldmVsb3BtZW50JyB8fCBlbnYgPT09ICdwcm9kdWN0aW9uJykge1xuICAgIHJldHVybiBlbnY7XG4gIH1cbiAgcmV0dXJuICdwcm9kdWN0aW9uJztcbn1cblxuLyoqXG4gKiBMb2FkIGNvbmZpZ3VyYXRpb24gZm9yIHNwZWNpZmljIGVudmlyb25tZW50XG4gKiBJZiBubyBlbnZpcm9ubWVudCBzcGVjaWZpZWQsIHVzZXMgcHJvY2Vzcy5lbnYuRU5WSVJPTk1FTlQgb3IgZGVmYXVsdHMgdG8gJ3Byb2R1Y3Rpb24nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ29uZmlnKGVudmlyb25tZW50PzogRW52aXJvbm1lbnQpOiBDb25maWcge1xuICBjb25zdCBlbnYgPSBlbnZpcm9ubWVudCB8fCBnZXRFbnZpcm9ubWVudCgpO1xuICBjdXJyZW50Q29uZmlnID0ge1xuICAgIC4uLkRFRkFVTFRfQ09ORklHW2Vudl0sXG4gICAgLy8gQWxsb3cgZW52aXJvbm1lbnQgdmFyaWFibGUgb3ZlcnJpZGVzXG4gICAgYXdzOiB7XG4gICAgICAuLi5ERUZBVUxUX0NPTkZJR1tlbnZdLmF3cyxcbiAgICAgIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCBERUZBVUxUX0NPTkZJR1tlbnZdLmF3cy5yZWdpb24sXG4gICAgICBhcHBzeW5jVXJsOiBwcm9jZXNzLmVudi5BUFBTWU5DX1VSTCB8fCBERUZBVUxUX0NPTkZJR1tlbnZdLmF3cy5hcHBzeW5jVXJsLFxuICAgICAgY29nbml0b1VzZXJQb29sSWQ6IHByb2Nlc3MuZW52LkNPR05JVE9fVVNFUl9QT09MX0lEIHx8IERFRkFVTFRfQ09ORklHW2Vudl0uYXdzLmNvZ25pdG9Vc2VyUG9vbElkLFxuICAgICAgY29nbml0b0NsaWVudElkOiBwcm9jZXNzLmVudi5DT0dOSVRPX0NMSUVOVF9JRCB8fCBERUZBVUxUX0NPTkZJR1tlbnZdLmF3cy5jb2duaXRvQ2xpZW50SWQsXG4gICAgICBjb2duaXRvRG9tYWluOiBwcm9jZXNzLmVudi5DT0dOSVRPX0RPTUFJTiB8fCBERUZBVUxUX0NPTkZJR1tlbnZdLmF3cy5jb2duaXRvRG9tYWluLFxuICAgIH0sXG4gIH07XG4gIGNvbmZpZ0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgcmV0dXJuIGN1cnJlbnRDb25maWc7XG59XG5cbi8qKlxuICogR2V0IGN1cnJlbnQgY29uZmlndXJhdGlvbiAoYXV0by1pbml0aWFsaXplcyBpZiBub3QgYWxyZWFkeSBsb2FkZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWcoKTogQ29uZmlnIHtcbiAgaWYgKCFjb25maWdJbml0aWFsaXplZCB8fCAhY3VycmVudENvbmZpZykge1xuICAgIGxvYWRDb25maWcoKTtcbiAgfVxuICByZXR1cm4gY3VycmVudENvbmZpZyE7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export { loadConfig, getConfig, getEnvironment } from './config';
2
+ export type { Config, Environment } from './config';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getEnvironment = exports.getConfig = exports.loadConfig = void 0;
4
+ var config_1 = require("./config");
5
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
6
+ Object.defineProperty(exports, "getConfig", { enumerable: true, get: function () { return config_1.getConfig; } });
7
+ Object.defineProperty(exports, "getEnvironment", { enumerable: true, get: function () { return config_1.getEnvironment; } });
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFpRTtBQUF4RCxvR0FBQSxVQUFVLE9BQUE7QUFBRSxtR0FBQSxTQUFTLE9BQUE7QUFBRSx3R0FBQSxjQUFjLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBsb2FkQ29uZmlnLCBnZXRDb25maWcsIGdldEVudmlyb25tZW50IH0gZnJvbSAnLi9jb25maWcnO1xuZXhwb3J0IHR5cGUgeyBDb25maWcsIEVudmlyb25tZW50IH0gZnJvbSAnLi9jb25maWcnO1xuIl19