@zuplo/cli 6.7.0 → 6.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/common/api/lib.d.ts +3 -2
- package/dist/common/api/lib.d.ts.map +1 -1
- package/dist/common/api/lib.js.map +1 -1
- package/dist/common/middleware/user-identification.d.ts.map +1 -1
- package/dist/common/middleware/user-identification.js.map +1 -1
- package/dist/deploy/environments.d.ts +9 -0
- package/dist/deploy/environments.d.ts.map +1 -0
- package/dist/deploy/environments.js +68 -0
- package/dist/deploy/environments.js.map +1 -0
- package/dist/deploy/handler.d.ts +2 -0
- package/dist/deploy/handler.d.ts.map +1 -1
- package/dist/deploy/handler.js +91 -37
- package/dist/deploy/handler.js.map +1 -1
- package/dist/link/handler.d.ts.map +1 -1
- package/dist/link/handler.js +7 -0
- package/dist/link/handler.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
package/dist/common/api/lib.d.ts
CHANGED
|
@@ -10,7 +10,8 @@ export interface Environment {
|
|
|
10
10
|
name: string;
|
|
11
11
|
accountName: string;
|
|
12
12
|
projectName: string;
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
createdOn: Date | null;
|
|
14
|
+
branchName: string;
|
|
15
|
+
environmentType: "production" | "preview" | "development";
|
|
15
16
|
}
|
|
16
17
|
//# sourceMappingURL=lib.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../../src/common/api/lib.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../../src/common/api/lib.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,YAAY,GAAG,SAAS,GAAG,aAAa,CAAC;CAC3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../src/common/api/lib.ts"],"names":[],"mappings":"","sourcesContent":["export interface Account {\n id: string;\n name: string;\n}\n\nexport interface Project {\n id: string;\n name: string;\n}\n\nexport interface Environment {\n name: string;\n accountName: string;\n projectName: string;\n branchName
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../src/common/api/lib.ts"],"names":[],"mappings":"","sourcesContent":["export interface Account {\n id: string;\n name: string;\n}\n\nexport interface Project {\n id: string;\n name: string;\n}\n\nexport interface Environment {\n name: string;\n accountName: string;\n projectName: string;\n createdOn: Date | null;\n branchName: string;\n environmentType: \"production\" | \"preview\" | \"development\";\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-identification.d.ts","sourceRoot":"","sources":["../../../src/common/middleware/user-identification.ts"],"names":[],"mappings":"AASA,wBAAsB,QAAQ,CAAC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"user-identification.d.ts","sourceRoot":"","sources":["../../../src/common/middleware/user-identification.ts"],"names":[],"mappings":"AASA,wBAAsB,QAAQ,CAAC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,iBAqC9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-identification.js","sourceRoot":"","sources":["../../../src/common/middleware/user-identification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAgC;
|
|
1
|
+
{"version":3,"file":"user-identification.js","sourceRoot":"","sources":["../../../src/common/middleware/user-identification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAgC;IAG7D,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QAEN,IAAI,MAAM,CAAC;QAGX,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,IAAI,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,EAChD,OAAO,CACR,CAAC;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACtD,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,CAAC;QAAC,OAAO,IAAI,EAAE,CAAC;YAEd,MAAM,GAAG,SAAS,EAAE,CAAC;QACvB,CAAC;QAID,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAEpC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC;IACjC,CAAC;AACH,CAAC","sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport * as jose from \"jose\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ZUPLO_AUTH_FILE_NAME } from \"../constants.js\";\nimport { logger } from \"../logger.js\";\nimport { machineId } from \"../machine-id/lib.js\";\nimport { ZUPLO_XDG_STATE_HOME } from \"../xdg/lib.js\";\n\nexport async function identify(argv: { [key: string]: unknown }) {\n // 0. Respect GDPR and allow user to stop-tracking\n // eslint-disable-next-line node/no-process-env\n if (process.env.ZUPLO_DO_NOT_TRACK) {\n logger.trace(\"Sentry traces will be sent without user identification.\");\n } else {\n // We will supplement any Sentry errors with user information\n let userId;\n\n // 1. Read from the result of `zup link` (if it exists)\n try {\n const rawAuth = await readFile(\n join(ZUPLO_XDG_STATE_HOME, ZUPLO_AUTH_FILE_NAME),\n \"utf-8\"\n );\n const authJson = JSON.parse(rawAuth);\n const decoded = jose.decodeJwt(authJson.access_token);\n userId = decoded.sub;\n } catch (_err) {\n // 2. Else generate an id from the machine\n userId = machineId();\n }\n\n // 4. Add information to sentry\n // 4a. Always use the machine id as the primary id so that we can relate events when the user is logged in or logged out\n Sentry.setUser({ id: machineId() });\n // 4b. If we have more information about the identity of the user, we can add it as tags\n Sentry.setTag(\"user-id\", userId);\n if (argv.account && typeof argv.account === \"string\") {\n Sentry.setTag(\"account\", argv.account);\n }\n if (argv.project && typeof argv.project === \"string\") {\n Sentry.setTag(\"project\", argv.project);\n }\n // 5. Now that we have identified the user, set it in argv for others to use\n argv[\"zuplo-user-id\"] = userId;\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Environment } from "../common/api/lib.js";
|
|
2
|
+
import { SelfHostedArgs } from "./handler.js";
|
|
3
|
+
export declare class UnableToAutoLinkToExistingProject extends Error {
|
|
4
|
+
constructor(projectName: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function retrieveOrCreateEnvironment(branch: string, argv: SelfHostedArgs): Promise<any>;
|
|
7
|
+
export declare function retrieveFirstEnvironment(branch: string, argv: SelfHostedArgs): Promise<Environment | undefined>;
|
|
8
|
+
export declare function createEnvironment(branch: string, argv: SelfHostedArgs): Promise<any>;
|
|
9
|
+
//# sourceMappingURL=environments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environments.d.ts","sourceRoot":"","sources":["../../src/deploy/environments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,qBAAa,iCAAkC,SAAQ,KAAK;gBAC9C,WAAW,EAAE,MAAM;CAMhC;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,gBAQrB;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CA8BlC;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,gBAiC3E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import settings from "../common/settings.js";
|
|
2
|
+
export class UnableToAutoLinkToExistingProject extends Error {
|
|
3
|
+
constructor(projectName) {
|
|
4
|
+
super(`Unable to link environment and system variables for ${projectName}. Check that the project specified in your zuplo.jsonc exists in your account.`);
|
|
5
|
+
Object.setPrototypeOf(this, UnableToAutoLinkToExistingProject.prototype);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export async function retrieveOrCreateEnvironment(branch, argv) {
|
|
9
|
+
const environment = await retrieveFirstEnvironment(branch, argv);
|
|
10
|
+
if (environment) {
|
|
11
|
+
return environment;
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
return await createEnvironment(branch, argv);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function retrieveFirstEnvironment(branch, argv) {
|
|
18
|
+
const { account, project } = argv;
|
|
19
|
+
const baseUrl = `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/environments`;
|
|
20
|
+
const queryParams = {
|
|
21
|
+
accountName: account,
|
|
22
|
+
projectName: project,
|
|
23
|
+
};
|
|
24
|
+
const url = new URL(baseUrl);
|
|
25
|
+
url.search = new URLSearchParams(queryParams).toString();
|
|
26
|
+
const readEnvironmentResponse = await fetch(url, {
|
|
27
|
+
method: "GET",
|
|
28
|
+
headers: {
|
|
29
|
+
authorization: `Bearer ${argv["api-key"]}`,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
if (!readEnvironmentResponse.ok) {
|
|
33
|
+
throw new UnableToAutoLinkToExistingProject(project);
|
|
34
|
+
}
|
|
35
|
+
const environmentJsonFromDeveloperAPI = (await readEnvironmentResponse.json());
|
|
36
|
+
return environmentJsonFromDeveloperAPI.data.find((env) => env.branchName === branch);
|
|
37
|
+
}
|
|
38
|
+
export async function createEnvironment(branch, argv) {
|
|
39
|
+
const { account, project } = argv;
|
|
40
|
+
const baseUrl = `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/environments`;
|
|
41
|
+
let environmentType;
|
|
42
|
+
if (branch === "main" || branch === "master" || branch === "production") {
|
|
43
|
+
environmentType = "production";
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
environmentType = "preview";
|
|
47
|
+
}
|
|
48
|
+
const createEnvironmentResponse = await fetch(`${baseUrl}`, {
|
|
49
|
+
method: "POST",
|
|
50
|
+
headers: {
|
|
51
|
+
authorization: `Bearer ${argv["api-key"]}`,
|
|
52
|
+
"Content-Type": "application/json",
|
|
53
|
+
},
|
|
54
|
+
body: JSON.stringify({
|
|
55
|
+
accountName: account,
|
|
56
|
+
projectName: project,
|
|
57
|
+
branchName: branch,
|
|
58
|
+
environmentType,
|
|
59
|
+
}),
|
|
60
|
+
});
|
|
61
|
+
if (createEnvironmentResponse.ok) {
|
|
62
|
+
return await createEnvironmentResponse.json();
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw new Error(`Unable to create environment (project: ${project}, branch: ${branch}). Failed with ${createEnvironmentResponse.statusText}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=environments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environments.js","sourceRoot":"","sources":["../../src/deploy/environments.ts"],"names":[],"mappings":"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","sourcesContent":["import { Environment } from \"../common/api/lib.js\";\nimport settings from \"../common/settings.js\";\nimport { SelfHostedArgs } from \"./handler.js\";\n\nexport class UnableToAutoLinkToExistingProject extends Error {\n constructor(projectName: string) {\n super(\n `Unable to link environment and system variables for ${projectName}. Check that the project specified in your zuplo.jsonc exists in your account.`\n );\n Object.setPrototypeOf(this, UnableToAutoLinkToExistingProject.prototype);\n }\n}\n\nexport async function retrieveOrCreateEnvironment(\n branch: string,\n argv: SelfHostedArgs\n) {\n const environment = await retrieveFirstEnvironment(branch, argv);\n if (environment) {\n return environment;\n } else {\n return await createEnvironment(branch, argv);\n }\n}\n\nexport async function retrieveFirstEnvironment(\n branch: string,\n argv: SelfHostedArgs\n): Promise<Environment | undefined> {\n const { account, project } = argv;\n const baseUrl = `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/environments`;\n\n const queryParams: Record<string, string> = {\n accountName: account,\n projectName: project,\n };\n\n const url = new URL(baseUrl);\n url.search = new URLSearchParams(queryParams).toString();\n const readEnvironmentResponse = await fetch(url, {\n method: \"GET\",\n headers: {\n authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n });\n\n if (!readEnvironmentResponse.ok) {\n throw new UnableToAutoLinkToExistingProject(project);\n }\n\n const environmentJsonFromDeveloperAPI =\n (await readEnvironmentResponse.json()) as {\n data: Environment[];\n };\n\n return environmentJsonFromDeveloperAPI.data.find(\n (env) => env.branchName === branch\n );\n}\n\nexport async function createEnvironment(branch: string, argv: SelfHostedArgs) {\n const { account, project } = argv;\n const baseUrl = `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/environments`;\n\n // TODO: This is a heuristic for now since we don't have a way to determine the production branch for self-hosted from a DB\n let environmentType: \"production\" | \"preview\";\n if (branch === \"main\" || branch === \"master\" || branch === \"production\") {\n environmentType = \"production\";\n } else {\n environmentType = \"preview\";\n }\n\n const createEnvironmentResponse = await fetch(`${baseUrl}`, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${argv[\"api-key\"]}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n accountName: account,\n projectName: project,\n branchName: branch,\n environmentType,\n }),\n });\n\n if (createEnvironmentResponse.ok) {\n return await createEnvironmentResponse.json();\n } else {\n throw new Error(\n `Unable to create environment (project: ${project}, branch: ${branch}). Failed with ${createEnvironmentResponse.statusText}`\n );\n }\n}\n"]}
|
package/dist/deploy/handler.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { RequiredProperties } from "../common/utils/types.js";
|
|
1
2
|
export interface Arguments {
|
|
2
3
|
account: string;
|
|
3
4
|
project: string;
|
|
@@ -8,6 +9,7 @@ export interface Arguments {
|
|
|
8
9
|
"self-hosted-endpoint"?: string;
|
|
9
10
|
"override-repo-url"?: string;
|
|
10
11
|
}
|
|
12
|
+
export type SelfHostedArgs = RequiredProperties<Arguments, "self-hosted-endpoint">;
|
|
11
13
|
export declare function deploy(argv: Arguments): Promise<void>;
|
|
12
14
|
export declare const getPrettyBranch: (branch: string) => string;
|
|
13
15
|
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/deploy/handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/deploy/handler.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAW9D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,cAAc,GAAG,kBAAkB,CAC7C,SAAS,EACT,sBAAsB,CACvB,CAAC;AAEF,wBAAsB,MAAM,CAAC,IAAI,EAAE,SAAS,iBAO3C;AA4ND,eAAO,MAAM,eAAe,WAAY,MAAM,KAAG,MAahD,CAAC"}
|
package/dist/deploy/handler.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
import { parse } from "node:path";
|
|
3
|
-
import { MAX_PRETTY_BRANCH_NAME as MAX_PRETTY_BRANCH_LENGTH } from "../common/constants.js";
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join, parse, relative } from "node:path";
|
|
3
|
+
import { MAX_PRETTY_BRANCH_NAME as MAX_PRETTY_BRANCH_LENGTH, ZUPLO_SYSTEM_ENV_VAR, } from "../common/constants.js";
|
|
4
4
|
import { logger } from "../common/logger.js";
|
|
5
|
-
import { printCriticalFailureToConsoleAndExit, printDiagnosticsToConsole, printResultToConsoleAndExitGracefully, } from "../common/output.js";
|
|
5
|
+
import { printCriticalFailureToConsoleAndExit, printDiagnosticsToConsole, printResultToConsoleAndExitGracefully, printWarningToConsole, } from "../common/output.js";
|
|
6
6
|
import settings from "../common/settings.js";
|
|
7
7
|
import { normalizeUrl } from "../common/utils/urls.js";
|
|
8
|
-
import { ARCHIVE_EXTENSION, archive } from "./archive.js";
|
|
8
|
+
import { ARCHIVE_EXTENSION, archive, generateMetadata } from "./archive.js";
|
|
9
9
|
import { upload } from "./file-upload.js";
|
|
10
10
|
import { pollBuild, pollDeployment } from "./poll-deployment.js";
|
|
11
|
+
import { retrieveOrCreateEnvironment, UnableToAutoLinkToExistingProject, } from "./environments.js";
|
|
12
|
+
import { pullSystemConfig } from "../link/populate.js";
|
|
11
13
|
export async function deploy(argv) {
|
|
12
14
|
if (argv["self-hosted-endpoint"]) {
|
|
13
15
|
const args = argv;
|
|
@@ -64,44 +66,96 @@ async function deployToSaas(argv) {
|
|
|
64
66
|
}
|
|
65
67
|
}
|
|
66
68
|
async function deployToSelfHosted(argv) {
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
method: "POST",
|
|
80
|
-
headers: {
|
|
81
|
-
Authorization: `Bearer ${argv["api-key"]}`,
|
|
82
|
-
},
|
|
83
|
-
body: form,
|
|
84
|
-
});
|
|
85
|
-
if (uploadUrlResponse.ok) {
|
|
86
|
-
const { buildName } = await uploadUrlResponse.json();
|
|
87
|
-
const buildResult = await pollBuild(argv, endpoint, buildName);
|
|
88
|
-
if (buildResult.conditionType === "Complete") {
|
|
89
|
-
const deploymentResponse = await fetch(`${endpoint}/v1/deployments/${deploymentName}`, {
|
|
90
|
-
method: "GET",
|
|
91
|
-
headers: {
|
|
92
|
-
Authorization: `Bearer ${argv["api-key"]}`,
|
|
93
|
-
},
|
|
69
|
+
const { account, project } = argv;
|
|
70
|
+
let existingZuploEnv;
|
|
71
|
+
try {
|
|
72
|
+
const endpoint = normalizeUrl(argv["self-hosted-endpoint"]);
|
|
73
|
+
existingZuploEnv = retrieveExistingZuploEnv(argv);
|
|
74
|
+
const branch = (await generateMetadata(argv)).branch;
|
|
75
|
+
try {
|
|
76
|
+
const environmentToAutoLink = await retrieveOrCreateEnvironment(branch, argv);
|
|
77
|
+
await pullSystemConfig({
|
|
78
|
+
dir: argv.dir,
|
|
79
|
+
environment: environmentToAutoLink.name,
|
|
80
|
+
"api-key": argv["api-key"],
|
|
94
81
|
});
|
|
95
|
-
|
|
96
|
-
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (error instanceof UnableToAutoLinkToExistingProject) {
|
|
85
|
+
printWarningToConsole(`We are unable to fetch the environment variables from Zuplo for this project.
|
|
86
|
+
Deployment will proceed but the environment variables will not be available.
|
|
87
|
+
To fix this, check that the project, ${argv.project} exists and this api-key has access to it.`);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const archiveMetadata = await archive(argv);
|
|
94
|
+
logger.debug(`Tarball created locally at ${archiveMetadata}`);
|
|
95
|
+
const form = new FormData();
|
|
96
|
+
const deploymentName = `${project}-${getPrettyBranch(archiveMetadata.metadata.branch)}`;
|
|
97
|
+
form.set("file", new Blob([readFileSync(archiveMetadata.tarball)], {
|
|
98
|
+
type: "application/gzip",
|
|
99
|
+
}));
|
|
100
|
+
form.set("projectName", project);
|
|
101
|
+
form.set("deploymentName", deploymentName);
|
|
102
|
+
const uploadUrlResponse = await fetch(`${endpoint}/v1/deployments/build`, {
|
|
103
|
+
method: "POST",
|
|
104
|
+
headers: {
|
|
105
|
+
Authorization: `Bearer ${argv["api-key"]}`,
|
|
106
|
+
},
|
|
107
|
+
body: form,
|
|
108
|
+
});
|
|
109
|
+
if (uploadUrlResponse.ok) {
|
|
110
|
+
printDiagnosticsToConsole(`Deploying the current branch ${archiveMetadata.metadata.branch} to project ${project} on account ${account}...`);
|
|
111
|
+
const { buildName } = await uploadUrlResponse.json();
|
|
112
|
+
const buildResult = await pollBuild(argv, endpoint, buildName);
|
|
113
|
+
if (buildResult.conditionType === "Complete") {
|
|
114
|
+
const deploymentResponse = await fetch(`${endpoint}/v1/deployments/${deploymentName}`, {
|
|
115
|
+
method: "GET",
|
|
116
|
+
headers: {
|
|
117
|
+
Authorization: `Bearer ${argv["api-key"]}`,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
const deploymentJSON = await deploymentResponse.json();
|
|
121
|
+
restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);
|
|
122
|
+
await printResultToConsoleAndExitGracefully(`Deployed to ${deploymentJSON.deploymentUrl}`);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);
|
|
126
|
+
await printCriticalFailureToConsoleAndExit(`Failed to deploy the current environment. Here's the diagnostics: ${JSON.stringify(buildResult)}`);
|
|
127
|
+
}
|
|
97
128
|
}
|
|
98
129
|
else {
|
|
99
|
-
await
|
|
130
|
+
logger.error(await uploadUrlResponse.text(), "Failed to upload to self-hosted build endpoint");
|
|
131
|
+
await printCriticalFailureToConsoleAndExit("Error: Failed to upload to self-hosted build endpoint");
|
|
100
132
|
}
|
|
101
133
|
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
logger.error(error);
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function retrieveExistingZuploEnv(argv) {
|
|
142
|
+
const dir = argv.dir;
|
|
143
|
+
const normalizedDir = join(relative(process.cwd(), dir));
|
|
144
|
+
const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);
|
|
145
|
+
if (existsSync(envFilePath)) {
|
|
146
|
+
const envFileContent = readFileSync(envFilePath, "utf-8");
|
|
147
|
+
return envFileContent;
|
|
148
|
+
}
|
|
102
149
|
else {
|
|
103
|
-
|
|
104
|
-
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function restoreExistingZuploEnvAsNecessary(argv, originalValue) {
|
|
154
|
+
if (originalValue) {
|
|
155
|
+
const dir = argv.dir;
|
|
156
|
+
const normalizedDir = join(relative(process.cwd(), dir));
|
|
157
|
+
const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);
|
|
158
|
+
writeFileSync(envFilePath, originalValue);
|
|
105
159
|
}
|
|
106
160
|
}
|
|
107
161
|
export const getPrettyBranch = (branch) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/deploy/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { parse } from \"node:path\";\nimport { MAX_PRETTY_BRANCH_NAME as MAX_PRETTY_BRANCH_LENGTH } from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n} from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { RequiredProperties } from \"../common/utils/types.js\";\nimport { normalizeUrl } from \"../common/utils/urls.js\";\nimport { ARCHIVE_EXTENSION, archive } from \"./archive.js\";\nimport { upload } from \"./file-upload.js\";\nimport { pollBuild, pollDeployment } from \"./poll-deployment.js\";\n\nexport interface Arguments {\n account: string;\n project: string;\n dir: string;\n environment?: string;\n \"api-key\": string;\n \"verify-remote\": boolean;\n \"self-hosted-endpoint\"?: string;\n \"override-repo-url\"?: string;\n}\n\ntype SelfHostedArgs = RequiredProperties<Arguments, \"self-hosted-endpoint\">;\n\nexport async function deploy(argv: Arguments) {\n if (argv[\"self-hosted-endpoint\"]) {\n const args = argv as SelfHostedArgs;\n await deployToSelfHosted(args);\n } else {\n await deployToSaas(argv);\n }\n}\n\nasync function deployToSaas(argv: Arguments) {\n // 1. Create the tarball locally\n const archiveMetadata = await archive(argv);\n logger.debug(`Tarball created locally at ${archiveMetadata}`);\n\n // 2. Build uploadUrl request\n const { account, project } = argv;\n const uploadUrlResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/deployments/sources`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n body: JSON.stringify({\n accountName: account,\n projectName: project,\n branchName: archiveMetadata.metadata.branch,\n }),\n }\n );\n\n if (uploadUrlResponse.ok) {\n // 3. Upload to request URL\n const { uploadUrl } = await uploadUrlResponse.json();\n const uploadResponse = await upload(archiveMetadata.tarball, uploadUrl);\n\n if (uploadResponse.ok) {\n printDiagnosticsToConsole(\n `Deploying the current branch ${archiveMetadata.metadata.branch} to project ${project} on account ${account}...`\n );\n\n // 5. Poll for status\n const fileId = parse(new URL(uploadUrl).pathname).base.replace(\n ARCHIVE_EXTENSION,\n \"\"\n );\n const { url, steps, buildResult } = await pollDeployment(\n argv,\n fileId,\n account,\n project\n );\n if (url) {\n await printResultToConsoleAndExitGracefully(`Deployed to ${url}`);\n } else {\n const diagnostics = buildResult ?? steps;\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the current branch ${\n archiveMetadata.metadata.branch\n } to project ${project} on account ${account}. Here's the diagnostics: ${JSON.stringify(\n diagnostics,\n null,\n 2\n )}`\n );\n }\n } else {\n logger.error(\n {\n status: uploadResponse.status,\n statusText: uploadResponse.statusText,\n },\n \"Failed to upload source to cloud storage\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to upload source to cloud storage. Try again later.\"\n );\n }\n } else {\n logger.error(\n {\n status: uploadUrlResponse.status,\n statusText: uploadUrlResponse.statusText,\n },\n \"Failed to retrieve uploadUrl\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to determine where to upload your files. Try again later.\"\n );\n }\n}\n\nasync function deployToSelfHosted(argv: SelfHostedArgs) {\n // 0. Finagle the URL first\n const endpoint = normalizeUrl(argv[\"self-hosted-endpoint\"]);\n\n // 1. Create the tarball locally\n const archiveMetadata = await archive(argv);\n logger.debug(`Tarball created locally at ${archiveMetadata}`);\n\n // 2. Build uploadUrl request\n const { project } = argv;\n const form = new FormData();\n const deploymentName = `${project}-${getPrettyBranch(\n archiveMetadata.metadata.branch\n )}`;\n form.set(\n \"file\",\n new Blob([readFileSync(archiveMetadata.tarball)], {\n type: \"application/gzip\",\n })\n );\n form.set(\"projectName\", project);\n form.set(\"deploymentName\", deploymentName);\n\n const uploadUrlResponse = await fetch(`${endpoint}/v1/deployments/build`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n body: form,\n });\n\n if (uploadUrlResponse.ok) {\n // 3. Poll for build\n const { buildName } = await uploadUrlResponse.json();\n const buildResult = await pollBuild(argv, endpoint, buildName);\n\n if (buildResult.conditionType === \"Complete\") {\n // Retrieve the deployment\n const deploymentResponse = await fetch(\n `${endpoint}/v1/deployments/${deploymentName}`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n }\n );\n const deploymentJSON: { deploymentUrl: string } =\n await deploymentResponse.json();\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${deploymentJSON.deploymentUrl}`\n );\n } else {\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the current environment. Here's the diagnostics: ${JSON.stringify(\n buildResult\n )}`\n );\n }\n } else {\n logger.error(\n await uploadUrlResponse.text(),\n \"Failed to upload to self-hosted build endpoint\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to upload to self-hosted build endpoint\"\n );\n }\n}\n\nexport const getPrettyBranch = (branch: string): string => {\n // https://ricardometring.com/javascript-replace-special-characters\n return (\n branch\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\") // Remove accents\n .replace(/([^\\w]+|\\s+)/g, \"-\") // Replace space and other characters by hyphen\n // eslint-disable-next-line no-useless-escape\n .replace(/\\-\\-+/g, \"-\") // Replaces multiple hyphens by one hyphen\n .replace(/(^-+|-+$)/, \"\") // Remove extra hyphens from beginning or end of the string\n .toLowerCase()\n .substring(0, MAX_PRETTY_BRANCH_LENGTH)\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/deploy/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EACL,sBAAsB,IAAI,wBAAwB,EAClD,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,oCAAoC,EACpC,yBAAyB,EACzB,qCAAqC,EACrC,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EACL,2BAA2B,EAC3B,iCAAiC,GAClC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAkBvD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAe;IAC1C,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAsB,CAAC;QACpC,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAe;IAEzC,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,8BAA8B,eAAe,EAAE,CAAC,CAAC;IAG9D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,iBAAiB,GAAG,MAAM,KAAK,CACnC,GAAG,QAAQ,CAAC,4BAA4B,yBAAyB,EACjE;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,CAAC,EAAE;SAC3C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,WAAW,EAAE,OAAO;YACpB,WAAW,EAAE,OAAO;YACpB,UAAU,EAAE,eAAe,CAAC,QAAQ,CAAC,MAAM;SAC5C,CAAC;KACH,CACF,CAAC;IAEF,IAAI,iBAAiB,CAAC,EAAE,EAAE,CAAC;QAEzB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;QACrD,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAExE,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;YACtB,yBAAyB,CACvB,gCAAgC,eAAe,CAAC,QAAQ,CAAC,MAAM,eAAe,OAAO,eAAe,OAAO,KAAK,CACjH,CAAC;YAGF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAC5D,iBAAiB,EACjB,EAAE,CACH,CAAC;YACF,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,CACtD,IAAI,EACJ,MAAM,EACN,OAAO,EACP,OAAO,CACR,CAAC;YACF,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,qCAAqC,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,WAAW,IAAI,KAAK,CAAC;gBACzC,MAAM,oCAAoC,CACxC,uCACE,eAAe,CAAC,QAAQ,CAAC,MAC3B,eAAe,OAAO,eAAe,OAAO,6BAA6B,IAAI,CAAC,SAAS,CACrF,WAAW,EACX,IAAI,EACJ,CAAC,CACF,EAAE,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CACV;gBACE,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,UAAU,EAAE,cAAc,CAAC,UAAU;aACtC,EACD,0CAA0C,CAC3C,CAAC;YACF,yBAAyB,CACvB,mEAAmE,CACpE,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CACV;YACE,MAAM,EAAE,iBAAiB,CAAC,MAAM;YAChC,UAAU,EAAE,iBAAiB,CAAC,UAAU;SACzC,EACD,8BAA8B,CAC/B,CAAC;QACF,MAAM,oCAAoC,CACxC,yEAAyE,CAC1E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAoB;IACpD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAElC,IAAI,gBAAoC,CAAC;IAEzC,IAAI,CAAC;QAEH,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAI5D,gBAAgB,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,qBAAqB,GAAG,MAAM,2BAA2B,CAC7D,MAAM,EACN,IAAI,CACL,CAAC;YACF,MAAM,gBAAgB,CAAC;gBACrB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,WAAW,EAAE,qBAAqB,CAAC,IAAI;gBACvC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,iCAAiC,EAAE,CAAC;gBACvD,qBAAqB,CACnB;;iDAEuC,IAAI,CAAC,OAAO,4CAA4C,CAChG,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAGD,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,8BAA8B,eAAe,EAAE,CAAC,CAAC;QAG9D,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,GAAG,OAAO,IAAI,eAAe,CAClD,eAAe,CAAC,QAAQ,CAAC,MAAM,CAChC,EAAE,CAAC;QACJ,IAAI,CAAC,GAAG,CACN,MAAM,EACN,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE;YAChD,IAAI,EAAE,kBAAkB;SACzB,CAAC,CACH,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAE3C,MAAM,iBAAiB,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,uBAAuB,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,CAAC,EAAE;aAC3C;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,IAAI,iBAAiB,CAAC,EAAE,EAAE,CAAC;YACzB,yBAAyB,CACvB,gCAAgC,eAAe,CAAC,QAAQ,CAAC,MAAM,eAAe,OAAO,eAAe,OAAO,KAAK,CACjH,CAAC;YAGF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAE/D,IAAI,WAAW,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;gBAE7C,MAAM,kBAAkB,GAAG,MAAM,KAAK,CACpC,GAAG,QAAQ,mBAAmB,cAAc,EAAE,EAC9C;oBACE,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE;wBACP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,CAAC,EAAE;qBAC3C;iBACF,CACF,CAAC;gBACF,MAAM,cAAc,GAClB,MAAM,kBAAkB,CAAC,IAAI,EAAE,CAAC;gBAClC,kCAAkC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;gBAC3D,MAAM,qCAAqC,CACzC,eAAe,cAAc,CAAC,aAAa,EAAE,CAC9C,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,kCAAkC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;gBAC3D,MAAM,oCAAoC,CACxC,qEAAqE,IAAI,CAAC,SAAS,CACjF,WAAW,CACZ,EAAE,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CACV,MAAM,iBAAiB,CAAC,IAAI,EAAE,EAC9B,gDAAgD,CACjD,CAAC;YACF,MAAM,oCAAoC,CACxC,uDAAuD,CACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,kCAAkC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAoB;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;IAC9D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC1D,OAAO,cAAc,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,kCAAkC,CACzC,IAAoB,EACpB,aAAiC;IAEjC,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;QAC9D,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAc,EAAU,EAAE;IAExD,OAAO,CACL,MAAM;SACH,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAE7B,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,WAAW,EAAE;SACb,SAAS,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAC1C,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, parse, relative } from \"node:path\";\nimport {\n MAX_PRETTY_BRANCH_NAME as MAX_PRETTY_BRANCH_LENGTH,\n ZUPLO_SYSTEM_ENV_VAR,\n} from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n printWarningToConsole,\n} from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { RequiredProperties } from \"../common/utils/types.js\";\nimport { normalizeUrl } from \"../common/utils/urls.js\";\nimport { ARCHIVE_EXTENSION, archive, generateMetadata } from \"./archive.js\";\nimport { upload } from \"./file-upload.js\";\nimport { pollBuild, pollDeployment } from \"./poll-deployment.js\";\nimport {\n retrieveOrCreateEnvironment,\n UnableToAutoLinkToExistingProject,\n} from \"./environments.js\";\nimport { pullSystemConfig } from \"../link/populate.js\";\n\nexport interface Arguments {\n account: string;\n project: string;\n dir: string;\n environment?: string;\n \"api-key\": string;\n \"verify-remote\": boolean;\n \"self-hosted-endpoint\"?: string;\n \"override-repo-url\"?: string;\n}\n\nexport type SelfHostedArgs = RequiredProperties<\n Arguments,\n \"self-hosted-endpoint\"\n>;\n\nexport async function deploy(argv: Arguments) {\n if (argv[\"self-hosted-endpoint\"]) {\n const args = argv as SelfHostedArgs;\n await deployToSelfHosted(args);\n } else {\n await deployToSaas(argv);\n }\n}\n\nasync function deployToSaas(argv: Arguments) {\n // 1. Create the tarball locally\n const archiveMetadata = await archive(argv);\n logger.debug(`Tarball created locally at ${archiveMetadata}`);\n\n // 2. Build uploadUrl request\n const { account, project } = argv;\n const uploadUrlResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/deployments/sources`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n body: JSON.stringify({\n accountName: account,\n projectName: project,\n branchName: archiveMetadata.metadata.branch,\n }),\n }\n );\n\n if (uploadUrlResponse.ok) {\n // 3. Upload to request URL\n const { uploadUrl } = await uploadUrlResponse.json();\n const uploadResponse = await upload(archiveMetadata.tarball, uploadUrl);\n\n if (uploadResponse.ok) {\n printDiagnosticsToConsole(\n `Deploying the current branch ${archiveMetadata.metadata.branch} to project ${project} on account ${account}...`\n );\n\n // 5. Poll for status\n const fileId = parse(new URL(uploadUrl).pathname).base.replace(\n ARCHIVE_EXTENSION,\n \"\"\n );\n const { url, steps, buildResult } = await pollDeployment(\n argv,\n fileId,\n account,\n project\n );\n if (url) {\n await printResultToConsoleAndExitGracefully(`Deployed to ${url}`);\n } else {\n const diagnostics = buildResult ?? steps;\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the current branch ${\n archiveMetadata.metadata.branch\n } to project ${project} on account ${account}. Here's the diagnostics: ${JSON.stringify(\n diagnostics,\n null,\n 2\n )}`\n );\n }\n } else {\n logger.error(\n {\n status: uploadResponse.status,\n statusText: uploadResponse.statusText,\n },\n \"Failed to upload source to cloud storage\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to upload source to cloud storage. Try again later.\"\n );\n }\n } else {\n logger.error(\n {\n status: uploadUrlResponse.status,\n statusText: uploadUrlResponse.statusText,\n },\n \"Failed to retrieve uploadUrl\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to determine where to upload your files. Try again later.\"\n );\n }\n}\n\nasync function deployToSelfHosted(argv: SelfHostedArgs) {\n const { account, project } = argv;\n\n let existingZuploEnv: string | undefined;\n\n try {\n // 0. Finagle the URL first\n const endpoint = normalizeUrl(argv[\"self-hosted-endpoint\"]);\n\n // 1. Perform the link on-behalf-of-the-user\n // Store the current .env.zuplo if there is one and restore it later\n existingZuploEnv = retrieveExistingZuploEnv(argv);\n const branch = (await generateMetadata(argv)).branch;\n try {\n const environmentToAutoLink = await retrieveOrCreateEnvironment(\n branch,\n argv\n );\n await pullSystemConfig({\n dir: argv.dir,\n environment: environmentToAutoLink.name,\n \"api-key\": argv[\"api-key\"],\n });\n } catch (error) {\n if (error instanceof UnableToAutoLinkToExistingProject) {\n printWarningToConsole(\n `We are unable to fetch the environment variables from Zuplo for this project. \n Deployment will proceed but the environment variables will not be available. \n To fix this, check that the project, ${argv.project} exists and this api-key has access to it.`\n );\n } else {\n throw error;\n }\n }\n\n // 2. Create the tarball locally\n const archiveMetadata = await archive(argv);\n logger.debug(`Tarball created locally at ${archiveMetadata}`);\n\n // 3. Build uploadUrl request\n const form = new FormData();\n const deploymentName = `${project}-${getPrettyBranch(\n archiveMetadata.metadata.branch\n )}`;\n form.set(\n \"file\",\n new Blob([readFileSync(archiveMetadata.tarball)], {\n type: \"application/gzip\",\n })\n );\n form.set(\"projectName\", project);\n form.set(\"deploymentName\", deploymentName);\n\n const uploadUrlResponse = await fetch(`${endpoint}/v1/deployments/build`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n body: form,\n });\n\n if (uploadUrlResponse.ok) {\n printDiagnosticsToConsole(\n `Deploying the current branch ${archiveMetadata.metadata.branch} to project ${project} on account ${account}...`\n );\n\n // 4. Poll for build\n const { buildName } = await uploadUrlResponse.json();\n const buildResult = await pollBuild(argv, endpoint, buildName);\n\n if (buildResult.conditionType === \"Complete\") {\n // Retrieve the deployment\n const deploymentResponse = await fetch(\n `${endpoint}/v1/deployments/${deploymentName}`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n }\n );\n const deploymentJSON: { deploymentUrl: string } =\n await deploymentResponse.json();\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${deploymentJSON.deploymentUrl}`\n );\n } else {\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the current environment. Here's the diagnostics: ${JSON.stringify(\n buildResult\n )}`\n );\n }\n } else {\n logger.error(\n await uploadUrlResponse.text(),\n \"Failed to upload to self-hosted build endpoint\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to upload to self-hosted build endpoint\"\n );\n }\n } catch (error) {\n logger.error(error);\n } finally {\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n }\n}\n\nfunction retrieveExistingZuploEnv(argv: SelfHostedArgs): string | undefined {\n const dir = argv.dir;\n const normalizedDir = join(relative(process.cwd(), dir));\n const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n if (existsSync(envFilePath)) {\n const envFileContent = readFileSync(envFilePath, \"utf-8\");\n return envFileContent;\n } else {\n return undefined;\n }\n}\n\nfunction restoreExistingZuploEnvAsNecessary(\n argv: SelfHostedArgs,\n originalValue: string | undefined\n) {\n if (originalValue) {\n const dir = argv.dir;\n const normalizedDir = join(relative(process.cwd(), dir));\n const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n writeFileSync(envFilePath, originalValue);\n }\n}\n\nexport const getPrettyBranch = (branch: string): string => {\n // https://ricardometring.com/javascript-replace-special-characters\n return (\n branch\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\") // Remove accents\n .replace(/([^\\w]+|\\s+)/g, \"-\") // Replace space and other characters by hyphen\n // eslint-disable-next-line no-useless-escape\n .replace(/\\-\\-+/g, \"-\") // Replaces multiple hyphens by one hyphen\n .replace(/(^-+|-+$)/, \"\") // Remove extra hyphens from beginning or end of the string\n .toLowerCase()\n .substring(0, MAX_PRETTY_BRANCH_LENGTH)\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/link/handler.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA6BD,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/link/handler.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA6BD,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,iBAiLzC"}
|
package/dist/link/handler.js
CHANGED
|
@@ -72,6 +72,13 @@ export async function link(argv) {
|
|
|
72
72
|
authorization: `Bearer ${argv["api-key"]}`,
|
|
73
73
|
},
|
|
74
74
|
});
|
|
75
|
+
if (!environmentResponseFromDeveloperAPI.ok) {
|
|
76
|
+
logger.error({
|
|
77
|
+
status: environmentResponseFromDeveloperAPI.status,
|
|
78
|
+
statusText: environmentResponseFromDeveloperAPI.statusText,
|
|
79
|
+
}, "Failed to link to a project in your account");
|
|
80
|
+
await printCriticalFailureToConsoleAndExit("Check that the project specified in your zuplo.jsonc exists and that you have access to it.");
|
|
81
|
+
}
|
|
75
82
|
let environmentJsonFromDeveloperAPI = (await environmentResponseFromDeveloperAPI.json());
|
|
76
83
|
let numDevelopmentEnvironments = environmentJsonFromDeveloperAPI.data.filter((env) => {
|
|
77
84
|
return env.environmentType === "development";
|
package/dist/link/handler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/link/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { select } from \"@inquirer/prompts\";\nimport { Environment, Project } from \"../common/api/lib.js\";\nimport { logger } from \"../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printResultToConsoleAndExitGracefully,\n textOrJson,\n} from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { pullSystemConfig, safeMergeConfig } from \"./populate.js\";\n\nexport interface Arguments {\n dir: string;\n \"api-key\": string;\n account?: string;\n project?: string;\n environment?: string;\n}\n\nfunction prettyPrintEnvironmentPrompt(\n env: Environment,\n hasSingleDevelopmentInstance: boolean\n) {\n let environmentType = env.environmentType.toLowerCase();\n let branchName = env.branchName;\n let name = env.name;\n\n switch (environmentType) {\n case \"working-copy\":\n case \"working_copy\":\n case \"development\":\n if (hasSingleDevelopmentInstance) {\n name = \"Default for local development\";\n environmentType = \"development\";\n branchName = \"\";\n return `${name} (${environmentType})`;\n } else {\n // For the case of working copy the branch name is actually \"main\" but it doesn't mean anything\n environmentType = \"development\";\n branchName = \"\";\n return `${name} (${environmentType})`;\n }\n }\n return `${name} (${environmentType}, ${branchName})`;\n}\n\nexport async function link(argv: Arguments) {\n const account = argv.account;\n let environment = argv.environment;\n\n // List the projects\n let project = argv.project;\n if (!environment && !project) {\n const projectResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/projects`,\n {\n headers: {\n authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n }\n );\n\n if (!projectResponse.ok) {\n logger.error(\n {\n status: projectResponse.status,\n statusText: projectResponse.statusText,\n response: textOrJson(await projectResponse.text()),\n },\n \"Failed to list projects.\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to list your projects. Try again later.\"\n );\n }\n\n // Ask the user to select a project, if necessary\n const projectJson = (await projectResponse.json()) as { data: Project[] };\n if (projectJson.data.length === 1) {\n project = projectJson.data[0].name;\n } else {\n project = await select({\n message: \"Select the project to work with\",\n choices: projectJson.data.map((prj) => {\n return {\n name: prj.name,\n value: prj.name,\n };\n }),\n });\n }\n }\n\n if (!environment) {\n const baseUrl = `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/environments`;\n\n const queryParams: Record<string, string> = {\n // This is safe because of the flow above where we finalize the account and project\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n accountName: account!,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n projectName: project!,\n };\n\n // Create the query string using URLSearchParams\n const url = new URL(baseUrl);\n url.search = new URLSearchParams(queryParams).toString();\n let environmentResponseFromDeveloperAPI = await fetch(url, {\n headers: {\n authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n });\n\n let environmentJsonFromDeveloperAPI =\n (await environmentResponseFromDeveloperAPI.json()) as {\n data: Environment[];\n };\n\n let numDevelopmentEnvironments =\n environmentJsonFromDeveloperAPI.data.filter((env) => {\n return env.environmentType === \"development\";\n }).length;\n\n if (numDevelopmentEnvironments <= 0) {\n // Create one on-the-fly\n const createDevelopmenEnvironmentResponse = await fetch(`${baseUrl}`, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${argv[\"api-key\"]}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n accountName: account,\n projectName: project,\n environmentType: \"development\",\n }),\n });\n\n if (!createDevelopmenEnvironmentResponse.ok) {\n logger.debug(\n {\n status: createDevelopmenEnvironmentResponse.status,\n statusText: createDevelopmenEnvironmentResponse.statusText,\n },\n \"Failed to create a new instance of development environment\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Failed to create a new development environment. Please try again later.\"\n );\n }\n\n numDevelopmentEnvironments++;\n\n // Re-fetch\n environmentResponseFromDeveloperAPI = await fetch(url, {\n headers: {\n authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n });\n\n environmentJsonFromDeveloperAPI =\n (await environmentResponseFromDeveloperAPI.json()) as {\n data: Environment[];\n };\n }\n\n const environments = Object.assign(\n {},\n environmentJsonFromDeveloperAPI.data\n .map((env) => {\n return {\n [prettyPrintEnvironmentPrompt(\n env,\n numDevelopmentEnvironments == 1\n )]: env.name,\n };\n })\n .reduce((acc, curr) => {\n return { ...acc, ...curr };\n })\n );\n\n if (Object.values(environments).length === 1) {\n environment = Object.values(environments)[0];\n } else {\n environment = await select({\n message: \"Select the environment to work with\",\n choices: Object.entries(environments).map(([key, value]) => {\n return {\n name: key,\n value,\n };\n }),\n });\n }\n }\n\n argv.environment = environment;\n\n // Safely merge the values in the .zuplo.jsonc file\n if (project) {\n await safeMergeConfig(argv.dir, project);\n }\n\n // Safely merge in other auxillary files\n await pullSystemConfig(argv);\n\n await printResultToConsoleAndExitGracefully(`\nSuccessfully linked your local directory to the ${project} project in the ${account} account.\n.env.zuplo and zuplo.jsonc have been updated with the new values.`);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/link/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { select } from \"@inquirer/prompts\";\nimport { Environment, Project } from \"../common/api/lib.js\";\nimport { logger } from \"../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printResultToConsoleAndExitGracefully,\n textOrJson,\n} from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { pullSystemConfig, safeMergeConfig } from \"./populate.js\";\n\nexport interface Arguments {\n dir: string;\n \"api-key\": string;\n account?: string;\n project?: string;\n environment?: string;\n}\n\nfunction prettyPrintEnvironmentPrompt(\n env: Environment,\n hasSingleDevelopmentInstance: boolean\n) {\n let environmentType = env.environmentType.toLowerCase();\n let branchName = env.branchName;\n let name = env.name;\n\n switch (environmentType) {\n case \"working-copy\":\n case \"working_copy\":\n case \"development\":\n if (hasSingleDevelopmentInstance) {\n name = \"Default for local development\";\n environmentType = \"development\";\n branchName = \"\";\n return `${name} (${environmentType})`;\n } else {\n // For the case of working copy the branch name is actually \"main\" but it doesn't mean anything\n environmentType = \"development\";\n branchName = \"\";\n return `${name} (${environmentType})`;\n }\n }\n return `${name} (${environmentType}, ${branchName})`;\n}\n\nexport async function link(argv: Arguments) {\n const account = argv.account;\n let environment = argv.environment;\n\n // List the projects\n let project = argv.project;\n if (!environment && !project) {\n const projectResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/projects`,\n {\n headers: {\n authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n }\n );\n\n if (!projectResponse.ok) {\n logger.error(\n {\n status: projectResponse.status,\n statusText: projectResponse.statusText,\n response: textOrJson(await projectResponse.text()),\n },\n \"Failed to list projects.\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to list your projects. Try again later.\"\n );\n }\n\n // Ask the user to select a project, if necessary\n const projectJson = (await projectResponse.json()) as { data: Project[] };\n if (projectJson.data.length === 1) {\n project = projectJson.data[0].name;\n } else {\n project = await select({\n message: \"Select the project to work with\",\n choices: projectJson.data.map((prj) => {\n return {\n name: prj.name,\n value: prj.name,\n };\n }),\n });\n }\n }\n\n if (!environment) {\n const baseUrl = `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/environments`;\n\n const queryParams: Record<string, string> = {\n // This is safe because of the flow above where we finalize the account and project\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n accountName: account!,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n projectName: project!,\n };\n\n // Create the query string using URLSearchParams\n const url = new URL(baseUrl);\n url.search = new URLSearchParams(queryParams).toString();\n let environmentResponseFromDeveloperAPI = await fetch(url, {\n headers: {\n authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n });\n\n if (!environmentResponseFromDeveloperAPI.ok) {\n logger.error(\n {\n status: environmentResponseFromDeveloperAPI.status,\n statusText: environmentResponseFromDeveloperAPI.statusText,\n },\n \"Failed to link to a project in your account\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Check that the project specified in your zuplo.jsonc exists and that you have access to it.\"\n );\n }\n\n let environmentJsonFromDeveloperAPI =\n (await environmentResponseFromDeveloperAPI.json()) as {\n data: Environment[];\n };\n\n let numDevelopmentEnvironments =\n environmentJsonFromDeveloperAPI.data.filter((env) => {\n return env.environmentType === \"development\";\n }).length;\n\n if (numDevelopmentEnvironments <= 0) {\n // Create one on-the-fly\n const createDevelopmenEnvironmentResponse = await fetch(`${baseUrl}`, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${argv[\"api-key\"]}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n accountName: account,\n projectName: project,\n environmentType: \"development\",\n }),\n });\n\n if (!createDevelopmenEnvironmentResponse.ok) {\n logger.debug(\n {\n status: createDevelopmenEnvironmentResponse.status,\n statusText: createDevelopmenEnvironmentResponse.statusText,\n },\n \"Failed to create a new instance of development environment\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Failed to create a new development environment. Please try again later.\"\n );\n }\n\n numDevelopmentEnvironments++;\n\n // Re-fetch\n environmentResponseFromDeveloperAPI = await fetch(url, {\n headers: {\n authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n });\n\n environmentJsonFromDeveloperAPI =\n (await environmentResponseFromDeveloperAPI.json()) as {\n data: Environment[];\n };\n }\n\n const environments = Object.assign(\n {},\n environmentJsonFromDeveloperAPI.data\n .map((env) => {\n return {\n [prettyPrintEnvironmentPrompt(\n env,\n numDevelopmentEnvironments == 1\n )]: env.name,\n };\n })\n .reduce((acc, curr) => {\n return { ...acc, ...curr };\n })\n );\n\n if (Object.values(environments).length === 1) {\n environment = Object.values(environments)[0];\n } else {\n environment = await select({\n message: \"Select the environment to work with\",\n choices: Object.entries(environments).map(([key, value]) => {\n return {\n name: key,\n value,\n };\n }),\n });\n }\n }\n\n argv.environment = environment;\n\n // Safely merge the values in the .zuplo.jsonc file\n if (project) {\n await safeMergeConfig(argv.dir, project);\n }\n\n // Safely merge in other auxillary files\n await pullSystemConfig(argv);\n\n await printResultToConsoleAndExitGracefully(`\nSuccessfully linked your local directory to the ${project} project in the ${account} account.\n.env.zuplo and zuplo.jsonc have been updated with the new values.`);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/cli.ts","../src/__tests__/archive-utils.test.ts","../src/__tests__/engine.test.ts","../src/__tests__/import-openapi-utils.test.ts","../src/__tests__/import-openapi.test.ts","../src/__tests__/oas-test-data.ts","../src/__tests__/outdated.test.ts","../src/__tests__/tsconfig-upgrader.test.ts","../src/build/handler.ts","../src/cmds/build.ts","../src/cmds/compile.ts","../src/cmds/convert.ts","../src/cmds/delete.ts","../src/cmds/deploy.ts","../src/cmds/dev.ts","../src/cmds/editor.ts","../src/cmds/link.ts","../src/cmds/list.ts","../src/cmds/login.ts","../src/cmds/test.ts","../src/cmds/project/import-openapi.ts","../src/cmds/project/index.ts","../src/cmds/project/update.ts","../src/cmds/tunnel/create.ts","../src/cmds/tunnel/delete.ts","../src/cmds/tunnel/describe.ts","../src/cmds/tunnel/index.ts","../src/cmds/tunnel/list.ts","../src/cmds/tunnel/rotate-token.ts","../src/cmds/tunnel/services/describe.ts","../src/cmds/tunnel/services/index.ts","../src/cmds/tunnel/services/update.ts","../src/cmds/variable/create.ts","../src/cmds/variable/index.ts","../src/cmds/variable/update.ts","../src/common/alias.ts","../src/common/args.ts","../src/common/constants.ts","../src/common/handler.ts","../src/common/logger.ts","../src/common/models.ts","../src/common/outdated.ts","../src/common/output.ts","../src/common/settings.ts","../src/common/analytics/lib.ts","../src/common/api/lib.ts","../src/common/machine-id/lib.ts","../src/common/middleware/user-configuration.ts","../src/common/middleware/user-identification.ts","../src/common/upgraders/lib.ts","../src/common/upgraders/package-json-upgrader.ts","../src/common/upgraders/tsconfig-upgrader.ts","../src/common/upgraders/vscode-settings-json-upgrader.ts","../src/common/utils/box.ts","../src/common/utils/ports.ts","../src/common/utils/types.ts","../src/common/utils/urls.ts","../src/common/validators/file-system-validator.ts","../src/common/validators/lib.ts","../src/common/validators/login-state-validator.ts","../src/common/validators/project-name-validator.ts","../src/common/xdg/lib.ts","../src/compile/handler.ts","../src/convert/engine.ts","../src/convert/handler.ts","../src/convert/routes.generated.ts","../src/delete/handler.ts","../src/delete/poll-deployment.ts","../src/deploy/archive.ts","../src/deploy/file-upload.ts","../src/deploy/handler.ts","../src/deploy/poll-deployment.ts","../src/dev/handler.ts","../src/editor/handler.ts","../src/editor/assets/index-03352ce7.js","../src/editor/server/cors-plugin.ts","../src/editor/server/server.ts","../src/editor/server/xfs.ts","../src/link/handler.ts","../src/link/populate.ts","../src/list/handler.ts","../src/login/handler.ts","../src/login/server.ts","../src/project/import-openapi/handler.ts","../src/project/import-openapi/interfaces.ts","../src/project/import-openapi/utils.ts","../src/project/update/handler.ts","../src/test/esbuild-config.ts","../src/test/handler.ts","../src/test/invoke-test.ts","../src/test/esbuild-plugins/node-test-prep-plugin.ts","../src/tunnel/models.ts","../src/tunnel/create/handler.ts","../src/tunnel/delete/handler.ts","../src/tunnel/delete/poll-teardown-operation.ts","../src/tunnel/describe/handler.ts","../src/tunnel/list/handler.ts","../src/tunnel/rotate-token/handler.ts","../src/tunnel/services/describe/handler.ts","../src/tunnel/services/update/handler.ts","../src/tunnel/services/update/poll-provisioning-operations.ts","../src/variable/models.ts","../src/variable/create/handler.ts","../src/variable/update/handler.ts"],"version":"5.6.2"}
|
|
1
|
+
{"root":["../src/cli.ts","../src/__tests__/archive-utils.test.ts","../src/__tests__/engine.test.ts","../src/__tests__/import-openapi-utils.test.ts","../src/__tests__/import-openapi.test.ts","../src/__tests__/oas-test-data.ts","../src/__tests__/outdated.test.ts","../src/__tests__/tsconfig-upgrader.test.ts","../src/build/handler.ts","../src/cmds/build.ts","../src/cmds/compile.ts","../src/cmds/convert.ts","../src/cmds/delete.ts","../src/cmds/deploy.ts","../src/cmds/dev.ts","../src/cmds/editor.ts","../src/cmds/link.ts","../src/cmds/list.ts","../src/cmds/login.ts","../src/cmds/test.ts","../src/cmds/project/import-openapi.ts","../src/cmds/project/index.ts","../src/cmds/project/update.ts","../src/cmds/tunnel/create.ts","../src/cmds/tunnel/delete.ts","../src/cmds/tunnel/describe.ts","../src/cmds/tunnel/index.ts","../src/cmds/tunnel/list.ts","../src/cmds/tunnel/rotate-token.ts","../src/cmds/tunnel/services/describe.ts","../src/cmds/tunnel/services/index.ts","../src/cmds/tunnel/services/update.ts","../src/cmds/variable/create.ts","../src/cmds/variable/index.ts","../src/cmds/variable/update.ts","../src/common/alias.ts","../src/common/args.ts","../src/common/constants.ts","../src/common/handler.ts","../src/common/logger.ts","../src/common/models.ts","../src/common/outdated.ts","../src/common/output.ts","../src/common/settings.ts","../src/common/analytics/lib.ts","../src/common/api/lib.ts","../src/common/machine-id/lib.ts","../src/common/middleware/user-configuration.ts","../src/common/middleware/user-identification.ts","../src/common/upgraders/lib.ts","../src/common/upgraders/package-json-upgrader.ts","../src/common/upgraders/tsconfig-upgrader.ts","../src/common/upgraders/vscode-settings-json-upgrader.ts","../src/common/utils/box.ts","../src/common/utils/ports.ts","../src/common/utils/types.ts","../src/common/utils/urls.ts","../src/common/validators/file-system-validator.ts","../src/common/validators/lib.ts","../src/common/validators/login-state-validator.ts","../src/common/validators/project-name-validator.ts","../src/common/xdg/lib.ts","../src/compile/handler.ts","../src/convert/engine.ts","../src/convert/handler.ts","../src/convert/routes.generated.ts","../src/delete/handler.ts","../src/delete/poll-deployment.ts","../src/deploy/archive.ts","../src/deploy/environments.ts","../src/deploy/file-upload.ts","../src/deploy/handler.ts","../src/deploy/poll-deployment.ts","../src/dev/handler.ts","../src/editor/handler.ts","../src/editor/assets/index-03352ce7.js","../src/editor/server/cors-plugin.ts","../src/editor/server/server.ts","../src/editor/server/xfs.ts","../src/link/handler.ts","../src/link/populate.ts","../src/list/handler.ts","../src/login/handler.ts","../src/login/server.ts","../src/project/import-openapi/handler.ts","../src/project/import-openapi/interfaces.ts","../src/project/import-openapi/utils.ts","../src/project/update/handler.ts","../src/test/esbuild-config.ts","../src/test/handler.ts","../src/test/invoke-test.ts","../src/test/esbuild-plugins/node-test-prep-plugin.ts","../src/tunnel/models.ts","../src/tunnel/create/handler.ts","../src/tunnel/delete/handler.ts","../src/tunnel/delete/poll-teardown-operation.ts","../src/tunnel/describe/handler.ts","../src/tunnel/list/handler.ts","../src/tunnel/rotate-token/handler.ts","../src/tunnel/services/describe/handler.ts","../src/tunnel/services/update/handler.ts","../src/tunnel/services/update/poll-provisioning-operations.ts","../src/variable/models.ts","../src/variable/create/handler.ts","../src/variable/update/handler.ts"],"version":"5.6.2"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zuplo/cli",
|
|
3
|
-
"version": "6.7.
|
|
3
|
+
"version": "6.7.2",
|
|
4
4
|
"repository": "https://github.com/zuplo/zuplo",
|
|
5
5
|
"author": "Zuplo, Inc.",
|
|
6
6
|
"type": "module",
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
"@opentelemetry/api": "^1.8.0",
|
|
30
30
|
"@sentry/node": "^7.119.2",
|
|
31
31
|
"@swc/core": "1.7.6",
|
|
32
|
-
"@zuplo/core": "^6.7.
|
|
32
|
+
"@zuplo/core": "^6.7.2",
|
|
33
33
|
"@zuplo/pino-pretty-configurations": "^1.5.0",
|
|
34
|
-
"@zuplo/runtime": "^6.7.
|
|
34
|
+
"@zuplo/runtime": "^6.7.2",
|
|
35
35
|
"chalk": "^5.3.0",
|
|
36
36
|
"chokidar": "^3.5.3",
|
|
37
37
|
"dotenv": "^16.4.5",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"strip-ansi": "^7.1.0",
|
|
58
58
|
"tar": "^7.4.3",
|
|
59
59
|
"uuid": "^10.0.0",
|
|
60
|
-
"workerd": "1.
|
|
60
|
+
"workerd": "1.20241011.1",
|
|
61
61
|
"yargs": "^17.7.1"
|
|
62
62
|
}
|
|
63
63
|
}
|