@zuplo/cli 6.43.11 → 6.43.12
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/README.md +31 -31
- package/dist/__tests__/archive-utils.test.js +2 -2
- package/dist/__tests__/archive-utils.test.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/cmds/build.js +2 -2
- package/dist/cmds/build.js.map +1 -1
- package/dist/cmds/compile.js +4 -4
- package/dist/cmds/compile.js.map +1 -1
- package/dist/cmds/convert.js +1 -1
- package/dist/cmds/convert.js.map +1 -1
- package/dist/cmds/delete.d.ts.map +1 -1
- package/dist/cmds/delete.js +7 -6
- package/dist/cmds/delete.js.map +1 -1
- package/dist/cmds/deploy.d.ts.map +1 -1
- package/dist/cmds/deploy.js +4 -4
- package/dist/cmds/deploy.js.map +1 -1
- package/dist/cmds/dev.js +3 -3
- package/dist/cmds/dev.js.map +1 -1
- package/dist/cmds/editor.js +2 -2
- package/dist/cmds/editor.js.map +1 -1
- package/dist/cmds/link.d.ts.map +1 -1
- package/dist/cmds/link.js +4 -4
- package/dist/cmds/link.js.map +1 -1
- package/dist/cmds/list.d.ts.map +1 -1
- package/dist/cmds/list.js +3 -3
- package/dist/cmds/list.js.map +1 -1
- package/dist/cmds/login.d.ts.map +1 -1
- package/dist/cmds/login.js +3 -8
- package/dist/cmds/login.js.map +1 -1
- package/dist/cmds/project/import-openapi.js +1 -1
- package/dist/cmds/project/import-openapi.js.map +1 -1
- package/dist/cmds/project/update.js +2 -2
- package/dist/cmds/project/update.js.map +1 -1
- package/dist/cmds/test.js +3 -3
- package/dist/cmds/test.js.map +1 -1
- package/dist/cmds/tunnel/create.d.ts.map +1 -1
- package/dist/cmds/tunnel/create.js +4 -3
- package/dist/cmds/tunnel/create.js.map +1 -1
- package/dist/cmds/tunnel/delete.d.ts.map +1 -1
- package/dist/cmds/tunnel/delete.js +3 -3
- package/dist/cmds/tunnel/delete.js.map +1 -1
- package/dist/cmds/tunnel/describe.d.ts.map +1 -1
- package/dist/cmds/tunnel/describe.js +4 -3
- package/dist/cmds/tunnel/describe.js.map +1 -1
- package/dist/cmds/tunnel/list.js +1 -1
- package/dist/cmds/tunnel/list.js.map +1 -1
- package/dist/cmds/tunnel/rotate-token.d.ts.map +1 -1
- package/dist/cmds/tunnel/rotate-token.js +4 -3
- package/dist/cmds/tunnel/rotate-token.js.map +1 -1
- package/dist/cmds/tunnel/services/describe.d.ts.map +1 -1
- package/dist/cmds/tunnel/services/describe.js +4 -3
- package/dist/cmds/tunnel/services/describe.js.map +1 -1
- package/dist/cmds/tunnel/services/update.d.ts.map +1 -1
- package/dist/cmds/tunnel/services/update.js +4 -3
- package/dist/cmds/tunnel/services/update.js.map +1 -1
- package/dist/cmds/variable/create.d.ts.map +1 -1
- package/dist/cmds/variable/create.js +4 -3
- package/dist/cmds/variable/create.js.map +1 -1
- package/dist/cmds/variable/update.d.ts.map +1 -1
- package/dist/cmds/variable/update.js +9 -3
- package/dist/cmds/variable/update.js.map +1 -1
- package/dist/common/middleware/authentication.d.ts +4 -0
- package/dist/common/middleware/authentication.d.ts.map +1 -0
- package/dist/common/middleware/authentication.js +46 -0
- package/dist/common/middleware/authentication.js.map +1 -0
- package/dist/common/middleware/user-configuration.js +1 -1
- package/dist/common/middleware/user-configuration.js.map +1 -1
- package/dist/common/middleware/user-identification.js.map +1 -1
- package/dist/common/settings.d.ts +0 -1
- package/dist/common/settings.d.ts.map +1 -1
- package/dist/common/settings.js +0 -3
- package/dist/common/settings.js.map +1 -1
- package/dist/common/upgraders/package-json-upgrader.js +4 -4
- package/dist/common/upgraders/package-json-upgrader.js.map +1 -1
- package/dist/delete/handler.d.ts +1 -1
- package/dist/delete/handler.js +2 -2
- package/dist/delete/handler.js.map +1 -1
- package/dist/delete/poll-deployment.js +1 -1
- package/dist/delete/poll-deployment.js.map +1 -1
- package/dist/deploy/environments.js +2 -2
- package/dist/deploy/environments.js.map +1 -1
- package/dist/deploy/handler.d.ts +1 -1
- package/dist/deploy/handler.js +4 -4
- package/dist/deploy/handler.js.map +1 -1
- package/dist/deploy/poll-deployment.js +2 -2
- package/dist/deploy/poll-deployment.js.map +1 -1
- package/dist/link/handler.d.ts +1 -1
- package/dist/link/handler.js +4 -4
- package/dist/link/handler.js.map +1 -1
- package/dist/link/populate.d.ts +1 -1
- package/dist/link/populate.d.ts.map +1 -1
- package/dist/link/populate.js +3 -3
- package/dist/link/populate.js.map +1 -1
- package/dist/list/handler.d.ts +1 -1
- package/dist/list/handler.js +2 -2
- package/dist/list/handler.js.map +1 -1
- package/dist/login/handler.d.ts +1 -4
- package/dist/login/handler.d.ts.map +1 -1
- package/dist/login/handler.js +3 -6
- package/dist/login/handler.js.map +1 -1
- package/dist/login/html.d.ts +2 -0
- package/dist/login/html.d.ts.map +1 -0
- package/dist/login/html.js +84 -0
- package/dist/login/html.js.map +1 -0
- package/dist/login/server.d.ts.map +1 -1
- package/dist/login/server.js +4 -2
- package/dist/login/server.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tunnel/create/handler.d.ts +1 -1
- package/dist/tunnel/create/handler.js +1 -1
- package/dist/tunnel/create/handler.js.map +1 -1
- package/dist/tunnel/delete/handler.d.ts +1 -1
- package/dist/tunnel/delete/handler.js +1 -1
- package/dist/tunnel/delete/handler.js.map +1 -1
- package/dist/tunnel/delete/poll-teardown-operation.js +2 -2
- package/dist/tunnel/delete/poll-teardown-operation.js.map +1 -1
- package/dist/tunnel/describe/handler.d.ts +1 -1
- package/dist/tunnel/describe/handler.js +1 -1
- package/dist/tunnel/describe/handler.js.map +1 -1
- package/dist/tunnel/list/handler.d.ts +1 -1
- package/dist/tunnel/list/handler.js +1 -1
- package/dist/tunnel/list/handler.js.map +1 -1
- package/dist/tunnel/rotate-token/handler.d.ts +1 -1
- package/dist/tunnel/rotate-token/handler.js +1 -1
- package/dist/tunnel/rotate-token/handler.js.map +1 -1
- package/dist/tunnel/services/describe/handler.d.ts +1 -1
- package/dist/tunnel/services/describe/handler.js +1 -1
- package/dist/tunnel/services/describe/handler.js.map +1 -1
- package/dist/tunnel/services/update/handler.d.ts +1 -1
- package/dist/tunnel/services/update/handler.js +1 -1
- package/dist/tunnel/services/update/handler.js.map +1 -1
- package/dist/tunnel/services/update/poll-provisioning-operations.js +2 -2
- package/dist/tunnel/services/update/poll-provisioning-operations.js.map +1 -1
- package/dist/variable/create/handler.js +1 -1
- package/dist/variable/create/handler.js.map +1 -1
- package/dist/variable/models.d.ts +1 -1
- package/dist/variable/models.js.map +1 -1
- package/dist/variable/update/handler.js +1 -1
- package/dist/variable/update/handler.js.map +1 -1
- package/package.json +4 -4
- package/dist/common/validators/login-state-validator.d.ts +0 -14
- package/dist/common/validators/login-state-validator.d.ts.map +0 -1
- package/dist/common/validators/login-state-validator.js +0 -39
- package/dist/common/validators/login-state-validator.js.map +0 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { confirm } from "@inquirer/prompts";
|
|
2
|
+
import { decodeJwt } from "jose";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { readFile } from "node:fs/promises";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { login } from "../../login/handler.js";
|
|
7
|
+
import { ZUPLO_AUTH_FILE_NAME } from "../constants.js";
|
|
8
|
+
import { printCriticalFailureToConsoleAndExit } from "../output.js";
|
|
9
|
+
import { ZUPLO_XDG_STATE_HOME } from "../xdg/lib.js";
|
|
10
|
+
async function fail() {
|
|
11
|
+
await printCriticalFailureToConsoleAndExit(`You are not authenticated. Please run \`zuplo login\` to log in or set an api key.`);
|
|
12
|
+
}
|
|
13
|
+
async function getAuthToken() {
|
|
14
|
+
if (!existsSync(join(ZUPLO_XDG_STATE_HOME, ZUPLO_AUTH_FILE_NAME))) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const rawAuth = await readFile(join(ZUPLO_XDG_STATE_HOME, ZUPLO_AUTH_FILE_NAME), "utf-8");
|
|
18
|
+
const authJson = JSON.parse(rawAuth);
|
|
19
|
+
const jwt = decodeJwt(authJson.access_token);
|
|
20
|
+
if (!jwt.exp || jwt.exp < Date.now() / 1000) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
return authJson.access_token;
|
|
24
|
+
}
|
|
25
|
+
export async function authenticate(argv) {
|
|
26
|
+
if (argv["api-key"]) {
|
|
27
|
+
Object.assign(argv, { authToken: argv["api-key"] });
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const token = await getAuthToken();
|
|
31
|
+
if (!token) {
|
|
32
|
+
const result = await confirm({
|
|
33
|
+
message: "You are not authenticated. Would you like to log in?",
|
|
34
|
+
});
|
|
35
|
+
if (!result) {
|
|
36
|
+
return fail();
|
|
37
|
+
}
|
|
38
|
+
await login();
|
|
39
|
+
const isValid = await getAuthToken();
|
|
40
|
+
if (!isValid) {
|
|
41
|
+
return fail();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
Object.assign(argv, { authToken: token });
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=authentication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication.js","sourceRoot":"","sources":["../../../src/common/middleware/authentication.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,oCAAoC,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,KAAK,UAAU,IAAI;IACjB,MAAM,oCAAoC,CACxC,oFAAoF,CACrF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY;IAEzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC;QAClE,OAAO;IACT,CAAC;IAGD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,IAAI,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,EAChD,OAAO,CACR,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAErC,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAE7C,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QAC5C,OAAO;IACT,CAAC;IACD,OAAO,QAAQ,CAAC,YAAY,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAA4B;IAC7D,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IAEnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAC3B,OAAO,EAAE,sDAAsD;SAChE,CAAC,CAAC;QAGH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAGD,MAAM,KAAK,EAAE,CAAC;QAGd,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAGD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import { confirm } from \"@inquirer/prompts\";\nimport { decodeJwt } from \"jose\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { login } from \"../../login/handler.js\";\nimport { ZUPLO_AUTH_FILE_NAME } from \"../constants.js\";\nimport { printCriticalFailureToConsoleAndExit } from \"../output.js\";\nimport { ZUPLO_XDG_STATE_HOME } from \"../xdg/lib.js\";\n\nasync function fail() {\n await printCriticalFailureToConsoleAndExit(\n `You are not authenticated. Please run \\`zuplo login\\` to log in or set an api key.`\n );\n}\n\nasync function getAuthToken(): Promise<string | undefined> {\n // The auth file doesn't exist.\n if (!existsSync(join(ZUPLO_XDG_STATE_HOME, ZUPLO_AUTH_FILE_NAME))) {\n return;\n }\n\n // The credentials have expired.\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\n const jwt = decodeJwt(authJson.access_token);\n\n if (!jwt.exp || jwt.exp < Date.now() / 1000) {\n return;\n }\n return authJson.access_token;\n}\n\nexport async function authenticate(argv: { \"api-key\"?: string }) {\n if (argv[\"api-key\"]) {\n Object.assign(argv, { authToken: argv[\"api-key\"] });\n return;\n }\n\n const token = await getAuthToken();\n\n if (!token) {\n const result = await confirm({\n message: \"You are not authenticated. Would you like to log in?\",\n });\n\n // IF the user said no, then return an error\n if (!result) {\n return fail();\n }\n\n // Login\n await login();\n\n // Validate the login again\n const isValid = await getAuthToken();\n if (!isValid) {\n return fail();\n }\n }\n\n // Assign the token to the args\n Object.assign(argv, { authToken: token });\n}\n"]}
|
|
@@ -11,7 +11,7 @@ export async function configure(argv) {
|
|
|
11
11
|
const whoAmIResponse = await fetch(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/who-am-i`, {
|
|
12
12
|
method: "GET",
|
|
13
13
|
headers: {
|
|
14
|
-
Authorization: `Bearer ${argv
|
|
14
|
+
Authorization: `Bearer ${argv.authToken}`,
|
|
15
15
|
},
|
|
16
16
|
});
|
|
17
17
|
if (whoAmIResponse.ok) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-configuration.js","sourceRoot":"","sources":["../../../src/common/middleware/user-configuration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,oCAAoC,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAgBtC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAgC;IAI9D,MAAM,0BAA0B,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAG/C,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,GAAG,QAAQ,CAAC,4BAA4B,cAAc,EACtD;QACE,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"user-configuration.js","sourceRoot":"","sources":["../../../src/common/middleware/user-configuration.ts"],"names":[],"mappings":"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","sourcesContent":["import { ParseError, parse } from \"jsonc-parser\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport {\n ZUPLO_FALLBACK_JSON_FILE,\n ZUPLO_PREFERRED_JSON_FILE,\n} from \"../constants.js\";\nimport { logger } from \"../logger.js\";\nimport { printCriticalFailureToConsoleAndExit } from \"../output.js\";\nimport settings from \"../settings.js\";\n\n/**\n * This is the middleware to set the context for the CLI calls.\n *\n * It can be used to set sensible configurations such as account and project that are gotten from the API, zuplo.jsonc, --parameters\n *\n * The order of setting a configuration is\n * 1. API key\n * 2. zuplo.jsonc\n * 3. --parameters from the CLI invocation\n *\n * Note that --parameters objects can also come from .env file because of https://yargs.js.org/docs/#api-reference-envprefix\n *\n * @param argv - The yargs object\n */\nexport async function configure(argv: { [key: string]: unknown }) {\n // Clone the original value (for merging at the end)\n // The original is the most specific since it can only contain things from --parameters\n // It will always be applied last to override anything from zuplo.jsonc or the API key\n const cliParametersConfiguration = { ...argv };\n\n // Make a call to the API key\n const whoAmIResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/who-am-i`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n\n if (whoAmIResponse.ok) {\n // Note that the algorithms below are based on \"addition\"\n // You cannot unset/remove a value from the configuration by setting it to null/undefined\n // Do be mindful of parameters that might be the same value since things might be overridden\n\n // Merge any non-null values from the API key\n const apiKeyMetadata = await whoAmIResponse.json();\n Object.assign(argv, omitNull(apiKeyMetadata));\n\n // Merge any non-null values from zuplo.jsonc\n // For now, only merge project since zuplo.jsonc could have many keys that might conflict\n const { project: zuploJsoncProject } = await processZuploConfigurationFile(\n argv.dir as string | undefined\n );\n if (zuploJsoncProject) {\n argv.project = zuploJsoncProject;\n }\n\n // Merge any non-null values from --parameters\n Object.assign(argv, cliParametersConfiguration);\n } else {\n logger.trace(\n { status: whoAmIResponse.status, statusText: whoAmIResponse.statusText },\n \"Failed to determine who-am-i\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to validate the API key. Check your API key.\"\n );\n }\n}\n\nasync function processZuploConfigurationFile(\n sourceDirectory: string | undefined\n) {\n const normalizedDir = join(relative(process.cwd(), sourceDirectory ?? \".\"));\n const preferredPath = join(normalizedDir, ZUPLO_PREFERRED_JSON_FILE);\n const fallbackPath = join(normalizedDir, ZUPLO_FALLBACK_JSON_FILE);\n let fileContents = \"{}\";\n if (existsSync(preferredPath)) {\n fileContents = await readFile(preferredPath, \"utf-8\");\n } else if (existsSync(fallbackPath)) {\n fileContents = await readFile(fallbackPath, \"utf-8\");\n } else {\n logger.trace(\"No zuplo.jsonc file found\");\n return {};\n }\n\n // If we get here, we have a zuplo.jsonc (or, zuplo.json) file\n // That means we should report any issues with it.\n const errors: ParseError[] = [];\n const data = parse(fileContents, errors, { allowTrailingComma: true });\n if (errors.length > 0) {\n logger.trace(errors[0], \"Failed to parse zuplo.jsonc\");\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to parse the values from zuplo.jsonc. Check your zuplo.jsonc file.\"\n );\n }\n return data;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst omitNull = (obj: any) => {\n Object.keys(obj)\n .filter((k) => obj[k] === null)\n .forEach((k) => delete obj[k]);\n return obj;\n};\n"]}
|
|
@@ -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;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,MAAM,CAAC;YAEP,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 `
|
|
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,MAAM,CAAC;YAEP,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 `zuplo 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 {\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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/common/settings.ts"],"names":[],"mappings":"AACA,cAAM,QAAQ;IACZ,IAAI,4BAA4B,IAAI,MAAM,CAEzC;IAED,IAAI,
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/common/settings.ts"],"names":[],"mappings":"AACA,cAAM,QAAQ;IACZ,IAAI,4BAA4B,IAAI,MAAM,CAEzC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,wBAAwB,IAAI,MAAM,CAErC;IAED,IAAI,0BAA0B,IAAI,MAAM,CAEvC;CACF;AAED,QAAA,MAAM,QAAQ,UAAiB,CAAC;AAChC,eAAe,QAAQ,CAAC"}
|
package/dist/common/settings.js
CHANGED
|
@@ -2,9 +2,6 @@ class Settings {
|
|
|
2
2
|
get ZUPLO_DEVELOPER_API_ENDPOINT() {
|
|
3
3
|
return process.env.ZUPLO_DEVELOPER_API_ENDPOINT ?? "https://dev.zuplo.com";
|
|
4
4
|
}
|
|
5
|
-
get ZUPLO_API_ENDPOINT() {
|
|
6
|
-
return process.env.ZUPLO_API_ENDPOINT ?? "https://api.zuplo.com";
|
|
7
|
-
}
|
|
8
5
|
get MAX_POLL_RETRIES() {
|
|
9
6
|
return parseInt(process.env.MAX_POLL_RETRIES ?? "150");
|
|
10
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/common/settings.ts"],"names":[],"mappings":"AACA,MAAM,QAAQ;IACZ,IAAI,4BAA4B;QAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,uBAAuB,CAAC;IAC7E,CAAC;IAED,IAAI,
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/common/settings.ts"],"names":[],"mappings":"AACA,MAAM,QAAQ;IACZ,IAAI,4BAA4B;QAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,uBAAuB,CAAC;IAC7E,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,aAAa;QACf,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,wBAAwB;QAC1B,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,IAAI,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,0BAA0B;QAC5B,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC,CAAC;IAChE,CAAC;CACF;AAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;AAChC,eAAe,QAAQ,CAAC","sourcesContent":["/* eslint-disable node/no-process-env */\nclass Settings {\n get ZUPLO_DEVELOPER_API_ENDPOINT(): string {\n return process.env.ZUPLO_DEVELOPER_API_ENDPOINT ?? \"https://dev.zuplo.com\";\n }\n\n get MAX_POLL_RETRIES(): number {\n return parseInt(process.env.MAX_POLL_RETRIES ?? \"150\");\n }\n\n get POLL_INTERVAL(): number {\n return parseInt(process.env.POLL_INTERVAL ?? \"1000\");\n }\n\n get MAX_PROVISIONING_RETRIES(): number {\n return parseInt(process.env.MAX_PROVISIONING_RETRIES ?? \"60\");\n }\n\n get PROVISIONING_POLL_INTERVAL(): number {\n return parseInt(process.env.PROVISIONING_INTERVAL ?? \"15000\");\n }\n}\n\nconst settings = new Settings();\nexport default settings;\n"]}
|
|
@@ -23,16 +23,16 @@ export class PackageJsonUpgrader extends StandardUpgrader {
|
|
|
23
23
|
const packageJsonFile = join(this.normalizedDir, "package.json");
|
|
24
24
|
const rawPackage = await readFile(packageJsonFile, "utf-8");
|
|
25
25
|
const packageJson = JSON.parse(rawPackage);
|
|
26
|
-
packageJson.scripts.dev = "
|
|
26
|
+
packageJson.scripts.dev = "zuplo dev";
|
|
27
27
|
if (packageJson.scripts.build &&
|
|
28
28
|
(packageJson.scripts.build === "zup build" ||
|
|
29
29
|
packageJson.scripts.build === "zuplo build"))
|
|
30
30
|
delete packageJson.scripts.build;
|
|
31
|
-
if (packageJson.scripts.test && packageJson.scripts.test === "
|
|
32
|
-
packageJson.scripts.test = "
|
|
31
|
+
if (packageJson.scripts.test && packageJson.scripts.test === "zup test") {
|
|
32
|
+
packageJson.scripts.test = "zuplo test";
|
|
33
33
|
}
|
|
34
34
|
else if (!packageJson.scripts.test) {
|
|
35
|
-
packageJson.scripts.test = "
|
|
35
|
+
packageJson.scripts.test = "zuplo test";
|
|
36
36
|
}
|
|
37
37
|
if (packageJson.scripts.postinstall &&
|
|
38
38
|
packageJson.scripts.postinstall === "husky install") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-json-upgrader.js","sourceRoot":"","sources":["../../../src/common/upgraders/package-json-upgrader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD;QACE,KAAK,CAAC,8DAA8D,CAAC,CAAC;QACtE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,gBAAgB;IACvD,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC;YAEH,MAAM,UAAU,GAAG,MAAM,QAAQ,CAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,EACxC,OAAO,CACR,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACvB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,wBAAwB,EAAE,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAE5D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAG3C,WAAW,CAAC,OAAO,CAAC,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"package-json-upgrader.js","sourceRoot":"","sources":["../../../src/common/upgraders/package-json-upgrader.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { format } from \"prettier\";\nimport { Result } from \"../validators/lib.js\";\nimport { StandardUpgrader } from \"./lib.js\";\n\nexport class FailedToParsePackageJson extends Error {\n constructor() {\n super(\"Invalid package.json: Failed to parse the package.json file.\");\n Object.setPrototypeOf(this, FailedToParsePackageJson.prototype);\n }\n}\n\nexport class PackageJsonUpgrader extends StandardUpgrader {\n async isApplicable(): Promise<Result> {\n try {\n // Read in the package.json file\n const rawPackage = await readFile(\n join(this.normalizedDir, \"package.json\"),\n \"utf-8\"\n );\n JSON.parse(rawPackage);\n return { ok: true };\n } catch {\n return { ok: false, error: new FailedToParsePackageJson() };\n }\n }\n\n async upgrade(): Promise<void> {\n const packageJsonFile = join(this.normalizedDir, \"package.json\");\n const rawPackage = await readFile(packageJsonFile, \"utf-8\");\n\n const packageJson = JSON.parse(rawPackage);\n\n // Add the dev script\n packageJson.scripts.dev = \"zuplo dev\";\n\n // Remove the build script\n if (\n packageJson.scripts.build &&\n (packageJson.scripts.build === \"zup build\" ||\n packageJson.scripts.build === \"zuplo build\")\n )\n delete packageJson.scripts.build;\n\n // Fix the test script\n if (packageJson.scripts.test && packageJson.scripts.test === \"zup test\") {\n packageJson.scripts.test = \"zuplo test\";\n } else if (!packageJson.scripts.test) {\n packageJson.scripts.test = \"zuplo test\";\n }\n\n if (\n packageJson.scripts.postinstall &&\n packageJson.scripts.postinstall === \"husky install\"\n ) {\n delete packageJson.scripts.postinstall;\n }\n\n // Tackle the dependencies\n packageJson.dependencies[\"zuplo\"] = \"latest\";\n if (packageJson.dependencies[\"@zuplo/runtime\"]) {\n delete packageJson.dependencies[\"@zuplo/runtime\"];\n }\n if (packageJson.dependencies[\"@zuplo/core\"]) {\n delete packageJson.dependencies[\"@zuplo/core\"];\n }\n\n // Tackle the devDependencies\n if (packageJson.devDependencies) {\n if (packageJson.devDependencies[\"@zuplo/test\"])\n delete packageJson.devDependencies[\"@zuplo/test\"];\n\n if (packageJson.devDependencies[\"husky\"])\n delete packageJson.devDependencies[\"husky\"];\n\n if (packageJson.devDependencies[\"chai\"])\n delete packageJson.devDependencies[\"chai\"];\n\n if (packageJson.devDependencies[\"@types/chai\"])\n delete packageJson.devDependencies[\"@types/chai\"];\n }\n\n // Write out the new package.json\n const formatted = await format(JSON.stringify(packageJson), {\n parser: \"json-stringify\",\n quoteProps: \"as-needed\",\n });\n\n await writeFile(packageJsonFile, formatted);\n }\n}\n"]}
|
package/dist/delete/handler.d.ts
CHANGED
package/dist/delete/handler.js
CHANGED
|
@@ -25,7 +25,7 @@ async function deleteFromSaas(argv) {
|
|
|
25
25
|
const deleteResponse = await fetch(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/deployments/${deploymentName}`, {
|
|
26
26
|
method: "DELETE",
|
|
27
27
|
headers: {
|
|
28
|
-
Authorization: `Bearer ${argv
|
|
28
|
+
Authorization: `Bearer ${argv.authToken}`,
|
|
29
29
|
},
|
|
30
30
|
});
|
|
31
31
|
if (deleteResponse.ok) {
|
|
@@ -64,7 +64,7 @@ async function deleteFromSelfHosted(argv) {
|
|
|
64
64
|
const deleteResponse = await fetch(`${endpoint}/v1/deployments/${deploymentName}`, {
|
|
65
65
|
method: "DELETE",
|
|
66
66
|
headers: {
|
|
67
|
-
Authorization: `Bearer ${argv
|
|
67
|
+
Authorization: `Bearer ${argv.authToken}`,
|
|
68
68
|
},
|
|
69
69
|
});
|
|
70
70
|
if (deleteResponse.ok) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/delete/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,oCAAoC,EACpC,qCAAqC,GACtC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AActD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAe;IAC7C,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAsB,CAAC;QACpC,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAe;IAE3C,IAAI,cAAc,CAAC;IACnB,IAAI,CAAC;QACH,cAAc,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;QAC7C,MAAM,oCAAoC,CACxC,mCAAmC,IAAI,CAAC,GAAG,wCAAwC,CACpF,CAAC;IACJ,CAAC;IAGD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,aAAa,OAAO,gBAAgB,cAAc,EAAE,EACnH;QACE,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/delete/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalize } from \"node:path\";\nimport { logger } from \"../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printResultToConsoleAndExitGracefully,\n} from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { RequiredProperties } from \"../common/utils/types.js\";\nimport { pingDeployment } from \"./poll-deployment.js\";\n\nexport interface Arguments {\n account: string;\n project: string;\n url: string;\n authToken: string;\n wait: boolean;\n \"self-hosted-endpoint\"?: string;\n}\n\ntype SelfHostedArgs = RequiredProperties<Arguments, \"self-hosted-endpoint\">;\n\n// delete is a reserved keyword in JavaScript, so we call this function deleteZup\nexport async function deleteZup(argv: Arguments) {\n if (argv[\"self-hosted-endpoint\"]) {\n const args = argv as SelfHostedArgs;\n await deleteFromSelfHosted(args);\n } else {\n await deleteFromSaas(argv);\n }\n}\n\nasync function deleteFromSaas(argv: Arguments) {\n // 1. Extract the URL and normalize\n let deploymentName;\n try {\n deploymentName = await checkUrl(argv, deploymentName);\n } catch (err) {\n logger.error(err, \"Failed to parse the URL\");\n await printCriticalFailureToConsoleAndExit(\n `Error: Failed to parse the URL: ${argv.url}. Ensure you have entered a valid URL.`\n );\n }\n\n // 2. Build delete request\n const { account, project } = argv;\n const deleteResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/deployments/${deploymentName}`,\n {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n\n if (deleteResponse.ok) {\n if (argv.wait) {\n // 3. Poll until the deployment is no longer available\n const deleted = await pingDeployment(argv);\n if (!deleted) {\n logger.error(\n `Failed to confirm deletion of zup within alloted time frame.`\n );\n await printCriticalFailureToConsoleAndExit(\n `Error: Failed to confirm deletion of zup within alloted time frame of ${\n settings.MAX_POLL_RETRIES * settings.POLL_INTERVAL\n } ms. Your zup is still be available at ${argv.url}.`\n );\n } else {\n await printResultToConsoleAndExitGracefully(`Deleted ${argv.url}`);\n }\n } else {\n await printResultToConsoleAndExitGracefully(\n `Enqueued deletion of ${argv.url}`\n );\n }\n } else {\n logger.error(\n {\n status: deleteResponse.status,\n statusText: deleteResponse.statusText,\n },\n \"Failed to enqueue the deletion request\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to enqueue the deletion request. Try again later.\"\n );\n }\n}\n\nasync function deleteFromSelfHosted(argv: SelfHostedArgs) {\n // 1. Extract the URL and normalize\n let deploymentName;\n try {\n deploymentName = await checkUrl(argv, deploymentName);\n } catch (err) {\n logger.error(err, \"Failed to parse the URL\");\n await printCriticalFailureToConsoleAndExit(\n `Error: Failed to parse the URL: ${argv.url}. Ensure you have entered a valid URL.`\n );\n }\n\n // 2. Build delete request\n const endpoint = normalize(argv[\"self-hosted-endpoint\"]);\n const deleteResponse = await fetch(\n `${endpoint}/v1/deployments/${deploymentName}`,\n {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n\n if (deleteResponse.ok) {\n await printResultToConsoleAndExitGracefully(\n `Enqueued deletion of ${argv.url}`\n );\n } else {\n logger.error(\n JSON.stringify(await deleteResponse.json(), null, 2),\n \"Failed to upload to self-hosted build endpoint\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to enqueue the deletion request. Try again later.\"\n );\n }\n}\n\nasync function checkUrl(argv: Arguments, deploymentName: unknown) {\n let url = argv.url;\n if (!/^(http:\\/\\/|https:\\/\\/)/i.test(argv.url)) {\n url = \"https://\" + url;\n }\n const parsedUrl = new URL(url);\n\n if (parsedUrl.username || parsedUrl.password) {\n logger.error(`Extra username and/or password was included in the URL.`);\n await printCriticalFailureToConsoleAndExit(\n `Error: Extraneous username and/or password in the URL. Only include the hostname.`\n );\n }\n\n if (parsedUrl.pathname !== \"/\") {\n logger.error(\n `Extra pathname was included in the URL: ${parsedUrl.pathname}`\n );\n await printCriticalFailureToConsoleAndExit(\n `Error: Extraneous pathname in URL: ${parsedUrl.pathname}. Only include the hostname.`\n );\n }\n\n if (parsedUrl.search !== \"\") {\n logger.error(\n `Extra search params were included in the URL: ${parsedUrl.search}`\n );\n await printCriticalFailureToConsoleAndExit(\n `Error: Extraneous search params in URL: ${parsedUrl.search}. Only include the hostname.`\n );\n }\n\n deploymentName = parsedUrl.hostname.split(\".\")[0];\n return deploymentName;\n}\n"]}
|
|
@@ -5,7 +5,7 @@ function wait(duration = settings.POLL_INTERVAL) {
|
|
|
5
5
|
}
|
|
6
6
|
export async function pingDeployment(argv) {
|
|
7
7
|
for (let pollRetry = 0; pollRetry < settings.MAX_POLL_RETRIES; pollRetry++) {
|
|
8
|
-
printDiagnosticsToConsole(`Waiting for
|
|
8
|
+
printDiagnosticsToConsole(`Waiting for Zuplo deployment to be deleted... (${pollRetry}/${settings.MAX_POLL_RETRIES})`);
|
|
9
9
|
const response = await fetch(`${argv.url}/__zuplo/build`);
|
|
10
10
|
if (!response.ok) {
|
|
11
11
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll-deployment.js","sourceRoot":"","sources":["../../src/delete/poll-deployment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAG7C,SAAS,IAAI,CAAC,WAAmB,QAAQ,CAAC,aAAa;IACrD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAe;IAClD,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,CAAC;QAC3E,yBAAyB,CACvB,
|
|
1
|
+
{"version":3,"file":"poll-deployment.js","sourceRoot":"","sources":["../../src/delete/poll-deployment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAG7C,SAAS,IAAI,CAAC,WAAmB,QAAQ,CAAC,aAAa;IACrD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAe;IAClD,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,CAAC;QAC3E,yBAAyB,CACvB,kDAAkD,SAAS,IAAI,QAAQ,CAAC,gBAAgB,GAAG,CAC5F,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAEjB,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,EAAE,CAAC;YACb,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { printDiagnosticsToConsole } from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { Arguments } from \"./handler.js\";\n\nfunction wait(duration: number = settings.POLL_INTERVAL): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, duration));\n}\n\nexport async function pingDeployment(argv: Arguments): Promise<boolean> {\n for (let pollRetry = 0; pollRetry < settings.MAX_POLL_RETRIES; pollRetry++) {\n printDiagnosticsToConsole(\n `Waiting for Zuplo deployment to be deleted... (${pollRetry}/${settings.MAX_POLL_RETRIES})`\n );\n const response = await fetch(`${argv.url}/__zuplo/build`);\n if (!response.ok) {\n // That means that we no longer have a 2xx response from the zup\n return true;\n } else {\n await wait();\n continue;\n }\n }\n\n return false;\n}\n"]}
|
|
@@ -26,7 +26,7 @@ export async function retrieveFirstEnvironment(branch, argv) {
|
|
|
26
26
|
const readEnvironmentResponse = await fetch(url, {
|
|
27
27
|
method: "GET",
|
|
28
28
|
headers: {
|
|
29
|
-
authorization: `Bearer ${argv
|
|
29
|
+
authorization: `Bearer ${argv.authToken}`,
|
|
30
30
|
},
|
|
31
31
|
});
|
|
32
32
|
if (!readEnvironmentResponse.ok) {
|
|
@@ -48,7 +48,7 @@ export async function createEnvironment(branch, argv) {
|
|
|
48
48
|
const createEnvironmentResponse = await fetch(`${baseUrl}`, {
|
|
49
49
|
method: "POST",
|
|
50
50
|
headers: {
|
|
51
|
-
authorization: `Bearer ${argv
|
|
51
|
+
authorization: `Bearer ${argv.authToken}`,
|
|
52
52
|
"Content-Type": "application/json",
|
|
53
53
|
},
|
|
54
54
|
body: JSON.stringify({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environments.js","sourceRoot":"","sources":["../../src/deploy/environments.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAG7C,MAAM,OAAO,iCAAkC,SAAQ,KAAK;IAC1D,YAAY,WAAmB;QAC7B,KAAK,CACH,uDAAuD,WAAW,gFAAgF,CACnJ,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iCAAiC,CAAC,SAAS,CAAC,CAAC;IAC3E,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAc,EACd,IAAoB;IAEpB,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjE,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,OAAO,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAc,EACd,IAAoB;IAEpB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,OAAO,GAAG,GAAG,QAAQ,CAAC,4BAA4B,kBAAkB,CAAC;IAE3E,MAAM,WAAW,GAA2B;QAC1C,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,OAAO;KACrB,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,GAAG,CAAC,MAAM,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzD,MAAM,uBAAuB,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC/C,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,
|
|
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.authToken}`,\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.authToken}`,\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
package/dist/deploy/handler.js
CHANGED
|
@@ -33,7 +33,7 @@ async function deployToSaas(argv) {
|
|
|
33
33
|
const uploadUrlResponse = await fetch(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/deployments/source-url`, {
|
|
34
34
|
method: "POST",
|
|
35
35
|
headers: {
|
|
36
|
-
Authorization: `Bearer ${argv
|
|
36
|
+
Authorization: `Bearer ${argv.authToken}`,
|
|
37
37
|
},
|
|
38
38
|
body: JSON.stringify(payload),
|
|
39
39
|
});
|
|
@@ -87,7 +87,7 @@ async function deployToSelfHosted(argv) {
|
|
|
87
87
|
await pullSystemConfig({
|
|
88
88
|
dir: argv.dir,
|
|
89
89
|
environment: environmentToAutoLink.name,
|
|
90
|
-
|
|
90
|
+
authToken: argv.authToken,
|
|
91
91
|
});
|
|
92
92
|
}
|
|
93
93
|
catch (error) {
|
|
@@ -112,7 +112,7 @@ async function deployToSelfHosted(argv) {
|
|
|
112
112
|
const uploadUrlResponse = await fetch(`${endpoint}/v1/deployments/build`, {
|
|
113
113
|
method: "POST",
|
|
114
114
|
headers: {
|
|
115
|
-
Authorization: `Bearer ${argv
|
|
115
|
+
Authorization: `Bearer ${argv.authToken}`,
|
|
116
116
|
},
|
|
117
117
|
body: form,
|
|
118
118
|
});
|
|
@@ -126,7 +126,7 @@ async function deployToSelfHosted(argv) {
|
|
|
126
126
|
const deploymentResponse = await fetch(`${endpoint}/v1/deployments/${deploymentName}`, {
|
|
127
127
|
method: "GET",
|
|
128
128
|
headers: {
|
|
129
|
-
Authorization: `Bearer ${argv
|
|
129
|
+
Authorization: `Bearer ${argv.authToken}`,
|
|
130
130
|
},
|
|
131
131
|
});
|
|
132
132
|
const deploymentJSON = await deploymentResponse.json();
|
|
@@ -1 +1 @@
|
|
|
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,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,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,EACrB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,2BAA2B,EAC3B,iCAAiC,GAClC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAkBjE,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,CAAC,OAAO,EAAE,CAAC,CAAC;IAGtE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAElC,MAAM,OAAO,GAAG;QACd,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,eAAe,CAAC,QAAQ,CAAC,MAAM;QAC5C,aAAa,EAAE,eAAe,CAAC,QAAQ,CAAC,OAAO;QAC/C,GAAG,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG;KAClC,CAAC;IAEF,MAAM,iBAAiB,GAAG,MAAM,KAAK,CACnC,GAAG,QAAQ,CAAC,4BAA4B,4BAA4B,EACpE;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,CAAC,EAAE;SAC3C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CACF,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,wBAAwB,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjE,IAAI,iBAAiB,CAAC,EAAE,EAAE,CAAC;QAEzB,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;QAEnE,yBAAyB,CACvB,oCAAoC,YAAY,MAAM,CACvD,CAAC;QAEF,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC;YAClC,WAAW,EAAE,eAAe,CAAC,OAAO;YACpC,SAAS;YACT,YAAY;YACZ,GAAG,OAAO;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,oBAAoB,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAE1D,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,qBAAqB,CACnC,kBAAkB,OAAO,CAAC,WAAW,qBAAqB,OAAO,iBAAiB,OAAO,MAAM,CAChG,CAAC;YAEF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAC1C,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,OAAO,EACP,OAAO,CACR,CAAC;YACF,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,qCAAqC,CACzC,eAAe,GAAG,EAAE,EACpB,OAAO,CACR,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,oCAAoC,CACxC,oCACE,eAAe,CAAC,QAAQ,CAAC,MAC3B,eAAe,OAAO,eAAe,OAAO;YAC1C,MAAM,EAAE,EACV,OAAO,CACR,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,8DAA8D,CAC/D,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,8DAA8D,CAC/D,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,CAAC,OAAO,EAAE,CAAC,CAAC;QAGtE,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,MAAM,CAAC,KAAK,CAAC,wBAAwB,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;QAEjE,IAAI,iBAAiB,CAAC,EAAE,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,qBAAqB,CACnC,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;YAErD,MAAM,CAAC,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;YAEpD,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAExE,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;gBAE3D,MAAM,qCAAqC,CACzC,eAAe,cAAc,CAAC,aAAa,EAAE,EAC7C,OAAO,CACR,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,EACH,OAAO,CACR,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,eAAe,GAAG,CAAC,MAAc,EAAU,EAAE;IAEjD,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,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;SACpB,WAAW,EAAE;SACb,SAAS,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAC1C,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, 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 printSpinnerToConsole,\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 { pullSystemConfig } from \"../link/populate.js\";\nimport { archive, generateMetadata } from \"./archive.js\";\nimport {\n retrieveOrCreateEnvironment,\n UnableToAutoLinkToExistingProject,\n} from \"./environments.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\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.tarball}`);\n\n // 2. Build uploadUrl request\n const { account, project } = argv;\n\n const payload = {\n accountName: account,\n projectName: project,\n environment: archiveMetadata.metadata.branch,\n repositoryUrl: archiveMetadata.metadata.repoUrl,\n sha: archiveMetadata.metadata.sha,\n };\n\n const uploadUrlResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/deployments/source-url`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n body: JSON.stringify(payload),\n }\n );\n\n logger.debug(`Upload URL response: ${uploadUrlResponse.status}`);\n\n if (uploadUrlResponse.ok) {\n // 3. Upload to request URL\n const { uploadUrl, deploymentId } = await uploadUrlResponse.json();\n\n printDiagnosticsToConsole(\n `Uploading source for deployment (${deploymentId})...`\n );\n\n const uploadResponse = await upload({\n tarballPath: archiveMetadata.tarball,\n uploadUrl,\n deploymentId,\n ...payload,\n });\n\n logger.debug(`Upload response: ${uploadResponse.status}`);\n\n if (uploadResponse.ok) {\n const spinner = printSpinnerToConsole(\n `Deploying the '${payload.environment}' environment to '${project}' on account '${account}'...`\n );\n\n const { url, logUrl } = await pollDeployment(\n argv,\n deploymentId,\n account,\n project,\n spinner\n );\n if (url) {\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${url}`,\n spinner\n );\n } else {\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the environment ${\n archiveMetadata.metadata.branch\n } to project ${project} on account ${account}.\\nFor more information, check the deployment logs in the Zuplo dashboard.\\n\n ${logUrl}`,\n spinner\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 deployment source. Please try again.\"\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 upload deployment source. Please try again.\"\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.tarball}`);\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 logger.debug(`Upload URL response: ${uploadUrlResponse.status}`);\n\n if (uploadUrlResponse.ok) {\n const spinner = printSpinnerToConsole(\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\n logger.debug(`Deployment started for ${buildName}`);\n\n const buildResult = await pollBuild(argv, endpoint, buildName, spinner);\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\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${deploymentJSON.deploymentUrl}`,\n spinner\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 spinner\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\nconst 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 .replaceAll(\"_\", \"-\") // Replace underscores by hyphens (Url hosts cannot have underscores)\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":"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","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, 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 printSpinnerToConsole,\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 { pullSystemConfig } from \"../link/populate.js\";\nimport { archive, generateMetadata } from \"./archive.js\";\nimport {\n retrieveOrCreateEnvironment,\n UnableToAutoLinkToExistingProject,\n} from \"./environments.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 authToken: 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.tarball}`);\n\n // 2. Build uploadUrl request\n const { account, project } = argv;\n\n const payload = {\n accountName: account,\n projectName: project,\n environment: archiveMetadata.metadata.branch,\n repositoryUrl: archiveMetadata.metadata.repoUrl,\n sha: archiveMetadata.metadata.sha,\n };\n\n const uploadUrlResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/deployments/source-url`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${argv.authToken}`,\n },\n body: JSON.stringify(payload),\n }\n );\n\n logger.debug(`Upload URL response: ${uploadUrlResponse.status}`);\n\n if (uploadUrlResponse.ok) {\n // 3. Upload to request URL\n const { uploadUrl, deploymentId } = await uploadUrlResponse.json();\n\n printDiagnosticsToConsole(\n `Uploading source for deployment (${deploymentId})...`\n );\n\n const uploadResponse = await upload({\n tarballPath: archiveMetadata.tarball,\n uploadUrl,\n deploymentId,\n ...payload,\n });\n\n logger.debug(`Upload response: ${uploadResponse.status}`);\n\n if (uploadResponse.ok) {\n const spinner = printSpinnerToConsole(\n `Deploying the '${payload.environment}' environment to '${project}' on account '${account}'...`\n );\n\n const { url, logUrl } = await pollDeployment(\n argv,\n deploymentId,\n account,\n project,\n spinner\n );\n if (url) {\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${url}`,\n spinner\n );\n } else {\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the environment ${\n archiveMetadata.metadata.branch\n } to project ${project} on account ${account}.\\nFor more information, check the deployment logs in the Zuplo dashboard.\\n\n ${logUrl}`,\n spinner\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 deployment source. Please try again.\"\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 upload deployment source. Please try again.\"\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 authToken: argv.authToken,\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.tarball}`);\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.authToken}`,\n },\n body: form,\n });\n\n logger.debug(`Upload URL response: ${uploadUrlResponse.status}`);\n\n if (uploadUrlResponse.ok) {\n const spinner = printSpinnerToConsole(\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\n logger.debug(`Deployment started for ${buildName}`);\n\n const buildResult = await pollBuild(argv, endpoint, buildName, spinner);\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.authToken}`,\n },\n }\n );\n const deploymentJSON: { deploymentUrl: string } =\n await deploymentResponse.json();\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${deploymentJSON.deploymentUrl}`,\n spinner\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 spinner\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\nconst 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 .replaceAll(\"_\", \"-\") // Replace underscores by hyphens (Url hosts cannot have underscores)\n .toLowerCase()\n .substring(0, MAX_PRETTY_BRANCH_LENGTH)\n );\n};\n"]}
|
|
@@ -12,7 +12,7 @@ export async function pollDeployment(argv, fileId, account, project, spinner) {
|
|
|
12
12
|
const response = await fetch(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/deployment-status/${fileId}`, {
|
|
13
13
|
method: "GET",
|
|
14
14
|
headers: {
|
|
15
|
-
Authorization: `Bearer ${argv
|
|
15
|
+
Authorization: `Bearer ${argv.authToken}`,
|
|
16
16
|
},
|
|
17
17
|
});
|
|
18
18
|
if (response.ok) {
|
|
@@ -93,7 +93,7 @@ export async function pollBuild(argv, endpoint, buildName, spinner) {
|
|
|
93
93
|
const response = await fetch(`${endpoint}/v1/deployments/build/${buildName}`, {
|
|
94
94
|
method: "GET",
|
|
95
95
|
headers: {
|
|
96
|
-
Authorization: `Bearer ${argv
|
|
96
|
+
Authorization: `Bearer ${argv.authToken}`,
|
|
97
97
|
},
|
|
98
98
|
});
|
|
99
99
|
if (response.ok) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll-deployment.js","sourceRoot":"","sources":["../../src/deploy/poll-deployment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,oCAAoC,EACpC,UAAU,GACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAG7C,SAAS,IAAI,CAAC,WAAmB,QAAQ,CAAC,aAAa;IACrD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAe,EACf,MAAc,EACd,OAAe,EACf,OAAe,EACf,OAAY;IAEZ,MAAM,qCAAqC,GAAG,CAAC,CAAC;IAChD,IAAI,yCAAyC,GAAG,CAAC,CAAC;IAElD,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,CAAC;QAC3E,OAAO,CAAC,UAAU,GAAG,IAAI,SAAS,IAAI,QAAQ,CAAC,gBAAgB,GAAG,CAAC;QACnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,aAAa,OAAO,sBAAsB,MAAM,EAAE,EACjH;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"poll-deployment.js","sourceRoot":"","sources":["../../src/deploy/poll-deployment.ts"],"names":[],"mappings":"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","sourcesContent":["import { Ora } from \"ora\";\nimport { logger } from \"../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n textOrJson,\n} from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { Arguments } from \"./handler.js\";\n\nfunction wait(duration: number = settings.POLL_INTERVAL): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, duration));\n}\n\nexport async function pollDeployment(\n argv: Arguments,\n fileId: string,\n account: string,\n project: string,\n spinner: Ora\n): Promise<{ url?: string; logUrl: string }> {\n const MAX_RETRY_ATTEMPTS_FOR_SERVER_UPDATES = 5;\n let CURRENT_RETRY_ATTEMPTS_FOR_SERVER_UPDATES = 0;\n\n for (let pollRetry = 0; pollRetry < settings.MAX_POLL_RETRIES; pollRetry++) {\n spinner.suffixText = `(${pollRetry}/${settings.MAX_POLL_RETRIES})`;\n const response = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/deployment-status/${fileId}`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n if (response.ok) {\n const rawJSON = await response.text();\n const { status, url, logUrl } = JSON.parse(rawJSON);\n\n switch (status) {\n case \"IN_PROGRESS\":\n await wait();\n continue;\n case \"SUCCESS\": {\n // If the return URL is zuplo.app we can check to make sure the zup is\n // fully deployed. If it is not, it might be a private URL so we skip\n // the check.\n logger.debug(`Checking if API is live: ${url}`);\n const parsedUrl = new URL(url);\n if (parsedUrl.hostname.includes(\".zuplo.app\")) {\n // Let's do some other check here to ensure that the zup is fully deployed\n try {\n const zupResponse = await fetch(\n `${parsedUrl.origin}/__zuplo/build`\n );\n if (zupResponse.ok) {\n return {\n url,\n logUrl,\n };\n } else {\n logger.debug(\n { status: zupResponse.status },\n \"Error while polling deployment\"\n );\n try {\n const result = await zupResponse.text();\n logger.debug(result);\n } catch {\n // Ignore\n }\n // Let's do another round of polling\n await wait();\n continue;\n }\n } catch (error) {\n // Log the error in debug but let's continue polling.\n // On first deploy to dedicated-managed, sometimes the URL has not resolved yet.\n logger.debug(\"Error while polling for zuplo build\", error);\n await wait();\n continue;\n }\n } else {\n return {\n url,\n logUrl,\n };\n }\n }\n case \"ERROR\":\n return {\n logUrl,\n };\n }\n } else if (response.status === 404) {\n // This means that it has not posted yet\n await wait();\n continue;\n } else if (\n response.status === 500 &&\n CURRENT_RETRY_ATTEMPTS_FOR_SERVER_UPDATES <\n MAX_RETRY_ATTEMPTS_FOR_SERVER_UPDATES\n ) {\n CURRENT_RETRY_ATTEMPTS_FOR_SERVER_UPDATES++;\n await wait();\n continue;\n } else {\n logger.error(\n `Unexpected error from server while polling for deployment: ${\n response.status\n } ${response.statusText} ${textOrJson(await response.text())}`\n );\n throw new Error(\n `Unexpected response from server while polling for deployment: ${response.status} ${response.statusText}`\n );\n }\n }\n\n return {\n // Fallback url for the user to check the logs\n logUrl: \"https://portal.zuplo.com\",\n };\n}\n\nexport async function pollBuild(\n argv: Arguments,\n endpoint: string,\n buildName: string,\n spinner: Ora\n): Promise<{\n conditionType?: string;\n status?: string;\n reason?: string;\n message?: string;\n}> {\n const MAX_RETRY_ATTEMPTS_FOR_SERVER_UPDATES = 5;\n let CURRENT_RETRY_ATTEMPTS_FOR_SERVER_UPDATES = 0;\n\n for (let pollRetry = 0; pollRetry < settings.MAX_POLL_RETRIES; pollRetry++) {\n spinner.suffixText = `(${pollRetry}/${settings.MAX_POLL_RETRIES})`;\n\n const response = await fetch(\n `${endpoint}/v1/deployments/build/${buildName}`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n if (response.ok) {\n const { conditionType, status, reason, message } = await response.json();\n\n switch (conditionType) {\n case \"Complete\":\n case \"Failed\":\n return {\n conditionType,\n status,\n reason,\n message,\n };\n default:\n await wait();\n continue;\n }\n } else if (response.status === 404) {\n // This means that it has not posted yet\n await wait();\n continue;\n } else if (\n response.status === 500 &&\n CURRENT_RETRY_ATTEMPTS_FOR_SERVER_UPDATES <\n MAX_RETRY_ATTEMPTS_FOR_SERVER_UPDATES\n ) {\n CURRENT_RETRY_ATTEMPTS_FOR_SERVER_UPDATES++;\n await wait();\n continue;\n } else {\n logger.error(\n JSON.stringify(await response.json(), null, 2),\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\n return {};\n}\n"]}
|
package/dist/link/handler.d.ts
CHANGED
package/dist/link/handler.js
CHANGED
|
@@ -32,7 +32,7 @@ export async function link(argv) {
|
|
|
32
32
|
if (!environment && !project) {
|
|
33
33
|
const projectResponse = await fetch(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/projects`, {
|
|
34
34
|
headers: {
|
|
35
|
-
authorization: `Bearer ${argv
|
|
35
|
+
authorization: `Bearer ${argv.authToken}`,
|
|
36
36
|
},
|
|
37
37
|
});
|
|
38
38
|
if (!projectResponse.ok) {
|
|
@@ -69,7 +69,7 @@ export async function link(argv) {
|
|
|
69
69
|
url.search = new URLSearchParams(queryParams).toString();
|
|
70
70
|
let environmentResponseFromDeveloperAPI = await fetch(url, {
|
|
71
71
|
headers: {
|
|
72
|
-
authorization: `Bearer ${argv
|
|
72
|
+
authorization: `Bearer ${argv.authToken}`,
|
|
73
73
|
},
|
|
74
74
|
});
|
|
75
75
|
if (!environmentResponseFromDeveloperAPI.ok) {
|
|
@@ -87,7 +87,7 @@ export async function link(argv) {
|
|
|
87
87
|
const createDevelopmenEnvironmentResponse = await fetch(`${baseUrl}`, {
|
|
88
88
|
method: "POST",
|
|
89
89
|
headers: {
|
|
90
|
-
authorization: `Bearer ${argv
|
|
90
|
+
authorization: `Bearer ${argv.authToken}`,
|
|
91
91
|
"Content-Type": "application/json",
|
|
92
92
|
},
|
|
93
93
|
body: JSON.stringify({
|
|
@@ -106,7 +106,7 @@ export async function link(argv) {
|
|
|
106
106
|
numDevelopmentEnvironments++;
|
|
107
107
|
environmentResponseFromDeveloperAPI = await fetch(url, {
|
|
108
108
|
headers: {
|
|
109
|
-
authorization: `Bearer ${argv
|
|
109
|
+
authorization: `Bearer ${argv.authToken}`,
|
|
110
110
|
},
|
|
111
111
|
});
|
|
112
112
|
environmentJsonFromDeveloperAPI =
|