@strapi/cloud-cli 0.0.0-next.daa3d4c4db6322f58233f0ccb757d80dbd1b48e9 → 0.0.0-next.de7aa8b6d2161b0be06244360caa235b8619d823
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +7 -2
- package/dist/bin.js.map +1 -1
- package/dist/bin.mjs +7 -2
- package/dist/bin.mjs.map +1 -1
- package/dist/create-growth-sso-trial/action.d.ts +9 -0
- package/dist/create-growth-sso-trial/action.d.ts.map +1 -0
- package/dist/create-growth-sso-trial/action.js +51 -0
- package/dist/create-growth-sso-trial/action.js.map +1 -0
- package/dist/create-growth-sso-trial/action.mjs +49 -0
- package/dist/create-growth-sso-trial/action.mjs.map +1 -0
- package/dist/create-growth-sso-trial/index.d.ts +4 -0
- package/dist/create-growth-sso-trial/index.d.ts.map +1 -0
- package/dist/create-project/action.d.ts +2 -2
- package/dist/create-project/action.d.ts.map +1 -1
- package/dist/create-project/action.js +38 -11
- package/dist/create-project/action.js.map +1 -1
- package/dist/create-project/action.mjs +39 -12
- package/dist/create-project/action.mjs.map +1 -1
- package/dist/deploy-project/action.d.ts.map +1 -1
- package/dist/deploy-project/action.js +54 -17
- package/dist/deploy-project/action.js.map +1 -1
- package/dist/deploy-project/action.mjs +55 -18
- package/dist/deploy-project/action.mjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/login/action.d.ts +3 -1
- package/dist/login/action.d.ts.map +1 -1
- package/dist/login/action.js +16 -7
- package/dist/login/action.js.map +1 -1
- package/dist/login/action.mjs +16 -7
- package/dist/login/action.mjs.map +1 -1
- package/dist/package.json.js +5 -5
- package/dist/package.json.mjs +5 -5
- package/dist/services/build-logs.d.ts.map +1 -1
- package/dist/services/build-logs.js +7 -7
- package/dist/services/build-logs.js.map +1 -1
- package/dist/services/build-logs.mjs +7 -7
- package/dist/services/build-logs.mjs.map +1 -1
- package/dist/services/cli-api.d.ts +13 -2
- package/dist/services/cli-api.d.ts.map +1 -1
- package/dist/services/cli-api.js +21 -3
- package/dist/services/cli-api.js.map +1 -1
- package/dist/services/cli-api.mjs +21 -3
- package/dist/services/cli-api.mjs.map +1 -1
- package/dist/services/context.d.ts +4 -0
- package/dist/services/context.d.ts.map +1 -0
- package/dist/services/context.js +14 -0
- package/dist/services/context.js.map +1 -0
- package/dist/services/context.mjs +11 -0
- package/dist/services/context.mjs.map +1 -0
- package/dist/services/notification.d.ts +4 -1
- package/dist/services/notification.d.ts.map +1 -1
- package/dist/services/notification.js +44 -2
- package/dist/services/notification.js.map +1 -1
- package/dist/services/notification.mjs +44 -2
- package/dist/services/notification.mjs.map +1 -1
- package/dist/types.d.ts +20 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/compress-files.d.ts.map +1 -1
- package/dist/utils/compress-files.js +2 -0
- package/dist/utils/compress-files.js.map +1 -1
- package/dist/utils/compress-files.mjs +2 -0
- package/dist/utils/compress-files.mjs.map +1 -1
- package/dist/utils/error-message-factories.d.ts +9 -0
- package/dist/utils/error-message-factories.d.ts.map +1 -0
- package/dist/utils/error-message-factories.js +25 -0
- package/dist/utils/error-message-factories.js.map +1 -0
- package/dist/utils/error-message-factories.mjs +22 -0
- package/dist/utils/error-message-factories.mjs.map +1 -0
- package/package.json +5 -5
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport crypto from 'crypto';\nimport deployProject from './deploy-project';\nimport link from './link';\nimport login from './login';\nimport logout from './logout';\nimport createProject from './create-project';\nimport listProjects from './list-projects';\nimport listEnvironments from './environment/list';\nimport linkEnvironment from './environment/link';\nimport { CLIContext } from './types';\nimport { getLocalConfig, saveLocalConfig } from './config/local';\n\nexport const cli = {\n deployProject,\n link,\n login,\n logout,\n createProject,\n linkEnvironment,\n listProjects,\n listEnvironments,\n};\n\nconst cloudCommands = [\n deployProject,\n link,\n login,\n logout,\n linkEnvironment,\n listProjects,\n listEnvironments,\n];\n\nasync function initCloudCLIConfig() {\n const localConfig = await getLocalConfig();\n\n if (!localConfig.installId) {\n localConfig.installId = crypto.randomUUID();\n }\n\n await saveLocalConfig(localConfig);\n}\n\nexport async function buildStrapiCloudCommands({\n command,\n ctx,\n argv,\n}: {\n command: Command;\n ctx: CLIContext;\n argv: string[];\n}) {\n await initCloudCLIConfig();\n // Load all commands\n for (const cloudCommand of cloudCommands) {\n try {\n // Add this command to the Commander command object\n const subCommand = await cloudCommand.command({ command, ctx, argv });\n\n if (subCommand) {\n command.addCommand(subCommand);\n }\n } catch (e) {\n console.error(`Failed to load command ${cloudCommand.name}`, e);\n }\n }\n}\n\nexport * as services from './services';\n\nexport * from './types';\n"],"names":["cli","deployProject","link","login","logout","createProject","linkEnvironment","listProjects","listEnvironments","cloudCommands","initCloudCLIConfig","localConfig","getLocalConfig","installId","crypto","randomUUID","saveLocalConfig","buildStrapiCloudCommands","command","ctx","argv","cloudCommand","subCommand","addCommand","e","console","error","name"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport crypto from 'crypto';\nimport deployProject from './deploy-project';\nimport link from './link';\nimport login from './login';\nimport logout from './logout';\nimport createProject from './create-project';\nimport { createGrowthSsoTrial } from './create-growth-sso-trial';\nimport listProjects from './list-projects';\nimport listEnvironments from './environment/list';\nimport linkEnvironment from './environment/link';\nimport { CLIContext } from './types';\nimport { getLocalConfig, saveLocalConfig } from './config/local';\n\nexport const cli = {\n deployProject,\n link,\n login,\n logout,\n createProject,\n linkEnvironment,\n listProjects,\n listEnvironments,\n};\n\nexport { createGrowthSsoTrial };\n\nconst cloudCommands = [\n deployProject,\n link,\n login,\n logout,\n linkEnvironment,\n listProjects,\n listEnvironments,\n];\n\nasync function initCloudCLIConfig() {\n const localConfig = await getLocalConfig();\n\n if (!localConfig.installId) {\n localConfig.installId = crypto.randomUUID();\n }\n\n await saveLocalConfig(localConfig);\n}\n\nexport async function buildStrapiCloudCommands({\n command,\n ctx,\n argv,\n}: {\n command: Command;\n ctx: CLIContext;\n argv: string[];\n}) {\n await initCloudCLIConfig();\n // Load all commands\n for (const cloudCommand of cloudCommands) {\n try {\n // Add this command to the Commander command object\n const subCommand = await cloudCommand.command({ command, ctx, argv });\n\n if (subCommand) {\n command.addCommand(subCommand);\n }\n } catch (e) {\n console.error(`Failed to load command ${cloudCommand.name}`, e);\n }\n }\n}\n\nexport * as services from './services';\n\nexport * from './types';\n"],"names":["cli","deployProject","link","login","logout","createProject","linkEnvironment","listProjects","listEnvironments","cloudCommands","initCloudCLIConfig","localConfig","getLocalConfig","installId","crypto","randomUUID","saveLocalConfig","buildStrapiCloudCommands","command","ctx","argv","cloudCommand","subCommand","addCommand","e","console","error","name"],"mappings":";;;;;;;;;;;;;;MAcaA,GAAM,GAAA;AACjBC,IAAAA,aAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,KAAAA;AACAC,IAAAA,MAAAA;AACAC,IAAAA,aAAAA;AACAC,IAAAA,eAAAA;AACAC,IAAAA,YAAAA;AACAC,IAAAA;AACF;AAIA,MAAMC,aAAgB,GAAA;AACpBR,IAAAA,aAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,KAAAA;AACAC,IAAAA,MAAAA;AACAE,IAAAA,eAAAA;AACAC,IAAAA,YAAAA;AACAC,IAAAA;AACD,CAAA;AAED,eAAeE,kBAAAA,GAAAA;AACb,IAAA,MAAMC,cAAc,MAAMC,cAAAA,EAAAA;IAE1B,IAAI,CAACD,WAAYE,CAAAA,SAAS,EAAE;QAC1BF,WAAYE,CAAAA,SAAS,GAAGC,MAAAA,CAAOC,UAAU,EAAA;AAC3C;AAEA,IAAA,MAAMC,eAAgBL,CAAAA,WAAAA,CAAAA;AACxB;AAEO,eAAeM,yBAAyB,EAC7CC,OAAO,EACPC,GAAG,EACHC,IAAI,EAKL,EAAA;IACC,MAAMV,kBAAAA,EAAAA;;IAEN,KAAK,MAAMW,gBAAgBZ,aAAe,CAAA;QACxC,IAAI;;AAEF,YAAA,MAAMa,UAAa,GAAA,MAAMD,YAAaH,CAAAA,OAAO,CAAC;AAAEA,gBAAAA,OAAAA;AAASC,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAEnE,YAAA,IAAIE,UAAY,EAAA;AACdJ,gBAAAA,OAAAA,CAAQK,UAAU,CAACD,UAAAA,CAAAA;AACrB;AACF,SAAA,CAAE,OAAOE,CAAG,EAAA;YACVC,OAAQC,CAAAA,KAAK,CAAC,CAAC,uBAAuB,EAAEL,YAAaM,CAAAA,IAAI,CAAC,CAAC,EAAEH,CAAAA,CAAAA;AAC/D;AACF;AACF;;;;"}
|
package/dist/login/action.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { CLIContext } from '../types';
|
|
2
2
|
export declare function promptLogin(ctx: CLIContext): Promise<boolean>;
|
|
3
|
-
export default function loginAction(ctx: CLIContext
|
|
3
|
+
export default function loginAction(ctx: CLIContext, { showDashboardLink }?: {
|
|
4
|
+
showDashboardLink?: boolean;
|
|
5
|
+
}): Promise<boolean>;
|
|
4
6
|
//# sourceMappingURL=action.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/login/action.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/login/action.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,UAAU,CAAC;AAO3D,wBAAsB,WAAW,CAAC,GAAG,EAAE,UAAU,oBAchD;AAED,wBAA8B,WAAW,CACvC,GAAG,EAAE,UAAU,EACf,EAAE,iBAAwB,EAAE,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GACjE,OAAO,CAAC,OAAO,CAAC,CAgLlB"}
|
package/dist/login/action.js
CHANGED
|
@@ -15,6 +15,7 @@ require('ora');
|
|
|
15
15
|
require('cli-progress');
|
|
16
16
|
var api = require('../config/api.js');
|
|
17
17
|
var analytics = require('../utils/analytics.js');
|
|
18
|
+
var context = require('../services/context.js');
|
|
18
19
|
|
|
19
20
|
const openModule = import('open');
|
|
20
21
|
async function promptLogin(ctx) {
|
|
@@ -31,7 +32,7 @@ async function promptLogin(ctx) {
|
|
|
31
32
|
}
|
|
32
33
|
return false;
|
|
33
34
|
}
|
|
34
|
-
async function loginAction(ctx) {
|
|
35
|
+
async function loginAction(ctx, { showDashboardLink = true } = {}) {
|
|
35
36
|
const { logger, promptExperiment } = ctx;
|
|
36
37
|
const tokenService = await token.tokenServiceFactory(ctx);
|
|
37
38
|
const existingToken = await tokenService.retrieveToken();
|
|
@@ -42,13 +43,19 @@ async function loginAction(ctx) {
|
|
|
42
43
|
try {
|
|
43
44
|
const userInfo = await cloudApiService.getUserInfo();
|
|
44
45
|
const { email } = userInfo.data.data;
|
|
46
|
+
context.setContext({
|
|
47
|
+
...ctx,
|
|
48
|
+
user: userInfo.data.data
|
|
49
|
+
});
|
|
45
50
|
if (email) {
|
|
46
51
|
logger.log(`You are already logged into your account (${email}).`);
|
|
47
52
|
} else {
|
|
48
53
|
logger.log('You are already logged in.');
|
|
49
54
|
}
|
|
50
|
-
|
|
51
|
-
|
|
55
|
+
if (showDashboardLink) {
|
|
56
|
+
logger.log('To access your dashboard, please copy and paste the following URL into your web browser:');
|
|
57
|
+
logger.log(chalk.underline(`${api.apiConfig.dashboardBaseUrl}/projects`));
|
|
58
|
+
}
|
|
52
59
|
return true;
|
|
53
60
|
} catch (e) {
|
|
54
61
|
logger.debug('Failed to fetch user info', e);
|
|
@@ -57,7 +64,7 @@ async function loginAction(ctx) {
|
|
|
57
64
|
}
|
|
58
65
|
let cliConfig;
|
|
59
66
|
try {
|
|
60
|
-
logger.info('🔌 Connecting
|
|
67
|
+
logger.info('🔌 Connecting...');
|
|
61
68
|
const config = await cloudApiService.config();
|
|
62
69
|
cliConfig = config.data;
|
|
63
70
|
} catch (e) {
|
|
@@ -171,9 +178,11 @@ async function loginAction(ctx) {
|
|
|
171
178
|
}
|
|
172
179
|
}
|
|
173
180
|
spinner.succeed('Authentication successful!');
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
181
|
+
if (showDashboardLink) {
|
|
182
|
+
logger.log('You are now logged into Strapi Cloud.');
|
|
183
|
+
logger.log('To access your dashboard, please copy and paste the following URL into your web browser:');
|
|
184
|
+
logger.log(chalk.underline(`${api.apiConfig.dashboardBaseUrl}/projects`));
|
|
185
|
+
}
|
|
177
186
|
await analytics.trackEvent(ctx, cloudApiService, 'didLogin', {
|
|
178
187
|
loginMethod: 'cli',
|
|
179
188
|
...promptExperiment && {
|
package/dist/login/action.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.js","sources":["../../src/login/action.ts"],"sourcesContent":["import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\nimport { trackEvent } from '../utils/analytics';\n\nconst openModule = import('open');\n\nexport async function promptLogin(ctx: CLIContext) {\n const response = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'login',\n message: 'Would you like to login?',\n },\n ]);\n\n if (response.login) {\n const loginSuccessful = await loginAction(ctx);\n return loginSuccessful;\n }\n return false;\n}\n\nexport default async function loginAction(ctx: CLIContext): Promise<boolean> {\n const { logger, promptExperiment } = ctx;\n const tokenService = await tokenServiceFactory(ctx);\n const existingToken = await tokenService.retrieveToken();\n const cloudApiService = await cloudApiFactory(ctx, existingToken || undefined);\n\n if (existingToken) {\n const isTokenValid = await tokenService.isTokenValid(existingToken);\n if (isTokenValid) {\n try {\n const userInfo = await cloudApiService.getUserInfo();\n const { email } = userInfo.data.data;\n if (email) {\n logger.log(`You are already logged into your account (${email}).`);\n } else {\n logger.log('You are already logged in.');\n }\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n return true;\n } catch (e) {\n logger.debug('Failed to fetch user info', e);\n }\n }\n }\n\n let cliConfig: CloudCliConfig;\n try {\n logger.info('🔌 Connecting to the Strapi Cloud API...');\n const config = await cloudApiService.config();\n cliConfig = config.data;\n } catch (e: unknown) {\n logger.error('🥲 Oops! Something went wrong while logging you in. Please try again.');\n logger.debug(e);\n return false;\n }\n await trackEvent(ctx, cloudApiService, 'willLoginAttempt', {\n ...(promptExperiment && { promptExperiment }),\n });\n\n logger.debug('🔐 Creating device authentication request...', {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n });\n const deviceAuthResponse = (await axios\n .post(cliConfig.deviceCodeAuthUrl, {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n })\n .catch((e: AxiosError) => {\n logger.error('There was an issue with the authentication process. Please try again.');\n if (e.message) {\n logger.debug(e.message, e);\n } else {\n logger.debug(e);\n }\n })) as AxiosResponse;\n\n openModule.then((open) => {\n open.default(deviceAuthResponse.data.verification_uri_complete).catch((e: Error) => {\n logger.error('We encountered an issue opening the browser. Please try again later.');\n logger.debug(e.message, e);\n });\n });\n\n logger.log('If a browser tab does not open automatically, please follow the next steps:');\n logger.log(\n `1. Open this url in your device: ${deviceAuthResponse.data.verification_uri_complete}`\n );\n logger.log(\n `2. Enter the following code: ${deviceAuthResponse.data.user_code} and confirm to login.\\n`\n );\n\n const tokenPayload = {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n device_code: deviceAuthResponse.data.device_code,\n client_id: cliConfig.clientId,\n };\n\n let isAuthenticated = false;\n\n const authenticate = async () => {\n const spinner = logger.spinner('Waiting for authentication');\n spinner.start();\n const spinnerFail = () => spinner.fail('Authentication failed!');\n\n while (!isAuthenticated) {\n try {\n const tokenResponse = await axios.post(cliConfig.tokenUrl, tokenPayload);\n const authTokenData = tokenResponse.data;\n\n if (tokenResponse.status === 200) {\n // Token validation\n try {\n logger.debug('🔐 Validating token...');\n await tokenService.validateToken(authTokenData.id_token, cliConfig.jwksUrl);\n logger.debug('🔐 Token validation successful!');\n } catch (e: any) {\n logger.debug(e);\n spinnerFail();\n throw new Error('Unable to proceed: Token validation failed');\n }\n\n logger.debug('🔍 Fetching user information...');\n const cloudApiServiceWithToken = await cloudApiFactory(ctx, authTokenData.access_token);\n // Call to get user info to create the user in DB if not exists\n await cloudApiServiceWithToken.getUserInfo();\n logger.debug('🔍 User information fetched successfully!');\n\n try {\n logger.debug('📝 Saving login information...');\n await tokenService.saveToken(authTokenData.access_token);\n logger.debug('📝 Login information saved successfully!');\n isAuthenticated = true;\n } catch (e) {\n logger.error(\n 'There was a problem saving your login information. Please try logging in again.'\n );\n logger.debug(e);\n spinnerFail();\n return false;\n }\n }\n } catch (e: any) {\n if (e.message === 'Unable to proceed: Token validation failed') {\n logger.error(\n 'There seems to be a problem with your login information. Please try logging in again.'\n );\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n if (\n e.response?.data.error &&\n !['authorization_pending', 'slow_down'].includes(e!.response.data.error)\n ) {\n logger.debug(e);\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n // Await interval before retrying\n await new Promise((resolve) => {\n setTimeout(resolve, deviceAuthResponse.data.interval * 1000);\n });\n }\n }\n spinner.succeed('Authentication successful!');\n logger.log('You are now logged into Strapi Cloud.');\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n await trackEvent(ctx, cloudApiService, 'didLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n };\n\n await authenticate();\n return isAuthenticated;\n}\n"],"names":["openModule","promptLogin","ctx","response","inquirer","prompt","type","name","message","login","loginSuccessful","loginAction","logger","promptExperiment","tokenService","tokenServiceFactory","existingToken","retrieveToken","cloudApiService","cloudApiFactory","undefined","isTokenValid","userInfo","getUserInfo","email","data","log","chalk","underline","apiConfig","dashboardBaseUrl","e","debug","cliConfig","info","config","error","trackEvent","client_id","clientId","scope","audience","deviceAuthResponse","axios","post","deviceCodeAuthUrl","catch","then","open","default","verification_uri_complete","user_code","tokenPayload","grant_type","device_code","isAuthenticated","authenticate","spinner","start","spinnerFail","fail","tokenResponse","tokenUrl","authTokenData","status","validateToken","id_token","jwksUrl","Error","cloudApiServiceWithToken","access_token","saveToken","loginMethod","includes","Promise","resolve","setTimeout","interval","succeed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.js","sources":["../../src/login/action.ts"],"sourcesContent":["import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\nimport { trackEvent } from '../utils/analytics';\nimport { setContext } from '../services/context';\n\nconst openModule = import('open');\n\nexport async function promptLogin(ctx: CLIContext) {\n const response = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'login',\n message: 'Would you like to login?',\n },\n ]);\n\n if (response.login) {\n const loginSuccessful = await loginAction(ctx);\n return loginSuccessful;\n }\n return false;\n}\n\nexport default async function loginAction(\n ctx: CLIContext,\n { showDashboardLink = true }: { showDashboardLink?: boolean } = {}\n): Promise<boolean> {\n const { logger, promptExperiment } = ctx;\n const tokenService = await tokenServiceFactory(ctx);\n const existingToken = await tokenService.retrieveToken();\n const cloudApiService = await cloudApiFactory(ctx, existingToken || undefined);\n\n if (existingToken) {\n const isTokenValid = await tokenService.isTokenValid(existingToken);\n if (isTokenValid) {\n try {\n const userInfo = await cloudApiService.getUserInfo();\n const { email } = userInfo.data.data;\n setContext({ ...ctx, user: userInfo.data.data });\n if (email) {\n logger.log(`You are already logged into your account (${email}).`);\n } else {\n logger.log('You are already logged in.');\n }\n if (showDashboardLink) {\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n }\n return true;\n } catch (e) {\n logger.debug('Failed to fetch user info', e);\n }\n }\n }\n\n let cliConfig: CloudCliConfig;\n try {\n logger.info('🔌 Connecting...');\n const config = await cloudApiService.config();\n cliConfig = config.data;\n } catch (e: unknown) {\n logger.error('🥲 Oops! Something went wrong while logging you in. Please try again.');\n logger.debug(e);\n return false;\n }\n await trackEvent(ctx, cloudApiService, 'willLoginAttempt', {\n ...(promptExperiment && { promptExperiment }),\n });\n\n logger.debug('🔐 Creating device authentication request...', {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n });\n const deviceAuthResponse = (await axios\n .post(cliConfig.deviceCodeAuthUrl, {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n })\n .catch((e: AxiosError) => {\n logger.error('There was an issue with the authentication process. Please try again.');\n if (e.message) {\n logger.debug(e.message, e);\n } else {\n logger.debug(e);\n }\n })) as AxiosResponse;\n\n openModule.then((open) => {\n open.default(deviceAuthResponse.data.verification_uri_complete).catch((e: Error) => {\n logger.error('We encountered an issue opening the browser. Please try again later.');\n logger.debug(e.message, e);\n });\n });\n\n logger.log('If a browser tab does not open automatically, please follow the next steps:');\n logger.log(\n `1. Open this url in your device: ${deviceAuthResponse.data.verification_uri_complete}`\n );\n logger.log(\n `2. Enter the following code: ${deviceAuthResponse.data.user_code} and confirm to login.\\n`\n );\n\n const tokenPayload = {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n device_code: deviceAuthResponse.data.device_code,\n client_id: cliConfig.clientId,\n };\n\n let isAuthenticated = false;\n\n const authenticate = async () => {\n const spinner = logger.spinner('Waiting for authentication');\n spinner.start();\n const spinnerFail = () => spinner.fail('Authentication failed!');\n\n while (!isAuthenticated) {\n try {\n const tokenResponse = await axios.post(cliConfig.tokenUrl, tokenPayload);\n const authTokenData = tokenResponse.data;\n\n if (tokenResponse.status === 200) {\n // Token validation\n try {\n logger.debug('🔐 Validating token...');\n await tokenService.validateToken(authTokenData.id_token, cliConfig.jwksUrl);\n logger.debug('🔐 Token validation successful!');\n } catch (e: any) {\n logger.debug(e);\n spinnerFail();\n throw new Error('Unable to proceed: Token validation failed');\n }\n\n logger.debug('🔍 Fetching user information...');\n const cloudApiServiceWithToken = await cloudApiFactory(ctx, authTokenData.access_token);\n // Call to get user info to create the user in DB if not exists\n await cloudApiServiceWithToken.getUserInfo();\n logger.debug('🔍 User information fetched successfully!');\n\n try {\n logger.debug('📝 Saving login information...');\n await tokenService.saveToken(authTokenData.access_token);\n logger.debug('📝 Login information saved successfully!');\n isAuthenticated = true;\n } catch (e) {\n logger.error(\n 'There was a problem saving your login information. Please try logging in again.'\n );\n logger.debug(e);\n spinnerFail();\n return false;\n }\n }\n } catch (e: any) {\n if (e.message === 'Unable to proceed: Token validation failed') {\n logger.error(\n 'There seems to be a problem with your login information. Please try logging in again.'\n );\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n if (\n e.response?.data.error &&\n !['authorization_pending', 'slow_down'].includes(e!.response.data.error)\n ) {\n logger.debug(e);\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n // Await interval before retrying\n await new Promise((resolve) => {\n setTimeout(resolve, deviceAuthResponse.data.interval * 1000);\n });\n }\n }\n spinner.succeed('Authentication successful!');\n if (showDashboardLink) {\n logger.log('You are now logged into Strapi Cloud.');\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n }\n await trackEvent(ctx, cloudApiService, 'didLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n };\n\n await authenticate();\n return isAuthenticated;\n}\n"],"names":["openModule","promptLogin","ctx","response","inquirer","prompt","type","name","message","login","loginSuccessful","loginAction","showDashboardLink","logger","promptExperiment","tokenService","tokenServiceFactory","existingToken","retrieveToken","cloudApiService","cloudApiFactory","undefined","isTokenValid","userInfo","getUserInfo","email","data","setContext","user","log","chalk","underline","apiConfig","dashboardBaseUrl","e","debug","cliConfig","info","config","error","trackEvent","client_id","clientId","scope","audience","deviceAuthResponse","axios","post","deviceCodeAuthUrl","catch","then","open","default","verification_uri_complete","user_code","tokenPayload","grant_type","device_code","isAuthenticated","authenticate","spinner","start","spinnerFail","fail","tokenResponse","tokenUrl","authTokenData","status","validateToken","id_token","jwksUrl","Error","cloudApiServiceWithToken","access_token","saveToken","loginMethod","includes","Promise","resolve","setTimeout","interval","succeed"],"mappings":"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"}
|
package/dist/login/action.mjs
CHANGED
|
@@ -11,6 +11,7 @@ import 'ora';
|
|
|
11
11
|
import 'cli-progress';
|
|
12
12
|
import { apiConfig } from '../config/api.mjs';
|
|
13
13
|
import { trackEvent } from '../utils/analytics.mjs';
|
|
14
|
+
import { setContext } from '../services/context.mjs';
|
|
14
15
|
|
|
15
16
|
const openModule = import('open');
|
|
16
17
|
async function promptLogin(ctx) {
|
|
@@ -27,7 +28,7 @@ async function promptLogin(ctx) {
|
|
|
27
28
|
}
|
|
28
29
|
return false;
|
|
29
30
|
}
|
|
30
|
-
async function loginAction(ctx) {
|
|
31
|
+
async function loginAction(ctx, { showDashboardLink = true } = {}) {
|
|
31
32
|
const { logger, promptExperiment } = ctx;
|
|
32
33
|
const tokenService = await tokenServiceFactory(ctx);
|
|
33
34
|
const existingToken = await tokenService.retrieveToken();
|
|
@@ -38,13 +39,19 @@ async function loginAction(ctx) {
|
|
|
38
39
|
try {
|
|
39
40
|
const userInfo = await cloudApiService.getUserInfo();
|
|
40
41
|
const { email } = userInfo.data.data;
|
|
42
|
+
setContext({
|
|
43
|
+
...ctx,
|
|
44
|
+
user: userInfo.data.data
|
|
45
|
+
});
|
|
41
46
|
if (email) {
|
|
42
47
|
logger.log(`You are already logged into your account (${email}).`);
|
|
43
48
|
} else {
|
|
44
49
|
logger.log('You are already logged in.');
|
|
45
50
|
}
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
if (showDashboardLink) {
|
|
52
|
+
logger.log('To access your dashboard, please copy and paste the following URL into your web browser:');
|
|
53
|
+
logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));
|
|
54
|
+
}
|
|
48
55
|
return true;
|
|
49
56
|
} catch (e) {
|
|
50
57
|
logger.debug('Failed to fetch user info', e);
|
|
@@ -53,7 +60,7 @@ async function loginAction(ctx) {
|
|
|
53
60
|
}
|
|
54
61
|
let cliConfig;
|
|
55
62
|
try {
|
|
56
|
-
logger.info('🔌 Connecting
|
|
63
|
+
logger.info('🔌 Connecting...');
|
|
57
64
|
const config = await cloudApiService.config();
|
|
58
65
|
cliConfig = config.data;
|
|
59
66
|
} catch (e) {
|
|
@@ -167,9 +174,11 @@ async function loginAction(ctx) {
|
|
|
167
174
|
}
|
|
168
175
|
}
|
|
169
176
|
spinner.succeed('Authentication successful!');
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
177
|
+
if (showDashboardLink) {
|
|
178
|
+
logger.log('You are now logged into Strapi Cloud.');
|
|
179
|
+
logger.log('To access your dashboard, please copy and paste the following URL into your web browser:');
|
|
180
|
+
logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));
|
|
181
|
+
}
|
|
173
182
|
await trackEvent(ctx, cloudApiService, 'didLogin', {
|
|
174
183
|
loginMethod: 'cli',
|
|
175
184
|
...promptExperiment && {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.mjs","sources":["../../src/login/action.ts"],"sourcesContent":["import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\nimport { trackEvent } from '../utils/analytics';\n\nconst openModule = import('open');\n\nexport async function promptLogin(ctx: CLIContext) {\n const response = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'login',\n message: 'Would you like to login?',\n },\n ]);\n\n if (response.login) {\n const loginSuccessful = await loginAction(ctx);\n return loginSuccessful;\n }\n return false;\n}\n\nexport default async function loginAction(ctx: CLIContext): Promise<boolean> {\n const { logger, promptExperiment } = ctx;\n const tokenService = await tokenServiceFactory(ctx);\n const existingToken = await tokenService.retrieveToken();\n const cloudApiService = await cloudApiFactory(ctx, existingToken || undefined);\n\n if (existingToken) {\n const isTokenValid = await tokenService.isTokenValid(existingToken);\n if (isTokenValid) {\n try {\n const userInfo = await cloudApiService.getUserInfo();\n const { email } = userInfo.data.data;\n if (email) {\n logger.log(`You are already logged into your account (${email}).`);\n } else {\n logger.log('You are already logged in.');\n }\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n return true;\n } catch (e) {\n logger.debug('Failed to fetch user info', e);\n }\n }\n }\n\n let cliConfig: CloudCliConfig;\n try {\n logger.info('🔌 Connecting to the Strapi Cloud API...');\n const config = await cloudApiService.config();\n cliConfig = config.data;\n } catch (e: unknown) {\n logger.error('🥲 Oops! Something went wrong while logging you in. Please try again.');\n logger.debug(e);\n return false;\n }\n await trackEvent(ctx, cloudApiService, 'willLoginAttempt', {\n ...(promptExperiment && { promptExperiment }),\n });\n\n logger.debug('🔐 Creating device authentication request...', {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n });\n const deviceAuthResponse = (await axios\n .post(cliConfig.deviceCodeAuthUrl, {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n })\n .catch((e: AxiosError) => {\n logger.error('There was an issue with the authentication process. Please try again.');\n if (e.message) {\n logger.debug(e.message, e);\n } else {\n logger.debug(e);\n }\n })) as AxiosResponse;\n\n openModule.then((open) => {\n open.default(deviceAuthResponse.data.verification_uri_complete).catch((e: Error) => {\n logger.error('We encountered an issue opening the browser. Please try again later.');\n logger.debug(e.message, e);\n });\n });\n\n logger.log('If a browser tab does not open automatically, please follow the next steps:');\n logger.log(\n `1. Open this url in your device: ${deviceAuthResponse.data.verification_uri_complete}`\n );\n logger.log(\n `2. Enter the following code: ${deviceAuthResponse.data.user_code} and confirm to login.\\n`\n );\n\n const tokenPayload = {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n device_code: deviceAuthResponse.data.device_code,\n client_id: cliConfig.clientId,\n };\n\n let isAuthenticated = false;\n\n const authenticate = async () => {\n const spinner = logger.spinner('Waiting for authentication');\n spinner.start();\n const spinnerFail = () => spinner.fail('Authentication failed!');\n\n while (!isAuthenticated) {\n try {\n const tokenResponse = await axios.post(cliConfig.tokenUrl, tokenPayload);\n const authTokenData = tokenResponse.data;\n\n if (tokenResponse.status === 200) {\n // Token validation\n try {\n logger.debug('🔐 Validating token...');\n await tokenService.validateToken(authTokenData.id_token, cliConfig.jwksUrl);\n logger.debug('🔐 Token validation successful!');\n } catch (e: any) {\n logger.debug(e);\n spinnerFail();\n throw new Error('Unable to proceed: Token validation failed');\n }\n\n logger.debug('🔍 Fetching user information...');\n const cloudApiServiceWithToken = await cloudApiFactory(ctx, authTokenData.access_token);\n // Call to get user info to create the user in DB if not exists\n await cloudApiServiceWithToken.getUserInfo();\n logger.debug('🔍 User information fetched successfully!');\n\n try {\n logger.debug('📝 Saving login information...');\n await tokenService.saveToken(authTokenData.access_token);\n logger.debug('📝 Login information saved successfully!');\n isAuthenticated = true;\n } catch (e) {\n logger.error(\n 'There was a problem saving your login information. Please try logging in again.'\n );\n logger.debug(e);\n spinnerFail();\n return false;\n }\n }\n } catch (e: any) {\n if (e.message === 'Unable to proceed: Token validation failed') {\n logger.error(\n 'There seems to be a problem with your login information. Please try logging in again.'\n );\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n if (\n e.response?.data.error &&\n !['authorization_pending', 'slow_down'].includes(e!.response.data.error)\n ) {\n logger.debug(e);\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n // Await interval before retrying\n await new Promise((resolve) => {\n setTimeout(resolve, deviceAuthResponse.data.interval * 1000);\n });\n }\n }\n spinner.succeed('Authentication successful!');\n logger.log('You are now logged into Strapi Cloud.');\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n await trackEvent(ctx, cloudApiService, 'didLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n };\n\n await authenticate();\n return isAuthenticated;\n}\n"],"names":["openModule","promptLogin","ctx","response","inquirer","prompt","type","name","message","login","loginSuccessful","loginAction","logger","promptExperiment","tokenService","tokenServiceFactory","existingToken","retrieveToken","cloudApiService","cloudApiFactory","undefined","isTokenValid","userInfo","getUserInfo","email","data","log","chalk","underline","apiConfig","dashboardBaseUrl","e","debug","cliConfig","info","config","error","trackEvent","client_id","clientId","scope","audience","deviceAuthResponse","axios","post","deviceCodeAuthUrl","catch","then","open","default","verification_uri_complete","user_code","tokenPayload","grant_type","device_code","isAuthenticated","authenticate","spinner","start","spinnerFail","fail","tokenResponse","tokenUrl","authTokenData","status","validateToken","id_token","jwksUrl","Error","cloudApiServiceWithToken","access_token","saveToken","loginMethod","includes","Promise","resolve","setTimeout","interval","succeed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.mjs","sources":["../../src/login/action.ts"],"sourcesContent":["import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\nimport { trackEvent } from '../utils/analytics';\nimport { setContext } from '../services/context';\n\nconst openModule = import('open');\n\nexport async function promptLogin(ctx: CLIContext) {\n const response = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'login',\n message: 'Would you like to login?',\n },\n ]);\n\n if (response.login) {\n const loginSuccessful = await loginAction(ctx);\n return loginSuccessful;\n }\n return false;\n}\n\nexport default async function loginAction(\n ctx: CLIContext,\n { showDashboardLink = true }: { showDashboardLink?: boolean } = {}\n): Promise<boolean> {\n const { logger, promptExperiment } = ctx;\n const tokenService = await tokenServiceFactory(ctx);\n const existingToken = await tokenService.retrieveToken();\n const cloudApiService = await cloudApiFactory(ctx, existingToken || undefined);\n\n if (existingToken) {\n const isTokenValid = await tokenService.isTokenValid(existingToken);\n if (isTokenValid) {\n try {\n const userInfo = await cloudApiService.getUserInfo();\n const { email } = userInfo.data.data;\n setContext({ ...ctx, user: userInfo.data.data });\n if (email) {\n logger.log(`You are already logged into your account (${email}).`);\n } else {\n logger.log('You are already logged in.');\n }\n if (showDashboardLink) {\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n }\n return true;\n } catch (e) {\n logger.debug('Failed to fetch user info', e);\n }\n }\n }\n\n let cliConfig: CloudCliConfig;\n try {\n logger.info('🔌 Connecting...');\n const config = await cloudApiService.config();\n cliConfig = config.data;\n } catch (e: unknown) {\n logger.error('🥲 Oops! Something went wrong while logging you in. Please try again.');\n logger.debug(e);\n return false;\n }\n await trackEvent(ctx, cloudApiService, 'willLoginAttempt', {\n ...(promptExperiment && { promptExperiment }),\n });\n\n logger.debug('🔐 Creating device authentication request...', {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n });\n const deviceAuthResponse = (await axios\n .post(cliConfig.deviceCodeAuthUrl, {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n })\n .catch((e: AxiosError) => {\n logger.error('There was an issue with the authentication process. Please try again.');\n if (e.message) {\n logger.debug(e.message, e);\n } else {\n logger.debug(e);\n }\n })) as AxiosResponse;\n\n openModule.then((open) => {\n open.default(deviceAuthResponse.data.verification_uri_complete).catch((e: Error) => {\n logger.error('We encountered an issue opening the browser. Please try again later.');\n logger.debug(e.message, e);\n });\n });\n\n logger.log('If a browser tab does not open automatically, please follow the next steps:');\n logger.log(\n `1. Open this url in your device: ${deviceAuthResponse.data.verification_uri_complete}`\n );\n logger.log(\n `2. Enter the following code: ${deviceAuthResponse.data.user_code} and confirm to login.\\n`\n );\n\n const tokenPayload = {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n device_code: deviceAuthResponse.data.device_code,\n client_id: cliConfig.clientId,\n };\n\n let isAuthenticated = false;\n\n const authenticate = async () => {\n const spinner = logger.spinner('Waiting for authentication');\n spinner.start();\n const spinnerFail = () => spinner.fail('Authentication failed!');\n\n while (!isAuthenticated) {\n try {\n const tokenResponse = await axios.post(cliConfig.tokenUrl, tokenPayload);\n const authTokenData = tokenResponse.data;\n\n if (tokenResponse.status === 200) {\n // Token validation\n try {\n logger.debug('🔐 Validating token...');\n await tokenService.validateToken(authTokenData.id_token, cliConfig.jwksUrl);\n logger.debug('🔐 Token validation successful!');\n } catch (e: any) {\n logger.debug(e);\n spinnerFail();\n throw new Error('Unable to proceed: Token validation failed');\n }\n\n logger.debug('🔍 Fetching user information...');\n const cloudApiServiceWithToken = await cloudApiFactory(ctx, authTokenData.access_token);\n // Call to get user info to create the user in DB if not exists\n await cloudApiServiceWithToken.getUserInfo();\n logger.debug('🔍 User information fetched successfully!');\n\n try {\n logger.debug('📝 Saving login information...');\n await tokenService.saveToken(authTokenData.access_token);\n logger.debug('📝 Login information saved successfully!');\n isAuthenticated = true;\n } catch (e) {\n logger.error(\n 'There was a problem saving your login information. Please try logging in again.'\n );\n logger.debug(e);\n spinnerFail();\n return false;\n }\n }\n } catch (e: any) {\n if (e.message === 'Unable to proceed: Token validation failed') {\n logger.error(\n 'There seems to be a problem with your login information. Please try logging in again.'\n );\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n if (\n e.response?.data.error &&\n !['authorization_pending', 'slow_down'].includes(e!.response.data.error)\n ) {\n logger.debug(e);\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n // Await interval before retrying\n await new Promise((resolve) => {\n setTimeout(resolve, deviceAuthResponse.data.interval * 1000);\n });\n }\n }\n spinner.succeed('Authentication successful!');\n if (showDashboardLink) {\n logger.log('You are now logged into Strapi Cloud.');\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n }\n await trackEvent(ctx, cloudApiService, 'didLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n };\n\n await authenticate();\n return isAuthenticated;\n}\n"],"names":["openModule","promptLogin","ctx","response","inquirer","prompt","type","name","message","login","loginSuccessful","loginAction","showDashboardLink","logger","promptExperiment","tokenService","tokenServiceFactory","existingToken","retrieveToken","cloudApiService","cloudApiFactory","undefined","isTokenValid","userInfo","getUserInfo","email","data","setContext","user","log","chalk","underline","apiConfig","dashboardBaseUrl","e","debug","cliConfig","info","config","error","trackEvent","client_id","clientId","scope","audience","deviceAuthResponse","axios","post","deviceCodeAuthUrl","catch","then","open","default","verification_uri_complete","user_code","tokenPayload","grant_type","device_code","isAuthenticated","authenticate","spinner","start","spinnerFail","fail","tokenResponse","tokenUrl","authTokenData","status","validateToken","id_token","jwksUrl","Error","cloudApiServiceWithToken","access_token","saveToken","loginMethod","includes","Promise","resolve","setTimeout","interval","succeed"],"mappings":"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"}
|
package/dist/package.json.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var name = "@strapi/cloud-cli";
|
|
6
|
-
var version = "
|
|
6
|
+
var version = "0.0.0-next.de7aa8b6d2161b0be06244360caa235b8619d823";
|
|
7
7
|
var description = "Commands to interact with the Strapi Cloud";
|
|
8
8
|
var keywords = [
|
|
9
9
|
"strapi",
|
|
@@ -50,8 +50,8 @@ var scripts = {
|
|
|
50
50
|
watch: "run -T rollup -c -w"
|
|
51
51
|
};
|
|
52
52
|
var dependencies = {
|
|
53
|
-
"@strapi/utils": "
|
|
54
|
-
axios: "1.
|
|
53
|
+
"@strapi/utils": "0.0.0-next.de7aa8b6d2161b0be06244360caa235b8619d823",
|
|
54
|
+
axios: "1.12.2",
|
|
55
55
|
boxen: "5.1.2",
|
|
56
56
|
chalk: "4.1.2",
|
|
57
57
|
"cli-progress": "3.12.0",
|
|
@@ -75,8 +75,8 @@ var devDependencies = {
|
|
|
75
75
|
"@types/cli-progress": "3.11.5",
|
|
76
76
|
"@types/eventsource": "1.1.15",
|
|
77
77
|
"@types/lodash": "^4.14.191",
|
|
78
|
-
"eslint-config-custom": "
|
|
79
|
-
tsconfig: "
|
|
78
|
+
"eslint-config-custom": "0.0.0-next.de7aa8b6d2161b0be06244360caa235b8619d823",
|
|
79
|
+
tsconfig: "0.0.0-next.de7aa8b6d2161b0be06244360caa235b8619d823"
|
|
80
80
|
};
|
|
81
81
|
var engines = {
|
|
82
82
|
node: ">=18.0.0 <=22.x.x",
|
package/dist/package.json.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
var name = "@strapi/cloud-cli";
|
|
2
|
-
var version = "
|
|
2
|
+
var version = "0.0.0-next.de7aa8b6d2161b0be06244360caa235b8619d823";
|
|
3
3
|
var description = "Commands to interact with the Strapi Cloud";
|
|
4
4
|
var keywords = [
|
|
5
5
|
"strapi",
|
|
@@ -46,8 +46,8 @@ var scripts = {
|
|
|
46
46
|
watch: "run -T rollup -c -w"
|
|
47
47
|
};
|
|
48
48
|
var dependencies = {
|
|
49
|
-
"@strapi/utils": "
|
|
50
|
-
axios: "1.
|
|
49
|
+
"@strapi/utils": "0.0.0-next.de7aa8b6d2161b0be06244360caa235b8619d823",
|
|
50
|
+
axios: "1.12.2",
|
|
51
51
|
boxen: "5.1.2",
|
|
52
52
|
chalk: "4.1.2",
|
|
53
53
|
"cli-progress": "3.12.0",
|
|
@@ -71,8 +71,8 @@ var devDependencies = {
|
|
|
71
71
|
"@types/cli-progress": "3.11.5",
|
|
72
72
|
"@types/eventsource": "1.1.15",
|
|
73
73
|
"@types/lodash": "^4.14.191",
|
|
74
|
-
"eslint-config-custom": "
|
|
75
|
-
tsconfig: "
|
|
74
|
+
"eslint-config-custom": "0.0.0-next.de7aa8b6d2161b0be06244360caa235b8619d823",
|
|
75
|
+
tsconfig: "0.0.0-next.de7aa8b6d2161b0be06244360caa235b8619d823"
|
|
76
76
|
};
|
|
77
77
|
var engines = {
|
|
78
78
|
node: ">=18.0.0 <=22.x.x",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-logs.d.ts","sourceRoot":"","sources":["../../src/services/build-logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAE3D,QAAA,MAAM,uBAAuB,eAAgB,UAAU,WAClC,MAAM,SAAS,MAAM,aAAa,cAAc,
|
|
1
|
+
{"version":3,"file":"build-logs.d.ts","sourceRoot":"","sources":["../../src/services/build-logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAE3D,QAAA,MAAM,uBAAuB,eAAgB,UAAU,WAClC,MAAM,SAAS,MAAM,aAAa,cAAc,qBAuEpE,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -10,8 +10,8 @@ const buildLogsServiceFactory = ({ logger })=>{
|
|
|
10
10
|
let timeoutId = null;
|
|
11
11
|
let retries = 0;
|
|
12
12
|
const connect = (url)=>{
|
|
13
|
-
const
|
|
14
|
-
|
|
13
|
+
const logsSpinner = logger.spinner('Connecting to the server to get build logs\n').start();
|
|
14
|
+
logsSpinner.indent = 1;
|
|
15
15
|
const es = new EventSource(`${url}`, {
|
|
16
16
|
headers: {
|
|
17
17
|
Authorization: `Bearer ${token}`
|
|
@@ -25,8 +25,8 @@ const buildLogsServiceFactory = ({ logger })=>{
|
|
|
25
25
|
const resetTimeout = ()=>{
|
|
26
26
|
clearExistingTimeout();
|
|
27
27
|
timeoutId = setTimeout(()=>{
|
|
28
|
-
if (
|
|
29
|
-
|
|
28
|
+
if (logsSpinner.isSpinning) {
|
|
29
|
+
logsSpinner.fail('We were unable to connect to the server to get build logs at this time. This could be due to a temporary issue.');
|
|
30
30
|
}
|
|
31
31
|
es.close();
|
|
32
32
|
reject(new Error('Connection timed out'));
|
|
@@ -41,8 +41,8 @@ const buildLogsServiceFactory = ({ logger })=>{
|
|
|
41
41
|
resolve(null);
|
|
42
42
|
});
|
|
43
43
|
es.addEventListener('log', (event)=>{
|
|
44
|
-
if (
|
|
45
|
-
|
|
44
|
+
if (logsSpinner.isSpinning) {
|
|
45
|
+
logsSpinner.succeed();
|
|
46
46
|
}
|
|
47
47
|
resetTimeout();
|
|
48
48
|
const data = JSON.parse(event.data);
|
|
@@ -51,7 +51,7 @@ const buildLogsServiceFactory = ({ logger })=>{
|
|
|
51
51
|
es.onerror = async ()=>{
|
|
52
52
|
retries += 1;
|
|
53
53
|
if (retries > MAX_RETRIES) {
|
|
54
|
-
|
|
54
|
+
logsSpinner.fail('We were unable to connect to the server to get build logs at this time.');
|
|
55
55
|
es.close();
|
|
56
56
|
clearExistingTimeout(); // Important to clear the event loop from remaining timeout - avoid to wait for nothing while the timeout is running
|
|
57
57
|
reject(new Error('Max retries reached'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-logs.js","sources":["../../src/services/build-logs.ts"],"sourcesContent":["import EventSource from 'eventsource';\nimport { CLIContext, type CloudCliConfig } from '../types';\n\nconst buildLogsServiceFactory = ({ logger }: CLIContext) => {\n return async (url: string, token: string, cliConfig: CloudCliConfig) => {\n const CONN_TIMEOUT = Number(cliConfig.buildLogsConnectionTimeout);\n const MAX_RETRIES = Number(cliConfig.buildLogsMaxRetries);\n\n return new Promise((resolve, reject) => {\n let timeoutId: NodeJS.Timeout | null = null;\n let retries = 0;\n\n const connect = (url: string) => {\n const
|
|
1
|
+
{"version":3,"file":"build-logs.js","sources":["../../src/services/build-logs.ts"],"sourcesContent":["import EventSource from 'eventsource';\nimport { CLIContext, type CloudCliConfig } from '../types';\n\nconst buildLogsServiceFactory = ({ logger }: CLIContext) => {\n return async (url: string, token: string, cliConfig: CloudCliConfig) => {\n const CONN_TIMEOUT = Number(cliConfig.buildLogsConnectionTimeout);\n const MAX_RETRIES = Number(cliConfig.buildLogsMaxRetries);\n\n return new Promise((resolve, reject) => {\n let timeoutId: NodeJS.Timeout | null = null;\n let retries = 0;\n\n const connect = (url: string) => {\n const logsSpinner = logger.spinner('Connecting to the server to get build logs\\n').start();\n logsSpinner.indent = 1;\n const es = new EventSource(`${url}`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n const clearExistingTimeout = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n const resetTimeout = () => {\n clearExistingTimeout();\n timeoutId = setTimeout(() => {\n if (logsSpinner.isSpinning) {\n logsSpinner.fail(\n 'We were unable to connect to the server to get build logs at this time. This could be due to a temporary issue.'\n );\n }\n es.close();\n reject(new Error('Connection timed out'));\n }, CONN_TIMEOUT);\n };\n\n es.onopen = resetTimeout;\n\n es.addEventListener('finished', (event) => {\n const data = JSON.parse(event.data);\n logger.log(data.msg);\n es.close();\n clearExistingTimeout();\n resolve(null);\n });\n\n es.addEventListener('log', (event) => {\n if (logsSpinner.isSpinning) {\n logsSpinner.succeed();\n }\n resetTimeout();\n const data = JSON.parse(event.data);\n logger.log(data.msg);\n });\n\n es.onerror = async () => {\n retries += 1;\n if (retries > MAX_RETRIES) {\n logsSpinner.fail(\n 'We were unable to connect to the server to get build logs at this time.'\n );\n es.close();\n clearExistingTimeout(); // Important to clear the event loop from remaining timeout - avoid to wait for nothing while the timeout is running\n reject(new Error('Max retries reached'));\n }\n };\n };\n\n connect(url);\n });\n };\n};\n\nexport { buildLogsServiceFactory };\n"],"names":["buildLogsServiceFactory","logger","url","token","cliConfig","CONN_TIMEOUT","Number","buildLogsConnectionTimeout","MAX_RETRIES","buildLogsMaxRetries","Promise","resolve","reject","timeoutId","retries","connect","logsSpinner","spinner","start","indent","es","EventSource","headers","Authorization","clearExistingTimeout","clearTimeout","resetTimeout","setTimeout","isSpinning","fail","close","Error","onopen","addEventListener","event","data","JSON","parse","log","msg","succeed","onerror"],"mappings":"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"}
|
|
@@ -8,8 +8,8 @@ const buildLogsServiceFactory = ({ logger })=>{
|
|
|
8
8
|
let timeoutId = null;
|
|
9
9
|
let retries = 0;
|
|
10
10
|
const connect = (url)=>{
|
|
11
|
-
const
|
|
12
|
-
|
|
11
|
+
const logsSpinner = logger.spinner('Connecting to the server to get build logs\n').start();
|
|
12
|
+
logsSpinner.indent = 1;
|
|
13
13
|
const es = new EventSource(`${url}`, {
|
|
14
14
|
headers: {
|
|
15
15
|
Authorization: `Bearer ${token}`
|
|
@@ -23,8 +23,8 @@ const buildLogsServiceFactory = ({ logger })=>{
|
|
|
23
23
|
const resetTimeout = ()=>{
|
|
24
24
|
clearExistingTimeout();
|
|
25
25
|
timeoutId = setTimeout(()=>{
|
|
26
|
-
if (
|
|
27
|
-
|
|
26
|
+
if (logsSpinner.isSpinning) {
|
|
27
|
+
logsSpinner.fail('We were unable to connect to the server to get build logs at this time. This could be due to a temporary issue.');
|
|
28
28
|
}
|
|
29
29
|
es.close();
|
|
30
30
|
reject(new Error('Connection timed out'));
|
|
@@ -39,8 +39,8 @@ const buildLogsServiceFactory = ({ logger })=>{
|
|
|
39
39
|
resolve(null);
|
|
40
40
|
});
|
|
41
41
|
es.addEventListener('log', (event)=>{
|
|
42
|
-
if (
|
|
43
|
-
|
|
42
|
+
if (logsSpinner.isSpinning) {
|
|
43
|
+
logsSpinner.succeed();
|
|
44
44
|
}
|
|
45
45
|
resetTimeout();
|
|
46
46
|
const data = JSON.parse(event.data);
|
|
@@ -49,7 +49,7 @@ const buildLogsServiceFactory = ({ logger })=>{
|
|
|
49
49
|
es.onerror = async ()=>{
|
|
50
50
|
retries += 1;
|
|
51
51
|
if (retries > MAX_RETRIES) {
|
|
52
|
-
|
|
52
|
+
logsSpinner.fail('We were unable to connect to the server to get build logs at this time.');
|
|
53
53
|
es.close();
|
|
54
54
|
clearExistingTimeout(); // Important to clear the event loop from remaining timeout - avoid to wait for nothing while the timeout is running
|
|
55
55
|
reject(new Error('Max retries reached'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-logs.mjs","sources":["../../src/services/build-logs.ts"],"sourcesContent":["import EventSource from 'eventsource';\nimport { CLIContext, type CloudCliConfig } from '../types';\n\nconst buildLogsServiceFactory = ({ logger }: CLIContext) => {\n return async (url: string, token: string, cliConfig: CloudCliConfig) => {\n const CONN_TIMEOUT = Number(cliConfig.buildLogsConnectionTimeout);\n const MAX_RETRIES = Number(cliConfig.buildLogsMaxRetries);\n\n return new Promise((resolve, reject) => {\n let timeoutId: NodeJS.Timeout | null = null;\n let retries = 0;\n\n const connect = (url: string) => {\n const
|
|
1
|
+
{"version":3,"file":"build-logs.mjs","sources":["../../src/services/build-logs.ts"],"sourcesContent":["import EventSource from 'eventsource';\nimport { CLIContext, type CloudCliConfig } from '../types';\n\nconst buildLogsServiceFactory = ({ logger }: CLIContext) => {\n return async (url: string, token: string, cliConfig: CloudCliConfig) => {\n const CONN_TIMEOUT = Number(cliConfig.buildLogsConnectionTimeout);\n const MAX_RETRIES = Number(cliConfig.buildLogsMaxRetries);\n\n return new Promise((resolve, reject) => {\n let timeoutId: NodeJS.Timeout | null = null;\n let retries = 0;\n\n const connect = (url: string) => {\n const logsSpinner = logger.spinner('Connecting to the server to get build logs\\n').start();\n logsSpinner.indent = 1;\n const es = new EventSource(`${url}`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n const clearExistingTimeout = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n const resetTimeout = () => {\n clearExistingTimeout();\n timeoutId = setTimeout(() => {\n if (logsSpinner.isSpinning) {\n logsSpinner.fail(\n 'We were unable to connect to the server to get build logs at this time. This could be due to a temporary issue.'\n );\n }\n es.close();\n reject(new Error('Connection timed out'));\n }, CONN_TIMEOUT);\n };\n\n es.onopen = resetTimeout;\n\n es.addEventListener('finished', (event) => {\n const data = JSON.parse(event.data);\n logger.log(data.msg);\n es.close();\n clearExistingTimeout();\n resolve(null);\n });\n\n es.addEventListener('log', (event) => {\n if (logsSpinner.isSpinning) {\n logsSpinner.succeed();\n }\n resetTimeout();\n const data = JSON.parse(event.data);\n logger.log(data.msg);\n });\n\n es.onerror = async () => {\n retries += 1;\n if (retries > MAX_RETRIES) {\n logsSpinner.fail(\n 'We were unable to connect to the server to get build logs at this time.'\n );\n es.close();\n clearExistingTimeout(); // Important to clear the event loop from remaining timeout - avoid to wait for nothing while the timeout is running\n reject(new Error('Max retries reached'));\n }\n };\n };\n\n connect(url);\n });\n };\n};\n\nexport { buildLogsServiceFactory };\n"],"names":["buildLogsServiceFactory","logger","url","token","cliConfig","CONN_TIMEOUT","Number","buildLogsConnectionTimeout","MAX_RETRIES","buildLogsMaxRetries","Promise","resolve","reject","timeoutId","retries","connect","logsSpinner","spinner","start","indent","es","EventSource","headers","Authorization","clearExistingTimeout","clearTimeout","resetTimeout","setTimeout","isSpinning","fail","close","Error","onopen","addEventListener","event","data","JSON","parse","log","msg","succeed","onerror"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type AxiosResponse } from 'axios';
|
|
2
2
|
import type { CLIContext, CloudCliConfig, TrackPayload } from '../types';
|
|
3
|
-
export declare const VERSION = "
|
|
3
|
+
export declare const VERSION = "v3";
|
|
4
4
|
export type ProjectInfo = {
|
|
5
5
|
id: string;
|
|
6
6
|
name: string;
|
|
@@ -58,6 +58,14 @@ export type GetProjectResponse = {
|
|
|
58
58
|
};
|
|
59
59
|
};
|
|
60
60
|
};
|
|
61
|
+
export type CreateTrialResponse = {
|
|
62
|
+
licenseKey: string;
|
|
63
|
+
};
|
|
64
|
+
export type CreateProjectResponse = {
|
|
65
|
+
name: string;
|
|
66
|
+
environmentInternalName: string;
|
|
67
|
+
url?: string;
|
|
68
|
+
};
|
|
61
69
|
export interface CloudApiService {
|
|
62
70
|
deploy(deployInput: {
|
|
63
71
|
filePath: string;
|
|
@@ -72,7 +80,7 @@ export interface CloudApiService {
|
|
|
72
80
|
}) => void;
|
|
73
81
|
}): Promise<AxiosResponse<DeployResponse>>;
|
|
74
82
|
createProject(createProjectInput: ProjectInput): Promise<{
|
|
75
|
-
data:
|
|
83
|
+
data: CreateProjectResponse;
|
|
76
84
|
status: number;
|
|
77
85
|
}>;
|
|
78
86
|
getUserInfo(): Promise<AxiosResponse>;
|
|
@@ -88,6 +96,9 @@ export interface CloudApiService {
|
|
|
88
96
|
getProject(project: {
|
|
89
97
|
name: string;
|
|
90
98
|
}): Promise<AxiosResponse<GetProjectResponse>>;
|
|
99
|
+
createTrial(createTrialInput: {
|
|
100
|
+
strapiVersion: string;
|
|
101
|
+
}): Promise<AxiosResponse<CreateTrialResponse>>;
|
|
91
102
|
track(event: string, payload?: TrackPayload): Promise<AxiosResponse<void>>;
|
|
92
103
|
}
|
|
93
104
|
export declare function cloudApiFactory({ logger }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-api.d.ts","sourceRoot":"","sources":["../../src/services/cli-api.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAIlD,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-api.d.ts","sourceRoot":"","sources":["../../src/services/cli-api.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAIlD,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAMzE,eAAO,MAAM,OAAO,OAAO,CAAC;AAE5B,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KACjD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KAC7C,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KACpD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;KAC3C,CAAC;IACF,QAAQ,EAAE;QACR,aAAa,EAAE;YACb,OAAO,EAAE,MAAM,CAAC;YAChB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB,EAAE,MAAM,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,MAAM,CACJ,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACvD,EACD,EACE,gBAAgB,GACjB,EAAE;QACD,gBAAgB,EAAE,CAAC,aAAa,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;KAC/E,GACA,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;IAE1C,aAAa,CAAC,kBAAkB,EAAE,YAAY,GAAG,OAAO,CAAC;QACvD,IAAI,EAAE,qBAAqB,CAAC;QAC5B,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IAEH,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAEtC,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;IAEjD,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE7D,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAErE,gBAAgB,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAE9F,oBAAoB,CAAC,OAAO,EAAE;QAC5B,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,aAAa,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAEzD,UAAU,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAElF,WAAW,CAAC,gBAAgB,EAAE;QAC5B,aAAa,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAEhD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;CAC5E;AAED,wBAAsB,eAAe,CACnC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;CAAE,EAC5C,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CA2L1B"}
|