node_modules ignore

This commit is contained in:
oier committed 2025-05-08 23:43:47 +02:00
1 parent e19d52f172
commit 4574544c9f
65041 files changed
+10593536

No files matched your search

+4
View File
@@ -0,0 +1,4 @@
import { CLIContext, type CloudCliConfig } from '../types';
declare const buildLogsServiceFactory: ({ logger }: CLIContext) => (url: string, token: string, cliConfig: CloudCliConfig) => Promise<unknown>;
export { buildLogsServiceFactory };
//# sourceMappingURL=build-logs.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"build-logs.d.ts","sourceRoot":"","sources":["../../src/services/build-logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAE3D,QAAA,MAAM,uBAAuB,eAAgB,UAAU,WAClC,MAAM,SAAS,MAAM,aAAa,cAAc,qBAqEpE,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
+67
View File
@@ -0,0 +1,67 @@
'use strict';
var EventSource = require('eventsource');
const buildLogsServiceFactory = ({ logger })=>{
return async (url, token, cliConfig)=>{
const CONN_TIMEOUT = Number(cliConfig.buildLogsConnectionTimeout);
const MAX_RETRIES = Number(cliConfig.buildLogsMaxRetries);
return new Promise((resolve, reject)=>{
let timeoutId = null;
let retries = 0;
const connect = (url)=>{
const spinner = logger.spinner('Connecting to server to get build logs');
spinner.start();
const es = new EventSource(`${url}`, {
headers: {
Authorization: `Bearer ${token}`
}
});
const clearExistingTimeout = ()=>{
if (timeoutId) {
clearTimeout(timeoutId);
}
};
const resetTimeout = ()=>{
clearExistingTimeout();
timeoutId = setTimeout(()=>{
if (spinner.isSpinning) {
spinner.fail('We were unable to connect to the server to get build logs at this time. This could be due to a temporary issue.');
}
es.close();
reject(new Error('Connection timed out'));
}, CONN_TIMEOUT);
};
es.onopen = resetTimeout;
es.addEventListener('finished', (event)=>{
const data = JSON.parse(event.data);
logger.log(data.msg);
es.close();
clearExistingTimeout();
resolve(null);
});
es.addEventListener('log', (event)=>{
if (spinner.isSpinning) {
spinner.succeed();
}
resetTimeout();
const data = JSON.parse(event.data);
logger.log(data.msg);
});
es.onerror = async ()=>{
retries += 1;
if (retries > MAX_RETRIES) {
spinner.fail('We were unable to connect to the server to get build logs at this time.');
es.close();
clearExistingTimeout(); // Important to clear the event loop from remaining timeout - avoid to wait for nothing while the timeout is running
reject(new Error('Max retries reached'));
}
};
};
connect(url);
});
};
};
exports.buildLogsServiceFactory = buildLogsServiceFactory;
//# sourceMappingURL=build-logs.js.map
@@ -0,0 +1 @@
{"version":3,"file":"build-logs.js","sources":["../../src/services/build-logs.ts"],"sourcesContent":["import EventSource from 'eventsource';\nimport { CLIContext, type CloudCliConfig } from '../types';\n\nconst buildLogsServiceFactory = ({ logger }: CLIContext) => {\n return async (url: string, token: string, cliConfig: CloudCliConfig) => {\n const CONN_TIMEOUT = Number(cliConfig.buildLogsConnectionTimeout);\n const MAX_RETRIES = Number(cliConfig.buildLogsMaxRetries);\n\n return new Promise((resolve, reject) => {\n let timeoutId: NodeJS.Timeout | null = null;\n let retries = 0;\n\n const connect = (url: string) => {\n const 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 clearExistingTimeout(); // Important to clear the event loop from remaining timeout - avoid to wait for nothing while the timeout is running\n reject(new Error('Max retries reached'));\n }\n };\n };\n\n connect(url);\n });\n };\n};\n\nexport { buildLogsServiceFactory };\n"],"names":["buildLogsServiceFactory","logger","url","token","cliConfig","CONN_TIMEOUT","Number","buildLogsConnectionTimeout","MAX_RETRIES","buildLogsMaxRetries","Promise","resolve","reject","timeoutId","retries","connect","spinner","start","es","EventSource","headers","Authorization","clearExistingTimeout","clearTimeout","resetTimeout","setTimeout","isSpinning","fail","close","Error","onopen","addEventListener","event","data","JSON","parse","log","msg","succeed","onerror"],"mappings":";;;;AAGA,MAAMA,uBAA0B,GAAA,CAAC,EAAEC,MAAM,EAAc,GAAA;IACrD,OAAO,OAAOC,KAAaC,KAAeC,EAAAA,SAAAA,GAAAA;QACxC,MAAMC,YAAAA,GAAeC,MAAOF,CAAAA,SAAAA,CAAUG,0BAA0B,CAAA;QAChE,MAAMC,WAAAA,GAAcF,MAAOF,CAAAA,SAAAA,CAAUK,mBAAmB,CAAA;QAExD,OAAO,IAAIC,OAAQ,CAAA,CAACC,OAASC,EAAAA,MAAAA,GAAAA;AAC3B,YAAA,IAAIC,SAAmC,GAAA,IAAA;AACvC,YAAA,IAAIC,OAAU,GAAA,CAAA;AAEd,YAAA,MAAMC,UAAU,CAACb,GAAAA,GAAAA;gBACf,MAAMc,OAAAA,GAAUf,MAAOe,CAAAA,OAAO,CAAC,wCAAA,CAAA;AAC/BA,gBAAAA,OAAAA,CAAQC,KAAK,EAAA;AACb,gBAAA,MAAMC,KAAK,IAAIC,WAAAA,CAAY,CAAC,EAAEjB,GAAAA,CAAI,CAAC,EAAE;oBACnCkB,OAAS,EAAA;AACPC,wBAAAA,aAAAA,EAAe,CAAC,OAAO,EAAElB,KAAAA,CAAM;AACjC;AACF,iBAAA,CAAA;AAEA,gBAAA,MAAMmB,oBAAuB,GAAA,IAAA;AAC3B,oBAAA,IAAIT,SAAW,EAAA;wBACbU,YAAaV,CAAAA,SAAAA,CAAAA;AACf;AACF,iBAAA;AAEA,gBAAA,MAAMW,YAAe,GAAA,IAAA;AACnBF,oBAAAA,oBAAAA,EAAAA;AACAT,oBAAAA,SAAAA,GAAYY,UAAW,CAAA,IAAA;wBACrB,IAAIT,OAAAA,CAAQU,UAAU,EAAE;AACtBV,4BAAAA,OAAAA,CAAQW,IAAI,CACV,iHAAA,CAAA;AAEJ;AACAT,wBAAAA,EAAAA,CAAGU,KAAK,EAAA;AACRhB,wBAAAA,MAAAA,CAAO,IAAIiB,KAAM,CAAA,sBAAA,CAAA,CAAA;qBAChBxB,EAAAA,YAAAA,CAAAA;AACL,iBAAA;AAEAa,gBAAAA,EAAAA,CAAGY,MAAM,GAAGN,YAAAA;gBAEZN,EAAGa,CAAAA,gBAAgB,CAAC,UAAA,EAAY,CAACC,KAAAA,GAAAA;AAC/B,oBAAA,MAAMC,IAAOC,GAAAA,IAAAA,CAAKC,KAAK,CAACH,MAAMC,IAAI,CAAA;oBAClChC,MAAOmC,CAAAA,GAAG,CAACH,IAAAA,CAAKI,GAAG,CAAA;AACnBnB,oBAAAA,EAAAA,CAAGU,KAAK,EAAA;AACRN,oBAAAA,oBAAAA,EAAAA;oBACAX,OAAQ,CAAA,IAAA,CAAA;AACV,iBAAA,CAAA;gBAEAO,EAAGa,CAAAA,gBAAgB,CAAC,KAAA,EAAO,CAACC,KAAAA,GAAAA;oBAC1B,IAAIhB,OAAAA,CAAQU,UAAU,EAAE;AACtBV,wBAAAA,OAAAA,CAAQsB,OAAO,EAAA;AACjB;AACAd,oBAAAA,YAAAA,EAAAA;AACA,oBAAA,MAAMS,IAAOC,GAAAA,IAAAA,CAAKC,KAAK,CAACH,MAAMC,IAAI,CAAA;oBAClChC,MAAOmC,CAAAA,GAAG,CAACH,IAAAA,CAAKI,GAAG,CAAA;AACrB,iBAAA,CAAA;AAEAnB,gBAAAA,EAAAA,CAAGqB,OAAO,GAAG,UAAA;oBACXzB,OAAW,IAAA,CAAA;AACX,oBAAA,IAAIA,UAAUN,WAAa,EAAA;AACzBQ,wBAAAA,OAAAA,CAAQW,IAAI,CAAC,yEAAA,CAAA;AACbT,wBAAAA,EAAAA,CAAGU,KAAK,EAAA;AACRN,wBAAAA,oBAAAA,EAAAA,CAAAA;AACLine truncated
+65
View File
@@ -0,0 +1,65 @@
import EventSource from 'eventsource';
const buildLogsServiceFactory = ({ logger })=>{
return async (url, token, cliConfig)=>{
const CONN_TIMEOUT = Number(cliConfig.buildLogsConnectionTimeout);
const MAX_RETRIES = Number(cliConfig.buildLogsMaxRetries);
return new Promise((resolve, reject)=>{
let timeoutId = null;
let retries = 0;
const connect = (url)=>{
const spinner = logger.spinner('Connecting to server to get build logs');
spinner.start();
const es = new EventSource(`${url}`, {
headers: {
Authorization: `Bearer ${token}`
}
});
const clearExistingTimeout = ()=>{
if (timeoutId) {
clearTimeout(timeoutId);
}
};
const resetTimeout = ()=>{
clearExistingTimeout();
timeoutId = setTimeout(()=>{
if (spinner.isSpinning) {
spinner.fail('We were unable to connect to the server to get build logs at this time. This could be due to a temporary issue.');
}
es.close();
reject(new Error('Connection timed out'));
}, CONN_TIMEOUT);
};
es.onopen = resetTimeout;
es.addEventListener('finished', (event)=>{
const data = JSON.parse(event.data);
logger.log(data.msg);
es.close();
clearExistingTimeout();
resolve(null);
});
es.addEventListener('log', (event)=>{
if (spinner.isSpinning) {
spinner.succeed();
}
resetTimeout();
const data = JSON.parse(event.data);
logger.log(data.msg);
});
es.onerror = async ()=>{
retries += 1;
if (retries > MAX_RETRIES) {
spinner.fail('We were unable to connect to the server to get build logs at this time.');
es.close();
clearExistingTimeout(); // Important to clear the event loop from remaining timeout - avoid to wait for nothing while the timeout is running
reject(new Error('Max retries reached'));
}
};
};
connect(url);
});
};
};
export { buildLogsServiceFactory };
//# sourceMappingURL=build-logs.mjs.map
@@ -0,0 +1 @@
{"version":3,"file":"build-logs.mjs","sources":["../../src/services/build-logs.ts"],"sourcesContent":["import EventSource from 'eventsource';\nimport { CLIContext, type CloudCliConfig } from '../types';\n\nconst buildLogsServiceFactory = ({ logger }: CLIContext) => {\n return async (url: string, token: string, cliConfig: CloudCliConfig) => {\n const CONN_TIMEOUT = Number(cliConfig.buildLogsConnectionTimeout);\n const MAX_RETRIES = Number(cliConfig.buildLogsMaxRetries);\n\n return new Promise((resolve, reject) => {\n let timeoutId: NodeJS.Timeout | null = null;\n let retries = 0;\n\n const connect = (url: string) => {\n const 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 clearExistingTimeout(); // Important to clear the event loop from remaining timeout - avoid to wait for nothing while the timeout is running\n reject(new Error('Max retries reached'));\n }\n };\n };\n\n connect(url);\n });\n };\n};\n\nexport { buildLogsServiceFactory };\n"],"names":["buildLogsServiceFactory","logger","url","token","cliConfig","CONN_TIMEOUT","Number","buildLogsConnectionTimeout","MAX_RETRIES","buildLogsMaxRetries","Promise","resolve","reject","timeoutId","retries","connect","spinner","start","es","EventSource","headers","Authorization","clearExistingTimeout","clearTimeout","resetTimeout","setTimeout","isSpinning","fail","close","Error","onopen","addEventListener","event","data","JSON","parse","log","msg","succeed","onerror"],"mappings":";;AAGA,MAAMA,uBAA0B,GAAA,CAAC,EAAEC,MAAM,EAAc,GAAA;IACrD,OAAO,OAAOC,KAAaC,KAAeC,EAAAA,SAAAA,GAAAA;QACxC,MAAMC,YAAAA,GAAeC,MAAOF,CAAAA,SAAAA,CAAUG,0BAA0B,CAAA;QAChE,MAAMC,WAAAA,GAAcF,MAAOF,CAAAA,SAAAA,CAAUK,mBAAmB,CAAA;QAExD,OAAO,IAAIC,OAAQ,CAAA,CAACC,OAASC,EAAAA,MAAAA,GAAAA;AAC3B,YAAA,IAAIC,SAAmC,GAAA,IAAA;AACvC,YAAA,IAAIC,OAAU,GAAA,CAAA;AAEd,YAAA,MAAMC,UAAU,CAACb,GAAAA,GAAAA;gBACf,MAAMc,OAAAA,GAAUf,MAAOe,CAAAA,OAAO,CAAC,wCAAA,CAAA;AAC/BA,gBAAAA,OAAAA,CAAQC,KAAK,EAAA;AACb,gBAAA,MAAMC,KAAK,IAAIC,WAAAA,CAAY,CAAC,EAAEjB,GAAAA,CAAI,CAAC,EAAE;oBACnCkB,OAAS,EAAA;AACPC,wBAAAA,aAAAA,EAAe,CAAC,OAAO,EAAElB,KAAAA,CAAM;AACjC;AACF,iBAAA,CAAA;AAEA,gBAAA,MAAMmB,oBAAuB,GAAA,IAAA;AAC3B,oBAAA,IAAIT,SAAW,EAAA;wBACbU,YAAaV,CAAAA,SAAAA,CAAAA;AACf;AACF,iBAAA;AAEA,gBAAA,MAAMW,YAAe,GAAA,IAAA;AACnBF,oBAAAA,oBAAAA,EAAAA;AACAT,oBAAAA,SAAAA,GAAYY,UAAW,CAAA,IAAA;wBACrB,IAAIT,OAAAA,CAAQU,UAAU,EAAE;AACtBV,4BAAAA,OAAAA,CAAQW,IAAI,CACV,iHAAA,CAAA;AAEJ;AACAT,wBAAAA,EAAAA,CAAGU,KAAK,EAAA;AACRhB,wBAAAA,MAAAA,CAAO,IAAIiB,KAAM,CAAA,sBAAA,CAAA,CAAA;qBAChBxB,EAAAA,YAAAA,CAAAA;AACL,iBAAA;AAEAa,gBAAAA,EAAAA,CAAGY,MAAM,GAAGN,YAAAA;gBAEZN,EAAGa,CAAAA,gBAAgB,CAAC,UAAA,EAAY,CAACC,KAAAA,GAAAA;AAC/B,oBAAA,MAAMC,IAAOC,GAAAA,IAAAA,CAAKC,KAAK,CAACH,MAAMC,IAAI,CAAA;oBAClChC,MAAOmC,CAAAA,GAAG,CAACH,IAAAA,CAAKI,GAAG,CAAA;AACnBnB,oBAAAA,EAAAA,CAAGU,KAAK,EAAA;AACRN,oBAAAA,oBAAAA,EAAAA;oBACAX,OAAQ,CAAA,IAAA,CAAA;AACV,iBAAA,CAAA;gBAEAO,EAAGa,CAAAA,gBAAgB,CAAC,KAAA,EAAO,CAACC,KAAAA,GAAAA;oBAC1B,IAAIhB,OAAAA,CAAQU,UAAU,EAAE;AACtBV,wBAAAA,OAAAA,CAAQsB,OAAO,EAAA;AACjB;AACAd,oBAAAA,YAAAA,EAAAA;AACA,oBAAA,MAAMS,IAAOC,GAAAA,IAAAA,CAAKC,KAAK,CAACH,MAAMC,IAAI,CAAA;oBAClChC,MAAOmC,CAAAA,GAAG,CAACH,IAAAA,CAAKI,GAAG,CAAA;AACrB,iBAAA,CAAA;AAEAnB,gBAAAA,EAAAA,CAAGqB,OAAO,GAAG,UAAA;oBACXzB,OAAW,IAAA,CAAA;AACX,oBAAA,IAAIA,UAAUN,WAAa,EAAA;AACzBQ,wBAAAA,OAAAA,CAAQW,IAAI,CAAC,yEAAA,CAAA;AACbT,wBAAAA,EAAAA,CAAGU,KAAK,EAAA;AACRN,wBAAAA,oBAAAA,EAAAA,CAAAA;AACALine truncated
+96
View File
@@ -0,0 +1,96 @@
import { type AxiosResponse } from 'axios';
import type { CLIContext, CloudCliConfig, TrackPayload } from '../types';
export declare const VERSION = "v1";
export type ProjectInfo = {
id: string;
name: string;
targetEnvironment?: string;
displayName?: string;
nodeVersion?: string;
region?: string;
plan?: string;
url?: string;
};
export type EnvironmentInfo = Record<string, unknown>;
export type EnvironmentDetails = {
name: string;
hasLiveDeployment: boolean;
hasPendingDeployment: boolean;
};
export type ProjectInput = Omit<ProjectInfo, 'id'>;
export type DeployResponse = {
build_id: string;
image: string;
};
export type ListProjectsResponse = {
data: {
data: string;
};
};
export type ListEnvironmentsResponse = {
data: {
data: EnvironmentInfo[] | Record<string, never>;
};
};
export type ListLinkProjectsResponse = {
data: {
data: ProjectInfo[] | Record<string, never>;
};
};
export type ListLinkEnvironmentsResponse = {
data: {
data: EnvironmentDetails[] | Record<string, never>;
};
};
export type GetProjectResponse = {
data: {
displayName: string;
updatedAt: string;
suspendedAt?: string;
isTrial: boolean;
environments: string[];
environmentsDetails: EnvironmentDetails[];
};
metadata: {
dashboardUrls: {
project: string;
deployments: string;
};
};
};
export interface CloudApiService {
deploy(deployInput: {
filePath: string;
project: {
name: string;
targetEnvironment?: string;
};
}, { onUploadProgress, }: {
onUploadProgress: (progressEvent: {
loaded: number;
total?: number;
}) => void;
}): Promise<AxiosResponse<DeployResponse>>;
createProject(createProjectInput: ProjectInput): Promise<{
data: ProjectInput;
status: number;
}>;
getUserInfo(): Promise<AxiosResponse>;
config(): Promise<AxiosResponse<CloudCliConfig>>;
listProjects(): Promise<AxiosResponse<ListProjectsResponse>>;
listLinkProjects(): Promise<AxiosResponse<ListLinkProjectsResponse>>;
listEnvironments(project: {
name: string;
}): Promise<AxiosResponse<ListEnvironmentsResponse>>;
listLinkEnvironments(project: {
name: string;
}): Promise<AxiosResponse<ListLinkEnvironmentsResponse>>;
getProject(project: {
name: string;
}): Promise<AxiosResponse<GetProjectResponse>>;
track(event: string, payload?: TrackPayload): Promise<AxiosResponse<void>>;
}
export declare function cloudApiFactory({ logger }: {
logger: CLIContext['logger'];
}, token?: string): Promise<CloudApiService>;
//# sourceMappingURL=cli-api.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"cli-api.d.ts","sourceRoot":"","sources":["../../src/services/cli-api.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAIlD,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKzE,eAAO,MAAM,OAAO,OAAO,CAAC;AAE5B,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KACjD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KAC7C,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KACpD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;KAC3C,CAAC;IACF,QAAQ,EAAE;QACR,aAAa,EAAE;YACb,OAAO,EAAE,MAAM,CAAC;YAChB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,MAAM,CACJ,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACvD,EACD,EACE,gBAAgB,GACjB,EAAE;QACD,gBAAgB,EAAE,CAAC,aAAa,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;KAC/E,GACA,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;IAE1C,aAAa,CAAC,kBAAkB,EAAE,YAAY,GAAG,OAAO,CAAC;QACvD,IAAI,EAAE,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,oBAAoB,CAAC,CAAC,CAAC;IAE7D,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAErE,gBAAgB,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAE9F,oBAAoB,CAAC,OAAO,EAAE;QAC5B,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,aAAa,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAEzD,UAAU,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAElF,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,CAyK1B"}
+146
View File
@@ -0,0 +1,146 @@
'use strict';
var axios = require('axios');
var fse = require('fs-extra');
var os = require('os');
var api = require('../config/api.js');
var local = require('../config/local.js');
var _package = require('../package.json.js');
const VERSION = 'v1';
async function cloudApiFactory({ logger }, token) {
const localConfig = await local.getLocalConfig();
const customHeaders = {
'x-device-id': localConfig.installId,
'x-app-version': _package.default.version,
'x-os-name': os.type(),
'x-os-version': os.version(),
'x-language': Intl.DateTimeFormat().resolvedOptions().locale,
'x-node-version': process.versions.node
};
const axiosCloudAPI = axios.create({
baseURL: `${api.apiConfig.apiBaseUrl}/${VERSION}`,
headers: {
'Content-Type': 'application/json',
...customHeaders
}
});
if (token) {
axiosCloudAPI.defaults.headers.Authorization = `Bearer ${token}`;
}
return {
deploy ({ filePath, project }, { onUploadProgress }) {
return axiosCloudAPI.post(`/deploy/${project.name}`, {
file: fse.createReadStream(filePath),
targetEnvironment: project.targetEnvironment
}, {
headers: {
'Content-Type': 'multipart/form-data'
},
onUploadProgress
});
},
async createProject ({ name, nodeVersion, region, plan }) {
const response = await axiosCloudAPI.post('/project', {
projectName: name,
region,
nodeVersion,
plan
});
return {
data: {
id: response.data.id,
name: response.data.name,
nodeVersion: response.data.nodeVersion,
region: response.data.region
},
status: response.status
};
},
getUserInfo () {
return axiosCloudAPI.get('/user');
},
async config () {
try {
const response = await axiosCloudAPI.get('/config');
if (response.status !== 200) {
throw new Error('Error fetching cloud CLI config from the server.');
}
return response;
} catch (error) {
logger.debug("🥲 Oops! Couldn't retrieve the cloud CLI config from the server. Please try again.");
throw error;
}
},
async listProjects () {
try {
const response = await axiosCloudAPI.get('/projects');
if (response.status !== 200) {
throw new Error('Error fetching cloud projects from the server.');
}
return response;
} catch (error) {
logger.debug("🥲 Oops! Couldn't retrieve your project's list from the server. Please try again.");
throw error;
}
},
async listLinkProjects () {
try {
const response = await axiosCloudAPI.get('/projects-linkable');
if (response.status !== 200) {
throw new Error('Error fetching cloud projects from the server.');
}
return response;
} catch (error) {
logger.debug("🥲 Oops! Couldn't retrieve your project's list from the server. Please try again.");
throw error;
}
},
async listEnvironments ({ name }) {
try {
const response = await axiosCloudAPI.get(`/projects/${name}/environments`);
if (response.status !== 200) {
throw new Error('Error fetching cloud environments from the server.');
}
return response;
} catch (error) {
logger.debug("🥲 Oops! Couldn't retrieve your project's environments from the server. Please try again.");
throw error;
}
},
async listLinkEnvironments ({ name }) {
try {
const response = await axiosCloudAPI.get(`/projects/${name}/environments-linkable`);
if (response.status !== 200) {
throw new Error('Error fetching cloud environments from the server.');
}
return response;
} catch (error) {
logger.debug("🥲 Oops! Couldn't retrieve your project's environments from the server. Please try again.");
throw error;
}
},
async getProject ({ name }) {
try {
const response = await axiosCloudAPI.get(`/projects/${name}`);
if (response.status !== 200) {
throw new Error("Error fetching project's details.");
}
return response;
} catch (error) {
logger.debug("🥲 Oops! There was a problem retrieving your project's details. Please try again.");
throw error;
}
},
track (event, payload = {}) {
return axiosCloudAPI.post('/track', {
event,
payload
});
}
};
}
exports.VERSION = VERSION;
exports.cloudApiFactory = cloudApiFactory;
//# sourceMappingURL=cli-api.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"cli-api.js","sources":["../../src/services/cli-api.ts"],"sourcesContent":["import axios, { type AxiosResponse } from 'axios';\nimport fse from 'fs-extra';\nimport os from 'os';\nimport { apiConfig } from '../config/api';\nimport type { CLIContext, CloudCliConfig, TrackPayload } from '../types';\nimport { getLocalConfig } from '../config/local';\n\nimport packageJson from '../../package.json';\n\nexport const VERSION = 'v1';\n\nexport type ProjectInfo = {\n id: string;\n name: string;\n targetEnvironment?: string;\n displayName?: string;\n nodeVersion?: string;\n region?: string;\n plan?: string;\n url?: string;\n};\n\nexport type EnvironmentInfo = Record<string, unknown>;\n\nexport type EnvironmentDetails = {\n name: string;\n hasLiveDeployment: boolean;\n hasPendingDeployment: boolean;\n};\n\nexport type ProjectInput = Omit<ProjectInfo, 'id'>;\n\nexport type DeployResponse = {\n build_id: string;\n image: string;\n};\n\nexport type ListProjectsResponse = {\n data: {\n data: string;\n };\n};\n\nexport type ListEnvironmentsResponse = {\n data: {\n data: EnvironmentInfo[] | Record<string, never>;\n };\n};\n\nexport type ListLinkProjectsResponse = {\n data: {\n data: ProjectInfo[] | Record<string, never>;\n };\n};\n\nexport type ListLinkEnvironmentsResponse = {\n data: {\n data: EnvironmentDetails[] | Record<string, never>;\n };\n};\n\nexport type GetProjectResponse = {\n data: {\n displayName: string;\n updatedAt: string;\n suspendedAt?: string;\n isTrial: boolean;\n environments: string[];\n environmentsDetails: EnvironmentDetails[];\n };\n metadata: {\n dashboardUrls: {\n project: string;\n deployments: string;\n };\n };\n};\n\nexport interface CloudApiService {\n deploy(\n deployInput: {\n filePath: string;\n project: { name: string; targetEnvironment?: string };\n },\n {\n onUploadProgress,\n }: {\n onUploadProgress: (progressEvent: { loaded: number; total?: number }) => void;\n }\n ): Promise<AxiosResponse<DeployResponse>>;\n\n createProject(createProjectInput: ProjectInput): Promise<{\n data: ProjectInput;\n status: number;\n }>;\n\n getUserInfo(): Promise<AxiosResponse>;\n\n config(): Promise<AxiosResponse<CloudCliConfig>>;\n\n listProjects(): Promise<AxiosResponse<ListProjectsResponse>>;\n\n listLinkProjects(): Promise<AxiosResponse<ListLinkProjectsResponse>>;\n\n listEnvironments(project: { name: string }): Promise<AxiosResponse<ListEnvironmentsResponse>>;\n\n listLinkEnvironments(project: {\n name: string;\n }): Promise<AxiosResponse<ListLinkEnvironmentsResponse>>;\n\n getProject(project: { name: string }): Promise<AxiosResponse<GetProjectResponse>>;\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.installId,\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), targetEnvironment: project.targetEnvironment },\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 agLine truncated
+143
View File
@@ -0,0 +1,143 @@
import axios from 'axios';
import fse__default from 'fs-extra';
import os from 'os';
import { apiConfig } from '../config/api.mjs';
import { getLocalConfig } from '../config/local.mjs';
import packageJson from '../package.json.mjs';
const VERSION = 'v1';
async function cloudApiFactory({ logger }, token) {
const localConfig = await getLocalConfig();
const customHeaders = {
'x-device-id': localConfig.installId,
'x-app-version': packageJson.version,
'x-os-name': os.type(),
'x-os-version': os.version(),
'x-language': Intl.DateTimeFormat().resolvedOptions().locale,
'x-node-version': process.versions.node
};
const axiosCloudAPI = axios.create({
baseURL: `${apiConfig.apiBaseUrl}/${VERSION}`,
headers: {
'Content-Type': 'application/json',
...customHeaders
}
});
if (token) {
axiosCloudAPI.defaults.headers.Authorization = `Bearer ${token}`;
}
return {
deploy ({ filePath, project }, { onUploadProgress }) {
return axiosCloudAPI.post(`/deploy/${project.name}`, {
file: fse__default.createReadStream(filePath),
targetEnvironment: project.targetEnvironment
}, {
headers: {
'Content-Type': 'multipart/form-data'
},
onUploadProgress
});
},
async createProject ({ name, nodeVersion, region, plan }) {
const response = await axiosCloudAPI.post('/project', {
projectName: name,
region,
nodeVersion,
plan
});
return {
data: {
id: response.data.id,
name: response.data.name,
nodeVersion: response.data.nodeVersion,
region: response.data.region
},
status: response.status
};
},
getUserInfo () {
return axiosCloudAPI.get('/user');
},
async config () {
try {
const response = await axiosCloudAPI.get('/config');
if (response.status !== 200) {
throw new Error('Error fetching cloud CLI config from the server.');
}
return response;
} catch (error) {
logger.debug("🥲 Oops! Couldn't retrieve the cloud CLI config from the server. Please try again.");
throw error;
}
},
async listProjects () {
try {
const response = await axiosCloudAPI.get('/projects');
if (response.status !== 200) {
throw new Error('Error fetching cloud projects from the server.');
}
return response;
} catch (error) {
logger.debug("🥲 Oops! Couldn't retrieve your project's list from the server. Please try again.");
throw error;
}
},
async listLinkProjects () {
try {
const response = await axiosCloudAPI.get('/projects-linkable');
if (response.status !== 200) {
throw new Error('Error fetching cloud projects from the server.');
}
return response;
} catch (error) {
logger.debug("🥲 Oops! Couldn't retrieve your project's list from the server. Please try again.");
throw error;
}
},
async listEnvironments ({ name }) {
try {
const response = await axiosCloudAPI.get(`/projects/${name}/environments`);
if (response.status !== 200) {
throw new Error('Error fetching cloud environments from the server.');
}
return response;
} catch (error) {
logger.debug("🥲 Oops! Couldn't retrieve your project's environments from the server. Please try again.");
throw error;
}
},
async listLinkEnvironments ({ name }) {
try {
const response = await axiosCloudAPI.get(`/projects/${name}/environments-linkable`);
if (response.status !== 200) {
throw new Error('Error fetching cloud environments from the server.');
}
return response;
} catch (error) {
logger.debug("🥲 Oops! Couldn't retrieve your project's environments from the server. Please try again.");
throw error;
}
},
async getProject ({ name }) {
try {
const response = await axiosCloudAPI.get(`/projects/${name}`);
if (response.status !== 200) {
throw new Error("Error fetching project's details.");
}
return response;
} catch (error) {
logger.debug("🥲 Oops! There was a problem retrieving your project's details. Please try again.");
throw error;
}
},
track (event, payload = {}) {
return axiosCloudAPI.post('/track', {
event,
payload
});
}
};
}
export { VERSION, cloudApiFactory };
//# sourceMappingURL=cli-api.mjs.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"cli-api.mjs","sources":["../../src/services/cli-api.ts"],"sourcesContent":["import axios, { type AxiosResponse } from 'axios';\nimport fse from 'fs-extra';\nimport os from 'os';\nimport { apiConfig } from '../config/api';\nimport type { CLIContext, CloudCliConfig, TrackPayload } from '../types';\nimport { getLocalConfig } from '../config/local';\n\nimport packageJson from '../../package.json';\n\nexport const VERSION = 'v1';\n\nexport type ProjectInfo = {\n id: string;\n name: string;\n targetEnvironment?: string;\n displayName?: string;\n nodeVersion?: string;\n region?: string;\n plan?: string;\n url?: string;\n};\n\nexport type EnvironmentInfo = Record<string, unknown>;\n\nexport type EnvironmentDetails = {\n name: string;\n hasLiveDeployment: boolean;\n hasPendingDeployment: boolean;\n};\n\nexport type ProjectInput = Omit<ProjectInfo, 'id'>;\n\nexport type DeployResponse = {\n build_id: string;\n image: string;\n};\n\nexport type ListProjectsResponse = {\n data: {\n data: string;\n };\n};\n\nexport type ListEnvironmentsResponse = {\n data: {\n data: EnvironmentInfo[] | Record<string, never>;\n };\n};\n\nexport type ListLinkProjectsResponse = {\n data: {\n data: ProjectInfo[] | Record<string, never>;\n };\n};\n\nexport type ListLinkEnvironmentsResponse = {\n data: {\n data: EnvironmentDetails[] | Record<string, never>;\n };\n};\n\nexport type GetProjectResponse = {\n data: {\n displayName: string;\n updatedAt: string;\n suspendedAt?: string;\n isTrial: boolean;\n environments: string[];\n environmentsDetails: EnvironmentDetails[];\n };\n metadata: {\n dashboardUrls: {\n project: string;\n deployments: string;\n };\n };\n};\n\nexport interface CloudApiService {\n deploy(\n deployInput: {\n filePath: string;\n project: { name: string; targetEnvironment?: string };\n },\n {\n onUploadProgress,\n }: {\n onUploadProgress: (progressEvent: { loaded: number; total?: number }) => void;\n }\n ): Promise<AxiosResponse<DeployResponse>>;\n\n createProject(createProjectInput: ProjectInput): Promise<{\n data: ProjectInput;\n status: number;\n }>;\n\n getUserInfo(): Promise<AxiosResponse>;\n\n config(): Promise<AxiosResponse<CloudCliConfig>>;\n\n listProjects(): Promise<AxiosResponse<ListProjectsResponse>>;\n\n listLinkProjects(): Promise<AxiosResponse<ListLinkProjectsResponse>>;\n\n listEnvironments(project: { name: string }): Promise<AxiosResponse<ListEnvironmentsResponse>>;\n\n listLinkEnvironments(project: {\n name: string;\n }): Promise<AxiosResponse<ListLinkEnvironmentsResponse>>;\n\n getProject(project: { name: string }): Promise<AxiosResponse<GetProjectResponse>>;\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.installId,\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), targetEnvironment: project.targetEnvironment },\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 aLine truncated
+5
View File
@@ -0,0 +1,5 @@
export { cloudApiFactory } from './cli-api';
export * as local from './strapi-info-save';
export { tokenServiceFactory } from './token';
export { createLogger } from './logger';
//# sourceMappingURL=index.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
+14
View File
@@ -0,0 +1,14 @@
'use strict';
var cliApi = require('./cli-api.js');
var strapiInfoSave = require('./strapi-info-save.js');
var token = require('./token.js');
var logger = require('./logger.js');
exports.cloudApiFactory = cliApi.cloudApiFactory;
exports.local = strapiInfoSave;
exports.tokenServiceFactory = token.tokenServiceFactory;
exports.createLogger = logger.createLogger;
//# sourceMappingURL=index.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
+6
View File
@@ -0,0 +1,6 @@
export { cloudApiFactory } from './cli-api.mjs';
import * as strapiInfoSave from './strapi-info-save.mjs';
export { strapiInfoSave as local };
export { tokenServiceFactory } from './token.mjs';
export { createLogger } from './logger.mjs';
//# sourceMappingURL=index.mjs.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
+22
View File
@@ -0,0 +1,22 @@
import ora from 'ora';
import * as cliProgress from 'cli-progress';
export interface LoggerOptions {
silent?: boolean;
debug?: boolean;
timestamp?: boolean;
}
export interface Logger {
warnings: number;
errors: number;
debug: (...args: unknown[]) => void;
info: (...args: unknown[]) => void;
success: (...args: unknown[]) => void;
warn: (...args: unknown[]) => void;
error: (...args: unknown[]) => void;
log: (...args: unknown[]) => void;
spinner: (text: string) => Pick<ora.Ora, 'succeed' | 'fail' | 'start' | 'text' | 'isSpinning'>;
progressBar: (totalSize: number, text: string) => Pick<cliProgress.SingleBar, 'start' | 'stop' | 'update'>;
}
declare const createLogger: (options?: LoggerOptions) => Logger;
export { createLogger };
//# sourceMappingURL=logger.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/services/logger.ts"],"names":[],"mappings":"AAGA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACtC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC;IAC/F,WAAW,EAAE,CACX,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,KACT,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;CAC/D;AAMD,QAAA,MAAM,YAAY,aAAa,aAAa,KAAQ,MAqInD,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
+128
View File
@@ -0,0 +1,128 @@
'use strict';
var chalk = require('chalk');
var stringify = require('fast-safe-stringify');
var ora = require('ora');
var cliProgress = require('cli-progress');
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var cliProgress__namespace = /*#__PURE__*/_interopNamespaceDefault(cliProgress);
const stringifyArg = (arg)=>{
return typeof arg === 'object' ? stringify(arg) : arg;
};
const createLogger = (options = {})=>{
const { silent = false, debug = false, timestamp = true } = options;
const state = {
errors: 0,
warning: 0
};
return {
get warnings () {
return state.warning;
},
get errors () {
return state.errors;
},
async debug (...args) {
if (silent || !debug) {
return;
}
console.log(chalk.cyan(`[DEBUG]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args.map(stringifyArg));
},
info (...args) {
if (silent) {
return;
}
console.info(chalk.blue(`[INFO]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args.map(stringifyArg));
},
log (...args) {
if (silent) {
return;
}
console.info(chalk.blue(`${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args.map(stringifyArg));
},
success (...args) {
if (silent) {
return;
}
console.info(chalk.green(`[SUCCESS]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args.map(stringifyArg));
},
warn (...args) {
state.warning += 1;
if (silent) {
return;
}
console.warn(chalk.yellow(`[WARN]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args.map(stringifyArg));
},
error (...args) {
state.errors += 1;
if (silent) {
return;
}
console.error(chalk.red(`[ERROR]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args.map(stringifyArg));
},
// @ts-expect-error – returning a subpart of ora is fine because the types tell us what is what.
spinner (text) {
if (silent) {
return {
succeed () {
return this;
},
fail () {
return this;
},
start () {
return this;
},
text: '',
isSpinning: false
};
}
return ora(text);
},
progressBar (totalSize, text) {
if (silent) {
return {
start () {
return this;
},
stop () {
return this;
},
update () {
return this;
}
};
}
const progressBar = new cliProgress__namespace.SingleBar({
format: `${text ? `${text} |` : ''}${chalk.green('{bar}')}| {percentage}%`,
barCompleteChar: '\u2588',
barIncompleteChar: '\u2591',
hideCursor: true,
forceRedraw: true
});
progressBar.start(totalSize, 0);
return progressBar;
}
};
};
exports.createLogger = createLogger;
//# sourceMappingURL=logger.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"logger.js","sources":["../../src/services/logger.ts"],"sourcesContent":["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"],"names":["stringifyArg","arg","stringify","createLogger","options","silent","debug","timestamp","state","errors","warning","warnings","args","console","log","chalk","cyan","Date","toISOString","map","info","blue","success","green","warn","yellow","error","red","spinner","text","succeed","fail","start","isSpinning","ora","progressBar","totalSize","stop","update","cliProgress","SingleBar","format","barCompleteChar","barIncompleteChar","hideCursor","forceRedraw"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAMA,eAAe,CAACC,GAAAA,GAAAA;AACpB,IAAA,OAAO,OAAOA,GAAAA,KAAQ,QAAWC,GAAAA,SAAAA,CAAUD,GAAOA,CAAAA,GAAAA,GAAAA;AACpD,CAAA;AAEA,MAAME,YAAe,GAAA,CAACC,OAAyB,GAAA,EAAE,GAAA;IAC/C,MAAM,EAAEC,MAAS,GAAA,KAAK,EAAEC,KAAAA,GAAQ,KAAK,EAAEC,SAAAA,GAAY,IAAI,EAAE,GAAGH,OAAAA;AAE5D,IAAA,MAAMI,KAAQ,GAAA;QAAEC,MAAQ,EAAA,CAAA;QAAGC,OAAS,EAAA;AAAE,KAAA;IAEtC,OAAO;AACL,QAAA,IAAIC,QAAW,CAAA,GAAA;AACb,YAAA,OAAOH,MAAME,OAAO;AACtB,SAAA;AAEA,QAAA,IAAID,MAAS,CAAA,GAAA;AACX,YAAA,OAAOD,MAAMC,MAAM;AACrB,SAAA;QAEA,MAAMH,KAAAA,CAAAA,CAAM,GAAGM,IAAI,EAAA;YACjB,IAAIP,MAAAA,IAAU,CAACC,KLine truncated
+107
View File
@@ -0,0 +1,107 @@
import chalk from 'chalk';
import stringify from 'fast-safe-stringify';
import ora from 'ora';
import * as cliProgress from 'cli-progress';
const stringifyArg = (arg)=>{
return typeof arg === 'object' ? stringify(arg) : arg;
};
const createLogger = (options = {})=>{
const { silent = false, debug = false, timestamp = true } = options;
const state = {
errors: 0,
warning: 0
};
return {
get warnings () {
return state.warning;
},
get errors () {
return state.errors;
},
async debug (...args) {
if (silent || !debug) {
return;
}
console.log(chalk.cyan(`[DEBUG]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args.map(stringifyArg));
},
info (...args) {
if (silent) {
return;
}
console.info(chalk.blue(`[INFO]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args.map(stringifyArg));
},
log (...args) {
if (silent) {
return;
}
console.info(chalk.blue(`${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args.map(stringifyArg));
},
success (...args) {
if (silent) {
return;
}
console.info(chalk.green(`[SUCCESS]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args.map(stringifyArg));
},
warn (...args) {
state.warning += 1;
if (silent) {
return;
}
console.warn(chalk.yellow(`[WARN]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args.map(stringifyArg));
},
error (...args) {
state.errors += 1;
if (silent) {
return;
}
console.error(chalk.red(`[ERROR]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args.map(stringifyArg));
},
// @ts-expect-error – returning a subpart of ora is fine because the types tell us what is what.
spinner (text) {
if (silent) {
return {
succeed () {
return this;
},
fail () {
return this;
},
start () {
return this;
},
text: '',
isSpinning: false
};
}
return ora(text);
},
progressBar (totalSize, text) {
if (silent) {
return {
start () {
return this;
},
stop () {
return this;
},
update () {
return this;
}
};
}
const progressBar = new cliProgress.SingleBar({
format: `${text ? `${text} |` : ''}${chalk.green('{bar}')}| {percentage}%`,
barCompleteChar: '\u2588',
barIncompleteChar: '\u2591',
hideCursor: true,
forceRedraw: true
});
progressBar.start(totalSize, 0);
return progressBar;
}
};
};
export { createLogger };
//# sourceMappingURL=logger.mjs.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"logger.mjs","sources":["../../src/services/logger.ts"],"sourcesContent":["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"],"names":["stringifyArg","arg","stringify","createLogger","options","silent","debug","timestamp","state","errors","warning","warnings","args","console","log","chalk","cyan","Date","toISOString","map","info","blue","success","green","warn","yellow","error","red","spinner","text","succeed","fail","start","isSpinning","ora","progressBar","totalSize","stop","update","cliProgress","SingleBar","format","barCompleteChar","barIncompleteChar","hideCursor","forceRedraw"],"mappings":";;;;;AA4BA,MAAMA,eAAe,CAACC,GAAAA,GAAAA;AACpB,IAAA,OAAO,OAAOA,GAAAA,KAAQ,QAAWC,GAAAA,SAAAA,CAAUD,GAAOA,CAAAA,GAAAA,GAAAA;AACpD,CAAA;AAEA,MAAME,YAAe,GAAA,CAACC,OAAyB,GAAA,EAAE,GAAA;IAC/C,MAAM,EAAEC,MAAS,GAAA,KAAK,EAAEC,KAAAA,GAAQ,KAAK,EAAEC,SAAAA,GAAY,IAAI,EAAE,GAAGH,OAAAA;AAE5D,IAAA,MAAMI,KAAQ,GAAA;QAAEC,MAAQ,EAAA,CAAA;QAAGC,OAAS,EAAA;AAAE,KAAA;IAEtC,OAAO;AACL,QAAA,IAAIC,QAAW,CAAA,GAAA;AACb,YAAA,OAAOH,MAAME,OAAO;AACtB,SAAA;AAEA,QAAA,IAAID,MAAS,CAAA,GAAA;AACX,YAAA,OAAOD,MAAMC,MAAM;AACrB,SAAA;QAEA,MAAMH,KAAAA,CAAAA,CAAM,GAAGM,IAAI,EAAA;YACjB,IAAIP,MAAAA,IAAU,CAACC,KAAO,EAAA;AACpB,gBAAALine truncated
@@ -0,0 +1,3 @@
import type { CLIContext, CloudCliConfig } from '../types';
export declare function notificationServiceFactory({ logger }: CLIContext): (url: string, token: string, cliConfig: CloudCliConfig) => void;
//# sourceMappingURL=notification.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../src/services/notification.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAS3D,wBAAgB,0BAA0B,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,SAClD,MAAM,SAAS,MAAM,aAAa,cAAc,UAmC9D"}
+37
View File
@@ -0,0 +1,37 @@
'use strict';
var EventSource = require('eventsource');
function notificationServiceFactory({ logger }) {
return (url, token, cliConfig)=>{
const CONN_TIMEOUT = Number(cliConfig.notificationsConnectionTimeout);
const es = new EventSource(url, {
headers: {
Authorization: `Bearer ${token}`
}
});
let timeoutId;
const resetTimeout = ()=>{
clearTimeout(timeoutId);
timeoutId = setTimeout(()=>{
logger.log('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.');
es.close();
}, CONN_TIMEOUT); // 5 minutes
};
es.onopen = resetTimeout;
es.onmessage = (event)=>{
resetTimeout();
const data = JSON.parse(event.data);
if (data.message) {
logger.log(data.message);
}
// Close connection when a specific event is received
if (data.event === 'deploymentFinished' || data.event === 'deploymentFailed') {
es.close();
}
};
};
}
exports.notificationServiceFactory = notificationServiceFactory;
//# sourceMappingURL=notification.js.map
@@ -0,0 +1 @@
{"version":3,"file":"notification.js","sources":["../../src/services/notification.ts"],"sourcesContent":["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"],"names":["notificationServiceFactory","logger","url","token","cliConfig","CONN_TIMEOUT","Number","notificationsConnectionTimeout","es","EventSource","headers","Authorization","timeoutId","resetTimeout","clearTimeout","setTimeout","log","close","onopen","onmessage","event","data","JSON","parse","message"],"mappings":";;;;AAUO,SAASA,0BAAAA,CAA2B,EAAEC,MAAM,EAAc,EAAA;IAC/D,OAAO,CAACC,KAAaC,KAAeC,EAAAA,SAAAA,GAAAA;QAClC,MAAMC,YAAAA,GAAeC,MAAOF,CAAAA,SAAAA,CAAUG,8BAA8B,CAAA;QAEpE,MAAMC,EAAAA,GAAK,IAAIC,WAAAA,CAAYP,GAAK,EAAA;YAC9BQ,OAAS,EAAA;AACPC,gBAAAA,aAAAA,EAAe,CAAC,OAAO,EAAER,KAAAA,CAAM;AACjC;AACF,SAAA,CAAA;QACA,IAAIS,SAAAA;AAEJ,QAAA,MAAMC,YAAe,GAAA,IAAA;YACnBC,YAAaF,CAAAA,SAAAA,CAAAA;AACbA,YAAAA,SAAAA,GAAYG,UAAW,CAAA,IAAA;AACrBd,gBAAAA,MAAAA,CAAOe,GAAG,CACR,6HAAA,CAAA;AAEFR,gBAAAA,EAAAA,CAAGS,KAAK,EAAA;AACV,aAAA,EAAGZ;AACL,SAAA;AAEAG,QAAAA,EAAAA,CAAGU,MAAM,GAAGL,YAAAA;QACZL,EAAGW,CAAAA,SAAS,GAAG,CAACC,KAAAA,GAAAA;AACdP,YAAAA,YAAAA,EAAAA;AACA,YAAA,MAAMQ,IAAOC,GAAAA,IAAAA,CAAKC,KAAK,CAACH,MAAMC,IAAI,CAAA;YAElC,IAAIA,IAAAA,CAAKG,OAAO,EAAE;gBAChBvB,MAAOe,CAAAA,GAAG,CAACK,IAAAA,CAAKG,OAAO,CAAA;AACzB;;AAGA,YAAA,IAAIH,KAAKD,KAAK,KAAK,wBAAwBC,IAAKD,CAAAA,KAAK,KAAK,kBAAoB,EAAA;AAC5EZ,gBAAAA,EAAAA,CAAGS,KAAK,EAAA;AACV;AACF,SAAA;AACF,KAAA;AACF;;;;"}
+35
View File
@@ -0,0 +1,35 @@
import EventSource from 'eventsource';
function notificationServiceFactory({ logger }) {
return (url, token, cliConfig)=>{
const CONN_TIMEOUT = Number(cliConfig.notificationsConnectionTimeout);
const es = new EventSource(url, {
headers: {
Authorization: `Bearer ${token}`
}
});
let timeoutId;
const resetTimeout = ()=>{
clearTimeout(timeoutId);
timeoutId = setTimeout(()=>{
logger.log('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.');
es.close();
}, CONN_TIMEOUT); // 5 minutes
};
es.onopen = resetTimeout;
es.onmessage = (event)=>{
resetTimeout();
const data = JSON.parse(event.data);
if (data.message) {
logger.log(data.message);
}
// Close connection when a specific event is received
if (data.event === 'deploymentFinished' || data.event === 'deploymentFailed') {
es.close();
}
};
};
}
export { notificationServiceFactory };
//# sourceMappingURL=notification.mjs.map
@@ -0,0 +1 @@
{"version":3,"file":"notification.mjs","sources":["../../src/services/notification.ts"],"sourcesContent":["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"],"names":["notificationServiceFactory","logger","url","token","cliConfig","CONN_TIMEOUT","Number","notificationsConnectionTimeout","es","EventSource","headers","Authorization","timeoutId","resetTimeout","clearTimeout","setTimeout","log","close","onopen","onmessage","event","data","JSON","parse","message"],"mappings":";;AAUO,SAASA,0BAAAA,CAA2B,EAAEC,MAAM,EAAc,EAAA;IAC/D,OAAO,CAACC,KAAaC,KAAeC,EAAAA,SAAAA,GAAAA;QAClC,MAAMC,YAAAA,GAAeC,MAAOF,CAAAA,SAAAA,CAAUG,8BAA8B,CAAA;QAEpE,MAAMC,EAAAA,GAAK,IAAIC,WAAAA,CAAYP,GAAK,EAAA;YAC9BQ,OAAS,EAAA;AACPC,gBAAAA,aAAAA,EAAe,CAAC,OAAO,EAAER,KAAAA,CAAM;AACjC;AACF,SAAA,CAAA;QACA,IAAIS,SAAAA;AAEJ,QAAA,MAAMC,YAAe,GAAA,IAAA;YACnBC,YAAaF,CAAAA,SAAAA,CAAAA;AACbA,YAAAA,SAAAA,GAAYG,UAAW,CAAA,IAAA;AACrBd,gBAAAA,MAAAA,CAAOe,GAAG,CACR,6HAAA,CAAA;AAEFR,gBAAAA,EAAAA,CAAGS,KAAK,EAAA;AACV,aAAA,EAAGZ;AACL,SAAA;AAEAG,QAAAA,EAAAA,CAAGU,MAAM,GAAGL,YAAAA;QACZL,EAAGW,CAAAA,SAAS,GAAG,CAACC,KAAAA,GAAAA;AACdP,YAAAA,YAAAA,EAAAA;AACA,YAAA,MAAMQ,IAAOC,GAAAA,IAAAA,CAAKC,KAAK,CAACH,MAAMC,IAAI,CAAA;YAElC,IAAIA,IAAAA,CAAKG,OAAO,EAAE;gBAChBvB,MAAOe,CAAAA,GAAG,CAACK,IAAAA,CAAKG,OAAO,CAAA;AACzB;;AAGA,YAAA,IAAIH,KAAKD,KAAK,KAAK,wBAAwBC,IAAKD,CAAAA,KAAK,KAAK,kBAAoB,EAAA;AAC5EZ,gBAAAA,EAAAA,CAAGS,KAAK,EAAA;AACV;AACF,SAAA;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,25 @@
import type { ProjectInfo } from './cli-api';
export declare const LOCAL_SAVE_FILENAME = ".strapi-cloud.json";
export type LocalSave = {
project?: Omit<ProjectInfo, 'id'>;
};
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
export type LocalPatch = {
project?: DeepPartial<Omit<ProjectInfo, 'id'>>;
};
export declare function save(data: LocalSave, { directoryPath }?: {
directoryPath?: string;
}): Promise<void>;
export declare function retrieve({ directoryPath, }?: {
directoryPath?: string;
}): Promise<LocalSave>;
export declare function patch(patchData: LocalPatch, { directoryPath }?: {
directoryPath?: string;
}): Promise<void>;
export declare function deleteConfig({ directoryPath }?: {
directoryPath?: string;
}): Promise<void>;
export {};
//# sourceMappingURL=strapi-info-save.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"strapi-info-save.d.ts","sourceRoot":"","sources":["../../src/services/strapi-info-save.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,eAAO,MAAM,mBAAmB,uBAAuB,CAAC;AAExD,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;CACnC,CAAC;AAGF,KAAK,WAAW,CAAC,CAAC,IAAI;KACnB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAChE,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;CAChD,CAAC;AAKF,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,iBAK7F;AAED,wBAAsB,QAAQ,CAAC,EAC7B,aAAa,GACd,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAOtD;AAED,wBAAsB,KAAK,CACzB,SAAS,EAAE,UAAU,EACrB,EAAE,aAAa,EAAE,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,iBASnD;AAED,wBAAsB,YAAY,CAAC,EAAE,aAAa,EAAE,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,iBAMpF"}
@@ -0,0 +1,53 @@
'use strict';
var fse = require('fs-extra');
var path = require('path');
var lodash = require('lodash');
const LOCAL_SAVE_FILENAME = '.strapi-cloud.json';
const getFilePath = (directoryPath)=>path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);
async function save(data, { directoryPath } = {}) {
const pathToFile = getFilePath(directoryPath);
// Ensure the directory exists and creates it if not
await fse.ensureDir(path.dirname(pathToFile));
await fse.writeJson(pathToFile, data, {
encoding: 'utf8'
});
}
async function retrieve({ directoryPath } = {}) {
const pathToFile = getFilePath(directoryPath);
const pathExists = await fse.pathExists(pathToFile);
if (!pathExists) {
return {};
}
return fse.readJSON(pathToFile, {
encoding: 'utf8'
});
}
async function patch(patchData, { directoryPath } = {}) {
const pathToFile = getFilePath(directoryPath);
const existingData = await retrieve({
directoryPath
});
if (!existingData) {
throw new Error('No configuration data found to patch.');
}
const newData = lodash.merge(existingData, patchData);
await fse.writeJson(pathToFile, newData, {
encoding: 'utf8'
});
}
async function deleteConfig({ directoryPath } = {}) {
const pathToFile = getFilePath(directoryPath);
const pathExists = await fse.pathExists(pathToFile);
if (pathExists) {
await fse.remove(pathToFile);
}
}
exports.LOCAL_SAVE_FILENAME = LOCAL_SAVE_FILENAME;
exports.deleteConfig = deleteConfig;
exports.patch = patch;
exports.retrieve = retrieve;
exports.save = save;
//# sourceMappingURL=strapi-info-save.js.map
@@ -0,0 +1 @@
{"version":3,"file":"strapi-info-save.js","sources":["../../src/services/strapi-info-save.ts"],"sourcesContent":["import fse from 'fs-extra';\nimport path from 'path';\nimport { merge } from 'lodash';\nimport type { ProjectInfo } from './cli-api';\n\nexport const LOCAL_SAVE_FILENAME = '.strapi-cloud.json';\n\nexport type LocalSave = {\n project?: Omit<ProjectInfo, 'id'>;\n};\n\n// Utility type for making all properties optional recursively\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport type LocalPatch = {\n project?: DeepPartial<Omit<ProjectInfo, 'id'>>;\n};\n\nconst getFilePath = (directoryPath?: string): string =>\n path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n\nexport async function save(data: LocalSave, { directoryPath }: { directoryPath?: string } = {}) {\n const pathToFile = getFilePath(directoryPath);\n // Ensure the directory exists and creates it if not\n await fse.ensureDir(path.dirname(pathToFile));\n await fse.writeJson(pathToFile, data, { encoding: 'utf8' });\n}\n\nexport async function retrieve({\n directoryPath,\n}: { directoryPath?: string } = {}): Promise<LocalSave> {\n const pathToFile = getFilePath(directoryPath);\n const pathExists = await fse.pathExists(pathToFile);\n if (!pathExists) {\n return {};\n }\n return fse.readJSON(pathToFile, { encoding: 'utf8' });\n}\n\nexport async function patch(\n patchData: LocalPatch,\n { directoryPath }: { directoryPath?: string } = {}\n) {\n const pathToFile = getFilePath(directoryPath);\n const existingData = await retrieve({ directoryPath });\n if (!existingData) {\n throw new Error('No configuration data found to patch.');\n }\n const newData = merge(existingData, patchData);\n await fse.writeJson(pathToFile, newData, { encoding: 'utf8' });\n}\n\nexport async function deleteConfig({ directoryPath }: { directoryPath?: string } = {}) {\n const pathToFile = getFilePath(directoryPath);\n const pathExists = await fse.pathExists(pathToFile);\n if (pathExists) {\n await fse.remove(pathToFile);\n }\n}\n"],"names":["LOCAL_SAVE_FILENAME","getFilePath","directoryPath","path","join","process","cwd","save","data","pathToFile","fse","ensureDir","dirname","writeJson","encoding","retrieve","pathExists","readJSON","patch","patchData","existingData","Error","newData","merge","deleteConfig","remove"],"mappings":";;;;;;AAKO,MAAMA,sBAAsB;AAenC,MAAMC,WAAAA,GAAc,CAACC,aACnBC,GAAAA,IAAAA,CAAKC,IAAI,CAACF,aAAAA,IAAiBG,OAAQC,CAAAA,GAAG,EAAIN,EAAAA,mBAAAA,CAAAA;AAErC,eAAeO,KAAKC,IAAe,EAAE,EAAEN,aAAa,EAA8B,GAAG,EAAE,EAAA;AAC5F,IAAA,MAAMO,aAAaR,WAAYC,CAAAA,aAAAA,CAAAA;;AAE/B,IAAA,MAAMQ,GAAIC,CAAAA,SAAS,CAACR,IAAAA,CAAKS,OAAO,CAACH,UAAAA,CAAAA,CAAAA;AACjC,IAAA,MAAMC,GAAIG,CAAAA,SAAS,CAACJ,UAAAA,EAAYD,IAAM,EAAA;QAAEM,QAAU,EAAA;AAAO,KAAA,CAAA;AAC3D;AAEO,eAAeC,QAAS,CAAA,EAC7Bb,aAAa,EACc,GAAG,EAAE,EAAA;AAChC,IAAA,MAAMO,aAAaR,WAAYC,CAAAA,aAAAA,CAAAA;AAC/B,IAAA,MAAMc,UAAa,GAAA,MAAMN,GAAIM,CAAAA,UAAU,CAACP,UAAAA,CAAAA;AACxC,IAAA,IAAI,CAACO,UAAY,EAAA;AACf,QAAA,OAAO,EAAC;AACV;IACA,OAAON,GAAAA,CAAIO,QAAQ,CAACR,UAAY,EAAA;QAAEK,QAAU,EAAA;AAAO,KAAA,CAAA;AACrD;AAEO,eAAeI,MACpBC,SAAqB,EACrB,EAAEjB,aAAa,EAA8B,GAAG,EAAE,EAAA;AAElD,IAAA,MAAMO,aAAaR,WAAYC,CAAAA,aAAAA,CAAAA;IAC/B,MAAMkB,YAAAA,GAAe,MAAML,QAAS,CAAA;AAAEb,QAAAA;AAAc,KAAA,CAAA;AACpD,IAAA,IAAI,CAACkB,YAAc,EAAA;AACjB,QAAA,MAAM,IAAIC,KAAM,CAAA,uCAAA,CAAA;AAClB;IACA,MAAMC,OAAAA,GAAUC,aAAMH,YAAcD,EAAAA,SAAAA,CAAAA;AACpC,IAAA,MAAMT,GAAIG,CAAAA,SAAS,CAACJ,UAAAA,EAAYa,OAAS,EAAA;QAAER,QAAU,EAAA;AAAO,KAAA,CAAA;AAC9D;AAEO,eAAeU,YAAa,CAAA,EAAEtB,aAAa,EAA8B,GAAG,EAAE,EAAA;AACnF,IAAA,MAAMO,aAAaR,WAAYC,CAAAA,aAAAA,CAAAA;AAC/B,IAAA,MAAMc,UAAa,GAAA,MAAMN,GAAIM,CAAAA,UAAU,CAACP,UAAAA,CAAAA;AACxC,IAAA,IAAIO,UAAY,EAAA;QACd,MAAMN,GAAAA,CAAIe,MAAM,CAAChB,UAAAA,CAAAA;AACnB;AACF;;;;;;;;"}
@@ -0,0 +1,47 @@
import fse__default from 'fs-extra';
import path__default from 'path';
import { merge } from 'lodash';
const LOCAL_SAVE_FILENAME = '.strapi-cloud.json';
const getFilePath = (directoryPath)=>path__default.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);
async function save(data, { directoryPath } = {}) {
const pathToFile = getFilePath(directoryPath);
// Ensure the directory exists and creates it if not
await fse__default.ensureDir(path__default.dirname(pathToFile));
await fse__default.writeJson(pathToFile, data, {
encoding: 'utf8'
});
}
async function retrieve({ directoryPath } = {}) {
const pathToFile = getFilePath(directoryPath);
const pathExists = await fse__default.pathExists(pathToFile);
if (!pathExists) {
return {};
}
return fse__default.readJSON(pathToFile, {
encoding: 'utf8'
});
}
async function patch(patchData, { directoryPath } = {}) {
const pathToFile = getFilePath(directoryPath);
const existingData = await retrieve({
directoryPath
});
if (!existingData) {
throw new Error('No configuration data found to patch.');
}
const newData = merge(existingData, patchData);
await fse__default.writeJson(pathToFile, newData, {
encoding: 'utf8'
});
}
async function deleteConfig({ directoryPath } = {}) {
const pathToFile = getFilePath(directoryPath);
const pathExists = await fse__default.pathExists(pathToFile);
if (pathExists) {
await fse__default.remove(pathToFile);
}
}
export { LOCAL_SAVE_FILENAME, deleteConfig, patch, retrieve, save };
//# sourceMappingURL=strapi-info-save.mjs.map
@@ -0,0 +1 @@
{"version":3,"file":"strapi-info-save.mjs","sources":["../../src/services/strapi-info-save.ts"],"sourcesContent":["import fse from 'fs-extra';\nimport path from 'path';\nimport { merge } from 'lodash';\nimport type { ProjectInfo } from './cli-api';\n\nexport const LOCAL_SAVE_FILENAME = '.strapi-cloud.json';\n\nexport type LocalSave = {\n project?: Omit<ProjectInfo, 'id'>;\n};\n\n// Utility type for making all properties optional recursively\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport type LocalPatch = {\n project?: DeepPartial<Omit<ProjectInfo, 'id'>>;\n};\n\nconst getFilePath = (directoryPath?: string): string =>\n path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n\nexport async function save(data: LocalSave, { directoryPath }: { directoryPath?: string } = {}) {\n const pathToFile = getFilePath(directoryPath);\n // Ensure the directory exists and creates it if not\n await fse.ensureDir(path.dirname(pathToFile));\n await fse.writeJson(pathToFile, data, { encoding: 'utf8' });\n}\n\nexport async function retrieve({\n directoryPath,\n}: { directoryPath?: string } = {}): Promise<LocalSave> {\n const pathToFile = getFilePath(directoryPath);\n const pathExists = await fse.pathExists(pathToFile);\n if (!pathExists) {\n return {};\n }\n return fse.readJSON(pathToFile, { encoding: 'utf8' });\n}\n\nexport async function patch(\n patchData: LocalPatch,\n { directoryPath }: { directoryPath?: string } = {}\n) {\n const pathToFile = getFilePath(directoryPath);\n const existingData = await retrieve({ directoryPath });\n if (!existingData) {\n throw new Error('No configuration data found to patch.');\n }\n const newData = merge(existingData, patchData);\n await fse.writeJson(pathToFile, newData, { encoding: 'utf8' });\n}\n\nexport async function deleteConfig({ directoryPath }: { directoryPath?: string } = {}) {\n const pathToFile = getFilePath(directoryPath);\n const pathExists = await fse.pathExists(pathToFile);\n if (pathExists) {\n await fse.remove(pathToFile);\n }\n}\n"],"names":["LOCAL_SAVE_FILENAME","getFilePath","directoryPath","path","join","process","cwd","save","data","pathToFile","fse","ensureDir","dirname","writeJson","encoding","retrieve","pathExists","readJSON","patch","patchData","existingData","Error","newData","merge","deleteConfig","remove"],"mappings":";;;;AAKO,MAAMA,sBAAsB;AAenC,MAAMC,WAAAA,GAAc,CAACC,aACnBC,GAAAA,aAAAA,CAAKC,IAAI,CAACF,aAAAA,IAAiBG,OAAQC,CAAAA,GAAG,EAAIN,EAAAA,mBAAAA,CAAAA;AAErC,eAAeO,KAAKC,IAAe,EAAE,EAAEN,aAAa,EAA8B,GAAG,EAAE,EAAA;AAC5F,IAAA,MAAMO,aAAaR,WAAYC,CAAAA,aAAAA,CAAAA;;AAE/B,IAAA,MAAMQ,YAAIC,CAAAA,SAAS,CAACR,aAAAA,CAAKS,OAAO,CAACH,UAAAA,CAAAA,CAAAA;AACjC,IAAA,MAAMC,YAAIG,CAAAA,SAAS,CAACJ,UAAAA,EAAYD,IAAM,EAAA;QAAEM,QAAU,EAAA;AAAO,KAAA,CAAA;AAC3D;AAEO,eAAeC,QAAS,CAAA,EAC7Bb,aAAa,EACc,GAAG,EAAE,EAAA;AAChC,IAAA,MAAMO,aAAaR,WAAYC,CAAAA,aAAAA,CAAAA;AAC/B,IAAA,MAAMc,UAAa,GAAA,MAAMN,YAAIM,CAAAA,UAAU,CAACP,UAAAA,CAAAA;AACxC,IAAA,IAAI,CAACO,UAAY,EAAA;AACf,QAAA,OAAO,EAAC;AACV;IACA,OAAON,YAAAA,CAAIO,QAAQ,CAACR,UAAY,EAAA;QAAEK,QAAU,EAAA;AAAO,KAAA,CAAA;AACrD;AAEO,eAAeI,MACpBC,SAAqB,EACrB,EAAEjB,aAAa,EAA8B,GAAG,EAAE,EAAA;AAElD,IAAA,MAAMO,aAAaR,WAAYC,CAAAA,aAAAA,CAAAA;IAC/B,MAAMkB,YAAAA,GAAe,MAAML,QAAS,CAAA;AAAEb,QAAAA;AAAc,KAAA,CAAA;AACpD,IAAA,IAAI,CAACkB,YAAc,EAAA;AACjB,QAAA,MAAM,IAAIC,KAAM,CAAA,uCAAA,CAAA;AAClB;IACA,MAAMC,OAAAA,GAAUC,MAAMH,YAAcD,EAAAA,SAAAA,CAAAA;AACpC,IAAA,MAAMT,YAAIG,CAAAA,SAAS,CAACJ,UAAAA,EAAYa,OAAS,EAAA;QAAER,QAAU,EAAA;AAAO,KAAA,CAAA;AAC9D;AAEO,eAAeU,YAAa,CAAA,EAAEtB,aAAa,EAA8B,GAAG,EAAE,EAAA;AACnF,IAAA,MAAMO,aAAaR,WAAYC,CAAAA,aAAAA,CAAAA;AAC/B,IAAA,MAAMc,UAAa,GAAA,MAAMN,YAAIM,CAAAA,UAAU,CAACP,UAAAA,CAAAA;AACxC,IAAA,IAAIO,UAAY,EAAA;QACd,MAAMN,YAAAA,CAAIe,MAAM,CAAChB,UAAAA,CAAAA;AACnB;AACF;;;;"}
+12
View File
@@ -0,0 +1,12 @@
import type { CLIContext } from '../types';
export declare function tokenServiceFactory({ logger }: {
logger: CLIContext['logger'];
}): Promise<{
saveToken: (str: string) => Promise<void>;
retrieveToken: () => Promise<string | undefined>;
validateToken: (idToken: string, jwksUrl: string) => Promise<void>;
isTokenValid: (token: string) => Promise<boolean>;
eraseToken: () => Promise<void>;
getValidToken: (ctx: CLIContext, loginAction: (ctx: CLIContext) => Promise<boolean>) => Promise<string | null>;
}>;
//# sourceMappingURL=token.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/services/token.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,UAAU,CAAC;AAS3D,wBAAsB,mBAAmB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;CAAE;qBAGtD,MAAM;;6BA6BE,MAAM,WAAW,MAAM,KAAG,QAAQ,IAAI,CAAC;0BA6C1C,MAAM;;yBAoClC,UAAU,eACF,CAAC,GAAG,EAAE,UAAU,KAAK,QAAQ,OAAO,CAAC;GAyBrD"}
+126
View File
@@ -0,0 +1,126 @@
'use strict';
var jwksClient = require('jwks-rsa');
var jwt = require('jsonwebtoken');
var local = require('../config/local.js');
var cliApi = require('./cli-api.js');
let cliConfig;
async function tokenServiceFactory({ logger }) {
const cloudApiService = await cliApi.cloudApiFactory({
logger
});
async function saveToken(str) {
const appConfig = await local.getLocalConfig();
if (!appConfig) {
logger.error('There was a problem saving your token. Please try again.');
return;
}
appConfig.token = str;
try {
await local.saveLocalConfig(appConfig);
} catch (e) {
logger.debug(e);
logger.error('There was a problem saving your token. Please try again.');
}
}
async function retrieveToken() {
const appConfig = await local.getLocalConfig();
if (appConfig.token) {
// check if token is still valid
if (await isTokenValid(appConfig.token)) {
return appConfig.token;
}
}
return undefined;
}
async function validateToken(idToken, jwksUrl) {
const client = jwksClient({
jwksUri: jwksUrl
});
// Get the Key from the JWKS using the token header's Key ID (kid)
const getKey = (header, callback)=>{
client.getSigningKey(header.kid, (e, key)=>{
if (e) {
callback(e);
} else if (key) {
const publicKey = 'publicKey' in key ? key.publicKey : key.rsaPublicKey;
callback(null, publicKey);
} else {
callback(new Error('Key not found'));
}
});
};
const decodedToken = jwt.decode(idToken, {
complete: true
});
if (!decodedToken) {
if (typeof idToken === 'undefined' || idToken === '') {
logger.warn('You need to be logged in to use this feature. Please log in and try again.');
} else {
logger.error('There seems to be a problem with your login information. Please try logging in again.');
}
return Promise.reject(new Error('Invalid token'));
}
// Verify the JWT token signature using the JWKS Key
return new Promise((resolve, reject)=>{
jwt.verify(idToken, getKey, (err)=>{
if (err) {
reject(err);
}
if (decodedToken.payload.exp < Math.floor(Date.now() / 1000)) {
reject(new Error('Token is expired'));
}
resolve();
});
});
}
async function isTokenValid(token) {
try {
const config = await cloudApiService.config();
cliConfig = config.data;
if (token) {
await validateToken(token, cliConfig.jwksUrl);
return true;
}
return false;
} catch (e) {
logger.debug(e);
return false;
}
}
async function eraseToken() {
const appConfig = await local.getLocalConfig();
if (!appConfig) {
return;
}
delete appConfig.token;
try {
await local.saveLocalConfig(appConfig);
} catch (e) {
logger.debug(e);
logger.error('There was an issue removing your login information. Please try logging out again.');
throw e;
}
}
async function getValidToken(ctx, loginAction) {
let token = await retrieveToken();
while(!token || !await isTokenValid(token)){
logger.log(token ? 'Oops! Your token seems expired or invalid. Please login again.' : "We couldn't find a valid token. You need to be logged in to use this feature.");
if (!await loginAction(ctx)) return null;
token = await retrieveToken();
}
return token;
}
return {
saveToken,
retrieveToken,
validateToken,
isTokenValid,
eraseToken,
getValidToken
};
}
exports.tokenServiceFactory = tokenServiceFactory;
//# sourceMappingURL=token.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"token.js","sources":["../../src/services/token.ts"],"sourcesContent":["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 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 return Promise.reject(new Error('Invalid token'));\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 }\n if (decodedToken.payload.exp < Math.floor(Date.now() / 1000)) {\n reject(new Error('Token is expired'));\n }\n resolve();\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 ctx: CLIContext,\n loginAction: (ctx: CLIContext) => Promise<boolean>\n ) {\n let token = await retrieveToken();\n\n while (!token || !(await isTokenValid(token))) {\n logger.log(\n token\n ? 'Oops! Your token seems expired or invalid. Please login again.'\n : \"We couldn't find a valid token. You need to be logged in to use this feature.\"\n );\n if (!(await loginAction(ctx))) return null;\n token = await retrieveToken();\n }\n\n return token;\n }\n\n return {\n saveToken,\n retrieveToken,\n validateToken,\n isTokenValid,\n eraseToken,\n getValidToken,\n };\n}\n"],"names":["cliConfig","tokenServiceFactory","logger","cloudApiService","cloudApiFactory","saveToken","str","appConfig","getLocalConfig","error","token","saveLocalConfig","e","debug","retrieveToken","isTokenValid","undefined","validateToken","idToken","jwksUrl","client","jwksClient","jwksUri","getKey","header","callback","getSigningKey","kid","key","publicKey","rsaPublicKey","Error","decodedToken","jwt","decode","complete","warn","Promise","reject","resolve","verify","err","payload","exp","Math"Line truncated
+124
View File
@@ -0,0 +1,124 @@
import jwksClient from 'jwks-rsa';
import jwt from 'jsonwebtoken';
import { getLocalConfig, saveLocalConfig } from '../config/local.mjs';
import { cloudApiFactory } from './cli-api.mjs';
let cliConfig;
async function tokenServiceFactory({ logger }) {
const cloudApiService = await cloudApiFactory({
logger
});
async function saveToken(str) {
const appConfig = await getLocalConfig();
if (!appConfig) {
logger.error('There was a problem saving your token. Please try again.');
return;
}
appConfig.token = str;
try {
await saveLocalConfig(appConfig);
} catch (e) {
logger.debug(e);
logger.error('There was a problem saving your token. Please try again.');
}
}
async function retrieveToken() {
const appConfig = await getLocalConfig();
if (appConfig.token) {
// check if token is still valid
if (await isTokenValid(appConfig.token)) {
return appConfig.token;
}
}
return undefined;
}
async function validateToken(idToken, jwksUrl) {
const client = jwksClient({
jwksUri: jwksUrl
});
// Get the Key from the JWKS using the token header's Key ID (kid)
const getKey = (header, callback)=>{
client.getSigningKey(header.kid, (e, key)=>{
if (e) {
callback(e);
} else if (key) {
const publicKey = 'publicKey' in key ? key.publicKey : key.rsaPublicKey;
callback(null, publicKey);
} else {
callback(new Error('Key not found'));
}
});
};
const decodedToken = jwt.decode(idToken, {
complete: true
});
if (!decodedToken) {
if (typeof idToken === 'undefined' || idToken === '') {
logger.warn('You need to be logged in to use this feature. Please log in and try again.');
} else {
logger.error('There seems to be a problem with your login information. Please try logging in again.');
}
return Promise.reject(new Error('Invalid token'));
}
// Verify the JWT token signature using the JWKS Key
return new Promise((resolve, reject)=>{
jwt.verify(idToken, getKey, (err)=>{
if (err) {
reject(err);
}
if (decodedToken.payload.exp < Math.floor(Date.now() / 1000)) {
reject(new Error('Token is expired'));
}
resolve();
});
});
}
async function isTokenValid(token) {
try {
const config = await cloudApiService.config();
cliConfig = config.data;
if (token) {
await validateToken(token, cliConfig.jwksUrl);
return true;
}
return false;
} catch (e) {
logger.debug(e);
return false;
}
}
async function eraseToken() {
const appConfig = await getLocalConfig();
if (!appConfig) {
return;
}
delete appConfig.token;
try {
await saveLocalConfig(appConfig);
} catch (e) {
logger.debug(e);
logger.error('There was an issue removing your login information. Please try logging out again.');
throw e;
}
}
async function getValidToken(ctx, loginAction) {
let token = await retrieveToken();
while(!token || !await isTokenValid(token)){
logger.log(token ? 'Oops! Your token seems expired or invalid. Please login again.' : "We couldn't find a valid token. You need to be logged in to use this feature.");
if (!await loginAction(ctx)) return null;
token = await retrieveToken();
}
return token;
}
return {
saveToken,
retrieveToken,
validateToken,
isTokenValid,
eraseToken,
getValidToken
};
}
export { tokenServiceFactory };
//# sourceMappingURL=token.mjs.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"token.mjs","sources":["../../src/services/token.ts"],"sourcesContent":["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 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 return Promise.reject(new Error('Invalid token'));\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 }\n if (decodedToken.payload.exp < Math.floor(Date.now() / 1000)) {\n reject(new Error('Token is expired'));\n }\n resolve();\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 ctx: CLIContext,\n loginAction: (ctx: CLIContext) => Promise<boolean>\n ) {\n let token = await retrieveToken();\n\n while (!token || !(await isTokenValid(token))) {\n logger.log(\n token\n ? 'Oops! Your token seems expired or invalid. Please login again.'\n : \"We couldn't find a valid token. You need to be logged in to use this feature.\"\n );\n if (!(await loginAction(ctx))) return null;\n token = await retrieveToken();\n }\n\n return token;\n }\n\n return {\n saveToken,\n retrieveToken,\n validateToken,\n isTokenValid,\n eraseToken,\n getValidToken,\n };\n}\n"],"names":["cliConfig","tokenServiceFactory","logger","cloudApiService","cloudApiFactory","saveToken","str","appConfig","getLocalConfig","error","token","saveLocalConfig","e","debug","retrieveToken","isTokenValid","undefined","validateToken","idToken","jwksUrl","client","jwksClient","jwksUri","getKey","header","callback","getSigningKey","kid","key","publicKey","rsaPublicKey","Error","decodedToken","jwt","decode","complete","warn","Promise","reject","resolve","verify","err","payload","exp","MathLine truncated