@strapi/cloud-cli 0.0.0-next.a64ced5364618f917adb31b8684b4e3c01c58862 → 0.0.0-next.af9f5eed766381838931b23118affc1c765c5d88
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/LICENSE +18 -3
- package/dist/index.js +40 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +40 -16
- package/dist/index.mjs.map +1 -1
- package/dist/src/logout/action.d.ts.map +1 -1
- package/dist/src/services/cli-api.d.ts +4 -2
- package/dist/src/services/cli-api.d.ts.map +1 -1
- package/package.json +5 -5
package/LICENSE
CHANGED
|
@@ -2,7 +2,21 @@ Copyright (c) 2015-present Strapi Solutions SAS
|
|
|
2
2
|
|
|
3
3
|
Portions of the Strapi software are licensed as follows:
|
|
4
4
|
|
|
5
|
-
* All software that resides under an "ee/" directory (the “EE Software”), if that directory exists, is licensed under the license defined
|
|
5
|
+
* All software that resides under an "ee/" directory (the “EE Software”), if that directory exists, is licensed under the license defined below.
|
|
6
|
+
|
|
7
|
+
Enterprise License
|
|
8
|
+
|
|
9
|
+
If you or the company you represent has entered into a written agreement referencing the Enterprise Edition of the Strapi source code available at
|
|
10
|
+
https://github.com/strapi/strapi, then such agreement applies to your use of the Enterprise Edition of the Strapi Software. If you or the company you
|
|
11
|
+
represent is using the Enterprise Edition of the Strapi Software in connection with a subscription to our cloud offering, then the agreement you have
|
|
12
|
+
agreed to with respect to our cloud offering and the licenses included in such agreement apply to your use of the Enterprise Edition of the Strapi Software.
|
|
13
|
+
Otherwise, the Strapi Enterprise Software License Agreement (found here https://strapi.io/enterprise-terms) applies to your use of the Enterprise Edition of the Strapi Software.
|
|
14
|
+
|
|
15
|
+
BY ACCESSING OR USING THE ENTERPRISE EDITION OF THE STRAPI SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE RELEVANT REFERENCED AGREEMENT.
|
|
16
|
+
IF YOU ARE NOT AUTHORIZED TO ACCEPT THESE TERMS ON BEHALF OF THE COMPANY YOU REPRESENT OR IF YOU DO NOT AGREE TO ALL OF THE RELEVANT TERMS AND CONDITIONS REFERENCED AND YOU
|
|
17
|
+
HAVE NOT OTHERWISE EXECUTED A WRITTEN AGREEMENT WITH STRAPI, YOU ARE NOT AUTHORIZED TO ACCESS OR USE OR ALLOW ANY USER TO ACCESS OR USE ANY PART OF
|
|
18
|
+
THE ENTERPRISE EDITION OF THE STRAPI SOFTWARE. YOUR ACCESS RIGHTS ARE CONDITIONAL ON YOUR CONSENT TO THE RELEVANT REFERENCED TERMS TO THE EXCLUSION OF ALL OTHER TERMS;
|
|
19
|
+
IF THE RELEVANT REFERENCED TERMS ARE CONSIDERED AN OFFER BY YOU, ACCEPTANCE IS EXPRESSLY LIMITED TO THE RELEVANT REFERENCED TERMS.
|
|
6
20
|
|
|
7
21
|
* All software outside of the above-mentioned directories or restrictions above is available under the "MIT Expat" license as set forth below.
|
|
8
22
|
|
|
@@ -18,5 +32,6 @@ furnished to do so, subject to the following conditions:
|
|
|
18
32
|
The above copyright notice and this permission notice shall be included in all
|
|
19
33
|
copies or substantial portions of the Software.
|
|
20
34
|
|
|
21
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
-
|
|
35
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
36
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
37
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/dist/index.js
CHANGED
|
@@ -194,7 +194,7 @@ async function saveLocalConfig(data) {
|
|
|
194
194
|
await fse__default.default.writeJson(configFilePath, data, { encoding: "utf8", spaces: 2, mode: 384 });
|
|
195
195
|
}
|
|
196
196
|
const name = "@strapi/cloud-cli";
|
|
197
|
-
const version = "4.25.
|
|
197
|
+
const version = "4.25.1";
|
|
198
198
|
const description = "Commands to interact with the Strapi Cloud";
|
|
199
199
|
const keywords = [
|
|
200
200
|
"strapi",
|
|
@@ -238,7 +238,7 @@ const scripts = {
|
|
|
238
238
|
watch: "pack-up watch"
|
|
239
239
|
};
|
|
240
240
|
const dependencies = {
|
|
241
|
-
"@strapi/utils": "4.25.
|
|
241
|
+
"@strapi/utils": "4.25.1",
|
|
242
242
|
axios: "1.6.0",
|
|
243
243
|
chalk: "4.1.2",
|
|
244
244
|
"cli-progress": "3.12.0",
|
|
@@ -263,8 +263,8 @@ const devDependencies = {
|
|
|
263
263
|
"@types/cli-progress": "3.11.5",
|
|
264
264
|
"@types/eventsource": "1.1.15",
|
|
265
265
|
"@types/lodash": "^4.14.191",
|
|
266
|
-
"eslint-config-custom": "4.25.
|
|
267
|
-
tsconfig: "4.25.
|
|
266
|
+
"eslint-config-custom": "4.25.1",
|
|
267
|
+
tsconfig: "4.25.1"
|
|
268
268
|
};
|
|
269
269
|
const engines = {
|
|
270
270
|
node: ">=18.0.0 <=20.x.x",
|
|
@@ -293,7 +293,7 @@ const packageJson = {
|
|
|
293
293
|
engines
|
|
294
294
|
};
|
|
295
295
|
const VERSION = "v1";
|
|
296
|
-
async function cloudApiFactory(token) {
|
|
296
|
+
async function cloudApiFactory({ logger }, token) {
|
|
297
297
|
const localConfig = await getLocalConfig();
|
|
298
298
|
const customHeaders = {
|
|
299
299
|
"x-device-id": localConfig.deviceId,
|
|
@@ -346,8 +346,19 @@ async function cloudApiFactory(token) {
|
|
|
346
346
|
getUserInfo() {
|
|
347
347
|
return axiosCloudAPI.get("/user");
|
|
348
348
|
},
|
|
349
|
-
config() {
|
|
350
|
-
|
|
349
|
+
async config() {
|
|
350
|
+
try {
|
|
351
|
+
const response = await axiosCloudAPI.get("/config");
|
|
352
|
+
if (response.status !== 200) {
|
|
353
|
+
throw new Error("Error fetching cloud CLI config from the server.");
|
|
354
|
+
}
|
|
355
|
+
return response;
|
|
356
|
+
} catch (error) {
|
|
357
|
+
logger.debug(
|
|
358
|
+
"🥲 Oops! Couldn't retrieve the cloud CLI config from the server. Please try again."
|
|
359
|
+
);
|
|
360
|
+
throw error;
|
|
361
|
+
}
|
|
351
362
|
},
|
|
352
363
|
listProjects() {
|
|
353
364
|
return axiosCloudAPI.get("/projects");
|
|
@@ -386,7 +397,7 @@ const strapiInfoSave = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defi
|
|
|
386
397
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
387
398
|
let cliConfig;
|
|
388
399
|
async function tokenServiceFactory({ logger }) {
|
|
389
|
-
const cloudApiService = await cloudApiFactory();
|
|
400
|
+
const cloudApiService = await cloudApiFactory({ logger });
|
|
390
401
|
async function saveToken(str) {
|
|
391
402
|
const appConfig = await getLocalConfig();
|
|
392
403
|
if (!appConfig) {
|
|
@@ -661,7 +672,7 @@ const action$3 = async (ctx) => {
|
|
|
661
672
|
if (!token) {
|
|
662
673
|
return;
|
|
663
674
|
}
|
|
664
|
-
const cloudApi = await cloudApiFactory(token);
|
|
675
|
+
const cloudApi = await cloudApiFactory(ctx, token);
|
|
665
676
|
const { data: config } = await cloudApi.config();
|
|
666
677
|
const { questions, defaults: defaultValues } = config.projectCreation;
|
|
667
678
|
const projectAnswersDefaulted = fp.defaults(defaultValues);
|
|
@@ -803,7 +814,7 @@ const buildLogsServiceFactory = ({ logger }) => {
|
|
|
803
814
|
};
|
|
804
815
|
};
|
|
805
816
|
async function upload(ctx, project, token, maxProjectFileSize) {
|
|
806
|
-
const cloudApi = await cloudApiFactory(token);
|
|
817
|
+
const cloudApi = await cloudApiFactory(ctx, token);
|
|
807
818
|
try {
|
|
808
819
|
const storagePath = await getTmpStoragePath();
|
|
809
820
|
const projectFolder = path__namespace.default.resolve(process.cwd());
|
|
@@ -905,7 +916,7 @@ async function getProject(ctx) {
|
|
|
905
916
|
}
|
|
906
917
|
const action$2 = async (ctx) => {
|
|
907
918
|
const { getValidToken } = await tokenServiceFactory(ctx);
|
|
908
|
-
const cloudApiService = await cloudApiFactory();
|
|
919
|
+
const cloudApiService = await cloudApiFactory(ctx);
|
|
909
920
|
const token = await getValidToken();
|
|
910
921
|
if (!token) {
|
|
911
922
|
return;
|
|
@@ -986,12 +997,12 @@ const deployProject = {
|
|
|
986
997
|
action: action$2,
|
|
987
998
|
command: command$3
|
|
988
999
|
};
|
|
989
|
-
const openModule = import("open");
|
|
1000
|
+
const openModule$1 = import("open");
|
|
990
1001
|
const action$1 = async (ctx) => {
|
|
991
1002
|
const { logger } = ctx;
|
|
992
1003
|
const tokenService = await tokenServiceFactory(ctx);
|
|
993
1004
|
const existingToken = await tokenService.retrieveToken();
|
|
994
|
-
const cloudApiService = await cloudApiFactory(existingToken || void 0);
|
|
1005
|
+
const cloudApiService = await cloudApiFactory(ctx, existingToken || void 0);
|
|
995
1006
|
const trackFailedLogin = async () => {
|
|
996
1007
|
try {
|
|
997
1008
|
await cloudApiService.track("didNotLogin", { loginMethod: "cli" });
|
|
@@ -1052,7 +1063,7 @@ const action$1 = async (ctx) => {
|
|
|
1052
1063
|
logger.debug(e);
|
|
1053
1064
|
}
|
|
1054
1065
|
});
|
|
1055
|
-
openModule.then((open) => {
|
|
1066
|
+
openModule$1.then((open) => {
|
|
1056
1067
|
open.default(deviceAuthResponse.data.verification_uri_complete).catch((e) => {
|
|
1057
1068
|
logger.error("We encountered an issue opening the browser. Please try again later.");
|
|
1058
1069
|
logger.debug(e.message, e);
|
|
@@ -1091,7 +1102,7 @@ const action$1 = async (ctx) => {
|
|
|
1091
1102
|
throw new Error("Unable to proceed: Token validation failed");
|
|
1092
1103
|
}
|
|
1093
1104
|
logger.debug("🔍 Fetching user information...");
|
|
1094
|
-
const cloudApiServiceWithToken = await cloudApiFactory(authTokenData.access_token);
|
|
1105
|
+
const cloudApiServiceWithToken = await cloudApiFactory(ctx, authTokenData.access_token);
|
|
1095
1106
|
await cloudApiServiceWithToken.getUserInfo();
|
|
1096
1107
|
logger.debug("🔍 User information fetched successfully!");
|
|
1097
1108
|
try {
|
|
@@ -1155,6 +1166,7 @@ const login = {
|
|
|
1155
1166
|
action: action$1,
|
|
1156
1167
|
command: command$2
|
|
1157
1168
|
};
|
|
1169
|
+
const openModule = import("open");
|
|
1158
1170
|
const action = async (ctx) => {
|
|
1159
1171
|
const { logger } = ctx;
|
|
1160
1172
|
const { retrieveToken, eraseToken } = await tokenServiceFactory(ctx);
|
|
@@ -1163,9 +1175,21 @@ const action = async (ctx) => {
|
|
|
1163
1175
|
logger.log("You're already logged out.");
|
|
1164
1176
|
return;
|
|
1165
1177
|
}
|
|
1166
|
-
const cloudApiService = await cloudApiFactory(token);
|
|
1178
|
+
const cloudApiService = await cloudApiFactory(ctx, token);
|
|
1179
|
+
const config = await cloudApiService.config();
|
|
1180
|
+
const cliConfig2 = config.data;
|
|
1167
1181
|
try {
|
|
1168
1182
|
await eraseToken();
|
|
1183
|
+
openModule.then((open) => {
|
|
1184
|
+
open.default(
|
|
1185
|
+
`${cliConfig2.baseUrl}/oidc/logout?client_id=${encodeURIComponent(
|
|
1186
|
+
cliConfig2.clientId
|
|
1187
|
+
)}&logout_hint=${encodeURIComponent(token)}
|
|
1188
|
+
`
|
|
1189
|
+
).catch((e) => {
|
|
1190
|
+
logger.debug(e.message, e);
|
|
1191
|
+
});
|
|
1192
|
+
});
|
|
1169
1193
|
logger.log(
|
|
1170
1194
|
"🔌 You have been logged out from the CLI. If you are on a shared computer, please make sure to log out from the Strapi Cloud Dashboard as well."
|
|
1171
1195
|
);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/config/api.ts","../src/utils/compress-files.ts","../src/config/local.ts","../src/services/cli-api.ts","../src/services/strapi-info-save.ts","../src/services/token.ts","../src/services/logger.ts","../src/create-project/action.ts","../src/services/notification.ts","../src/utils/pkg.ts","../src/services/build-logs.ts","../src/deploy-project/action.ts","../src/utils/helpers.ts","../src/deploy-project/command.ts","../src/deploy-project/index.ts","../src/login/action.ts","../src/login/command.ts","../src/login/index.ts","../src/logout/action.ts","../src/logout/command.ts","../src/logout/index.ts","../src/create-project/command.ts","../src/create-project/index.ts","../src/index.ts"],"sourcesContent":["import { env } from '@strapi/utils';\n\nexport const apiConfig = {\n apiBaseUrl: env('STRAPI_CLI_CLOUD_API', 'https://cloud-cli-api.strapi.io'),\n dashboardBaseUrl: env('STRAPI_CLI_CLOUD_DASHBOARD', 'https://cloud.strapi.io'),\n};\n","// TODO Migrate to fs-extra\nimport * as fs from 'fs';\nimport * as tar from 'tar';\nimport * as path from 'path';\nimport { minimatch } from 'minimatch';\n\nconst IGNORED_PATTERNS = [\n '**/.git/**',\n '**/node_modules/**',\n '**/build/**',\n '**/dist/**',\n '**/.cache/**',\n '**/.circleci/**',\n '**/.github/**',\n '**/.gitignore',\n '**/.gitkeep',\n '**/.gitlab-ci.yml',\n '**/.idea/**',\n '**/.vscode/**',\n];\n\nconst getFiles = (\n dirPath: string,\n ignorePatterns: string[] = [],\n arrayOfFiles: string[] = [],\n subfolder: string = ''\n): string[] => {\n const entries = fs.readdirSync(path.join(dirPath, subfolder));\n entries.forEach((entry) => {\n const entryPathFromRoot = path.join(subfolder, entry);\n const entryPath = path.relative(dirPath, entryPathFromRoot);\n const isIgnored = isIgnoredFile(dirPath, entryPathFromRoot, ignorePatterns);\n if (isIgnored) {\n return;\n }\n if (fs.statSync(entryPath).isDirectory()) {\n getFiles(dirPath, ignorePatterns, arrayOfFiles, entryPathFromRoot);\n } else {\n arrayOfFiles.push(entryPath);\n }\n });\n return arrayOfFiles;\n};\n\nconst isIgnoredFile = (folderPath: string, file: string, ignorePatterns: string[]): boolean => {\n ignorePatterns.push(...IGNORED_PATTERNS);\n const relativeFilePath = path.join(folderPath, file);\n let isIgnored = false;\n for (const pattern of ignorePatterns) {\n if (pattern.startsWith('!')) {\n if (minimatch(relativeFilePath, pattern.slice(1), { matchBase: true, dot: true })) {\n return false;\n }\n } else if (minimatch(relativeFilePath, pattern, { matchBase: true, dot: true })) {\n if (path.basename(file) !== '.gitkeep') {\n isIgnored = true;\n }\n }\n }\n return isIgnored;\n};\n\nconst readGitignore = (folderPath: string): string[] => {\n const gitignorePath = path.resolve(folderPath, '.gitignore');\n if (!fs.existsSync(gitignorePath)) return [];\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n return gitignoreContent\n .split(/\\r?\\n/)\n .filter((line) => Boolean(line.trim()) && !line.startsWith('#'));\n};\n\nconst compressFilesToTar = async (\n storagePath: string,\n folderToCompress: string,\n filename: string\n): Promise<void> => {\n const ignorePatterns = readGitignore(folderToCompress);\n const filesToCompress = getFiles(folderToCompress, ignorePatterns);\n\n return tar.c(\n {\n gzip: true,\n file: path.resolve(storagePath, filename),\n },\n filesToCompress\n );\n};\n\nexport { compressFilesToTar, isIgnoredFile };\n","import path from 'path';\nimport os from 'os';\nimport fse from 'fs-extra';\nimport XDGAppPaths from 'xdg-app-paths';\n\nconst APP_FOLDER_NAME = 'com.strapi.cli';\n\nexport const CONFIG_FILENAME = 'config.json';\n\nexport type LocalConfig = {\n token?: string;\n deviceId?: string;\n};\n\nasync function checkDirectoryExists(directoryPath: string) {\n try {\n const fsStat = await fse.lstat(directoryPath);\n return fsStat.isDirectory();\n } catch (e) {\n return false;\n }\n}\n\n// Determine storage path based on the operating system\nexport async function getTmpStoragePath() {\n const storagePath = path.join(os.tmpdir(), APP_FOLDER_NAME);\n await fse.ensureDir(storagePath);\n return storagePath;\n}\n\nasync function getConfigPath() {\n const configDirs = XDGAppPaths(APP_FOLDER_NAME).configDirs();\n const configPath = configDirs.find(checkDirectoryExists);\n\n if (!configPath) {\n await fse.ensureDir(configDirs[0]);\n return configDirs[0];\n }\n return configPath;\n}\n\nexport async function getLocalConfig(): Promise<LocalConfig> {\n const configPath = await getConfigPath();\n const configFilePath = path.join(configPath, CONFIG_FILENAME);\n await fse.ensureFile(configFilePath);\n try {\n return await fse.readJSON(configFilePath, { encoding: 'utf8', throws: true });\n } catch (e) {\n return {};\n }\n}\n\nexport async function saveLocalConfig(data: LocalConfig) {\n const configPath = await getConfigPath();\n const configFilePath = path.join(configPath, CONFIG_FILENAME);\n await fse.writeJson(configFilePath, data, { encoding: 'utf8', spaces: 2, mode: 0o600 });\n}\n","import axios, { type AxiosResponse } from 'axios';\nimport fse from 'fs-extra';\nimport os from 'os';\nimport { apiConfig } from '../config/api';\nimport type { CloudCliConfig } from '../types';\nimport { getLocalConfig } from '../config/local';\n\nimport packageJson from '../../package.json';\n\nexport const VERSION = 'v1';\n\nexport type ProjectInfos = {\n name: string;\n nodeVersion: string;\n region: string;\n plan?: string;\n url?: string;\n};\nexport type ProjectInput = Omit<ProjectInfos, 'id'>;\n\nexport type DeployResponse = {\n build_id: string;\n image: string;\n};\n\nexport type TrackPayload = Record<string, unknown>;\n\nexport interface CloudApiService {\n deploy(\n deployInput: {\n filePath: string;\n project: { name: string };\n },\n {\n onUploadProgress,\n }: {\n onUploadProgress: (progressEvent: { loaded: number; total?: number }) => void;\n }\n ): Promise<AxiosResponse<DeployResponse>>;\n\n createProject(projectInput: ProjectInput): Promise<{\n data: ProjectInfos;\n status: number;\n }>;\n\n getUserInfo(): Promise<AxiosResponse>;\n\n config(): Promise<AxiosResponse<CloudCliConfig>>;\n\n listProjects(): Promise<AxiosResponse<ProjectInfos[]>>;\n\n track(event: string, payload?: TrackPayload): Promise<AxiosResponse<void>>;\n}\n\nexport async function cloudApiFactory(token?: string): Promise<CloudApiService> {\n const localConfig = await getLocalConfig();\n const customHeaders = {\n 'x-device-id': localConfig.deviceId,\n 'x-app-version': packageJson.version,\n 'x-os-name': os.type(),\n 'x-os-version': os.version(),\n 'x-language': Intl.DateTimeFormat().resolvedOptions().locale,\n 'x-node-version': process.versions.node,\n };\n const axiosCloudAPI = axios.create({\n baseURL: `${apiConfig.apiBaseUrl}/${VERSION}`,\n headers: {\n 'Content-Type': 'application/json',\n ...customHeaders,\n },\n });\n\n if (token) {\n axiosCloudAPI.defaults.headers.Authorization = `Bearer ${token}`;\n }\n\n return {\n deploy({ filePath, project }, { onUploadProgress }) {\n return axiosCloudAPI.post(\n `/deploy/${project.name}`,\n { file: fse.createReadStream(filePath) },\n {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n onUploadProgress,\n }\n );\n },\n\n async createProject({ name, nodeVersion, region, plan }) {\n const response = await axiosCloudAPI.post('/project', {\n projectName: name,\n region,\n nodeVersion,\n plan,\n });\n\n return {\n data: {\n id: response.data.id,\n name: response.data.name,\n nodeVersion: response.data.nodeVersion,\n region: response.data.region,\n },\n status: response.status,\n };\n },\n\n getUserInfo() {\n return axiosCloudAPI.get('/user');\n },\n\n config(): Promise<AxiosResponse<CloudCliConfig>> {\n return axiosCloudAPI.get('/config');\n },\n\n listProjects() {\n return axiosCloudAPI.get<ProjectInfos[]>('/projects');\n },\n\n track(event, payload = {}) {\n return axiosCloudAPI.post<void>('/track', {\n event,\n payload,\n });\n },\n };\n}\n","import fse from 'fs-extra';\nimport path from 'path';\nimport type { ProjectInfos } from './cli-api';\n\nexport const LOCAL_SAVE_FILENAME = '.strapi-cloud.json';\n\nexport type LocalSave = {\n project?: ProjectInfos;\n};\n\nexport async function save(data: LocalSave, { directoryPath }: { directoryPath?: string } = {}) {\n const alreadyInFileData = await retrieve({ directoryPath });\n const storedData = { ...alreadyInFileData, ...data };\n const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n // Ensure the directory exists\n await fse.ensureDir(path.dirname(pathToFile));\n await fse.writeJson(pathToFile, storedData, { encoding: 'utf8' });\n}\n\nexport async function retrieve({\n directoryPath,\n}: { directoryPath?: string } = {}): Promise<LocalSave> {\n const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n const pathExists = await fse.pathExists(pathToFile);\n if (!pathExists) {\n return {};\n }\n\n return fse.readJSON(pathToFile, { encoding: 'utf8' });\n}\n","import jwksClient, { type JwksClient, type SigningKey } from 'jwks-rsa';\nimport type { JwtHeader, VerifyErrors } from 'jsonwebtoken';\nimport jwt from 'jsonwebtoken';\nimport { getLocalConfig, saveLocalConfig } from '../config/local';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { cloudApiFactory } from './cli-api';\n\nlet cliConfig: CloudCliConfig;\n\ninterface DecodedToken {\n [key: string]: any;\n}\n\nexport async function tokenServiceFactory({ logger }: { logger: CLIContext['logger'] }) {\n const cloudApiService = await cloudApiFactory();\n\n async function saveToken(str: string) {\n const appConfig = await getLocalConfig();\n\n if (!appConfig) {\n logger.error('There was a problem saving your token. Please try again.');\n return;\n }\n\n appConfig.token = str;\n\n try {\n await saveLocalConfig(appConfig);\n } catch (e: Error | unknown) {\n logger.debug(e);\n logger.error('There was a problem saving your token. Please try again.');\n }\n }\n\n async function retrieveToken() {\n const appConfig = await getLocalConfig();\n if (appConfig.token) {\n // check if token is still valid\n if (await isTokenValid(appConfig.token)) {\n return appConfig.token;\n }\n }\n return undefined;\n }\n\n async function validateToken(idToken: string, jwksUrl: string): Promise<void> {\n const client: JwksClient = jwksClient({\n jwksUri: jwksUrl,\n });\n\n // Get the Key from the JWKS using the token header's Key ID (kid)\n const getKey = (header: JwtHeader, callback: (e: Error | null, key?: string) => void) => {\n client.getSigningKey(header.kid, (e: Error | null, key?: SigningKey) => {\n if (e) {\n callback(e);\n } else if (key) {\n const publicKey = 'publicKey' in key ? key.publicKey : key.rsaPublicKey;\n callback(null, publicKey);\n } else {\n callback(new Error('Key not found'));\n }\n });\n };\n\n // Decode the JWT token to get the header and payload\n const decodedToken = jwt.decode(idToken, { complete: true }) as DecodedToken;\n if (!decodedToken) {\n if (typeof idToken === 'undefined' || idToken === '') {\n logger.warn('You need to be logged in to use this feature. Please log in and try again.');\n } else {\n logger.error(\n 'There seems to be a problem with your login information. Please try logging in again.'\n );\n }\n }\n\n // Verify the JWT token signature using the JWKS Key\n return new Promise<void>((resolve, reject) => {\n jwt.verify(idToken, getKey, (err: VerifyErrors | null) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n\n async function isTokenValid(token: string) {\n try {\n const config = await cloudApiService.config();\n\n cliConfig = config.data;\n if (token) {\n await validateToken(token, cliConfig.jwksUrl);\n return true;\n }\n return false;\n } catch (e) {\n logger.debug(e);\n return false;\n }\n }\n\n async function eraseToken() {\n const appConfig = await getLocalConfig();\n if (!appConfig) {\n return;\n }\n\n delete appConfig.token;\n\n try {\n await saveLocalConfig(appConfig);\n } catch (e: Error | unknown) {\n logger.debug(e);\n logger.error(\n 'There was an issue removing your login information. Please try logging out again.'\n );\n throw e;\n }\n }\n\n async function getValidToken() {\n const token = await retrieveToken();\n if (!token) {\n logger.log('No token found. Please login first.');\n return null;\n }\n\n if (!(await isTokenValid(token))) {\n logger.log('Unable to proceed: Token is expired or not valid. Please login again.');\n return null;\n }\n return token;\n }\n\n return {\n saveToken,\n retrieveToken,\n validateToken,\n isTokenValid,\n eraseToken,\n getValidToken,\n };\n}\n","import chalk from 'chalk';\nimport stringify from 'fast-safe-stringify';\n\nimport ora from 'ora';\nimport * as cliProgress from 'cli-progress';\n\nexport interface LoggerOptions {\n silent?: boolean;\n debug?: boolean;\n timestamp?: boolean;\n}\n\nexport interface Logger {\n warnings: number;\n errors: number;\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n success: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n log: (...args: unknown[]) => void;\n spinner: (text: string) => Pick<ora.Ora, 'succeed' | 'fail' | 'start' | 'text' | 'isSpinning'>;\n progressBar: (\n totalSize: number,\n text: string\n ) => Pick<cliProgress.SingleBar, 'start' | 'stop' | 'update'>;\n}\n\nconst stringifyArg = (arg: unknown) => {\n return typeof arg === 'object' ? stringify(arg) : arg;\n};\n\nconst createLogger = (options: LoggerOptions = {}): Logger => {\n const { silent = false, debug = false, timestamp = true } = options;\n\n const state = { errors: 0, warning: 0 };\n\n return {\n get warnings() {\n return state.warning;\n },\n\n get errors() {\n return state.errors;\n },\n\n async debug(...args) {\n if (silent || !debug) {\n return;\n }\n\n console.log(\n chalk.cyan(`[DEBUG]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n info(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.blue(`[INFO]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n log(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.blue(`${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n success(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.green(`[SUCCESS]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n warn(...args) {\n state.warning += 1;\n\n if (silent) {\n return;\n }\n\n console.warn(\n chalk.yellow(`[WARN]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n error(...args) {\n state.errors += 1;\n\n if (silent) {\n return;\n }\n\n console.error(\n chalk.red(`[ERROR]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n // @ts-expect-error – returning a subpart of ora is fine because the types tell us what is what.\n spinner(text: string) {\n if (silent) {\n return {\n succeed() {\n return this;\n },\n fail() {\n return this;\n },\n start() {\n return this;\n },\n text: '',\n isSpinning: false,\n };\n }\n\n return ora(text);\n },\n\n progressBar(totalSize: number, text: string) {\n if (silent) {\n return {\n start() {\n return this;\n },\n stop() {\n return this;\n },\n update() {\n return this;\n },\n };\n }\n\n const progressBar = new cliProgress.SingleBar({\n format: `${text ? `${text} |` : ''}${chalk.green('{bar}')}| {percentage}%`,\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591',\n hideCursor: true,\n forceRedraw: true,\n });\n\n progressBar.start(totalSize, 0);\n\n return progressBar;\n },\n };\n};\n\nexport { createLogger };\n","import inquirer from 'inquirer';\nimport { AxiosError } from 'axios';\nimport { defaults } from 'lodash/fp';\nimport type { CLIContext, ProjectAnswers, ProjectInput } from '../types';\nimport { tokenServiceFactory, cloudApiFactory, local } from '../services';\n\nasync function handleError(ctx: CLIContext, error: Error) {\n const tokenService = await tokenServiceFactory(ctx);\n const { logger } = ctx;\n\n logger.debug(error);\n if (error instanceof AxiosError) {\n const errorMessage = typeof error.response?.data === 'string' ? error.response.data : null;\n switch (error.response?.status) {\n case 401:\n logger.error('Your session has expired. Please log in again.');\n await tokenService.eraseToken();\n return;\n case 403:\n logger.error(\n errorMessage ||\n 'You do not have permission to create a project. Please contact support for assistance.'\n );\n return;\n case 400:\n logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.');\n return;\n case 503:\n logger.error(\n 'Strapi Cloud project creation is currently unavailable. Please try again later.'\n );\n return;\n default:\n if (errorMessage) {\n logger.error(errorMessage);\n return;\n }\n break;\n }\n }\n logger.error(\n 'We encountered an issue while creating your project. Please try again in a moment. If the problem persists, contact support for assistance.'\n );\n}\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { getValidToken } = await tokenServiceFactory(ctx);\n\n const token = await getValidToken();\n if (!token) {\n return;\n }\n const cloudApi = await cloudApiFactory(token);\n const { data: config } = await cloudApi.config();\n const { questions, defaults: defaultValues } = config.projectCreation;\n\n const projectAnswersDefaulted = defaults(defaultValues);\n const projectAnswers = await inquirer.prompt<ProjectAnswers>(questions);\n\n const projectInput: ProjectInput = projectAnswersDefaulted(projectAnswers);\n\n const spinner = logger.spinner('Setting up your project...').start();\n try {\n const { data } = await cloudApi.createProject(projectInput);\n await local.save({ project: data });\n spinner.succeed('Project created successfully!');\n return data;\n } catch (e: Error | unknown) {\n spinner.fail('Failed to create project on Strapi Cloud.');\n await handleError(ctx, e as Error);\n }\n};\n","import EventSource from 'eventsource';\nimport type { CLIContext, CloudCliConfig } from '../types';\n\ntype Event = {\n type: string;\n data: string;\n lastEventId: string;\n origin: string;\n};\n\nexport function notificationServiceFactory({ logger }: CLIContext) {\n return (url: string, token: string, cliConfig: CloudCliConfig) => {\n const CONN_TIMEOUT = Number(cliConfig.notificationsConnectionTimeout);\n\n const es = new EventSource(url, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n let timeoutId: NodeJS.Timeout;\n\n const resetTimeout = () => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n logger.log(\n 'We were unable to connect to the server at this time. This could be due to a temporary issue. Please try again in a moment.'\n );\n es.close();\n }, CONN_TIMEOUT); // 5 minutes\n };\n\n es.onopen = resetTimeout;\n es.onmessage = (event: Event) => {\n resetTimeout();\n const data = JSON.parse(event.data);\n\n if (data.message) {\n logger.log(data.message);\n }\n\n // Close connection when a specific event is received\n if (data.event === 'deploymentFinished' || data.event === 'deploymentFailed') {\n es.close();\n }\n };\n };\n}\n","// TODO Migrate to fs-extra\nimport fs from 'fs/promises';\nimport os from 'os';\nimport pkgUp from 'pkg-up';\nimport * as yup from 'yup';\nimport chalk from 'chalk';\nimport { Logger } from '../services/logger';\n\ninterface Export {\n types?: string;\n source: string;\n module?: string;\n import?: string;\n require?: string;\n default: string;\n}\n\nconst packageJsonSchema = yup.object({\n name: yup.string().required(),\n exports: yup.lazy((value) =>\n yup\n .object(\n typeof value === 'object'\n ? Object.entries(value).reduce((acc, [key, value]) => {\n if (typeof value === 'object') {\n acc[key] = yup\n .object({\n types: yup.string().optional(),\n source: yup.string().required(),\n module: yup.string().optional(),\n import: yup.string().required(),\n require: yup.string().required(),\n default: yup.string().required(),\n })\n .noUnknown(true);\n } else {\n acc[key] = yup\n .string()\n .matches(/^\\.\\/.*\\.json$/)\n .required();\n }\n\n return acc;\n }, {} as Record<string, yup.SchemaOf<string> | yup.SchemaOf<Export>>)\n : undefined\n )\n .optional()\n ),\n});\n\ntype PackageJson = yup.Asserts<typeof packageJsonSchema>;\n\n/**\n * @description being a task to load the package.json starting from the current working directory\n * using a shallow find for the package.json and `fs` to read the file. If no package.json is found,\n * the process will throw with an appropriate error message.\n */\nconst loadPkg = async ({ cwd, logger }: { cwd: string; logger: Logger }): Promise<PackageJson> => {\n const pkgPath = await pkgUp({ cwd });\n\n if (!pkgPath) {\n throw new Error('Could not find a package.json in the current directory');\n }\n\n const buffer = await fs.readFile(pkgPath);\n\n const pkg = JSON.parse(buffer.toString());\n\n logger.debug('Loaded package.json:', os.EOL, pkg);\n\n return pkg;\n};\n\n/**\n * @description validate the package.json against a standardised schema using `yup`.\n * If the validation fails, the process will throw with an appropriate error message.\n */\nconst validatePkg = async ({ pkg }: { pkg: object }): Promise<PackageJson> => {\n try {\n const validatedPkg = await packageJsonSchema.validate(pkg, {\n strict: true,\n });\n\n return validatedPkg;\n } catch (err) {\n if (err instanceof yup.ValidationError) {\n switch (err.type) {\n case 'required':\n if (err.path) {\n throw new Error(\n `'${err.path}' in 'package.json' is required as type '${chalk.magenta(\n yup.reach(packageJsonSchema, err.path).type\n )}'`\n );\n }\n break;\n /**\n * This will only be thrown if there are keys in the export map\n * that we don't expect so we can therefore make some assumptions\n */\n case 'noUnknown':\n if (err.path && err.params && 'unknown' in err.params) {\n throw new Error(\n `'${err.path}' in 'package.json' contains the unknown key ${chalk.magenta(\n err.params.unknown\n )}, for compatability only the following keys are allowed: ${chalk.magenta(\n \"['types', 'source', 'import', 'require', 'default']\"\n )}`\n );\n }\n break;\n default:\n if (err.path && err.params && 'type' in err.params && 'value' in err.params) {\n throw new Error(\n `'${err.path}' in 'package.json' must be of type '${chalk.magenta(\n err.params.type\n )}' (recieved '${chalk.magenta(typeof err.params.value)}')`\n );\n }\n }\n }\n\n throw err;\n }\n};\n\nexport type { PackageJson, Export };\nexport { loadPkg, validatePkg };\n","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 spinner = logger.spinner('Connecting to server to get build logs');\n spinner.start();\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 (spinner.isSpinning) {\n spinner.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 (spinner.isSpinning) {\n spinner.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 spinner.fail('We were unable to connect to the server to get build logs at this time.');\n es.close();\n reject(new Error('Max retries reached'));\n }\n };\n };\n\n connect(url);\n });\n };\n};\n\nexport { buildLogsServiceFactory };\n","import fse from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { AxiosError } from 'axios';\nimport * as crypto from 'node:crypto';\nimport { apiConfig } from '../config/api';\nimport { compressFilesToTar } from '../utils/compress-files';\nimport createProjectAction from '../create-project/action';\nimport type { CLIContext, ProjectInfos } from '../types';\nimport { getTmpStoragePath } from '../config/local';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../services';\nimport { notificationServiceFactory } from '../services/notification';\nimport { loadPkg } from '../utils/pkg';\nimport { buildLogsServiceFactory } from '../services/build-logs';\n\ntype PackageJson = {\n name: string;\n strapi?: {\n uuid: string;\n };\n};\n\nasync function upload(\n ctx: CLIContext,\n project: ProjectInfos,\n token: string,\n maxProjectFileSize: number\n) {\n const cloudApi = await cloudApiFactory(token);\n // * Upload project\n try {\n const storagePath = await getTmpStoragePath();\n const projectFolder = path.resolve(process.cwd());\n const packageJson = (await loadPkg(ctx)) as PackageJson;\n\n if (!packageJson) {\n ctx.logger.error(\n 'Unable to deploy the project. Please make sure the package.json file is correctly formatted.'\n );\n return;\n }\n\n ctx.logger.log('📦 Compressing project...');\n // hash packageJson.name to avoid conflicts\n const hashname = crypto.createHash('sha512').update(packageJson.name).digest('hex');\n const compressedFilename = `${hashname}.tar.gz`;\n try {\n ctx.logger.debug(\n 'Compression parameters\\n',\n `Storage path: ${storagePath}\\n`,\n `Project folder: ${projectFolder}\\n`,\n `Compressed filename: ${compressedFilename}`\n );\n await compressFilesToTar(storagePath, projectFolder, compressedFilename);\n ctx.logger.log('📦 Project compressed successfully!');\n } catch (e: unknown) {\n ctx.logger.error(\n '⚠️ Project compression failed. Try again later or check for large/incompatible files.'\n );\n ctx.logger.debug(e);\n process.exit(1);\n }\n\n const tarFilePath = path.resolve(storagePath, compressedFilename);\n const fileStats = await fse.stat(tarFilePath);\n\n if (fileStats.size > maxProjectFileSize) {\n ctx.logger.log(\n 'Unable to proceed: Your project is too big to be transferred, please use a git repo instead.'\n );\n try {\n await fse.remove(tarFilePath);\n } catch (e: any) {\n ctx.logger.log('Unable to remove file: ', tarFilePath);\n ctx.logger.debug(e);\n }\n return;\n }\n\n ctx.logger.info('🚀 Uploading project...');\n const progressBar = ctx.logger.progressBar(100, 'Upload Progress');\n\n try {\n const { data } = await cloudApi.deploy(\n { filePath: tarFilePath, project },\n {\n onUploadProgress(progressEvent) {\n const total = progressEvent.total || fileStats.size;\n const percentage = Math.round((progressEvent.loaded * 100) / total);\n progressBar.update(percentage);\n },\n }\n );\n\n progressBar.update(100);\n progressBar.stop();\n ctx.logger.success('✨ Upload finished!');\n return data.build_id;\n } catch (e: any) {\n progressBar.stop();\n if (e instanceof AxiosError && e.response?.data) {\n if (e.response.status === 404) {\n ctx.logger.error(\n `The project does not exist. Remove the ${local.LOCAL_SAVE_FILENAME} file and try again.`\n );\n } else {\n ctx.logger.error(e.response.data);\n }\n } else {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n }\n\n ctx.logger.debug(e);\n } finally {\n await fse.remove(tarFilePath);\n }\n process.exit(0);\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n}\n\nasync function getProject(ctx: CLIContext) {\n const { project } = await local.retrieve();\n if (!project) {\n try {\n return await createProjectAction(ctx);\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n }\n return project;\n}\n\nexport default async (ctx: CLIContext) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const cloudApiService = await cloudApiFactory();\n const token = await getValidToken();\n\n if (!token) {\n return;\n }\n\n const project = await getProject(ctx);\n\n if (!project) {\n return;\n }\n\n try {\n await cloudApiService.track('willDeployWithCLI', { projectInternalName: project.name });\n } catch (e) {\n ctx.logger.debug('Failed to track willDeploy', e);\n }\n\n const notificationService = notificationServiceFactory(ctx);\n const buildLogsService = buildLogsServiceFactory(ctx);\n\n const { data: cliConfig } = await cloudApiService.config();\n\n let maxSize: number = parseInt(cliConfig.maxProjectFileSize, 10);\n if (Number.isNaN(maxSize)) {\n ctx.logger.debug(\n 'An error occurred while parsing the maxProjectFileSize. Using default value.'\n );\n maxSize = 100000000;\n }\n\n const buildId = await upload(ctx, project, token, maxSize);\n\n if (!buildId) {\n return;\n }\n\n try {\n notificationService(`${apiConfig.apiBaseUrl}/notifications`, token, cliConfig);\n await buildLogsService(`${apiConfig.apiBaseUrl}/v1/logs/${buildId}`, token, cliConfig);\n\n ctx.logger.log(\n 'Visit the following URL for deployment logs. Your deployment will be available here shortly.'\n );\n ctx.logger.log(\n chalk.underline(`${apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`)\n );\n } catch (e: Error | unknown) {\n if (e instanceof Error) {\n ctx.logger.error(e.message);\n } else {\n throw e;\n }\n }\n};\n","import chalk from 'chalk';\nimport { has } from 'lodash/fp';\n\n// TODO: Remove duplicated code by extracting to a shared package\n\nconst assertCwdContainsStrapiProject = (name: string) => {\n const logErrorAndExit = () => {\n console.log(\n `You need to run ${chalk.yellow(\n `strapi ${name}`\n )} in a Strapi project. Make sure you are in the right directory.`\n );\n process.exit(1);\n };\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const pkgJSON = require(`${process.cwd()}/package.json`);\n if (\n !has('dependencies.@strapi/strapi', pkgJSON) &&\n !has('devDependencies.@strapi/strapi', pkgJSON)\n ) {\n logErrorAndExit();\n }\n } catch (err) {\n logErrorAndExit();\n }\n};\n\nconst runAction =\n (name: string, action: (...args: any[]) => Promise<unknown>) =>\n (...args: unknown[]) => {\n assertCwdContainsStrapiProject(name);\n\n Promise.resolve()\n .then(() => {\n return action(...args);\n })\n .catch((error) => {\n console.error(error);\n process.exit(1);\n });\n };\n\nexport { runAction };\n","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ deploy project to the cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:deploy')\n .alias('deploy')\n .description('Deploy a Strapi Cloud project')\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('deploy', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n name: 'deploy-project',\n description: 'Deploy a Strapi Cloud project',\n action,\n command,\n} as StrapiCloudCommandInfo;\n","import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\n\nconst openModule = import('open');\n\nexport default async (ctx: CLIContext): Promise<boolean> => {\n const { logger } = ctx;\n const tokenService = await tokenServiceFactory(ctx);\n const existingToken = await tokenService.retrieveToken();\n const cloudApiService = await cloudApiFactory(existingToken || undefined);\n\n const trackFailedLogin = async () => {\n try {\n await cloudApiService.track('didNotLogin', { loginMethod: 'cli' });\n } catch (e) {\n logger.debug('Failed to track failed login', e);\n }\n };\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 // If the token is invalid and request failed, we should proceed with the login process\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\n try {\n await cloudApiService.track('willLoginAttempt', {});\n } catch (e) {\n logger.debug('Failed to track login attempt', e);\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(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 trackFailedLogin();\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 trackFailedLogin();\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 try {\n await cloudApiService.track('didLogin', { loginMethod: 'cli' });\n } catch (e) {\n logger.debug('Failed to track login', e);\n }\n };\n\n await authenticate();\n return isAuthenticated;\n};\n","import type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow login`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:login')\n .alias('login')\n .description('Strapi Cloud Login')\n .addHelpText(\n 'after',\n '\\nAfter running this command, you will be prompted to enter your authentication information.'\n )\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('login', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n name: 'login',\n description: 'Strapi Cloud Login',\n action,\n command,\n} as StrapiCloudCommandInfo;\n","import type { CLIContext } from '../types';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { retrieveToken, eraseToken } = await tokenServiceFactory(ctx);\n\n const token = await retrieveToken();\n if (!token) {\n logger.log(\"You're already logged out.\");\n return;\n }\n const cloudApiService = await cloudApiFactory(token);\n try {\n // we might want also to perform extra actions like logging out from the auth0 tenant\n await eraseToken();\n logger.log(\n '🔌 You have been logged out from the CLI. If you are on a shared computer, please make sure to log out from the Strapi Cloud Dashboard as well.'\n );\n } catch (e) {\n logger.error('🥲 Oops! Something went wrong while logging you out. Please try again.');\n logger.debug(e);\n }\n try {\n await cloudApiService.track('didLogout', { loginMethod: 'cli' });\n } catch (e) {\n logger.debug('Failed to track logout event', e);\n }\n};\n","import type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow logout`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:logout')\n .alias('logout')\n .description('Strapi Cloud Logout')\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('logout', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\n\nexport { action, command };\n\nexport default {\n name: 'logout',\n description: 'Strapi Cloud Logout',\n action,\n command,\n};\n","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ create project in Strapi cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:create-project')\n .description('Create a Strapi Cloud project')\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('cloud:create-project', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n name: 'create-project',\n description: 'Create a new project',\n action,\n command,\n} as StrapiCloudCommandInfo;\n","import { Command } from 'commander';\nimport crypto from 'crypto';\nimport deployProject from './deploy-project';\nimport login from './login';\nimport logout from './logout';\nimport createProject from './create-project';\nimport { CLIContext } from './types';\nimport { getLocalConfig, saveLocalConfig } from './config/local';\n\nexport const cli = {\n deployProject,\n login,\n logout,\n createProject,\n};\n\nconst cloudCommands = [deployProject, login, logout];\n\nasync function initCloudCLIConfig() {\n const localConfig = await getLocalConfig();\n\n if (!localConfig.deviceId) {\n localConfig.deviceId = 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 await cloudCommand.command({ command, ctx, argv });\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":["env","fs","path","minimatch","tar","fse","os","XDGAppPaths","axios","name","jwksClient","jwt","stringify","chalk","ora","cliProgress","AxiosError","defaults","inquirer","local.save","cliConfig","EventSource","yup","value","pkgUp","url","packageJson","crypto","local.LOCAL_SAVE_FILENAME","local.retrieve","createProjectAction","has","action","command"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/config/api.ts","../src/utils/compress-files.ts","../src/config/local.ts","../src/services/cli-api.ts","../src/services/strapi-info-save.ts","../src/services/token.ts","../src/services/logger.ts","../src/create-project/action.ts","../src/services/notification.ts","../src/utils/pkg.ts","../src/services/build-logs.ts","../src/deploy-project/action.ts","../src/utils/helpers.ts","../src/deploy-project/command.ts","../src/deploy-project/index.ts","../src/login/action.ts","../src/login/command.ts","../src/login/index.ts","../src/logout/action.ts","../src/logout/command.ts","../src/logout/index.ts","../src/create-project/command.ts","../src/create-project/index.ts","../src/index.ts"],"sourcesContent":["import { env } from '@strapi/utils';\n\nexport const apiConfig = {\n apiBaseUrl: env('STRAPI_CLI_CLOUD_API', 'https://cloud-cli-api.strapi.io'),\n dashboardBaseUrl: env('STRAPI_CLI_CLOUD_DASHBOARD', 'https://cloud.strapi.io'),\n};\n","// TODO Migrate to fs-extra\nimport * as fs from 'fs';\nimport * as tar from 'tar';\nimport * as path from 'path';\nimport { minimatch } from 'minimatch';\n\nconst IGNORED_PATTERNS = [\n '**/.git/**',\n '**/node_modules/**',\n '**/build/**',\n '**/dist/**',\n '**/.cache/**',\n '**/.circleci/**',\n '**/.github/**',\n '**/.gitignore',\n '**/.gitkeep',\n '**/.gitlab-ci.yml',\n '**/.idea/**',\n '**/.vscode/**',\n];\n\nconst getFiles = (\n dirPath: string,\n ignorePatterns: string[] = [],\n arrayOfFiles: string[] = [],\n subfolder: string = ''\n): string[] => {\n const entries = fs.readdirSync(path.join(dirPath, subfolder));\n entries.forEach((entry) => {\n const entryPathFromRoot = path.join(subfolder, entry);\n const entryPath = path.relative(dirPath, entryPathFromRoot);\n const isIgnored = isIgnoredFile(dirPath, entryPathFromRoot, ignorePatterns);\n if (isIgnored) {\n return;\n }\n if (fs.statSync(entryPath).isDirectory()) {\n getFiles(dirPath, ignorePatterns, arrayOfFiles, entryPathFromRoot);\n } else {\n arrayOfFiles.push(entryPath);\n }\n });\n return arrayOfFiles;\n};\n\nconst isIgnoredFile = (folderPath: string, file: string, ignorePatterns: string[]): boolean => {\n ignorePatterns.push(...IGNORED_PATTERNS);\n const relativeFilePath = path.join(folderPath, file);\n let isIgnored = false;\n for (const pattern of ignorePatterns) {\n if (pattern.startsWith('!')) {\n if (minimatch(relativeFilePath, pattern.slice(1), { matchBase: true, dot: true })) {\n return false;\n }\n } else if (minimatch(relativeFilePath, pattern, { matchBase: true, dot: true })) {\n if (path.basename(file) !== '.gitkeep') {\n isIgnored = true;\n }\n }\n }\n return isIgnored;\n};\n\nconst readGitignore = (folderPath: string): string[] => {\n const gitignorePath = path.resolve(folderPath, '.gitignore');\n if (!fs.existsSync(gitignorePath)) return [];\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n return gitignoreContent\n .split(/\\r?\\n/)\n .filter((line) => Boolean(line.trim()) && !line.startsWith('#'));\n};\n\nconst compressFilesToTar = async (\n storagePath: string,\n folderToCompress: string,\n filename: string\n): Promise<void> => {\n const ignorePatterns = readGitignore(folderToCompress);\n const filesToCompress = getFiles(folderToCompress, ignorePatterns);\n\n return tar.c(\n {\n gzip: true,\n file: path.resolve(storagePath, filename),\n },\n filesToCompress\n );\n};\n\nexport { compressFilesToTar, isIgnoredFile };\n","import path from 'path';\nimport os from 'os';\nimport fse from 'fs-extra';\nimport XDGAppPaths from 'xdg-app-paths';\n\nconst APP_FOLDER_NAME = 'com.strapi.cli';\n\nexport const CONFIG_FILENAME = 'config.json';\n\nexport type LocalConfig = {\n token?: string;\n deviceId?: string;\n};\n\nasync function checkDirectoryExists(directoryPath: string) {\n try {\n const fsStat = await fse.lstat(directoryPath);\n return fsStat.isDirectory();\n } catch (e) {\n return false;\n }\n}\n\n// Determine storage path based on the operating system\nexport async function getTmpStoragePath() {\n const storagePath = path.join(os.tmpdir(), APP_FOLDER_NAME);\n await fse.ensureDir(storagePath);\n return storagePath;\n}\n\nasync function getConfigPath() {\n const configDirs = XDGAppPaths(APP_FOLDER_NAME).configDirs();\n const configPath = configDirs.find(checkDirectoryExists);\n\n if (!configPath) {\n await fse.ensureDir(configDirs[0]);\n return configDirs[0];\n }\n return configPath;\n}\n\nexport async function getLocalConfig(): Promise<LocalConfig> {\n const configPath = await getConfigPath();\n const configFilePath = path.join(configPath, CONFIG_FILENAME);\n await fse.ensureFile(configFilePath);\n try {\n return await fse.readJSON(configFilePath, { encoding: 'utf8', throws: true });\n } catch (e) {\n return {};\n }\n}\n\nexport async function saveLocalConfig(data: LocalConfig) {\n const configPath = await getConfigPath();\n const configFilePath = path.join(configPath, CONFIG_FILENAME);\n await fse.writeJson(configFilePath, data, { encoding: 'utf8', spaces: 2, mode: 0o600 });\n}\n","import axios, { type AxiosResponse } from 'axios';\nimport fse from 'fs-extra';\nimport os from 'os';\nimport { apiConfig } from '../config/api';\nimport type { CLIContext, CloudCliConfig } from '../types';\nimport { getLocalConfig } from '../config/local';\n\nimport packageJson from '../../package.json';\n\nexport const VERSION = 'v1';\n\nexport type ProjectInfos = {\n name: string;\n nodeVersion: string;\n region: string;\n plan?: string;\n url?: string;\n};\nexport type ProjectInput = Omit<ProjectInfos, 'id'>;\n\nexport type DeployResponse = {\n build_id: string;\n image: string;\n};\n\nexport type TrackPayload = Record<string, unknown>;\n\nexport interface CloudApiService {\n deploy(\n deployInput: {\n filePath: string;\n project: { name: string };\n },\n {\n onUploadProgress,\n }: {\n onUploadProgress: (progressEvent: { loaded: number; total?: number }) => void;\n }\n ): Promise<AxiosResponse<DeployResponse>>;\n\n createProject(projectInput: ProjectInput): Promise<{\n data: ProjectInfos;\n status: number;\n }>;\n\n getUserInfo(): Promise<AxiosResponse>;\n\n config(): Promise<AxiosResponse<CloudCliConfig>>;\n\n listProjects(): Promise<AxiosResponse<ProjectInfos[]>>;\n\n track(event: string, payload?: TrackPayload): Promise<AxiosResponse<void>>;\n}\n\nexport async function cloudApiFactory(\n { logger }: { logger: CLIContext['logger'] },\n token?: string\n): Promise<CloudApiService> {\n const localConfig = await getLocalConfig();\n const customHeaders = {\n 'x-device-id': localConfig.deviceId,\n 'x-app-version': packageJson.version,\n 'x-os-name': os.type(),\n 'x-os-version': os.version(),\n 'x-language': Intl.DateTimeFormat().resolvedOptions().locale,\n 'x-node-version': process.versions.node,\n };\n const axiosCloudAPI = axios.create({\n baseURL: `${apiConfig.apiBaseUrl}/${VERSION}`,\n headers: {\n 'Content-Type': 'application/json',\n ...customHeaders,\n },\n });\n\n if (token) {\n axiosCloudAPI.defaults.headers.Authorization = `Bearer ${token}`;\n }\n\n return {\n deploy({ filePath, project }, { onUploadProgress }) {\n return axiosCloudAPI.post(\n `/deploy/${project.name}`,\n { file: fse.createReadStream(filePath) },\n {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n onUploadProgress,\n }\n );\n },\n\n async createProject({ name, nodeVersion, region, plan }) {\n const response = await axiosCloudAPI.post('/project', {\n projectName: name,\n region,\n nodeVersion,\n plan,\n });\n\n return {\n data: {\n id: response.data.id,\n name: response.data.name,\n nodeVersion: response.data.nodeVersion,\n region: response.data.region,\n },\n status: response.status,\n };\n },\n\n getUserInfo() {\n return axiosCloudAPI.get('/user');\n },\n\n async config(): Promise<AxiosResponse<CloudCliConfig>> {\n try {\n const response = await axiosCloudAPI.get('/config');\n\n if (response.status !== 200) {\n throw new Error('Error fetching cloud CLI config from the server.');\n }\n\n return response;\n } catch (error) {\n logger.debug(\n \"🥲 Oops! Couldn't retrieve the cloud CLI config from the server. Please try again.\"\n );\n\n throw error;\n }\n },\n\n listProjects() {\n return axiosCloudAPI.get<ProjectInfos[]>('/projects');\n },\n\n track(event, payload = {}) {\n return axiosCloudAPI.post<void>('/track', {\n event,\n payload,\n });\n },\n };\n}\n","import fse from 'fs-extra';\nimport path from 'path';\nimport type { ProjectInfos } from './cli-api';\n\nexport const LOCAL_SAVE_FILENAME = '.strapi-cloud.json';\n\nexport type LocalSave = {\n project?: ProjectInfos;\n};\n\nexport async function save(data: LocalSave, { directoryPath }: { directoryPath?: string } = {}) {\n const alreadyInFileData = await retrieve({ directoryPath });\n const storedData = { ...alreadyInFileData, ...data };\n const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n // Ensure the directory exists\n await fse.ensureDir(path.dirname(pathToFile));\n await fse.writeJson(pathToFile, storedData, { encoding: 'utf8' });\n}\n\nexport async function retrieve({\n directoryPath,\n}: { directoryPath?: string } = {}): Promise<LocalSave> {\n const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n const pathExists = await fse.pathExists(pathToFile);\n if (!pathExists) {\n return {};\n }\n\n return fse.readJSON(pathToFile, { encoding: 'utf8' });\n}\n","import jwksClient, { type JwksClient, type SigningKey } from 'jwks-rsa';\nimport type { JwtHeader, VerifyErrors } from 'jsonwebtoken';\nimport jwt from 'jsonwebtoken';\nimport { getLocalConfig, saveLocalConfig } from '../config/local';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { cloudApiFactory } from './cli-api';\n\nlet cliConfig: CloudCliConfig;\n\ninterface DecodedToken {\n [key: string]: any;\n}\n\nexport async function tokenServiceFactory({ logger }: { logger: CLIContext['logger'] }) {\n const cloudApiService = await cloudApiFactory({ logger });\n\n async function saveToken(str: string) {\n const appConfig = await getLocalConfig();\n\n if (!appConfig) {\n logger.error('There was a problem saving your token. Please try again.');\n return;\n }\n\n appConfig.token = str;\n\n try {\n await saveLocalConfig(appConfig);\n } catch (e: Error | unknown) {\n logger.debug(e);\n logger.error('There was a problem saving your token. Please try again.');\n }\n }\n\n async function retrieveToken() {\n const appConfig = await getLocalConfig();\n if (appConfig.token) {\n // check if token is still valid\n if (await isTokenValid(appConfig.token)) {\n return appConfig.token;\n }\n }\n return undefined;\n }\n\n async function validateToken(idToken: string, jwksUrl: string): Promise<void> {\n const client: JwksClient = jwksClient({\n jwksUri: jwksUrl,\n });\n\n // Get the Key from the JWKS using the token header's Key ID (kid)\n const getKey = (header: JwtHeader, callback: (e: Error | null, key?: string) => void) => {\n client.getSigningKey(header.kid, (e: Error | null, key?: SigningKey) => {\n if (e) {\n callback(e);\n } else if (key) {\n const publicKey = 'publicKey' in key ? key.publicKey : key.rsaPublicKey;\n callback(null, publicKey);\n } else {\n callback(new Error('Key not found'));\n }\n });\n };\n\n // Decode the JWT token to get the header and payload\n const decodedToken = jwt.decode(idToken, { complete: true }) as DecodedToken;\n if (!decodedToken) {\n if (typeof idToken === 'undefined' || idToken === '') {\n logger.warn('You need to be logged in to use this feature. Please log in and try again.');\n } else {\n logger.error(\n 'There seems to be a problem with your login information. Please try logging in again.'\n );\n }\n }\n\n // Verify the JWT token signature using the JWKS Key\n return new Promise<void>((resolve, reject) => {\n jwt.verify(idToken, getKey, (err: VerifyErrors | null) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n\n async function isTokenValid(token: string) {\n try {\n const config = await cloudApiService.config();\n\n cliConfig = config.data;\n if (token) {\n await validateToken(token, cliConfig.jwksUrl);\n return true;\n }\n return false;\n } catch (e) {\n logger.debug(e);\n return false;\n }\n }\n\n async function eraseToken() {\n const appConfig = await getLocalConfig();\n if (!appConfig) {\n return;\n }\n\n delete appConfig.token;\n\n try {\n await saveLocalConfig(appConfig);\n } catch (e: Error | unknown) {\n logger.debug(e);\n logger.error(\n 'There was an issue removing your login information. Please try logging out again.'\n );\n throw e;\n }\n }\n\n async function getValidToken() {\n const token = await retrieveToken();\n if (!token) {\n logger.log('No token found. Please login first.');\n return null;\n }\n\n if (!(await isTokenValid(token))) {\n logger.log('Unable to proceed: Token is expired or not valid. Please login again.');\n return null;\n }\n return token;\n }\n\n return {\n saveToken,\n retrieveToken,\n validateToken,\n isTokenValid,\n eraseToken,\n getValidToken,\n };\n}\n","import chalk from 'chalk';\nimport stringify from 'fast-safe-stringify';\n\nimport ora from 'ora';\nimport * as cliProgress from 'cli-progress';\n\nexport interface LoggerOptions {\n silent?: boolean;\n debug?: boolean;\n timestamp?: boolean;\n}\n\nexport interface Logger {\n warnings: number;\n errors: number;\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n success: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n log: (...args: unknown[]) => void;\n spinner: (text: string) => Pick<ora.Ora, 'succeed' | 'fail' | 'start' | 'text' | 'isSpinning'>;\n progressBar: (\n totalSize: number,\n text: string\n ) => Pick<cliProgress.SingleBar, 'start' | 'stop' | 'update'>;\n}\n\nconst stringifyArg = (arg: unknown) => {\n return typeof arg === 'object' ? stringify(arg) : arg;\n};\n\nconst createLogger = (options: LoggerOptions = {}): Logger => {\n const { silent = false, debug = false, timestamp = true } = options;\n\n const state = { errors: 0, warning: 0 };\n\n return {\n get warnings() {\n return state.warning;\n },\n\n get errors() {\n return state.errors;\n },\n\n async debug(...args) {\n if (silent || !debug) {\n return;\n }\n\n console.log(\n chalk.cyan(`[DEBUG]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n info(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.blue(`[INFO]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n log(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.blue(`${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n success(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.green(`[SUCCESS]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n warn(...args) {\n state.warning += 1;\n\n if (silent) {\n return;\n }\n\n console.warn(\n chalk.yellow(`[WARN]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n error(...args) {\n state.errors += 1;\n\n if (silent) {\n return;\n }\n\n console.error(\n chalk.red(`[ERROR]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n // @ts-expect-error – returning a subpart of ora is fine because the types tell us what is what.\n spinner(text: string) {\n if (silent) {\n return {\n succeed() {\n return this;\n },\n fail() {\n return this;\n },\n start() {\n return this;\n },\n text: '',\n isSpinning: false,\n };\n }\n\n return ora(text);\n },\n\n progressBar(totalSize: number, text: string) {\n if (silent) {\n return {\n start() {\n return this;\n },\n stop() {\n return this;\n },\n update() {\n return this;\n },\n };\n }\n\n const progressBar = new cliProgress.SingleBar({\n format: `${text ? `${text} |` : ''}${chalk.green('{bar}')}| {percentage}%`,\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591',\n hideCursor: true,\n forceRedraw: true,\n });\n\n progressBar.start(totalSize, 0);\n\n return progressBar;\n },\n };\n};\n\nexport { createLogger };\n","import inquirer from 'inquirer';\nimport { AxiosError } from 'axios';\nimport { defaults } from 'lodash/fp';\nimport type { CLIContext, ProjectAnswers, ProjectInput } from '../types';\nimport { tokenServiceFactory, cloudApiFactory, local } from '../services';\n\nasync function handleError(ctx: CLIContext, error: Error) {\n const tokenService = await tokenServiceFactory(ctx);\n const { logger } = ctx;\n\n logger.debug(error);\n if (error instanceof AxiosError) {\n const errorMessage = typeof error.response?.data === 'string' ? error.response.data : null;\n switch (error.response?.status) {\n case 401:\n logger.error('Your session has expired. Please log in again.');\n await tokenService.eraseToken();\n return;\n case 403:\n logger.error(\n errorMessage ||\n 'You do not have permission to create a project. Please contact support for assistance.'\n );\n return;\n case 400:\n logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.');\n return;\n case 503:\n logger.error(\n 'Strapi Cloud project creation is currently unavailable. Please try again later.'\n );\n return;\n default:\n if (errorMessage) {\n logger.error(errorMessage);\n return;\n }\n break;\n }\n }\n logger.error(\n 'We encountered an issue while creating your project. Please try again in a moment. If the problem persists, contact support for assistance.'\n );\n}\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { getValidToken } = await tokenServiceFactory(ctx);\n\n const token = await getValidToken();\n if (!token) {\n return;\n }\n const cloudApi = await cloudApiFactory(ctx, token);\n const { data: config } = await cloudApi.config();\n const { questions, defaults: defaultValues } = config.projectCreation;\n\n const projectAnswersDefaulted = defaults(defaultValues);\n const projectAnswers = await inquirer.prompt<ProjectAnswers>(questions);\n\n const projectInput: ProjectInput = projectAnswersDefaulted(projectAnswers);\n\n const spinner = logger.spinner('Setting up your project...').start();\n try {\n const { data } = await cloudApi.createProject(projectInput);\n await local.save({ project: data });\n spinner.succeed('Project created successfully!');\n return data;\n } catch (e: Error | unknown) {\n spinner.fail('Failed to create project on Strapi Cloud.');\n await handleError(ctx, e as Error);\n }\n};\n","import EventSource from 'eventsource';\nimport type { CLIContext, CloudCliConfig } from '../types';\n\ntype Event = {\n type: string;\n data: string;\n lastEventId: string;\n origin: string;\n};\n\nexport function notificationServiceFactory({ logger }: CLIContext) {\n return (url: string, token: string, cliConfig: CloudCliConfig) => {\n const CONN_TIMEOUT = Number(cliConfig.notificationsConnectionTimeout);\n\n const es = new EventSource(url, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n let timeoutId: NodeJS.Timeout;\n\n const resetTimeout = () => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n logger.log(\n 'We were unable to connect to the server at this time. This could be due to a temporary issue. Please try again in a moment.'\n );\n es.close();\n }, CONN_TIMEOUT); // 5 minutes\n };\n\n es.onopen = resetTimeout;\n es.onmessage = (event: Event) => {\n resetTimeout();\n const data = JSON.parse(event.data);\n\n if (data.message) {\n logger.log(data.message);\n }\n\n // Close connection when a specific event is received\n if (data.event === 'deploymentFinished' || data.event === 'deploymentFailed') {\n es.close();\n }\n };\n };\n}\n","// TODO Migrate to fs-extra\nimport fs from 'fs/promises';\nimport os from 'os';\nimport pkgUp from 'pkg-up';\nimport * as yup from 'yup';\nimport chalk from 'chalk';\nimport { Logger } from '../services/logger';\n\ninterface Export {\n types?: string;\n source: string;\n module?: string;\n import?: string;\n require?: string;\n default: string;\n}\n\nconst packageJsonSchema = yup.object({\n name: yup.string().required(),\n exports: yup.lazy((value) =>\n yup\n .object(\n typeof value === 'object'\n ? Object.entries(value).reduce((acc, [key, value]) => {\n if (typeof value === 'object') {\n acc[key] = yup\n .object({\n types: yup.string().optional(),\n source: yup.string().required(),\n module: yup.string().optional(),\n import: yup.string().required(),\n require: yup.string().required(),\n default: yup.string().required(),\n })\n .noUnknown(true);\n } else {\n acc[key] = yup\n .string()\n .matches(/^\\.\\/.*\\.json$/)\n .required();\n }\n\n return acc;\n }, {} as Record<string, yup.SchemaOf<string> | yup.SchemaOf<Export>>)\n : undefined\n )\n .optional()\n ),\n});\n\ntype PackageJson = yup.Asserts<typeof packageJsonSchema>;\n\n/**\n * @description being a task to load the package.json starting from the current working directory\n * using a shallow find for the package.json and `fs` to read the file. If no package.json is found,\n * the process will throw with an appropriate error message.\n */\nconst loadPkg = async ({ cwd, logger }: { cwd: string; logger: Logger }): Promise<PackageJson> => {\n const pkgPath = await pkgUp({ cwd });\n\n if (!pkgPath) {\n throw new Error('Could not find a package.json in the current directory');\n }\n\n const buffer = await fs.readFile(pkgPath);\n\n const pkg = JSON.parse(buffer.toString());\n\n logger.debug('Loaded package.json:', os.EOL, pkg);\n\n return pkg;\n};\n\n/**\n * @description validate the package.json against a standardised schema using `yup`.\n * If the validation fails, the process will throw with an appropriate error message.\n */\nconst validatePkg = async ({ pkg }: { pkg: object }): Promise<PackageJson> => {\n try {\n const validatedPkg = await packageJsonSchema.validate(pkg, {\n strict: true,\n });\n\n return validatedPkg;\n } catch (err) {\n if (err instanceof yup.ValidationError) {\n switch (err.type) {\n case 'required':\n if (err.path) {\n throw new Error(\n `'${err.path}' in 'package.json' is required as type '${chalk.magenta(\n yup.reach(packageJsonSchema, err.path).type\n )}'`\n );\n }\n break;\n /**\n * This will only be thrown if there are keys in the export map\n * that we don't expect so we can therefore make some assumptions\n */\n case 'noUnknown':\n if (err.path && err.params && 'unknown' in err.params) {\n throw new Error(\n `'${err.path}' in 'package.json' contains the unknown key ${chalk.magenta(\n err.params.unknown\n )}, for compatability only the following keys are allowed: ${chalk.magenta(\n \"['types', 'source', 'import', 'require', 'default']\"\n )}`\n );\n }\n break;\n default:\n if (err.path && err.params && 'type' in err.params && 'value' in err.params) {\n throw new Error(\n `'${err.path}' in 'package.json' must be of type '${chalk.magenta(\n err.params.type\n )}' (recieved '${chalk.magenta(typeof err.params.value)}')`\n );\n }\n }\n }\n\n throw err;\n }\n};\n\nexport type { PackageJson, Export };\nexport { loadPkg, validatePkg };\n","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 spinner = logger.spinner('Connecting to server to get build logs');\n spinner.start();\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 (spinner.isSpinning) {\n spinner.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 (spinner.isSpinning) {\n spinner.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 spinner.fail('We were unable to connect to the server to get build logs at this time.');\n es.close();\n reject(new Error('Max retries reached'));\n }\n };\n };\n\n connect(url);\n });\n };\n};\n\nexport { buildLogsServiceFactory };\n","import fse from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { AxiosError } from 'axios';\nimport * as crypto from 'node:crypto';\nimport { apiConfig } from '../config/api';\nimport { compressFilesToTar } from '../utils/compress-files';\nimport createProjectAction from '../create-project/action';\nimport type { CLIContext, ProjectInfos } from '../types';\nimport { getTmpStoragePath } from '../config/local';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../services';\nimport { notificationServiceFactory } from '../services/notification';\nimport { loadPkg } from '../utils/pkg';\nimport { buildLogsServiceFactory } from '../services/build-logs';\n\ntype PackageJson = {\n name: string;\n strapi?: {\n uuid: string;\n };\n};\n\nasync function upload(\n ctx: CLIContext,\n project: ProjectInfos,\n token: string,\n maxProjectFileSize: number\n) {\n const cloudApi = await cloudApiFactory(ctx, token);\n // * Upload project\n try {\n const storagePath = await getTmpStoragePath();\n const projectFolder = path.resolve(process.cwd());\n const packageJson = (await loadPkg(ctx)) as PackageJson;\n\n if (!packageJson) {\n ctx.logger.error(\n 'Unable to deploy the project. Please make sure the package.json file is correctly formatted.'\n );\n return;\n }\n\n ctx.logger.log('📦 Compressing project...');\n // hash packageJson.name to avoid conflicts\n const hashname = crypto.createHash('sha512').update(packageJson.name).digest('hex');\n const compressedFilename = `${hashname}.tar.gz`;\n try {\n ctx.logger.debug(\n 'Compression parameters\\n',\n `Storage path: ${storagePath}\\n`,\n `Project folder: ${projectFolder}\\n`,\n `Compressed filename: ${compressedFilename}`\n );\n await compressFilesToTar(storagePath, projectFolder, compressedFilename);\n ctx.logger.log('📦 Project compressed successfully!');\n } catch (e: unknown) {\n ctx.logger.error(\n '⚠️ Project compression failed. Try again later or check for large/incompatible files.'\n );\n ctx.logger.debug(e);\n process.exit(1);\n }\n\n const tarFilePath = path.resolve(storagePath, compressedFilename);\n const fileStats = await fse.stat(tarFilePath);\n\n if (fileStats.size > maxProjectFileSize) {\n ctx.logger.log(\n 'Unable to proceed: Your project is too big to be transferred, please use a git repo instead.'\n );\n try {\n await fse.remove(tarFilePath);\n } catch (e: any) {\n ctx.logger.log('Unable to remove file: ', tarFilePath);\n ctx.logger.debug(e);\n }\n return;\n }\n\n ctx.logger.info('🚀 Uploading project...');\n const progressBar = ctx.logger.progressBar(100, 'Upload Progress');\n\n try {\n const { data } = await cloudApi.deploy(\n { filePath: tarFilePath, project },\n {\n onUploadProgress(progressEvent) {\n const total = progressEvent.total || fileStats.size;\n const percentage = Math.round((progressEvent.loaded * 100) / total);\n progressBar.update(percentage);\n },\n }\n );\n\n progressBar.update(100);\n progressBar.stop();\n ctx.logger.success('✨ Upload finished!');\n return data.build_id;\n } catch (e: any) {\n progressBar.stop();\n if (e instanceof AxiosError && e.response?.data) {\n if (e.response.status === 404) {\n ctx.logger.error(\n `The project does not exist. Remove the ${local.LOCAL_SAVE_FILENAME} file and try again.`\n );\n } else {\n ctx.logger.error(e.response.data);\n }\n } else {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n }\n\n ctx.logger.debug(e);\n } finally {\n await fse.remove(tarFilePath);\n }\n process.exit(0);\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n}\n\nasync function getProject(ctx: CLIContext) {\n const { project } = await local.retrieve();\n if (!project) {\n try {\n return await createProjectAction(ctx);\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n }\n return project;\n}\n\nexport default async (ctx: CLIContext) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const cloudApiService = await cloudApiFactory(ctx);\n const token = await getValidToken();\n\n if (!token) {\n return;\n }\n\n const project = await getProject(ctx);\n\n if (!project) {\n return;\n }\n\n try {\n await cloudApiService.track('willDeployWithCLI', { projectInternalName: project.name });\n } catch (e) {\n ctx.logger.debug('Failed to track willDeploy', e);\n }\n\n const notificationService = notificationServiceFactory(ctx);\n const buildLogsService = buildLogsServiceFactory(ctx);\n\n const { data: cliConfig } = await cloudApiService.config();\n\n let maxSize: number = parseInt(cliConfig.maxProjectFileSize, 10);\n if (Number.isNaN(maxSize)) {\n ctx.logger.debug(\n 'An error occurred while parsing the maxProjectFileSize. Using default value.'\n );\n maxSize = 100000000;\n }\n\n const buildId = await upload(ctx, project, token, maxSize);\n\n if (!buildId) {\n return;\n }\n\n try {\n notificationService(`${apiConfig.apiBaseUrl}/notifications`, token, cliConfig);\n await buildLogsService(`${apiConfig.apiBaseUrl}/v1/logs/${buildId}`, token, cliConfig);\n\n ctx.logger.log(\n 'Visit the following URL for deployment logs. Your deployment will be available here shortly.'\n );\n ctx.logger.log(\n chalk.underline(`${apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`)\n );\n } catch (e: Error | unknown) {\n if (e instanceof Error) {\n ctx.logger.error(e.message);\n } else {\n throw e;\n }\n }\n};\n","import chalk from 'chalk';\nimport { has } from 'lodash/fp';\n\n// TODO: Remove duplicated code by extracting to a shared package\n\nconst assertCwdContainsStrapiProject = (name: string) => {\n const logErrorAndExit = () => {\n console.log(\n `You need to run ${chalk.yellow(\n `strapi ${name}`\n )} in a Strapi project. Make sure you are in the right directory.`\n );\n process.exit(1);\n };\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const pkgJSON = require(`${process.cwd()}/package.json`);\n if (\n !has('dependencies.@strapi/strapi', pkgJSON) &&\n !has('devDependencies.@strapi/strapi', pkgJSON)\n ) {\n logErrorAndExit();\n }\n } catch (err) {\n logErrorAndExit();\n }\n};\n\nconst runAction =\n (name: string, action: (...args: any[]) => Promise<unknown>) =>\n (...args: unknown[]) => {\n assertCwdContainsStrapiProject(name);\n\n Promise.resolve()\n .then(() => {\n return action(...args);\n })\n .catch((error) => {\n console.error(error);\n process.exit(1);\n });\n };\n\nexport { runAction };\n","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ deploy project to the cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:deploy')\n .alias('deploy')\n .description('Deploy a Strapi Cloud project')\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('deploy', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n name: 'deploy-project',\n description: 'Deploy a Strapi Cloud project',\n action,\n command,\n} as StrapiCloudCommandInfo;\n","import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\n\nconst openModule = import('open');\n\nexport default async (ctx: CLIContext): Promise<boolean> => {\n const { logger } = ctx;\n const tokenService = await tokenServiceFactory(ctx);\n const existingToken = await tokenService.retrieveToken();\n const cloudApiService = await cloudApiFactory(ctx, existingToken || undefined);\n\n const trackFailedLogin = async () => {\n try {\n await cloudApiService.track('didNotLogin', { loginMethod: 'cli' });\n } catch (e) {\n logger.debug('Failed to track failed login', e);\n }\n };\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 // If the token is invalid and request failed, we should proceed with the login process\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\n try {\n await cloudApiService.track('willLoginAttempt', {});\n } catch (e) {\n logger.debug('Failed to track login attempt', e);\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 trackFailedLogin();\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 trackFailedLogin();\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 try {\n await cloudApiService.track('didLogin', { loginMethod: 'cli' });\n } catch (e) {\n logger.debug('Failed to track login', e);\n }\n };\n\n await authenticate();\n return isAuthenticated;\n};\n","import type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow login`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:login')\n .alias('login')\n .description('Strapi Cloud Login')\n .addHelpText(\n 'after',\n '\\nAfter running this command, you will be prompted to enter your authentication information.'\n )\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('login', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n name: 'login',\n description: 'Strapi Cloud Login',\n action,\n command,\n} as StrapiCloudCommandInfo;\n","import type { CLIContext } from '../types';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\n\nconst openModule = import('open');\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { retrieveToken, eraseToken } = await tokenServiceFactory(ctx);\n\n const token = await retrieveToken();\n if (!token) {\n logger.log(\"You're already logged out.\");\n return;\n }\n const cloudApiService = await cloudApiFactory(ctx, token);\n const config = await cloudApiService.config();\n const cliConfig = config.data;\n\n try {\n await eraseToken();\n\n openModule.then((open) => {\n open\n .default(\n `${cliConfig.baseUrl}/oidc/logout?client_id=${encodeURIComponent(\n cliConfig.clientId\n )}&logout_hint=${encodeURIComponent(token)}\n `\n )\n .catch((e: Error) => {\n // Failing to open the logout URL is not a critical error, so we just log it\n logger.debug(e.message, e);\n });\n });\n\n logger.log(\n '🔌 You have been logged out from the CLI. If you are on a shared computer, please make sure to log out from the Strapi Cloud Dashboard as well.'\n );\n } catch (e) {\n logger.error('🥲 Oops! Something went wrong while logging you out. Please try again.');\n logger.debug(e);\n }\n try {\n await cloudApiService.track('didLogout', { loginMethod: 'cli' });\n } catch (e) {\n logger.debug('Failed to track logout event', e);\n }\n};\n","import type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow logout`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:logout')\n .alias('logout')\n .description('Strapi Cloud Logout')\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('logout', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\n\nexport { action, command };\n\nexport default {\n name: 'logout',\n description: 'Strapi Cloud Logout',\n action,\n command,\n};\n","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ create project in Strapi cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:create-project')\n .description('Create a Strapi Cloud project')\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('cloud:create-project', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n name: 'create-project',\n description: 'Create a new project',\n action,\n command,\n} as StrapiCloudCommandInfo;\n","import { Command } from 'commander';\nimport crypto from 'crypto';\nimport deployProject from './deploy-project';\nimport login from './login';\nimport logout from './logout';\nimport createProject from './create-project';\nimport { CLIContext } from './types';\nimport { getLocalConfig, saveLocalConfig } from './config/local';\n\nexport const cli = {\n deployProject,\n login,\n logout,\n createProject,\n};\n\nconst cloudCommands = [deployProject, login, logout];\n\nasync function initCloudCLIConfig() {\n const localConfig = await getLocalConfig();\n\n if (!localConfig.deviceId) {\n localConfig.deviceId = 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 await cloudCommand.command({ command, ctx, argv });\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":["env","fs","path","minimatch","tar","fse","os","XDGAppPaths","axios","name","jwksClient","jwt","stringify","chalk","ora","cliProgress","AxiosError","defaults","inquirer","local.save","cliConfig","EventSource","yup","value","pkgUp","url","packageJson","crypto","local.LOCAL_SAVE_FILENAME","local.retrieve","createProjectAction","has","action","command","openModule"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -132,7 +132,7 @@ async function saveLocalConfig(data) {
|
|
|
132
132
|
await fse.writeJson(configFilePath, data, { encoding: "utf8", spaces: 2, mode: 384 });
|
|
133
133
|
}
|
|
134
134
|
const name = "@strapi/cloud-cli";
|
|
135
|
-
const version = "4.25.
|
|
135
|
+
const version = "4.25.1";
|
|
136
136
|
const description = "Commands to interact with the Strapi Cloud";
|
|
137
137
|
const keywords = [
|
|
138
138
|
"strapi",
|
|
@@ -176,7 +176,7 @@ const scripts = {
|
|
|
176
176
|
watch: "pack-up watch"
|
|
177
177
|
};
|
|
178
178
|
const dependencies = {
|
|
179
|
-
"@strapi/utils": "4.25.
|
|
179
|
+
"@strapi/utils": "4.25.1",
|
|
180
180
|
axios: "1.6.0",
|
|
181
181
|
chalk: "4.1.2",
|
|
182
182
|
"cli-progress": "3.12.0",
|
|
@@ -201,8 +201,8 @@ const devDependencies = {
|
|
|
201
201
|
"@types/cli-progress": "3.11.5",
|
|
202
202
|
"@types/eventsource": "1.1.15",
|
|
203
203
|
"@types/lodash": "^4.14.191",
|
|
204
|
-
"eslint-config-custom": "4.25.
|
|
205
|
-
tsconfig: "4.25.
|
|
204
|
+
"eslint-config-custom": "4.25.1",
|
|
205
|
+
tsconfig: "4.25.1"
|
|
206
206
|
};
|
|
207
207
|
const engines = {
|
|
208
208
|
node: ">=18.0.0 <=20.x.x",
|
|
@@ -231,7 +231,7 @@ const packageJson = {
|
|
|
231
231
|
engines
|
|
232
232
|
};
|
|
233
233
|
const VERSION = "v1";
|
|
234
|
-
async function cloudApiFactory(token) {
|
|
234
|
+
async function cloudApiFactory({ logger }, token) {
|
|
235
235
|
const localConfig = await getLocalConfig();
|
|
236
236
|
const customHeaders = {
|
|
237
237
|
"x-device-id": localConfig.deviceId,
|
|
@@ -284,8 +284,19 @@ async function cloudApiFactory(token) {
|
|
|
284
284
|
getUserInfo() {
|
|
285
285
|
return axiosCloudAPI.get("/user");
|
|
286
286
|
},
|
|
287
|
-
config() {
|
|
288
|
-
|
|
287
|
+
async config() {
|
|
288
|
+
try {
|
|
289
|
+
const response = await axiosCloudAPI.get("/config");
|
|
290
|
+
if (response.status !== 200) {
|
|
291
|
+
throw new Error("Error fetching cloud CLI config from the server.");
|
|
292
|
+
}
|
|
293
|
+
return response;
|
|
294
|
+
} catch (error) {
|
|
295
|
+
logger.debug(
|
|
296
|
+
"🥲 Oops! Couldn't retrieve the cloud CLI config from the server. Please try again."
|
|
297
|
+
);
|
|
298
|
+
throw error;
|
|
299
|
+
}
|
|
289
300
|
},
|
|
290
301
|
listProjects() {
|
|
291
302
|
return axiosCloudAPI.get("/projects");
|
|
@@ -324,7 +335,7 @@ const strapiInfoSave = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defi
|
|
|
324
335
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
325
336
|
let cliConfig;
|
|
326
337
|
async function tokenServiceFactory({ logger }) {
|
|
327
|
-
const cloudApiService = await cloudApiFactory();
|
|
338
|
+
const cloudApiService = await cloudApiFactory({ logger });
|
|
328
339
|
async function saveToken(str) {
|
|
329
340
|
const appConfig = await getLocalConfig();
|
|
330
341
|
if (!appConfig) {
|
|
@@ -599,7 +610,7 @@ const action$3 = async (ctx) => {
|
|
|
599
610
|
if (!token) {
|
|
600
611
|
return;
|
|
601
612
|
}
|
|
602
|
-
const cloudApi = await cloudApiFactory(token);
|
|
613
|
+
const cloudApi = await cloudApiFactory(ctx, token);
|
|
603
614
|
const { data: config } = await cloudApi.config();
|
|
604
615
|
const { questions, defaults: defaultValues } = config.projectCreation;
|
|
605
616
|
const projectAnswersDefaulted = defaults(defaultValues);
|
|
@@ -741,7 +752,7 @@ const buildLogsServiceFactory = ({ logger }) => {
|
|
|
741
752
|
};
|
|
742
753
|
};
|
|
743
754
|
async function upload(ctx, project, token, maxProjectFileSize) {
|
|
744
|
-
const cloudApi = await cloudApiFactory(token);
|
|
755
|
+
const cloudApi = await cloudApiFactory(ctx, token);
|
|
745
756
|
try {
|
|
746
757
|
const storagePath = await getTmpStoragePath();
|
|
747
758
|
const projectFolder = path__default.resolve(process.cwd());
|
|
@@ -843,7 +854,7 @@ async function getProject(ctx) {
|
|
|
843
854
|
}
|
|
844
855
|
const action$2 = async (ctx) => {
|
|
845
856
|
const { getValidToken } = await tokenServiceFactory(ctx);
|
|
846
|
-
const cloudApiService = await cloudApiFactory();
|
|
857
|
+
const cloudApiService = await cloudApiFactory(ctx);
|
|
847
858
|
const token = await getValidToken();
|
|
848
859
|
if (!token) {
|
|
849
860
|
return;
|
|
@@ -924,12 +935,12 @@ const deployProject = {
|
|
|
924
935
|
action: action$2,
|
|
925
936
|
command: command$3
|
|
926
937
|
};
|
|
927
|
-
const openModule = import("open");
|
|
938
|
+
const openModule$1 = import("open");
|
|
928
939
|
const action$1 = async (ctx) => {
|
|
929
940
|
const { logger } = ctx;
|
|
930
941
|
const tokenService = await tokenServiceFactory(ctx);
|
|
931
942
|
const existingToken = await tokenService.retrieveToken();
|
|
932
|
-
const cloudApiService = await cloudApiFactory(existingToken || void 0);
|
|
943
|
+
const cloudApiService = await cloudApiFactory(ctx, existingToken || void 0);
|
|
933
944
|
const trackFailedLogin = async () => {
|
|
934
945
|
try {
|
|
935
946
|
await cloudApiService.track("didNotLogin", { loginMethod: "cli" });
|
|
@@ -990,7 +1001,7 @@ const action$1 = async (ctx) => {
|
|
|
990
1001
|
logger.debug(e);
|
|
991
1002
|
}
|
|
992
1003
|
});
|
|
993
|
-
openModule.then((open) => {
|
|
1004
|
+
openModule$1.then((open) => {
|
|
994
1005
|
open.default(deviceAuthResponse.data.verification_uri_complete).catch((e) => {
|
|
995
1006
|
logger.error("We encountered an issue opening the browser. Please try again later.");
|
|
996
1007
|
logger.debug(e.message, e);
|
|
@@ -1029,7 +1040,7 @@ const action$1 = async (ctx) => {
|
|
|
1029
1040
|
throw new Error("Unable to proceed: Token validation failed");
|
|
1030
1041
|
}
|
|
1031
1042
|
logger.debug("🔍 Fetching user information...");
|
|
1032
|
-
const cloudApiServiceWithToken = await cloudApiFactory(authTokenData.access_token);
|
|
1043
|
+
const cloudApiServiceWithToken = await cloudApiFactory(ctx, authTokenData.access_token);
|
|
1033
1044
|
await cloudApiServiceWithToken.getUserInfo();
|
|
1034
1045
|
logger.debug("🔍 User information fetched successfully!");
|
|
1035
1046
|
try {
|
|
@@ -1093,6 +1104,7 @@ const login = {
|
|
|
1093
1104
|
action: action$1,
|
|
1094
1105
|
command: command$2
|
|
1095
1106
|
};
|
|
1107
|
+
const openModule = import("open");
|
|
1096
1108
|
const action = async (ctx) => {
|
|
1097
1109
|
const { logger } = ctx;
|
|
1098
1110
|
const { retrieveToken, eraseToken } = await tokenServiceFactory(ctx);
|
|
@@ -1101,9 +1113,21 @@ const action = async (ctx) => {
|
|
|
1101
1113
|
logger.log("You're already logged out.");
|
|
1102
1114
|
return;
|
|
1103
1115
|
}
|
|
1104
|
-
const cloudApiService = await cloudApiFactory(token);
|
|
1116
|
+
const cloudApiService = await cloudApiFactory(ctx, token);
|
|
1117
|
+
const config = await cloudApiService.config();
|
|
1118
|
+
const cliConfig2 = config.data;
|
|
1105
1119
|
try {
|
|
1106
1120
|
await eraseToken();
|
|
1121
|
+
openModule.then((open) => {
|
|
1122
|
+
open.default(
|
|
1123
|
+
`${cliConfig2.baseUrl}/oidc/logout?client_id=${encodeURIComponent(
|
|
1124
|
+
cliConfig2.clientId
|
|
1125
|
+
)}&logout_hint=${encodeURIComponent(token)}
|
|
1126
|
+
`
|
|
1127
|
+
).catch((e) => {
|
|
1128
|
+
logger.debug(e.message, e);
|
|
1129
|
+
});
|
|
1130
|
+
});
|
|
1107
1131
|
logger.log(
|
|
1108
1132
|
"🔌 You have been logged out from the CLI. If you are on a shared computer, please make sure to log out from the Strapi Cloud Dashboard as well."
|
|
1109
1133
|
);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/config/api.ts","../src/utils/compress-files.ts","../src/config/local.ts","../src/services/cli-api.ts","../src/services/strapi-info-save.ts","../src/services/token.ts","../src/services/logger.ts","../src/create-project/action.ts","../src/services/notification.ts","../src/utils/pkg.ts","../src/services/build-logs.ts","../src/deploy-project/action.ts","../src/utils/helpers.ts","../src/deploy-project/command.ts","../src/deploy-project/index.ts","../src/login/action.ts","../src/login/command.ts","../src/login/index.ts","../src/logout/action.ts","../src/logout/command.ts","../src/logout/index.ts","../src/create-project/command.ts","../src/create-project/index.ts","../src/index.ts"],"sourcesContent":["import { env } from '@strapi/utils';\n\nexport const apiConfig = {\n apiBaseUrl: env('STRAPI_CLI_CLOUD_API', 'https://cloud-cli-api.strapi.io'),\n dashboardBaseUrl: env('STRAPI_CLI_CLOUD_DASHBOARD', 'https://cloud.strapi.io'),\n};\n","// TODO Migrate to fs-extra\nimport * as fs from 'fs';\nimport * as tar from 'tar';\nimport * as path from 'path';\nimport { minimatch } from 'minimatch';\n\nconst IGNORED_PATTERNS = [\n '**/.git/**',\n '**/node_modules/**',\n '**/build/**',\n '**/dist/**',\n '**/.cache/**',\n '**/.circleci/**',\n '**/.github/**',\n '**/.gitignore',\n '**/.gitkeep',\n '**/.gitlab-ci.yml',\n '**/.idea/**',\n '**/.vscode/**',\n];\n\nconst getFiles = (\n dirPath: string,\n ignorePatterns: string[] = [],\n arrayOfFiles: string[] = [],\n subfolder: string = ''\n): string[] => {\n const entries = fs.readdirSync(path.join(dirPath, subfolder));\n entries.forEach((entry) => {\n const entryPathFromRoot = path.join(subfolder, entry);\n const entryPath = path.relative(dirPath, entryPathFromRoot);\n const isIgnored = isIgnoredFile(dirPath, entryPathFromRoot, ignorePatterns);\n if (isIgnored) {\n return;\n }\n if (fs.statSync(entryPath).isDirectory()) {\n getFiles(dirPath, ignorePatterns, arrayOfFiles, entryPathFromRoot);\n } else {\n arrayOfFiles.push(entryPath);\n }\n });\n return arrayOfFiles;\n};\n\nconst isIgnoredFile = (folderPath: string, file: string, ignorePatterns: string[]): boolean => {\n ignorePatterns.push(...IGNORED_PATTERNS);\n const relativeFilePath = path.join(folderPath, file);\n let isIgnored = false;\n for (const pattern of ignorePatterns) {\n if (pattern.startsWith('!')) {\n if (minimatch(relativeFilePath, pattern.slice(1), { matchBase: true, dot: true })) {\n return false;\n }\n } else if (minimatch(relativeFilePath, pattern, { matchBase: true, dot: true })) {\n if (path.basename(file) !== '.gitkeep') {\n isIgnored = true;\n }\n }\n }\n return isIgnored;\n};\n\nconst readGitignore = (folderPath: string): string[] => {\n const gitignorePath = path.resolve(folderPath, '.gitignore');\n if (!fs.existsSync(gitignorePath)) return [];\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n return gitignoreContent\n .split(/\\r?\\n/)\n .filter((line) => Boolean(line.trim()) && !line.startsWith('#'));\n};\n\nconst compressFilesToTar = async (\n storagePath: string,\n folderToCompress: string,\n filename: string\n): Promise<void> => {\n const ignorePatterns = readGitignore(folderToCompress);\n const filesToCompress = getFiles(folderToCompress, ignorePatterns);\n\n return tar.c(\n {\n gzip: true,\n file: path.resolve(storagePath, filename),\n },\n filesToCompress\n );\n};\n\nexport { compressFilesToTar, isIgnoredFile };\n","import path from 'path';\nimport os from 'os';\nimport fse from 'fs-extra';\nimport XDGAppPaths from 'xdg-app-paths';\n\nconst APP_FOLDER_NAME = 'com.strapi.cli';\n\nexport const CONFIG_FILENAME = 'config.json';\n\nexport type LocalConfig = {\n token?: string;\n deviceId?: string;\n};\n\nasync function checkDirectoryExists(directoryPath: string) {\n try {\n const fsStat = await fse.lstat(directoryPath);\n return fsStat.isDirectory();\n } catch (e) {\n return false;\n }\n}\n\n// Determine storage path based on the operating system\nexport async function getTmpStoragePath() {\n const storagePath = path.join(os.tmpdir(), APP_FOLDER_NAME);\n await fse.ensureDir(storagePath);\n return storagePath;\n}\n\nasync function getConfigPath() {\n const configDirs = XDGAppPaths(APP_FOLDER_NAME).configDirs();\n const configPath = configDirs.find(checkDirectoryExists);\n\n if (!configPath) {\n await fse.ensureDir(configDirs[0]);\n return configDirs[0];\n }\n return configPath;\n}\n\nexport async function getLocalConfig(): Promise<LocalConfig> {\n const configPath = await getConfigPath();\n const configFilePath = path.join(configPath, CONFIG_FILENAME);\n await fse.ensureFile(configFilePath);\n try {\n return await fse.readJSON(configFilePath, { encoding: 'utf8', throws: true });\n } catch (e) {\n return {};\n }\n}\n\nexport async function saveLocalConfig(data: LocalConfig) {\n const configPath = await getConfigPath();\n const configFilePath = path.join(configPath, CONFIG_FILENAME);\n await fse.writeJson(configFilePath, data, { encoding: 'utf8', spaces: 2, mode: 0o600 });\n}\n","import axios, { type AxiosResponse } from 'axios';\nimport fse from 'fs-extra';\nimport os from 'os';\nimport { apiConfig } from '../config/api';\nimport type { CloudCliConfig } from '../types';\nimport { getLocalConfig } from '../config/local';\n\nimport packageJson from '../../package.json';\n\nexport const VERSION = 'v1';\n\nexport type ProjectInfos = {\n name: string;\n nodeVersion: string;\n region: string;\n plan?: string;\n url?: string;\n};\nexport type ProjectInput = Omit<ProjectInfos, 'id'>;\n\nexport type DeployResponse = {\n build_id: string;\n image: string;\n};\n\nexport type TrackPayload = Record<string, unknown>;\n\nexport interface CloudApiService {\n deploy(\n deployInput: {\n filePath: string;\n project: { name: string };\n },\n {\n onUploadProgress,\n }: {\n onUploadProgress: (progressEvent: { loaded: number; total?: number }) => void;\n }\n ): Promise<AxiosResponse<DeployResponse>>;\n\n createProject(projectInput: ProjectInput): Promise<{\n data: ProjectInfos;\n status: number;\n }>;\n\n getUserInfo(): Promise<AxiosResponse>;\n\n config(): Promise<AxiosResponse<CloudCliConfig>>;\n\n listProjects(): Promise<AxiosResponse<ProjectInfos[]>>;\n\n track(event: string, payload?: TrackPayload): Promise<AxiosResponse<void>>;\n}\n\nexport async function cloudApiFactory(token?: string): Promise<CloudApiService> {\n const localConfig = await getLocalConfig();\n const customHeaders = {\n 'x-device-id': localConfig.deviceId,\n 'x-app-version': packageJson.version,\n 'x-os-name': os.type(),\n 'x-os-version': os.version(),\n 'x-language': Intl.DateTimeFormat().resolvedOptions().locale,\n 'x-node-version': process.versions.node,\n };\n const axiosCloudAPI = axios.create({\n baseURL: `${apiConfig.apiBaseUrl}/${VERSION}`,\n headers: {\n 'Content-Type': 'application/json',\n ...customHeaders,\n },\n });\n\n if (token) {\n axiosCloudAPI.defaults.headers.Authorization = `Bearer ${token}`;\n }\n\n return {\n deploy({ filePath, project }, { onUploadProgress }) {\n return axiosCloudAPI.post(\n `/deploy/${project.name}`,\n { file: fse.createReadStream(filePath) },\n {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n onUploadProgress,\n }\n );\n },\n\n async createProject({ name, nodeVersion, region, plan }) {\n const response = await axiosCloudAPI.post('/project', {\n projectName: name,\n region,\n nodeVersion,\n plan,\n });\n\n return {\n data: {\n id: response.data.id,\n name: response.data.name,\n nodeVersion: response.data.nodeVersion,\n region: response.data.region,\n },\n status: response.status,\n };\n },\n\n getUserInfo() {\n return axiosCloudAPI.get('/user');\n },\n\n config(): Promise<AxiosResponse<CloudCliConfig>> {\n return axiosCloudAPI.get('/config');\n },\n\n listProjects() {\n return axiosCloudAPI.get<ProjectInfos[]>('/projects');\n },\n\n track(event, payload = {}) {\n return axiosCloudAPI.post<void>('/track', {\n event,\n payload,\n });\n },\n };\n}\n","import fse from 'fs-extra';\nimport path from 'path';\nimport type { ProjectInfos } from './cli-api';\n\nexport const LOCAL_SAVE_FILENAME = '.strapi-cloud.json';\n\nexport type LocalSave = {\n project?: ProjectInfos;\n};\n\nexport async function save(data: LocalSave, { directoryPath }: { directoryPath?: string } = {}) {\n const alreadyInFileData = await retrieve({ directoryPath });\n const storedData = { ...alreadyInFileData, ...data };\n const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n // Ensure the directory exists\n await fse.ensureDir(path.dirname(pathToFile));\n await fse.writeJson(pathToFile, storedData, { encoding: 'utf8' });\n}\n\nexport async function retrieve({\n directoryPath,\n}: { directoryPath?: string } = {}): Promise<LocalSave> {\n const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n const pathExists = await fse.pathExists(pathToFile);\n if (!pathExists) {\n return {};\n }\n\n return fse.readJSON(pathToFile, { encoding: 'utf8' });\n}\n","import jwksClient, { type JwksClient, type SigningKey } from 'jwks-rsa';\nimport type { JwtHeader, VerifyErrors } from 'jsonwebtoken';\nimport jwt from 'jsonwebtoken';\nimport { getLocalConfig, saveLocalConfig } from '../config/local';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { cloudApiFactory } from './cli-api';\n\nlet cliConfig: CloudCliConfig;\n\ninterface DecodedToken {\n [key: string]: any;\n}\n\nexport async function tokenServiceFactory({ logger }: { logger: CLIContext['logger'] }) {\n const cloudApiService = await cloudApiFactory();\n\n async function saveToken(str: string) {\n const appConfig = await getLocalConfig();\n\n if (!appConfig) {\n logger.error('There was a problem saving your token. Please try again.');\n return;\n }\n\n appConfig.token = str;\n\n try {\n await saveLocalConfig(appConfig);\n } catch (e: Error | unknown) {\n logger.debug(e);\n logger.error('There was a problem saving your token. Please try again.');\n }\n }\n\n async function retrieveToken() {\n const appConfig = await getLocalConfig();\n if (appConfig.token) {\n // check if token is still valid\n if (await isTokenValid(appConfig.token)) {\n return appConfig.token;\n }\n }\n return undefined;\n }\n\n async function validateToken(idToken: string, jwksUrl: string): Promise<void> {\n const client: JwksClient = jwksClient({\n jwksUri: jwksUrl,\n });\n\n // Get the Key from the JWKS using the token header's Key ID (kid)\n const getKey = (header: JwtHeader, callback: (e: Error | null, key?: string) => void) => {\n client.getSigningKey(header.kid, (e: Error | null, key?: SigningKey) => {\n if (e) {\n callback(e);\n } else if (key) {\n const publicKey = 'publicKey' in key ? key.publicKey : key.rsaPublicKey;\n callback(null, publicKey);\n } else {\n callback(new Error('Key not found'));\n }\n });\n };\n\n // Decode the JWT token to get the header and payload\n const decodedToken = jwt.decode(idToken, { complete: true }) as DecodedToken;\n if (!decodedToken) {\n if (typeof idToken === 'undefined' || idToken === '') {\n logger.warn('You need to be logged in to use this feature. Please log in and try again.');\n } else {\n logger.error(\n 'There seems to be a problem with your login information. Please try logging in again.'\n );\n }\n }\n\n // Verify the JWT token signature using the JWKS Key\n return new Promise<void>((resolve, reject) => {\n jwt.verify(idToken, getKey, (err: VerifyErrors | null) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n\n async function isTokenValid(token: string) {\n try {\n const config = await cloudApiService.config();\n\n cliConfig = config.data;\n if (token) {\n await validateToken(token, cliConfig.jwksUrl);\n return true;\n }\n return false;\n } catch (e) {\n logger.debug(e);\n return false;\n }\n }\n\n async function eraseToken() {\n const appConfig = await getLocalConfig();\n if (!appConfig) {\n return;\n }\n\n delete appConfig.token;\n\n try {\n await saveLocalConfig(appConfig);\n } catch (e: Error | unknown) {\n logger.debug(e);\n logger.error(\n 'There was an issue removing your login information. Please try logging out again.'\n );\n throw e;\n }\n }\n\n async function getValidToken() {\n const token = await retrieveToken();\n if (!token) {\n logger.log('No token found. Please login first.');\n return null;\n }\n\n if (!(await isTokenValid(token))) {\n logger.log('Unable to proceed: Token is expired or not valid. Please login again.');\n return null;\n }\n return token;\n }\n\n return {\n saveToken,\n retrieveToken,\n validateToken,\n isTokenValid,\n eraseToken,\n getValidToken,\n };\n}\n","import chalk from 'chalk';\nimport stringify from 'fast-safe-stringify';\n\nimport ora from 'ora';\nimport * as cliProgress from 'cli-progress';\n\nexport interface LoggerOptions {\n silent?: boolean;\n debug?: boolean;\n timestamp?: boolean;\n}\n\nexport interface Logger {\n warnings: number;\n errors: number;\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n success: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n log: (...args: unknown[]) => void;\n spinner: (text: string) => Pick<ora.Ora, 'succeed' | 'fail' | 'start' | 'text' | 'isSpinning'>;\n progressBar: (\n totalSize: number,\n text: string\n ) => Pick<cliProgress.SingleBar, 'start' | 'stop' | 'update'>;\n}\n\nconst stringifyArg = (arg: unknown) => {\n return typeof arg === 'object' ? stringify(arg) : arg;\n};\n\nconst createLogger = (options: LoggerOptions = {}): Logger => {\n const { silent = false, debug = false, timestamp = true } = options;\n\n const state = { errors: 0, warning: 0 };\n\n return {\n get warnings() {\n return state.warning;\n },\n\n get errors() {\n return state.errors;\n },\n\n async debug(...args) {\n if (silent || !debug) {\n return;\n }\n\n console.log(\n chalk.cyan(`[DEBUG]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n info(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.blue(`[INFO]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n log(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.blue(`${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n success(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.green(`[SUCCESS]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n warn(...args) {\n state.warning += 1;\n\n if (silent) {\n return;\n }\n\n console.warn(\n chalk.yellow(`[WARN]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n error(...args) {\n state.errors += 1;\n\n if (silent) {\n return;\n }\n\n console.error(\n chalk.red(`[ERROR]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n // @ts-expect-error – returning a subpart of ora is fine because the types tell us what is what.\n spinner(text: string) {\n if (silent) {\n return {\n succeed() {\n return this;\n },\n fail() {\n return this;\n },\n start() {\n return this;\n },\n text: '',\n isSpinning: false,\n };\n }\n\n return ora(text);\n },\n\n progressBar(totalSize: number, text: string) {\n if (silent) {\n return {\n start() {\n return this;\n },\n stop() {\n return this;\n },\n update() {\n return this;\n },\n };\n }\n\n const progressBar = new cliProgress.SingleBar({\n format: `${text ? `${text} |` : ''}${chalk.green('{bar}')}| {percentage}%`,\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591',\n hideCursor: true,\n forceRedraw: true,\n });\n\n progressBar.start(totalSize, 0);\n\n return progressBar;\n },\n };\n};\n\nexport { createLogger };\n","import inquirer from 'inquirer';\nimport { AxiosError } from 'axios';\nimport { defaults } from 'lodash/fp';\nimport type { CLIContext, ProjectAnswers, ProjectInput } from '../types';\nimport { tokenServiceFactory, cloudApiFactory, local } from '../services';\n\nasync function handleError(ctx: CLIContext, error: Error) {\n const tokenService = await tokenServiceFactory(ctx);\n const { logger } = ctx;\n\n logger.debug(error);\n if (error instanceof AxiosError) {\n const errorMessage = typeof error.response?.data === 'string' ? error.response.data : null;\n switch (error.response?.status) {\n case 401:\n logger.error('Your session has expired. Please log in again.');\n await tokenService.eraseToken();\n return;\n case 403:\n logger.error(\n errorMessage ||\n 'You do not have permission to create a project. Please contact support for assistance.'\n );\n return;\n case 400:\n logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.');\n return;\n case 503:\n logger.error(\n 'Strapi Cloud project creation is currently unavailable. Please try again later.'\n );\n return;\n default:\n if (errorMessage) {\n logger.error(errorMessage);\n return;\n }\n break;\n }\n }\n logger.error(\n 'We encountered an issue while creating your project. Please try again in a moment. If the problem persists, contact support for assistance.'\n );\n}\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { getValidToken } = await tokenServiceFactory(ctx);\n\n const token = await getValidToken();\n if (!token) {\n return;\n }\n const cloudApi = await cloudApiFactory(token);\n const { data: config } = await cloudApi.config();\n const { questions, defaults: defaultValues } = config.projectCreation;\n\n const projectAnswersDefaulted = defaults(defaultValues);\n const projectAnswers = await inquirer.prompt<ProjectAnswers>(questions);\n\n const projectInput: ProjectInput = projectAnswersDefaulted(projectAnswers);\n\n const spinner = logger.spinner('Setting up your project...').start();\n try {\n const { data } = await cloudApi.createProject(projectInput);\n await local.save({ project: data });\n spinner.succeed('Project created successfully!');\n return data;\n } catch (e: Error | unknown) {\n spinner.fail('Failed to create project on Strapi Cloud.');\n await handleError(ctx, e as Error);\n }\n};\n","import EventSource from 'eventsource';\nimport type { CLIContext, CloudCliConfig } from '../types';\n\ntype Event = {\n type: string;\n data: string;\n lastEventId: string;\n origin: string;\n};\n\nexport function notificationServiceFactory({ logger }: CLIContext) {\n return (url: string, token: string, cliConfig: CloudCliConfig) => {\n const CONN_TIMEOUT = Number(cliConfig.notificationsConnectionTimeout);\n\n const es = new EventSource(url, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n let timeoutId: NodeJS.Timeout;\n\n const resetTimeout = () => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n logger.log(\n 'We were unable to connect to the server at this time. This could be due to a temporary issue. Please try again in a moment.'\n );\n es.close();\n }, CONN_TIMEOUT); // 5 minutes\n };\n\n es.onopen = resetTimeout;\n es.onmessage = (event: Event) => {\n resetTimeout();\n const data = JSON.parse(event.data);\n\n if (data.message) {\n logger.log(data.message);\n }\n\n // Close connection when a specific event is received\n if (data.event === 'deploymentFinished' || data.event === 'deploymentFailed') {\n es.close();\n }\n };\n };\n}\n","// TODO Migrate to fs-extra\nimport fs from 'fs/promises';\nimport os from 'os';\nimport pkgUp from 'pkg-up';\nimport * as yup from 'yup';\nimport chalk from 'chalk';\nimport { Logger } from '../services/logger';\n\ninterface Export {\n types?: string;\n source: string;\n module?: string;\n import?: string;\n require?: string;\n default: string;\n}\n\nconst packageJsonSchema = yup.object({\n name: yup.string().required(),\n exports: yup.lazy((value) =>\n yup\n .object(\n typeof value === 'object'\n ? Object.entries(value).reduce((acc, [key, value]) => {\n if (typeof value === 'object') {\n acc[key] = yup\n .object({\n types: yup.string().optional(),\n source: yup.string().required(),\n module: yup.string().optional(),\n import: yup.string().required(),\n require: yup.string().required(),\n default: yup.string().required(),\n })\n .noUnknown(true);\n } else {\n acc[key] = yup\n .string()\n .matches(/^\\.\\/.*\\.json$/)\n .required();\n }\n\n return acc;\n }, {} as Record<string, yup.SchemaOf<string> | yup.SchemaOf<Export>>)\n : undefined\n )\n .optional()\n ),\n});\n\ntype PackageJson = yup.Asserts<typeof packageJsonSchema>;\n\n/**\n * @description being a task to load the package.json starting from the current working directory\n * using a shallow find for the package.json and `fs` to read the file. If no package.json is found,\n * the process will throw with an appropriate error message.\n */\nconst loadPkg = async ({ cwd, logger }: { cwd: string; logger: Logger }): Promise<PackageJson> => {\n const pkgPath = await pkgUp({ cwd });\n\n if (!pkgPath) {\n throw new Error('Could not find a package.json in the current directory');\n }\n\n const buffer = await fs.readFile(pkgPath);\n\n const pkg = JSON.parse(buffer.toString());\n\n logger.debug('Loaded package.json:', os.EOL, pkg);\n\n return pkg;\n};\n\n/**\n * @description validate the package.json against a standardised schema using `yup`.\n * If the validation fails, the process will throw with an appropriate error message.\n */\nconst validatePkg = async ({ pkg }: { pkg: object }): Promise<PackageJson> => {\n try {\n const validatedPkg = await packageJsonSchema.validate(pkg, {\n strict: true,\n });\n\n return validatedPkg;\n } catch (err) {\n if (err instanceof yup.ValidationError) {\n switch (err.type) {\n case 'required':\n if (err.path) {\n throw new Error(\n `'${err.path}' in 'package.json' is required as type '${chalk.magenta(\n yup.reach(packageJsonSchema, err.path).type\n )}'`\n );\n }\n break;\n /**\n * This will only be thrown if there are keys in the export map\n * that we don't expect so we can therefore make some assumptions\n */\n case 'noUnknown':\n if (err.path && err.params && 'unknown' in err.params) {\n throw new Error(\n `'${err.path}' in 'package.json' contains the unknown key ${chalk.magenta(\n err.params.unknown\n )}, for compatability only the following keys are allowed: ${chalk.magenta(\n \"['types', 'source', 'import', 'require', 'default']\"\n )}`\n );\n }\n break;\n default:\n if (err.path && err.params && 'type' in err.params && 'value' in err.params) {\n throw new Error(\n `'${err.path}' in 'package.json' must be of type '${chalk.magenta(\n err.params.type\n )}' (recieved '${chalk.magenta(typeof err.params.value)}')`\n );\n }\n }\n }\n\n throw err;\n }\n};\n\nexport type { PackageJson, Export };\nexport { loadPkg, validatePkg };\n","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 spinner = logger.spinner('Connecting to server to get build logs');\n spinner.start();\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 (spinner.isSpinning) {\n spinner.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 (spinner.isSpinning) {\n spinner.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 spinner.fail('We were unable to connect to the server to get build logs at this time.');\n es.close();\n reject(new Error('Max retries reached'));\n }\n };\n };\n\n connect(url);\n });\n };\n};\n\nexport { buildLogsServiceFactory };\n","import fse from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { AxiosError } from 'axios';\nimport * as crypto from 'node:crypto';\nimport { apiConfig } from '../config/api';\nimport { compressFilesToTar } from '../utils/compress-files';\nimport createProjectAction from '../create-project/action';\nimport type { CLIContext, ProjectInfos } from '../types';\nimport { getTmpStoragePath } from '../config/local';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../services';\nimport { notificationServiceFactory } from '../services/notification';\nimport { loadPkg } from '../utils/pkg';\nimport { buildLogsServiceFactory } from '../services/build-logs';\n\ntype PackageJson = {\n name: string;\n strapi?: {\n uuid: string;\n };\n};\n\nasync function upload(\n ctx: CLIContext,\n project: ProjectInfos,\n token: string,\n maxProjectFileSize: number\n) {\n const cloudApi = await cloudApiFactory(token);\n // * Upload project\n try {\n const storagePath = await getTmpStoragePath();\n const projectFolder = path.resolve(process.cwd());\n const packageJson = (await loadPkg(ctx)) as PackageJson;\n\n if (!packageJson) {\n ctx.logger.error(\n 'Unable to deploy the project. Please make sure the package.json file is correctly formatted.'\n );\n return;\n }\n\n ctx.logger.log('📦 Compressing project...');\n // hash packageJson.name to avoid conflicts\n const hashname = crypto.createHash('sha512').update(packageJson.name).digest('hex');\n const compressedFilename = `${hashname}.tar.gz`;\n try {\n ctx.logger.debug(\n 'Compression parameters\\n',\n `Storage path: ${storagePath}\\n`,\n `Project folder: ${projectFolder}\\n`,\n `Compressed filename: ${compressedFilename}`\n );\n await compressFilesToTar(storagePath, projectFolder, compressedFilename);\n ctx.logger.log('📦 Project compressed successfully!');\n } catch (e: unknown) {\n ctx.logger.error(\n '⚠️ Project compression failed. Try again later or check for large/incompatible files.'\n );\n ctx.logger.debug(e);\n process.exit(1);\n }\n\n const tarFilePath = path.resolve(storagePath, compressedFilename);\n const fileStats = await fse.stat(tarFilePath);\n\n if (fileStats.size > maxProjectFileSize) {\n ctx.logger.log(\n 'Unable to proceed: Your project is too big to be transferred, please use a git repo instead.'\n );\n try {\n await fse.remove(tarFilePath);\n } catch (e: any) {\n ctx.logger.log('Unable to remove file: ', tarFilePath);\n ctx.logger.debug(e);\n }\n return;\n }\n\n ctx.logger.info('🚀 Uploading project...');\n const progressBar = ctx.logger.progressBar(100, 'Upload Progress');\n\n try {\n const { data } = await cloudApi.deploy(\n { filePath: tarFilePath, project },\n {\n onUploadProgress(progressEvent) {\n const total = progressEvent.total || fileStats.size;\n const percentage = Math.round((progressEvent.loaded * 100) / total);\n progressBar.update(percentage);\n },\n }\n );\n\n progressBar.update(100);\n progressBar.stop();\n ctx.logger.success('✨ Upload finished!');\n return data.build_id;\n } catch (e: any) {\n progressBar.stop();\n if (e instanceof AxiosError && e.response?.data) {\n if (e.response.status === 404) {\n ctx.logger.error(\n `The project does not exist. Remove the ${local.LOCAL_SAVE_FILENAME} file and try again.`\n );\n } else {\n ctx.logger.error(e.response.data);\n }\n } else {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n }\n\n ctx.logger.debug(e);\n } finally {\n await fse.remove(tarFilePath);\n }\n process.exit(0);\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n}\n\nasync function getProject(ctx: CLIContext) {\n const { project } = await local.retrieve();\n if (!project) {\n try {\n return await createProjectAction(ctx);\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n }\n return project;\n}\n\nexport default async (ctx: CLIContext) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const cloudApiService = await cloudApiFactory();\n const token = await getValidToken();\n\n if (!token) {\n return;\n }\n\n const project = await getProject(ctx);\n\n if (!project) {\n return;\n }\n\n try {\n await cloudApiService.track('willDeployWithCLI', { projectInternalName: project.name });\n } catch (e) {\n ctx.logger.debug('Failed to track willDeploy', e);\n }\n\n const notificationService = notificationServiceFactory(ctx);\n const buildLogsService = buildLogsServiceFactory(ctx);\n\n const { data: cliConfig } = await cloudApiService.config();\n\n let maxSize: number = parseInt(cliConfig.maxProjectFileSize, 10);\n if (Number.isNaN(maxSize)) {\n ctx.logger.debug(\n 'An error occurred while parsing the maxProjectFileSize. Using default value.'\n );\n maxSize = 100000000;\n }\n\n const buildId = await upload(ctx, project, token, maxSize);\n\n if (!buildId) {\n return;\n }\n\n try {\n notificationService(`${apiConfig.apiBaseUrl}/notifications`, token, cliConfig);\n await buildLogsService(`${apiConfig.apiBaseUrl}/v1/logs/${buildId}`, token, cliConfig);\n\n ctx.logger.log(\n 'Visit the following URL for deployment logs. Your deployment will be available here shortly.'\n );\n ctx.logger.log(\n chalk.underline(`${apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`)\n );\n } catch (e: Error | unknown) {\n if (e instanceof Error) {\n ctx.logger.error(e.message);\n } else {\n throw e;\n }\n }\n};\n","import chalk from 'chalk';\nimport { has } from 'lodash/fp';\n\n// TODO: Remove duplicated code by extracting to a shared package\n\nconst assertCwdContainsStrapiProject = (name: string) => {\n const logErrorAndExit = () => {\n console.log(\n `You need to run ${chalk.yellow(\n `strapi ${name}`\n )} in a Strapi project. Make sure you are in the right directory.`\n );\n process.exit(1);\n };\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const pkgJSON = require(`${process.cwd()}/package.json`);\n if (\n !has('dependencies.@strapi/strapi', pkgJSON) &&\n !has('devDependencies.@strapi/strapi', pkgJSON)\n ) {\n logErrorAndExit();\n }\n } catch (err) {\n logErrorAndExit();\n }\n};\n\nconst runAction =\n (name: string, action: (...args: any[]) => Promise<unknown>) =>\n (...args: unknown[]) => {\n assertCwdContainsStrapiProject(name);\n\n Promise.resolve()\n .then(() => {\n return action(...args);\n })\n .catch((error) => {\n console.error(error);\n process.exit(1);\n });\n };\n\nexport { runAction };\n","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ deploy project to the cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:deploy')\n .alias('deploy')\n .description('Deploy a Strapi Cloud project')\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('deploy', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n name: 'deploy-project',\n description: 'Deploy a Strapi Cloud project',\n action,\n command,\n} as StrapiCloudCommandInfo;\n","import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\n\nconst openModule = import('open');\n\nexport default async (ctx: CLIContext): Promise<boolean> => {\n const { logger } = ctx;\n const tokenService = await tokenServiceFactory(ctx);\n const existingToken = await tokenService.retrieveToken();\n const cloudApiService = await cloudApiFactory(existingToken || undefined);\n\n const trackFailedLogin = async () => {\n try {\n await cloudApiService.track('didNotLogin', { loginMethod: 'cli' });\n } catch (e) {\n logger.debug('Failed to track failed login', e);\n }\n };\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 // If the token is invalid and request failed, we should proceed with the login process\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\n try {\n await cloudApiService.track('willLoginAttempt', {});\n } catch (e) {\n logger.debug('Failed to track login attempt', e);\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(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 trackFailedLogin();\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 trackFailedLogin();\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 try {\n await cloudApiService.track('didLogin', { loginMethod: 'cli' });\n } catch (e) {\n logger.debug('Failed to track login', e);\n }\n };\n\n await authenticate();\n return isAuthenticated;\n};\n","import type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow login`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:login')\n .alias('login')\n .description('Strapi Cloud Login')\n .addHelpText(\n 'after',\n '\\nAfter running this command, you will be prompted to enter your authentication information.'\n )\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('login', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n name: 'login',\n description: 'Strapi Cloud Login',\n action,\n command,\n} as StrapiCloudCommandInfo;\n","import type { CLIContext } from '../types';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { retrieveToken, eraseToken } = await tokenServiceFactory(ctx);\n\n const token = await retrieveToken();\n if (!token) {\n logger.log(\"You're already logged out.\");\n return;\n }\n const cloudApiService = await cloudApiFactory(token);\n try {\n // we might want also to perform extra actions like logging out from the auth0 tenant\n await eraseToken();\n logger.log(\n '🔌 You have been logged out from the CLI. If you are on a shared computer, please make sure to log out from the Strapi Cloud Dashboard as well.'\n );\n } catch (e) {\n logger.error('🥲 Oops! Something went wrong while logging you out. Please try again.');\n logger.debug(e);\n }\n try {\n await cloudApiService.track('didLogout', { loginMethod: 'cli' });\n } catch (e) {\n logger.debug('Failed to track logout event', e);\n }\n};\n","import type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow logout`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:logout')\n .alias('logout')\n .description('Strapi Cloud Logout')\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('logout', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\n\nexport { action, command };\n\nexport default {\n name: 'logout',\n description: 'Strapi Cloud Logout',\n action,\n command,\n};\n","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ create project in Strapi cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:create-project')\n .description('Create a Strapi Cloud project')\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('cloud:create-project', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n name: 'create-project',\n description: 'Create a new project',\n action,\n command,\n} as StrapiCloudCommandInfo;\n","import { Command } from 'commander';\nimport crypto from 'crypto';\nimport deployProject from './deploy-project';\nimport login from './login';\nimport logout from './logout';\nimport createProject from './create-project';\nimport { CLIContext } from './types';\nimport { getLocalConfig, saveLocalConfig } from './config/local';\n\nexport const cli = {\n deployProject,\n login,\n logout,\n createProject,\n};\n\nconst cloudCommands = [deployProject, login, logout];\n\nasync function initCloudCLIConfig() {\n const localConfig = await getLocalConfig();\n\n if (!localConfig.deviceId) {\n localConfig.deviceId = 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 await cloudCommand.command({ command, ctx, argv });\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":["path","name","local.save","cliConfig","value","fs","url","packageJson","local.LOCAL_SAVE_FILENAME","local.retrieve","createProjectAction","action","command","crypto"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/config/api.ts","../src/utils/compress-files.ts","../src/config/local.ts","../src/services/cli-api.ts","../src/services/strapi-info-save.ts","../src/services/token.ts","../src/services/logger.ts","../src/create-project/action.ts","../src/services/notification.ts","../src/utils/pkg.ts","../src/services/build-logs.ts","../src/deploy-project/action.ts","../src/utils/helpers.ts","../src/deploy-project/command.ts","../src/deploy-project/index.ts","../src/login/action.ts","../src/login/command.ts","../src/login/index.ts","../src/logout/action.ts","../src/logout/command.ts","../src/logout/index.ts","../src/create-project/command.ts","../src/create-project/index.ts","../src/index.ts"],"sourcesContent":["import { env } from '@strapi/utils';\n\nexport const apiConfig = {\n apiBaseUrl: env('STRAPI_CLI_CLOUD_API', 'https://cloud-cli-api.strapi.io'),\n dashboardBaseUrl: env('STRAPI_CLI_CLOUD_DASHBOARD', 'https://cloud.strapi.io'),\n};\n","// TODO Migrate to fs-extra\nimport * as fs from 'fs';\nimport * as tar from 'tar';\nimport * as path from 'path';\nimport { minimatch } from 'minimatch';\n\nconst IGNORED_PATTERNS = [\n '**/.git/**',\n '**/node_modules/**',\n '**/build/**',\n '**/dist/**',\n '**/.cache/**',\n '**/.circleci/**',\n '**/.github/**',\n '**/.gitignore',\n '**/.gitkeep',\n '**/.gitlab-ci.yml',\n '**/.idea/**',\n '**/.vscode/**',\n];\n\nconst getFiles = (\n dirPath: string,\n ignorePatterns: string[] = [],\n arrayOfFiles: string[] = [],\n subfolder: string = ''\n): string[] => {\n const entries = fs.readdirSync(path.join(dirPath, subfolder));\n entries.forEach((entry) => {\n const entryPathFromRoot = path.join(subfolder, entry);\n const entryPath = path.relative(dirPath, entryPathFromRoot);\n const isIgnored = isIgnoredFile(dirPath, entryPathFromRoot, ignorePatterns);\n if (isIgnored) {\n return;\n }\n if (fs.statSync(entryPath).isDirectory()) {\n getFiles(dirPath, ignorePatterns, arrayOfFiles, entryPathFromRoot);\n } else {\n arrayOfFiles.push(entryPath);\n }\n });\n return arrayOfFiles;\n};\n\nconst isIgnoredFile = (folderPath: string, file: string, ignorePatterns: string[]): boolean => {\n ignorePatterns.push(...IGNORED_PATTERNS);\n const relativeFilePath = path.join(folderPath, file);\n let isIgnored = false;\n for (const pattern of ignorePatterns) {\n if (pattern.startsWith('!')) {\n if (minimatch(relativeFilePath, pattern.slice(1), { matchBase: true, dot: true })) {\n return false;\n }\n } else if (minimatch(relativeFilePath, pattern, { matchBase: true, dot: true })) {\n if (path.basename(file) !== '.gitkeep') {\n isIgnored = true;\n }\n }\n }\n return isIgnored;\n};\n\nconst readGitignore = (folderPath: string): string[] => {\n const gitignorePath = path.resolve(folderPath, '.gitignore');\n if (!fs.existsSync(gitignorePath)) return [];\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n return gitignoreContent\n .split(/\\r?\\n/)\n .filter((line) => Boolean(line.trim()) && !line.startsWith('#'));\n};\n\nconst compressFilesToTar = async (\n storagePath: string,\n folderToCompress: string,\n filename: string\n): Promise<void> => {\n const ignorePatterns = readGitignore(folderToCompress);\n const filesToCompress = getFiles(folderToCompress, ignorePatterns);\n\n return tar.c(\n {\n gzip: true,\n file: path.resolve(storagePath, filename),\n },\n filesToCompress\n );\n};\n\nexport { compressFilesToTar, isIgnoredFile };\n","import path from 'path';\nimport os from 'os';\nimport fse from 'fs-extra';\nimport XDGAppPaths from 'xdg-app-paths';\n\nconst APP_FOLDER_NAME = 'com.strapi.cli';\n\nexport const CONFIG_FILENAME = 'config.json';\n\nexport type LocalConfig = {\n token?: string;\n deviceId?: string;\n};\n\nasync function checkDirectoryExists(directoryPath: string) {\n try {\n const fsStat = await fse.lstat(directoryPath);\n return fsStat.isDirectory();\n } catch (e) {\n return false;\n }\n}\n\n// Determine storage path based on the operating system\nexport async function getTmpStoragePath() {\n const storagePath = path.join(os.tmpdir(), APP_FOLDER_NAME);\n await fse.ensureDir(storagePath);\n return storagePath;\n}\n\nasync function getConfigPath() {\n const configDirs = XDGAppPaths(APP_FOLDER_NAME).configDirs();\n const configPath = configDirs.find(checkDirectoryExists);\n\n if (!configPath) {\n await fse.ensureDir(configDirs[0]);\n return configDirs[0];\n }\n return configPath;\n}\n\nexport async function getLocalConfig(): Promise<LocalConfig> {\n const configPath = await getConfigPath();\n const configFilePath = path.join(configPath, CONFIG_FILENAME);\n await fse.ensureFile(configFilePath);\n try {\n return await fse.readJSON(configFilePath, { encoding: 'utf8', throws: true });\n } catch (e) {\n return {};\n }\n}\n\nexport async function saveLocalConfig(data: LocalConfig) {\n const configPath = await getConfigPath();\n const configFilePath = path.join(configPath, CONFIG_FILENAME);\n await fse.writeJson(configFilePath, data, { encoding: 'utf8', spaces: 2, mode: 0o600 });\n}\n","import axios, { type AxiosResponse } from 'axios';\nimport fse from 'fs-extra';\nimport os from 'os';\nimport { apiConfig } from '../config/api';\nimport type { CLIContext, CloudCliConfig } from '../types';\nimport { getLocalConfig } from '../config/local';\n\nimport packageJson from '../../package.json';\n\nexport const VERSION = 'v1';\n\nexport type ProjectInfos = {\n name: string;\n nodeVersion: string;\n region: string;\n plan?: string;\n url?: string;\n};\nexport type ProjectInput = Omit<ProjectInfos, 'id'>;\n\nexport type DeployResponse = {\n build_id: string;\n image: string;\n};\n\nexport type TrackPayload = Record<string, unknown>;\n\nexport interface CloudApiService {\n deploy(\n deployInput: {\n filePath: string;\n project: { name: string };\n },\n {\n onUploadProgress,\n }: {\n onUploadProgress: (progressEvent: { loaded: number; total?: number }) => void;\n }\n ): Promise<AxiosResponse<DeployResponse>>;\n\n createProject(projectInput: ProjectInput): Promise<{\n data: ProjectInfos;\n status: number;\n }>;\n\n getUserInfo(): Promise<AxiosResponse>;\n\n config(): Promise<AxiosResponse<CloudCliConfig>>;\n\n listProjects(): Promise<AxiosResponse<ProjectInfos[]>>;\n\n track(event: string, payload?: TrackPayload): Promise<AxiosResponse<void>>;\n}\n\nexport async function cloudApiFactory(\n { logger }: { logger: CLIContext['logger'] },\n token?: string\n): Promise<CloudApiService> {\n const localConfig = await getLocalConfig();\n const customHeaders = {\n 'x-device-id': localConfig.deviceId,\n 'x-app-version': packageJson.version,\n 'x-os-name': os.type(),\n 'x-os-version': os.version(),\n 'x-language': Intl.DateTimeFormat().resolvedOptions().locale,\n 'x-node-version': process.versions.node,\n };\n const axiosCloudAPI = axios.create({\n baseURL: `${apiConfig.apiBaseUrl}/${VERSION}`,\n headers: {\n 'Content-Type': 'application/json',\n ...customHeaders,\n },\n });\n\n if (token) {\n axiosCloudAPI.defaults.headers.Authorization = `Bearer ${token}`;\n }\n\n return {\n deploy({ filePath, project }, { onUploadProgress }) {\n return axiosCloudAPI.post(\n `/deploy/${project.name}`,\n { file: fse.createReadStream(filePath) },\n {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n onUploadProgress,\n }\n );\n },\n\n async createProject({ name, nodeVersion, region, plan }) {\n const response = await axiosCloudAPI.post('/project', {\n projectName: name,\n region,\n nodeVersion,\n plan,\n });\n\n return {\n data: {\n id: response.data.id,\n name: response.data.name,\n nodeVersion: response.data.nodeVersion,\n region: response.data.region,\n },\n status: response.status,\n };\n },\n\n getUserInfo() {\n return axiosCloudAPI.get('/user');\n },\n\n async config(): Promise<AxiosResponse<CloudCliConfig>> {\n try {\n const response = await axiosCloudAPI.get('/config');\n\n if (response.status !== 200) {\n throw new Error('Error fetching cloud CLI config from the server.');\n }\n\n return response;\n } catch (error) {\n logger.debug(\n \"🥲 Oops! Couldn't retrieve the cloud CLI config from the server. Please try again.\"\n );\n\n throw error;\n }\n },\n\n listProjects() {\n return axiosCloudAPI.get<ProjectInfos[]>('/projects');\n },\n\n track(event, payload = {}) {\n return axiosCloudAPI.post<void>('/track', {\n event,\n payload,\n });\n },\n };\n}\n","import fse from 'fs-extra';\nimport path from 'path';\nimport type { ProjectInfos } from './cli-api';\n\nexport const LOCAL_SAVE_FILENAME = '.strapi-cloud.json';\n\nexport type LocalSave = {\n project?: ProjectInfos;\n};\n\nexport async function save(data: LocalSave, { directoryPath }: { directoryPath?: string } = {}) {\n const alreadyInFileData = await retrieve({ directoryPath });\n const storedData = { ...alreadyInFileData, ...data };\n const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n // Ensure the directory exists\n await fse.ensureDir(path.dirname(pathToFile));\n await fse.writeJson(pathToFile, storedData, { encoding: 'utf8' });\n}\n\nexport async function retrieve({\n directoryPath,\n}: { directoryPath?: string } = {}): Promise<LocalSave> {\n const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n const pathExists = await fse.pathExists(pathToFile);\n if (!pathExists) {\n return {};\n }\n\n return fse.readJSON(pathToFile, { encoding: 'utf8' });\n}\n","import jwksClient, { type JwksClient, type SigningKey } from 'jwks-rsa';\nimport type { JwtHeader, VerifyErrors } from 'jsonwebtoken';\nimport jwt from 'jsonwebtoken';\nimport { getLocalConfig, saveLocalConfig } from '../config/local';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { cloudApiFactory } from './cli-api';\n\nlet cliConfig: CloudCliConfig;\n\ninterface DecodedToken {\n [key: string]: any;\n}\n\nexport async function tokenServiceFactory({ logger }: { logger: CLIContext['logger'] }) {\n const cloudApiService = await cloudApiFactory({ logger });\n\n async function saveToken(str: string) {\n const appConfig = await getLocalConfig();\n\n if (!appConfig) {\n logger.error('There was a problem saving your token. Please try again.');\n return;\n }\n\n appConfig.token = str;\n\n try {\n await saveLocalConfig(appConfig);\n } catch (e: Error | unknown) {\n logger.debug(e);\n logger.error('There was a problem saving your token. Please try again.');\n }\n }\n\n async function retrieveToken() {\n const appConfig = await getLocalConfig();\n if (appConfig.token) {\n // check if token is still valid\n if (await isTokenValid(appConfig.token)) {\n return appConfig.token;\n }\n }\n return undefined;\n }\n\n async function validateToken(idToken: string, jwksUrl: string): Promise<void> {\n const client: JwksClient = jwksClient({\n jwksUri: jwksUrl,\n });\n\n // Get the Key from the JWKS using the token header's Key ID (kid)\n const getKey = (header: JwtHeader, callback: (e: Error | null, key?: string) => void) => {\n client.getSigningKey(header.kid, (e: Error | null, key?: SigningKey) => {\n if (e) {\n callback(e);\n } else if (key) {\n const publicKey = 'publicKey' in key ? key.publicKey : key.rsaPublicKey;\n callback(null, publicKey);\n } else {\n callback(new Error('Key not found'));\n }\n });\n };\n\n // Decode the JWT token to get the header and payload\n const decodedToken = jwt.decode(idToken, { complete: true }) as DecodedToken;\n if (!decodedToken) {\n if (typeof idToken === 'undefined' || idToken === '') {\n logger.warn('You need to be logged in to use this feature. Please log in and try again.');\n } else {\n logger.error(\n 'There seems to be a problem with your login information. Please try logging in again.'\n );\n }\n }\n\n // Verify the JWT token signature using the JWKS Key\n return new Promise<void>((resolve, reject) => {\n jwt.verify(idToken, getKey, (err: VerifyErrors | null) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n\n async function isTokenValid(token: string) {\n try {\n const config = await cloudApiService.config();\n\n cliConfig = config.data;\n if (token) {\n await validateToken(token, cliConfig.jwksUrl);\n return true;\n }\n return false;\n } catch (e) {\n logger.debug(e);\n return false;\n }\n }\n\n async function eraseToken() {\n const appConfig = await getLocalConfig();\n if (!appConfig) {\n return;\n }\n\n delete appConfig.token;\n\n try {\n await saveLocalConfig(appConfig);\n } catch (e: Error | unknown) {\n logger.debug(e);\n logger.error(\n 'There was an issue removing your login information. Please try logging out again.'\n );\n throw e;\n }\n }\n\n async function getValidToken() {\n const token = await retrieveToken();\n if (!token) {\n logger.log('No token found. Please login first.');\n return null;\n }\n\n if (!(await isTokenValid(token))) {\n logger.log('Unable to proceed: Token is expired or not valid. Please login again.');\n return null;\n }\n return token;\n }\n\n return {\n saveToken,\n retrieveToken,\n validateToken,\n isTokenValid,\n eraseToken,\n getValidToken,\n };\n}\n","import chalk from 'chalk';\nimport stringify from 'fast-safe-stringify';\n\nimport ora from 'ora';\nimport * as cliProgress from 'cli-progress';\n\nexport interface LoggerOptions {\n silent?: boolean;\n debug?: boolean;\n timestamp?: boolean;\n}\n\nexport interface Logger {\n warnings: number;\n errors: number;\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n success: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n log: (...args: unknown[]) => void;\n spinner: (text: string) => Pick<ora.Ora, 'succeed' | 'fail' | 'start' | 'text' | 'isSpinning'>;\n progressBar: (\n totalSize: number,\n text: string\n ) => Pick<cliProgress.SingleBar, 'start' | 'stop' | 'update'>;\n}\n\nconst stringifyArg = (arg: unknown) => {\n return typeof arg === 'object' ? stringify(arg) : arg;\n};\n\nconst createLogger = (options: LoggerOptions = {}): Logger => {\n const { silent = false, debug = false, timestamp = true } = options;\n\n const state = { errors: 0, warning: 0 };\n\n return {\n get warnings() {\n return state.warning;\n },\n\n get errors() {\n return state.errors;\n },\n\n async debug(...args) {\n if (silent || !debug) {\n return;\n }\n\n console.log(\n chalk.cyan(`[DEBUG]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n info(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.blue(`[INFO]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n log(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.blue(`${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n success(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.green(`[SUCCESS]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n warn(...args) {\n state.warning += 1;\n\n if (silent) {\n return;\n }\n\n console.warn(\n chalk.yellow(`[WARN]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n error(...args) {\n state.errors += 1;\n\n if (silent) {\n return;\n }\n\n console.error(\n chalk.red(`[ERROR]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args.map(stringifyArg)\n );\n },\n\n // @ts-expect-error – returning a subpart of ora is fine because the types tell us what is what.\n spinner(text: string) {\n if (silent) {\n return {\n succeed() {\n return this;\n },\n fail() {\n return this;\n },\n start() {\n return this;\n },\n text: '',\n isSpinning: false,\n };\n }\n\n return ora(text);\n },\n\n progressBar(totalSize: number, text: string) {\n if (silent) {\n return {\n start() {\n return this;\n },\n stop() {\n return this;\n },\n update() {\n return this;\n },\n };\n }\n\n const progressBar = new cliProgress.SingleBar({\n format: `${text ? `${text} |` : ''}${chalk.green('{bar}')}| {percentage}%`,\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591',\n hideCursor: true,\n forceRedraw: true,\n });\n\n progressBar.start(totalSize, 0);\n\n return progressBar;\n },\n };\n};\n\nexport { createLogger };\n","import inquirer from 'inquirer';\nimport { AxiosError } from 'axios';\nimport { defaults } from 'lodash/fp';\nimport type { CLIContext, ProjectAnswers, ProjectInput } from '../types';\nimport { tokenServiceFactory, cloudApiFactory, local } from '../services';\n\nasync function handleError(ctx: CLIContext, error: Error) {\n const tokenService = await tokenServiceFactory(ctx);\n const { logger } = ctx;\n\n logger.debug(error);\n if (error instanceof AxiosError) {\n const errorMessage = typeof error.response?.data === 'string' ? error.response.data : null;\n switch (error.response?.status) {\n case 401:\n logger.error('Your session has expired. Please log in again.');\n await tokenService.eraseToken();\n return;\n case 403:\n logger.error(\n errorMessage ||\n 'You do not have permission to create a project. Please contact support for assistance.'\n );\n return;\n case 400:\n logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.');\n return;\n case 503:\n logger.error(\n 'Strapi Cloud project creation is currently unavailable. Please try again later.'\n );\n return;\n default:\n if (errorMessage) {\n logger.error(errorMessage);\n return;\n }\n break;\n }\n }\n logger.error(\n 'We encountered an issue while creating your project. Please try again in a moment. If the problem persists, contact support for assistance.'\n );\n}\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { getValidToken } = await tokenServiceFactory(ctx);\n\n const token = await getValidToken();\n if (!token) {\n return;\n }\n const cloudApi = await cloudApiFactory(ctx, token);\n const { data: config } = await cloudApi.config();\n const { questions, defaults: defaultValues } = config.projectCreation;\n\n const projectAnswersDefaulted = defaults(defaultValues);\n const projectAnswers = await inquirer.prompt<ProjectAnswers>(questions);\n\n const projectInput: ProjectInput = projectAnswersDefaulted(projectAnswers);\n\n const spinner = logger.spinner('Setting up your project...').start();\n try {\n const { data } = await cloudApi.createProject(projectInput);\n await local.save({ project: data });\n spinner.succeed('Project created successfully!');\n return data;\n } catch (e: Error | unknown) {\n spinner.fail('Failed to create project on Strapi Cloud.');\n await handleError(ctx, e as Error);\n }\n};\n","import EventSource from 'eventsource';\nimport type { CLIContext, CloudCliConfig } from '../types';\n\ntype Event = {\n type: string;\n data: string;\n lastEventId: string;\n origin: string;\n};\n\nexport function notificationServiceFactory({ logger }: CLIContext) {\n return (url: string, token: string, cliConfig: CloudCliConfig) => {\n const CONN_TIMEOUT = Number(cliConfig.notificationsConnectionTimeout);\n\n const es = new EventSource(url, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n let timeoutId: NodeJS.Timeout;\n\n const resetTimeout = () => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n logger.log(\n 'We were unable to connect to the server at this time. This could be due to a temporary issue. Please try again in a moment.'\n );\n es.close();\n }, CONN_TIMEOUT); // 5 minutes\n };\n\n es.onopen = resetTimeout;\n es.onmessage = (event: Event) => {\n resetTimeout();\n const data = JSON.parse(event.data);\n\n if (data.message) {\n logger.log(data.message);\n }\n\n // Close connection when a specific event is received\n if (data.event === 'deploymentFinished' || data.event === 'deploymentFailed') {\n es.close();\n }\n };\n };\n}\n","// TODO Migrate to fs-extra\nimport fs from 'fs/promises';\nimport os from 'os';\nimport pkgUp from 'pkg-up';\nimport * as yup from 'yup';\nimport chalk from 'chalk';\nimport { Logger } from '../services/logger';\n\ninterface Export {\n types?: string;\n source: string;\n module?: string;\n import?: string;\n require?: string;\n default: string;\n}\n\nconst packageJsonSchema = yup.object({\n name: yup.string().required(),\n exports: yup.lazy((value) =>\n yup\n .object(\n typeof value === 'object'\n ? Object.entries(value).reduce((acc, [key, value]) => {\n if (typeof value === 'object') {\n acc[key] = yup\n .object({\n types: yup.string().optional(),\n source: yup.string().required(),\n module: yup.string().optional(),\n import: yup.string().required(),\n require: yup.string().required(),\n default: yup.string().required(),\n })\n .noUnknown(true);\n } else {\n acc[key] = yup\n .string()\n .matches(/^\\.\\/.*\\.json$/)\n .required();\n }\n\n return acc;\n }, {} as Record<string, yup.SchemaOf<string> | yup.SchemaOf<Export>>)\n : undefined\n )\n .optional()\n ),\n});\n\ntype PackageJson = yup.Asserts<typeof packageJsonSchema>;\n\n/**\n * @description being a task to load the package.json starting from the current working directory\n * using a shallow find for the package.json and `fs` to read the file. If no package.json is found,\n * the process will throw with an appropriate error message.\n */\nconst loadPkg = async ({ cwd, logger }: { cwd: string; logger: Logger }): Promise<PackageJson> => {\n const pkgPath = await pkgUp({ cwd });\n\n if (!pkgPath) {\n throw new Error('Could not find a package.json in the current directory');\n }\n\n const buffer = await fs.readFile(pkgPath);\n\n const pkg = JSON.parse(buffer.toString());\n\n logger.debug('Loaded package.json:', os.EOL, pkg);\n\n return pkg;\n};\n\n/**\n * @description validate the package.json against a standardised schema using `yup`.\n * If the validation fails, the process will throw with an appropriate error message.\n */\nconst validatePkg = async ({ pkg }: { pkg: object }): Promise<PackageJson> => {\n try {\n const validatedPkg = await packageJsonSchema.validate(pkg, {\n strict: true,\n });\n\n return validatedPkg;\n } catch (err) {\n if (err instanceof yup.ValidationError) {\n switch (err.type) {\n case 'required':\n if (err.path) {\n throw new Error(\n `'${err.path}' in 'package.json' is required as type '${chalk.magenta(\n yup.reach(packageJsonSchema, err.path).type\n )}'`\n );\n }\n break;\n /**\n * This will only be thrown if there are keys in the export map\n * that we don't expect so we can therefore make some assumptions\n */\n case 'noUnknown':\n if (err.path && err.params && 'unknown' in err.params) {\n throw new Error(\n `'${err.path}' in 'package.json' contains the unknown key ${chalk.magenta(\n err.params.unknown\n )}, for compatability only the following keys are allowed: ${chalk.magenta(\n \"['types', 'source', 'import', 'require', 'default']\"\n )}`\n );\n }\n break;\n default:\n if (err.path && err.params && 'type' in err.params && 'value' in err.params) {\n throw new Error(\n `'${err.path}' in 'package.json' must be of type '${chalk.magenta(\n err.params.type\n )}' (recieved '${chalk.magenta(typeof err.params.value)}')`\n );\n }\n }\n }\n\n throw err;\n }\n};\n\nexport type { PackageJson, Export };\nexport { loadPkg, validatePkg };\n","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 spinner = logger.spinner('Connecting to server to get build logs');\n spinner.start();\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 (spinner.isSpinning) {\n spinner.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 (spinner.isSpinning) {\n spinner.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 spinner.fail('We were unable to connect to the server to get build logs at this time.');\n es.close();\n reject(new Error('Max retries reached'));\n }\n };\n };\n\n connect(url);\n });\n };\n};\n\nexport { buildLogsServiceFactory };\n","import fse from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { AxiosError } from 'axios';\nimport * as crypto from 'node:crypto';\nimport { apiConfig } from '../config/api';\nimport { compressFilesToTar } from '../utils/compress-files';\nimport createProjectAction from '../create-project/action';\nimport type { CLIContext, ProjectInfos } from '../types';\nimport { getTmpStoragePath } from '../config/local';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../services';\nimport { notificationServiceFactory } from '../services/notification';\nimport { loadPkg } from '../utils/pkg';\nimport { buildLogsServiceFactory } from '../services/build-logs';\n\ntype PackageJson = {\n name: string;\n strapi?: {\n uuid: string;\n };\n};\n\nasync function upload(\n ctx: CLIContext,\n project: ProjectInfos,\n token: string,\n maxProjectFileSize: number\n) {\n const cloudApi = await cloudApiFactory(ctx, token);\n // * Upload project\n try {\n const storagePath = await getTmpStoragePath();\n const projectFolder = path.resolve(process.cwd());\n const packageJson = (await loadPkg(ctx)) as PackageJson;\n\n if (!packageJson) {\n ctx.logger.error(\n 'Unable to deploy the project. Please make sure the package.json file is correctly formatted.'\n );\n return;\n }\n\n ctx.logger.log('📦 Compressing project...');\n // hash packageJson.name to avoid conflicts\n const hashname = crypto.createHash('sha512').update(packageJson.name).digest('hex');\n const compressedFilename = `${hashname}.tar.gz`;\n try {\n ctx.logger.debug(\n 'Compression parameters\\n',\n `Storage path: ${storagePath}\\n`,\n `Project folder: ${projectFolder}\\n`,\n `Compressed filename: ${compressedFilename}`\n );\n await compressFilesToTar(storagePath, projectFolder, compressedFilename);\n ctx.logger.log('📦 Project compressed successfully!');\n } catch (e: unknown) {\n ctx.logger.error(\n '⚠️ Project compression failed. Try again later or check for large/incompatible files.'\n );\n ctx.logger.debug(e);\n process.exit(1);\n }\n\n const tarFilePath = path.resolve(storagePath, compressedFilename);\n const fileStats = await fse.stat(tarFilePath);\n\n if (fileStats.size > maxProjectFileSize) {\n ctx.logger.log(\n 'Unable to proceed: Your project is too big to be transferred, please use a git repo instead.'\n );\n try {\n await fse.remove(tarFilePath);\n } catch (e: any) {\n ctx.logger.log('Unable to remove file: ', tarFilePath);\n ctx.logger.debug(e);\n }\n return;\n }\n\n ctx.logger.info('🚀 Uploading project...');\n const progressBar = ctx.logger.progressBar(100, 'Upload Progress');\n\n try {\n const { data } = await cloudApi.deploy(\n { filePath: tarFilePath, project },\n {\n onUploadProgress(progressEvent) {\n const total = progressEvent.total || fileStats.size;\n const percentage = Math.round((progressEvent.loaded * 100) / total);\n progressBar.update(percentage);\n },\n }\n );\n\n progressBar.update(100);\n progressBar.stop();\n ctx.logger.success('✨ Upload finished!');\n return data.build_id;\n } catch (e: any) {\n progressBar.stop();\n if (e instanceof AxiosError && e.response?.data) {\n if (e.response.status === 404) {\n ctx.logger.error(\n `The project does not exist. Remove the ${local.LOCAL_SAVE_FILENAME} file and try again.`\n );\n } else {\n ctx.logger.error(e.response.data);\n }\n } else {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n }\n\n ctx.logger.debug(e);\n } finally {\n await fse.remove(tarFilePath);\n }\n process.exit(0);\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n}\n\nasync function getProject(ctx: CLIContext) {\n const { project } = await local.retrieve();\n if (!project) {\n try {\n return await createProjectAction(ctx);\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n }\n return project;\n}\n\nexport default async (ctx: CLIContext) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const cloudApiService = await cloudApiFactory(ctx);\n const token = await getValidToken();\n\n if (!token) {\n return;\n }\n\n const project = await getProject(ctx);\n\n if (!project) {\n return;\n }\n\n try {\n await cloudApiService.track('willDeployWithCLI', { projectInternalName: project.name });\n } catch (e) {\n ctx.logger.debug('Failed to track willDeploy', e);\n }\n\n const notificationService = notificationServiceFactory(ctx);\n const buildLogsService = buildLogsServiceFactory(ctx);\n\n const { data: cliConfig } = await cloudApiService.config();\n\n let maxSize: number = parseInt(cliConfig.maxProjectFileSize, 10);\n if (Number.isNaN(maxSize)) {\n ctx.logger.debug(\n 'An error occurred while parsing the maxProjectFileSize. Using default value.'\n );\n maxSize = 100000000;\n }\n\n const buildId = await upload(ctx, project, token, maxSize);\n\n if (!buildId) {\n return;\n }\n\n try {\n notificationService(`${apiConfig.apiBaseUrl}/notifications`, token, cliConfig);\n await buildLogsService(`${apiConfig.apiBaseUrl}/v1/logs/${buildId}`, token, cliConfig);\n\n ctx.logger.log(\n 'Visit the following URL for deployment logs. Your deployment will be available here shortly.'\n );\n ctx.logger.log(\n chalk.underline(`${apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`)\n );\n } catch (e: Error | unknown) {\n if (e instanceof Error) {\n ctx.logger.error(e.message);\n } else {\n throw e;\n }\n }\n};\n","import chalk from 'chalk';\nimport { has } from 'lodash/fp';\n\n// TODO: Remove duplicated code by extracting to a shared package\n\nconst assertCwdContainsStrapiProject = (name: string) => {\n const logErrorAndExit = () => {\n console.log(\n `You need to run ${chalk.yellow(\n `strapi ${name}`\n )} in a Strapi project. Make sure you are in the right directory.`\n );\n process.exit(1);\n };\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const pkgJSON = require(`${process.cwd()}/package.json`);\n if (\n !has('dependencies.@strapi/strapi', pkgJSON) &&\n !has('devDependencies.@strapi/strapi', pkgJSON)\n ) {\n logErrorAndExit();\n }\n } catch (err) {\n logErrorAndExit();\n }\n};\n\nconst runAction =\n (name: string, action: (...args: any[]) => Promise<unknown>) =>\n (...args: unknown[]) => {\n assertCwdContainsStrapiProject(name);\n\n Promise.resolve()\n .then(() => {\n return action(...args);\n })\n .catch((error) => {\n console.error(error);\n process.exit(1);\n });\n };\n\nexport { runAction };\n","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ deploy project to the cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:deploy')\n .alias('deploy')\n .description('Deploy a Strapi Cloud project')\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('deploy', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n name: 'deploy-project',\n description: 'Deploy a Strapi Cloud project',\n action,\n command,\n} as StrapiCloudCommandInfo;\n","import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\n\nconst openModule = import('open');\n\nexport default async (ctx: CLIContext): Promise<boolean> => {\n const { logger } = ctx;\n const tokenService = await tokenServiceFactory(ctx);\n const existingToken = await tokenService.retrieveToken();\n const cloudApiService = await cloudApiFactory(ctx, existingToken || undefined);\n\n const trackFailedLogin = async () => {\n try {\n await cloudApiService.track('didNotLogin', { loginMethod: 'cli' });\n } catch (e) {\n logger.debug('Failed to track failed login', e);\n }\n };\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 // If the token is invalid and request failed, we should proceed with the login process\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\n try {\n await cloudApiService.track('willLoginAttempt', {});\n } catch (e) {\n logger.debug('Failed to track login attempt', e);\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 trackFailedLogin();\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 trackFailedLogin();\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 try {\n await cloudApiService.track('didLogin', { loginMethod: 'cli' });\n } catch (e) {\n logger.debug('Failed to track login', e);\n }\n };\n\n await authenticate();\n return isAuthenticated;\n};\n","import type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow login`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:login')\n .alias('login')\n .description('Strapi Cloud Login')\n .addHelpText(\n 'after',\n '\\nAfter running this command, you will be prompted to enter your authentication information.'\n )\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('login', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n name: 'login',\n description: 'Strapi Cloud Login',\n action,\n command,\n} as StrapiCloudCommandInfo;\n","import type { CLIContext } from '../types';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\n\nconst openModule = import('open');\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { retrieveToken, eraseToken } = await tokenServiceFactory(ctx);\n\n const token = await retrieveToken();\n if (!token) {\n logger.log(\"You're already logged out.\");\n return;\n }\n const cloudApiService = await cloudApiFactory(ctx, token);\n const config = await cloudApiService.config();\n const cliConfig = config.data;\n\n try {\n await eraseToken();\n\n openModule.then((open) => {\n open\n .default(\n `${cliConfig.baseUrl}/oidc/logout?client_id=${encodeURIComponent(\n cliConfig.clientId\n )}&logout_hint=${encodeURIComponent(token)}\n `\n )\n .catch((e: Error) => {\n // Failing to open the logout URL is not a critical error, so we just log it\n logger.debug(e.message, e);\n });\n });\n\n logger.log(\n '🔌 You have been logged out from the CLI. If you are on a shared computer, please make sure to log out from the Strapi Cloud Dashboard as well.'\n );\n } catch (e) {\n logger.error('🥲 Oops! Something went wrong while logging you out. Please try again.');\n logger.debug(e);\n }\n try {\n await cloudApiService.track('didLogout', { loginMethod: 'cli' });\n } catch (e) {\n logger.debug('Failed to track logout event', e);\n }\n};\n","import type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow logout`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:logout')\n .alias('logout')\n .description('Strapi Cloud Logout')\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('logout', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\n\nexport { action, command };\n\nexport default {\n name: 'logout',\n description: 'Strapi Cloud Logout',\n action,\n command,\n};\n","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ create project in Strapi cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n command\n .command('cloud:create-project')\n .description('Create a Strapi Cloud project')\n .option('-d, --debug', 'Enable debugging mode with verbose logs')\n .option('-s, --silent', \"Don't log anything\")\n .action(() => runAction('cloud:create-project', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n name: 'create-project',\n description: 'Create a new project',\n action,\n command,\n} as StrapiCloudCommandInfo;\n","import { Command } from 'commander';\nimport crypto from 'crypto';\nimport deployProject from './deploy-project';\nimport login from './login';\nimport logout from './logout';\nimport createProject from './create-project';\nimport { CLIContext } from './types';\nimport { getLocalConfig, saveLocalConfig } from './config/local';\n\nexport const cli = {\n deployProject,\n login,\n logout,\n createProject,\n};\n\nconst cloudCommands = [deployProject, login, logout];\n\nasync function initCloudCLIConfig() {\n const localConfig = await getLocalConfig();\n\n if (!localConfig.deviceId) {\n localConfig.deviceId = 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 await cloudCommand.command({ command, ctx, argv });\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":["path","name","local.save","cliConfig","value","fs","url","packageJson","local.LOCAL_SAVE_FILENAME","local.retrieve","createProjectAction","action","command","openModule","crypto"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/logout/action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/logout/action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;8BAKhB,UAAU;AAArC,wBA0CE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type AxiosResponse } from 'axios';
|
|
2
|
-
import type { CloudCliConfig } from '../types';
|
|
2
|
+
import type { CLIContext, CloudCliConfig } from '../types';
|
|
3
3
|
export declare const VERSION = "v1";
|
|
4
4
|
export type ProjectInfos = {
|
|
5
5
|
name: string;
|
|
@@ -35,5 +35,7 @@ export interface CloudApiService {
|
|
|
35
35
|
listProjects(): Promise<AxiosResponse<ProjectInfos[]>>;
|
|
36
36
|
track(event: string, payload?: TrackPayload): Promise<AxiosResponse<void>>;
|
|
37
37
|
}
|
|
38
|
-
export declare function cloudApiFactory(
|
|
38
|
+
export declare function cloudApiFactory({ logger }: {
|
|
39
|
+
logger: CLIContext['logger'];
|
|
40
|
+
}, token?: string): Promise<CloudApiService>;
|
|
39
41
|
//# sourceMappingURL=cli-api.d.ts.map
|
|
@@ -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,cAAc,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,MAAM,UAAU,CAAC;AAK3D,eAAO,MAAM,OAAO,OAAO,CAAC;AAE5B,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AACF,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AAEpD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,MAAM,CACJ,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3B,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,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC;QACjD,IAAI,EAAE,YAAY,CAAC;QACnB,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,YAAY,EAAE,CAAC,CAAC,CAAC;IAEvD,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,CAwF1B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/cloud-cli",
|
|
3
|
-
"version": "0.0.0-next.
|
|
3
|
+
"version": "0.0.0-next.af9f5eed766381838931b23118affc1c765c5d88",
|
|
4
4
|
"description": "Commands to interact with the Strapi Cloud",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"strapi",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"watch": "pack-up watch"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@strapi/utils": "0.0.0-next.
|
|
47
|
+
"@strapi/utils": "0.0.0-next.af9f5eed766381838931b23118affc1c765c5d88",
|
|
48
48
|
"axios": "1.6.0",
|
|
49
49
|
"chalk": "4.1.2",
|
|
50
50
|
"cli-progress": "3.12.0",
|
|
@@ -69,12 +69,12 @@
|
|
|
69
69
|
"@types/cli-progress": "3.11.5",
|
|
70
70
|
"@types/eventsource": "1.1.15",
|
|
71
71
|
"@types/lodash": "^4.14.191",
|
|
72
|
-
"eslint-config-custom": "0.0.0-next.
|
|
73
|
-
"tsconfig": "0.0.0-next.
|
|
72
|
+
"eslint-config-custom": "0.0.0-next.af9f5eed766381838931b23118affc1c765c5d88",
|
|
73
|
+
"tsconfig": "0.0.0-next.af9f5eed766381838931b23118affc1c765c5d88"
|
|
74
74
|
},
|
|
75
75
|
"engines": {
|
|
76
76
|
"node": ">=18.0.0 <=20.x.x",
|
|
77
77
|
"npm": ">=6.0.0"
|
|
78
78
|
},
|
|
79
|
-
"gitHead": "
|
|
79
|
+
"gitHead": "af9f5eed766381838931b23118affc1c765c5d88"
|
|
80
80
|
}
|