@zuplo/cli 6.68.6 → 6.68.8
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/__tests__/integration/custom-domain.integration.test.d.ts +2 -0
- package/dist/__tests__/integration/custom-domain.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/custom-domain.integration.test.js +543 -0
- package/dist/__tests__/integration/custom-domain.integration.test.js.map +1 -0
- package/dist/__tests__/integration/jest-mocks-setup.js +2 -0
- package/dist/__tests__/integration/jest-mocks-setup.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/cmds/custom-domain/create.d.ts +9 -0
- package/dist/cmds/custom-domain/create.d.ts.map +1 -0
- package/dist/cmds/custom-domain/create.js +82 -0
- package/dist/cmds/custom-domain/create.js.map +1 -0
- package/dist/cmds/custom-domain/delete.d.ts +9 -0
- package/dist/cmds/custom-domain/delete.d.ts.map +1 -0
- package/dist/cmds/custom-domain/delete.js +72 -0
- package/dist/cmds/custom-domain/delete.js.map +1 -0
- package/dist/cmds/custom-domain/index.d.ts +4 -0
- package/dist/cmds/custom-domain/index.d.ts.map +1 -0
- package/dist/cmds/custom-domain/index.js +20 -0
- package/dist/cmds/custom-domain/index.js.map +1 -0
- package/dist/cmds/custom-domain/list.d.ts +9 -0
- package/dist/cmds/custom-domain/list.d.ts.map +1 -0
- package/dist/cmds/custom-domain/list.js +56 -0
- package/dist/cmds/custom-domain/list.js.map +1 -0
- package/dist/cmds/custom-domain/update.d.ts +9 -0
- package/dist/cmds/custom-domain/update.d.ts.map +1 -0
- package/dist/cmds/custom-domain/update.js +72 -0
- package/dist/cmds/custom-domain/update.js.map +1 -0
- package/dist/common/output.d.ts +4 -0
- package/dist/common/output.d.ts.map +1 -1
- package/dist/common/output.js +9 -0
- package/dist/common/output.js.map +1 -1
- package/dist/common/settings.d.ts +2 -0
- package/dist/common/settings.d.ts.map +1 -1
- package/dist/common/settings.js +6 -0
- package/dist/common/settings.js.map +1 -1
- package/dist/custom-domain/create/handler.d.ts +11 -0
- package/dist/custom-domain/create/handler.d.ts.map +1 -0
- package/dist/custom-domain/create/handler.js +50 -0
- package/dist/custom-domain/create/handler.js.map +1 -0
- package/dist/custom-domain/delete/handler.d.ts +9 -0
- package/dist/custom-domain/delete/handler.d.ts.map +1 -0
- package/dist/custom-domain/delete/handler.js +85 -0
- package/dist/custom-domain/delete/handler.js.map +1 -0
- package/dist/custom-domain/list/handler.d.ts +7 -0
- package/dist/custom-domain/list/handler.d.ts.map +1 -0
- package/dist/custom-domain/list/handler.js +105 -0
- package/dist/custom-domain/list/handler.js.map +1 -0
- package/dist/custom-domain/models.d.ts +37 -0
- package/dist/custom-domain/models.d.ts.map +1 -0
- package/dist/custom-domain/models.js +2 -0
- package/dist/custom-domain/models.js.map +1 -0
- package/dist/custom-domain/update/handler.d.ts +9 -0
- package/dist/custom-domain/update/handler.d.ts.map +1 -0
- package/dist/custom-domain/update/handler.js +47 -0
- package/dist/custom-domain/update/handler.js.map +1 -0
- package/dist/login/login.d.ts +2 -2
- package/dist/login/login.d.ts.map +1 -1
- package/dist/login/login.js +3 -2
- package/dist/login/login.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -4,6 +4,8 @@ declare class Settings {
|
|
|
4
4
|
get POLL_INTERVAL(): number;
|
|
5
5
|
get MAX_PROVISIONING_RETRIES(): number;
|
|
6
6
|
get PROVISIONING_POLL_INTERVAL(): number;
|
|
7
|
+
get AUTH0_DOMAIN(): string;
|
|
8
|
+
get AUTH0_CLIENT_ID(): string;
|
|
7
9
|
}
|
|
8
10
|
declare const settings: Settings;
|
|
9
11
|
export default settings;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/common/settings.ts"],"names":[],"mappings":"AAGA,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"}
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/common/settings.ts"],"names":[],"mappings":"AAGA,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;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;CACF;AAED,QAAA,MAAM,QAAQ,UAAiB,CAAC;AAChC,eAAe,QAAQ,CAAC"}
|
package/dist/common/settings.js
CHANGED
|
@@ -14,6 +14,12 @@ class Settings {
|
|
|
14
14
|
get PROVISIONING_POLL_INTERVAL() {
|
|
15
15
|
return parseInt(process.env.PROVISIONING_INTERVAL ?? "15000", 10);
|
|
16
16
|
}
|
|
17
|
+
get AUTH0_DOMAIN() {
|
|
18
|
+
return process.env.AUTH0_DOMAIN ?? "auth.zuplo.com";
|
|
19
|
+
}
|
|
20
|
+
get AUTH0_CLIENT_ID() {
|
|
21
|
+
return process.env.AUTH0_CLIENT_ID ?? "mYLGcH7kB4P0pw0HAk6GH7raRwYhSlW4";
|
|
22
|
+
}
|
|
17
23
|
}
|
|
18
24
|
const settings = new Settings();
|
|
19
25
|
export default settings;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/common/settings.ts"],"names":[],"mappings":"AAGA,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,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,aAAa;QACf,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,wBAAwB;QAC1B,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,0BAA0B;QAC5B,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;CACF;AAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;AAChC,eAAe,QAAQ,CAAC","sourcesContent":["/** biome-ignore-all lint/style/useNamingConvention: Environment variables */\n/** biome-ignore-all lint/style/noProcessEnv: Environment variables */\n\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 ?? \"250\", 10);\n }\n\n get POLL_INTERVAL(): number {\n return parseInt(process.env.POLL_INTERVAL ?? \"1000\", 10);\n }\n\n get MAX_PROVISIONING_RETRIES(): number {\n return parseInt(process.env.MAX_PROVISIONING_RETRIES ?? \"60\", 10);\n }\n\n get PROVISIONING_POLL_INTERVAL(): number {\n return parseInt(process.env.PROVISIONING_INTERVAL ?? \"15000\", 10);\n }\n}\n\nconst settings = new Settings();\nexport default settings;\n"]}
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/common/settings.ts"],"names":[],"mappings":"AAGA,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,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,aAAa;QACf,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,wBAAwB;QAC1B,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,0BAA0B;QAC5B,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,YAAY;QACd,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,gBAAgB,CAAC;IACtD,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,kCAAkC,CAAC;IAC3E,CAAC;CACF;AAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;AAChC,eAAe,QAAQ,CAAC","sourcesContent":["/** biome-ignore-all lint/style/useNamingConvention: Environment variables */\n/** biome-ignore-all lint/style/noProcessEnv: Environment variables */\n\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 ?? \"250\", 10);\n }\n\n get POLL_INTERVAL(): number {\n return parseInt(process.env.POLL_INTERVAL ?? \"1000\", 10);\n }\n\n get MAX_PROVISIONING_RETRIES(): number {\n return parseInt(process.env.MAX_PROVISIONING_RETRIES ?? \"60\", 10);\n }\n\n get PROVISIONING_POLL_INTERVAL(): number {\n return parseInt(process.env.PROVISIONING_INTERVAL ?? \"15000\", 10);\n }\n\n get AUTH0_DOMAIN(): string {\n return process.env.AUTH0_DOMAIN ?? \"auth.zuplo.com\";\n }\n\n get AUTH0_CLIENT_ID(): string {\n return process.env.AUTH0_CLIENT_ID ?? \"mYLGcH7kB4P0pw0HAk6GH7raRwYhSlW4\";\n }\n}\n\nconst settings = new Settings();\nexport default settings;\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CustomDomainStage } from "../models.js";
|
|
2
|
+
export interface Arguments {
|
|
3
|
+
account: string;
|
|
4
|
+
authToken: string;
|
|
5
|
+
hostname: string;
|
|
6
|
+
"deployment-name"?: string;
|
|
7
|
+
stage?: CustomDomainStage;
|
|
8
|
+
output?: "default" | "json";
|
|
9
|
+
}
|
|
10
|
+
export declare function create(argv: Arguments): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/custom-domain/create/handler.ts"],"names":[],"mappings":"AAQA,OAAO,EAA8B,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE7E,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC7B;AAcD,wBAAsB,MAAM,CAAC,IAAI,EAAE,SAAS,iBAmD3C"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { logger } from "../../common/logger.js";
|
|
2
|
+
import { printCriticalFailureToConsoleAndExit, printJsonToConsoleAndExitGracefully, printTableToConsoleAndExitGracefully, textOrJson, } from "../../common/output.js";
|
|
3
|
+
import settings from "../../common/settings.js";
|
|
4
|
+
function toMutationTable(result) {
|
|
5
|
+
return {
|
|
6
|
+
hostname: result.hostname,
|
|
7
|
+
"deployment-name": result.deploymentName ?? "",
|
|
8
|
+
stage: result.stage ?? "",
|
|
9
|
+
cname: result.cname ?? "",
|
|
10
|
+
"ownership-verification-name": result.ownershipVerification?.name ?? "",
|
|
11
|
+
"ownership-verification-type": result.ownershipVerification?.type ?? "",
|
|
12
|
+
"ownership-verification-value": result.ownershipVerification?.value ?? "",
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export async function create(argv) {
|
|
16
|
+
const { account, hostname } = argv;
|
|
17
|
+
const body = { hostname };
|
|
18
|
+
if (argv["deployment-name"]) {
|
|
19
|
+
body.deploymentName = argv["deployment-name"];
|
|
20
|
+
}
|
|
21
|
+
if (argv.stage) {
|
|
22
|
+
body.stage = argv.stage;
|
|
23
|
+
}
|
|
24
|
+
const createResponse = await fetch(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/custom-domains`, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: {
|
|
27
|
+
Authorization: `Bearer ${argv.authToken}`,
|
|
28
|
+
"Content-Type": "application/json",
|
|
29
|
+
},
|
|
30
|
+
body: JSON.stringify(body),
|
|
31
|
+
});
|
|
32
|
+
if (createResponse.ok) {
|
|
33
|
+
const result = await createResponse.json();
|
|
34
|
+
if (argv.output === "json") {
|
|
35
|
+
await printJsonToConsoleAndExitGracefully(result);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
await printTableToConsoleAndExitGracefully(toMutationTable(result));
|
|
39
|
+
}
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const response = textOrJson(await createResponse.text());
|
|
43
|
+
logger.error({
|
|
44
|
+
status: createResponse.status,
|
|
45
|
+
statusText: createResponse.statusText,
|
|
46
|
+
response,
|
|
47
|
+
}, "Failed to create custom domain for account");
|
|
48
|
+
await printCriticalFailureToConsoleAndExit("Error: Failed to create custom domain for your account. Check the arguments.");
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/custom-domain/create/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,oCAAoC,EACpC,mCAAmC,EACnC,oCAAoC,EACpC,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAYhD,SAAS,eAAe,CAAC,MAAkC;IACzD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,iBAAiB,EAAE,MAAM,CAAC,cAAc,IAAI,EAAE;QAC9C,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;QACzB,6BAA6B,EAAE,MAAM,CAAC,qBAAqB,EAAE,IAAI,IAAI,EAAE;QACvE,6BAA6B,EAAE,MAAM,CAAC,qBAAqB,EAAE,IAAI,IAAI,EAAE;QACvE,8BAA8B,EAAE,MAAM,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAe;IAC1C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IACnC,MAAM,IAAI,GAIN,EAAE,QAAQ,EAAE,CAAC;IAEjB,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,iBAAiB,EAChF;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;YACzC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CACF,CAAC;IAEF,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,MAAM,GAA+B,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QACvE,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,mCAAmC,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,oCAAoC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,KAAK,CACV;QACE,MAAM,EAAE,cAAc,CAAC,MAAM;QAC7B,UAAU,EAAE,cAAc,CAAC,UAAU;QACrC,QAAQ;KACT,EACD,4CAA4C,CAC7C,CAAC;IACF,MAAM,oCAAoC,CACxC,8EAA8E,CAC/E,CAAC;AACJ,CAAC","sourcesContent":["import { logger } from \"../../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printJsonToConsoleAndExitGracefully,\n printTableToConsoleAndExitGracefully,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { CustomDomainMutationResult, CustomDomainStage } from \"../models.js\";\n\nexport interface Arguments {\n account: string;\n authToken: string;\n hostname: string;\n \"deployment-name\"?: string;\n stage?: CustomDomainStage;\n output?: \"default\" | \"json\";\n}\n\nfunction toMutationTable(result: CustomDomainMutationResult) {\n return {\n hostname: result.hostname,\n \"deployment-name\": result.deploymentName ?? \"\",\n stage: result.stage ?? \"\",\n cname: result.cname ?? \"\",\n \"ownership-verification-name\": result.ownershipVerification?.name ?? \"\",\n \"ownership-verification-type\": result.ownershipVerification?.type ?? \"\",\n \"ownership-verification-value\": result.ownershipVerification?.value ?? \"\",\n };\n}\n\nexport async function create(argv: Arguments) {\n const { account, hostname } = argv;\n const body: {\n hostname: string;\n deploymentName?: string;\n stage?: CustomDomainStage;\n } = { hostname };\n\n if (argv[\"deployment-name\"]) {\n body.deploymentName = argv[\"deployment-name\"];\n }\n\n if (argv.stage) {\n body.stage = argv.stage;\n }\n\n const createResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/custom-domains`,\n {\n method: \"POST\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n }\n );\n\n if (createResponse.ok) {\n const result: CustomDomainMutationResult = await createResponse.json();\n if (argv.output === \"json\") {\n await printJsonToConsoleAndExitGracefully(result);\n } else {\n await printTableToConsoleAndExitGracefully(toMutationTable(result));\n }\n return;\n }\n\n const response = textOrJson(await createResponse.text());\n logger.error(\n {\n status: createResponse.status,\n statusText: createResponse.statusText,\n response,\n },\n \"Failed to create custom domain for account\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to create custom domain for your account. Check the arguments.\"\n );\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface Arguments {
|
|
2
|
+
account: string;
|
|
3
|
+
authToken: string;
|
|
4
|
+
hostname: string;
|
|
5
|
+
"deployment-name"?: string;
|
|
6
|
+
output?: "default" | "json";
|
|
7
|
+
}
|
|
8
|
+
export declare function deleteCustomDomain(argv: Arguments): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/custom-domain/delete/handler.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC7B;AA4FD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,SAAS,iBA8CvD"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { logger } from "../../common/logger.js";
|
|
2
|
+
import { printCriticalFailureToConsoleAndExit, printJsonToConsoleAndExitGracefully, printResultToConsoleAndExitGracefully, textOrJson, } from "../../common/output.js";
|
|
3
|
+
import settings from "../../common/settings.js";
|
|
4
|
+
async function exitWithLoggedFailure(message, logMessage, context = {}) {
|
|
5
|
+
logger.error(context, logMessage);
|
|
6
|
+
await printCriticalFailureToConsoleAndExit(message);
|
|
7
|
+
throw new Error("printCriticalFailureToConsoleAndExit returned unexpectedly");
|
|
8
|
+
}
|
|
9
|
+
async function fetchCustomDomains(account, authToken) {
|
|
10
|
+
const listResponse = await fetch(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/custom-domains`, {
|
|
11
|
+
method: "GET",
|
|
12
|
+
headers: {
|
|
13
|
+
Authorization: `Bearer ${authToken}`,
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
if (listResponse.ok) {
|
|
17
|
+
return (await listResponse.json());
|
|
18
|
+
}
|
|
19
|
+
const response = textOrJson(await listResponse.text());
|
|
20
|
+
return exitWithLoggedFailure("Error: Failed to look up custom domain assignments before deletion. Try again with --deployment-name.", "Failed to fetch custom domains for deletion preflight", {
|
|
21
|
+
status: listResponse.status,
|
|
22
|
+
statusText: listResponse.statusText,
|
|
23
|
+
response,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async function resolveDeploymentName(customDomain) {
|
|
27
|
+
if (customDomain.deployments.length === 0) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
if (customDomain.deployments.length === 1) {
|
|
31
|
+
return customDomain.deployments[0].deploymentName ?? undefined;
|
|
32
|
+
}
|
|
33
|
+
return exitWithLoggedFailure(`Error: Custom domain ${customDomain.hostname} is assigned to multiple deployments. Rerun with --deployment-name.`, "Custom domain deletion requires an explicit deployment name", {
|
|
34
|
+
hostname: customDomain.hostname,
|
|
35
|
+
deploymentCount: customDomain.deployments.length,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async function inferDeploymentName(argv) {
|
|
39
|
+
if (argv["deployment-name"]) {
|
|
40
|
+
return argv["deployment-name"];
|
|
41
|
+
}
|
|
42
|
+
const customDomains = await fetchCustomDomains(argv.account, argv.authToken);
|
|
43
|
+
const matchingCustomDomain = customDomains.data.find((customDomain) => {
|
|
44
|
+
return customDomain.hostname === argv.hostname;
|
|
45
|
+
});
|
|
46
|
+
if (!matchingCustomDomain) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
return resolveDeploymentName(matchingCustomDomain);
|
|
50
|
+
}
|
|
51
|
+
export async function deleteCustomDomain(argv) {
|
|
52
|
+
const { account, hostname } = argv;
|
|
53
|
+
const deploymentName = await inferDeploymentName(argv);
|
|
54
|
+
const query = new URLSearchParams();
|
|
55
|
+
query.set("hostname", hostname);
|
|
56
|
+
if (deploymentName) {
|
|
57
|
+
query.set("deploymentName", deploymentName);
|
|
58
|
+
}
|
|
59
|
+
const deleteResponse = await fetch(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/custom-domains?${query.toString()}`, {
|
|
60
|
+
method: "DELETE",
|
|
61
|
+
headers: {
|
|
62
|
+
Authorization: `Bearer ${argv.authToken}`,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
if (deleteResponse.ok) {
|
|
66
|
+
if (argv.output === "json") {
|
|
67
|
+
await printJsonToConsoleAndExitGracefully({
|
|
68
|
+
deleted: true,
|
|
69
|
+
hostname,
|
|
70
|
+
deploymentName: deploymentName ?? null,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
await printResultToConsoleAndExitGracefully(`Custom domain ${hostname} deleted successfully.`);
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const response = textOrJson(await deleteResponse.text());
|
|
79
|
+
await exitWithLoggedFailure("Error: Failed to delete custom domain for your account. Check the arguments.", "Failed to delete custom domain for account", {
|
|
80
|
+
status: deleteResponse.status,
|
|
81
|
+
statusText: deleteResponse.statusText,
|
|
82
|
+
response,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/custom-domain/delete/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from \"../../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printJsonToConsoleAndExitGracefully,\n printResultToConsoleAndExitGracefully,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { CustomDomainListItem, CustomDomainListResponse } from \"../models.js\";\n\nexport interface Arguments {\n account: string;\n authToken: string;\n hostname: string;\n \"deployment-name\"?: string;\n output?: \"default\" | \"json\";\n}\n\ninterface LoggedFailureContext {\n status?: number;\n statusText?: string;\n response?: unknown;\n hostname?: string;\n deploymentCount?: number;\n}\n\nasync function exitWithLoggedFailure(\n message: string,\n logMessage: string,\n context: LoggedFailureContext = {}\n): Promise<never> {\n logger.error(context, logMessage);\n await printCriticalFailureToConsoleAndExit(message);\n\n throw new Error(\"printCriticalFailureToConsoleAndExit returned unexpectedly\");\n}\n\nasync function fetchCustomDomains(\n account: string,\n authToken: string\n): Promise<CustomDomainListResponse> {\n const listResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/custom-domains`,\n {\n method: \"GET\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${authToken}`,\n },\n }\n );\n\n if (listResponse.ok) {\n return (await listResponse.json()) as CustomDomainListResponse;\n }\n\n const response = textOrJson(await listResponse.text());\n return exitWithLoggedFailure(\n \"Error: Failed to look up custom domain assignments before deletion. Try again with --deployment-name.\",\n \"Failed to fetch custom domains for deletion preflight\",\n {\n status: listResponse.status,\n statusText: listResponse.statusText,\n response,\n }\n );\n}\n\nasync function resolveDeploymentName(\n customDomain: CustomDomainListItem\n): Promise<string | undefined> {\n if (customDomain.deployments.length === 0) {\n return undefined;\n }\n\n if (customDomain.deployments.length === 1) {\n return customDomain.deployments[0].deploymentName ?? undefined;\n }\n\n return exitWithLoggedFailure(\n `Error: Custom domain ${customDomain.hostname} is assigned to multiple deployments. Rerun with --deployment-name.`,\n \"Custom domain deletion requires an explicit deployment name\",\n {\n hostname: customDomain.hostname,\n deploymentCount: customDomain.deployments.length,\n }\n );\n}\n\nasync function inferDeploymentName(\n argv: Arguments\n): Promise<string | undefined> {\n if (argv[\"deployment-name\"]) {\n return argv[\"deployment-name\"];\n }\n\n const customDomains = await fetchCustomDomains(argv.account, argv.authToken);\n const matchingCustomDomain = customDomains.data.find((customDomain) => {\n return customDomain.hostname === argv.hostname;\n });\n\n if (!matchingCustomDomain) {\n return undefined;\n }\n\n return resolveDeploymentName(matchingCustomDomain);\n}\n\nexport async function deleteCustomDomain(argv: Arguments) {\n const { account, hostname } = argv;\n const deploymentName = await inferDeploymentName(argv);\n\n const query = new URLSearchParams();\n query.set(\"hostname\", hostname);\n if (deploymentName) {\n query.set(\"deploymentName\", deploymentName);\n }\n\n const deleteResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/custom-domains?${query.toString()}`,\n {\n method: \"DELETE\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n\n if (deleteResponse.ok) {\n if (argv.output === \"json\") {\n await printJsonToConsoleAndExitGracefully({\n deleted: true,\n hostname,\n deploymentName: deploymentName ?? null,\n });\n } else {\n await printResultToConsoleAndExitGracefully(\n `Custom domain ${hostname} deleted successfully.`\n );\n }\n return;\n }\n\n const response = textOrJson(await deleteResponse.text());\n await exitWithLoggedFailure(\n \"Error: Failed to delete custom domain for your account. Check the arguments.\",\n \"Failed to delete custom domain for account\",\n {\n status: deleteResponse.status,\n statusText: deleteResponse.statusText,\n response,\n }\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/custom-domain/list/handler.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC7B;AAwGD,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,iBA+CzC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { logger } from "../../common/logger.js";
|
|
2
|
+
import { printCriticalFailureToConsoleAndExit, printJsonToConsoleAndExitGracefully, printResultToConsoleAndExitGracefully, printTableToConsoleAndExitGracefully, textOrJson, } from "../../common/output.js";
|
|
3
|
+
import settings from "../../common/settings.js";
|
|
4
|
+
function toTableRows(customDomains) {
|
|
5
|
+
const rows = [];
|
|
6
|
+
customDomains.forEach((customDomain) => {
|
|
7
|
+
if (customDomain.deployments.length === 0) {
|
|
8
|
+
rows.push({
|
|
9
|
+
hostname: customDomain.hostname,
|
|
10
|
+
provider: customDomain.provider,
|
|
11
|
+
"project-name": customDomain.projectName,
|
|
12
|
+
"deployment-name": "",
|
|
13
|
+
branch: "",
|
|
14
|
+
"environment-type": "",
|
|
15
|
+
stage: "",
|
|
16
|
+
"is-default": "",
|
|
17
|
+
cname: "",
|
|
18
|
+
});
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
customDomain.deployments.forEach((deployment) => {
|
|
22
|
+
rows.push({
|
|
23
|
+
hostname: customDomain.hostname,
|
|
24
|
+
provider: customDomain.provider,
|
|
25
|
+
"project-name": customDomain.projectName,
|
|
26
|
+
"deployment-name": deployment.deploymentName ?? "",
|
|
27
|
+
branch: deployment.branch ?? "",
|
|
28
|
+
"environment-type": deployment.environmentType ?? "",
|
|
29
|
+
stage: deployment.stage ?? "",
|
|
30
|
+
"is-default": deployment.isDefault,
|
|
31
|
+
cname: deployment.cname ?? "",
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
return rows;
|
|
36
|
+
}
|
|
37
|
+
function toJsonRows(customDomains) {
|
|
38
|
+
const rows = [];
|
|
39
|
+
customDomains.forEach((customDomain) => {
|
|
40
|
+
if (customDomain.deployments.length === 0) {
|
|
41
|
+
rows.push({
|
|
42
|
+
hostname: customDomain.hostname,
|
|
43
|
+
provider: customDomain.provider,
|
|
44
|
+
projectName: customDomain.projectName,
|
|
45
|
+
deploymentName: null,
|
|
46
|
+
branch: null,
|
|
47
|
+
environmentType: null,
|
|
48
|
+
stage: null,
|
|
49
|
+
isDefault: null,
|
|
50
|
+
cname: null,
|
|
51
|
+
});
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
customDomain.deployments.forEach((deployment) => {
|
|
55
|
+
rows.push({
|
|
56
|
+
hostname: customDomain.hostname,
|
|
57
|
+
provider: customDomain.provider,
|
|
58
|
+
projectName: customDomain.projectName,
|
|
59
|
+
deploymentName: deployment.deploymentName,
|
|
60
|
+
branch: deployment.branch,
|
|
61
|
+
environmentType: deployment.environmentType,
|
|
62
|
+
stage: deployment.stage,
|
|
63
|
+
isDefault: deployment.isDefault,
|
|
64
|
+
cname: deployment.cname,
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
return rows;
|
|
69
|
+
}
|
|
70
|
+
export async function list(argv) {
|
|
71
|
+
const { account } = argv;
|
|
72
|
+
const listResponse = await fetch(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/custom-domains`, {
|
|
73
|
+
method: "GET",
|
|
74
|
+
headers: {
|
|
75
|
+
Authorization: `Bearer ${argv.authToken}`,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
if (listResponse.ok) {
|
|
79
|
+
const customDomains = await listResponse.json();
|
|
80
|
+
if (customDomains.data.length === 0) {
|
|
81
|
+
if (argv.output === "json") {
|
|
82
|
+
await printJsonToConsoleAndExitGracefully([]);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
await printResultToConsoleAndExitGracefully("No custom domains found");
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (argv.output === "json") {
|
|
90
|
+
await printJsonToConsoleAndExitGracefully(toJsonRows(customDomains.data));
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
await printTableToConsoleAndExitGracefully(toTableRows(customDomains.data));
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const response = textOrJson(await listResponse.text());
|
|
98
|
+
logger.error({
|
|
99
|
+
status: listResponse.status,
|
|
100
|
+
statusText: listResponse.statusText,
|
|
101
|
+
response,
|
|
102
|
+
}, "Failed to list custom domains for account");
|
|
103
|
+
await printCriticalFailureToConsoleAndExit("Error: Failed to list custom domains for your account. Try again later.");
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/custom-domain/list/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from \"../../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printJsonToConsoleAndExitGracefully,\n printResultToConsoleAndExitGracefully,\n printTableToConsoleAndExitGracefully,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { CustomDomainListItem, CustomDomainListResponse } from \"../models.js\";\n\nexport interface Arguments {\n account: string;\n authToken: string;\n output?: \"default\" | \"json\";\n}\n\ninterface CustomDomainTableRow {\n hostname: string;\n provider: string;\n \"project-name\": string;\n \"deployment-name\": string;\n branch: string;\n \"environment-type\": string;\n stage: string;\n \"is-default\": boolean | \"\";\n cname: string;\n}\n\ninterface CustomDomainJsonRow {\n hostname: string;\n provider: string;\n projectName: string;\n deploymentName: string | null;\n branch: string | null;\n environmentType: string | null;\n stage: string | null;\n isDefault: boolean | null;\n cname: string | null;\n}\n\nfunction toTableRows(\n customDomains: CustomDomainListItem[]\n): CustomDomainTableRow[] {\n const rows: CustomDomainTableRow[] = [];\n\n customDomains.forEach((customDomain) => {\n if (customDomain.deployments.length === 0) {\n rows.push({\n hostname: customDomain.hostname,\n provider: customDomain.provider,\n \"project-name\": customDomain.projectName,\n \"deployment-name\": \"\",\n branch: \"\",\n \"environment-type\": \"\",\n stage: \"\",\n \"is-default\": \"\",\n cname: \"\",\n });\n return;\n }\n\n customDomain.deployments.forEach((deployment) => {\n rows.push({\n hostname: customDomain.hostname,\n provider: customDomain.provider,\n \"project-name\": customDomain.projectName,\n \"deployment-name\": deployment.deploymentName ?? \"\",\n branch: deployment.branch ?? \"\",\n \"environment-type\": deployment.environmentType ?? \"\",\n stage: deployment.stage ?? \"\",\n \"is-default\": deployment.isDefault,\n cname: deployment.cname ?? \"\",\n });\n });\n });\n\n return rows;\n}\n\nfunction toJsonRows(\n customDomains: CustomDomainListItem[]\n): CustomDomainJsonRow[] {\n const rows: CustomDomainJsonRow[] = [];\n\n customDomains.forEach((customDomain) => {\n if (customDomain.deployments.length === 0) {\n rows.push({\n hostname: customDomain.hostname,\n provider: customDomain.provider,\n projectName: customDomain.projectName,\n deploymentName: null,\n branch: null,\n environmentType: null,\n stage: null,\n isDefault: null,\n cname: null,\n });\n return;\n }\n\n customDomain.deployments.forEach((deployment) => {\n rows.push({\n hostname: customDomain.hostname,\n provider: customDomain.provider,\n projectName: customDomain.projectName,\n deploymentName: deployment.deploymentName,\n branch: deployment.branch,\n environmentType: deployment.environmentType,\n stage: deployment.stage,\n isDefault: deployment.isDefault,\n cname: deployment.cname,\n });\n });\n });\n\n return rows;\n}\n\nexport async function list(argv: Arguments) {\n const { account } = argv;\n const listResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/custom-domains`,\n {\n method: \"GET\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n\n if (listResponse.ok) {\n const customDomains: CustomDomainListResponse = await listResponse.json();\n\n if (customDomains.data.length === 0) {\n if (argv.output === \"json\") {\n await printJsonToConsoleAndExitGracefully([]);\n } else {\n await printResultToConsoleAndExitGracefully(\"No custom domains found\");\n }\n return;\n }\n\n if (argv.output === \"json\") {\n await printJsonToConsoleAndExitGracefully(toJsonRows(customDomains.data));\n } else {\n await printTableToConsoleAndExitGracefully(\n toTableRows(customDomains.data)\n );\n }\n return;\n }\n\n const response = textOrJson(await listResponse.text());\n logger.error(\n {\n status: listResponse.status,\n statusText: listResponse.statusText,\n response,\n },\n \"Failed to list custom domains for account\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to list custom domains for your account. Try again later.\"\n );\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type CustomDomainProvider = "alias" | "amazon" | "cloudflare" | "custom";
|
|
2
|
+
export type CustomDomainStage = "api" | "dev-portal";
|
|
3
|
+
export type CustomDomainEnvironmentType = "PREVIEW" | "PRODUCTION";
|
|
4
|
+
export interface CustomDomainDeployment {
|
|
5
|
+
deploymentName: string | null;
|
|
6
|
+
branch: string | null;
|
|
7
|
+
environmentType: CustomDomainEnvironmentType | null;
|
|
8
|
+
isDefault: boolean;
|
|
9
|
+
stage: CustomDomainStage | null;
|
|
10
|
+
cname: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface CustomDomainListItem {
|
|
13
|
+
id: string;
|
|
14
|
+
accountName: string;
|
|
15
|
+
projectName: string;
|
|
16
|
+
deployments: CustomDomainDeployment[];
|
|
17
|
+
hostname: string;
|
|
18
|
+
provider: CustomDomainProvider;
|
|
19
|
+
}
|
|
20
|
+
export interface CustomDomainListResponse {
|
|
21
|
+
data: CustomDomainListItem[];
|
|
22
|
+
limit: number;
|
|
23
|
+
offset: number;
|
|
24
|
+
}
|
|
25
|
+
export interface OwnershipVerification {
|
|
26
|
+
name: string;
|
|
27
|
+
type: string;
|
|
28
|
+
value: string;
|
|
29
|
+
}
|
|
30
|
+
export interface CustomDomainMutationResult {
|
|
31
|
+
deploymentName: string | null;
|
|
32
|
+
hostname: string;
|
|
33
|
+
stage: CustomDomainStage | null;
|
|
34
|
+
ownershipVerification: OwnershipVerification | null;
|
|
35
|
+
cname: string | null;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/custom-domain/models.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEhF,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,YAAY,CAAC;AAGrD,MAAM,MAAM,2BAA2B,GAAG,SAAS,GAAG,YAAY,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,2BAA2B,GAAG,IAAI,CAAC;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,oBAAoB,EAAE,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAChC,qBAAqB,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACpD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/custom-domain/models.ts"],"names":[],"mappings":"","sourcesContent":["export type CustomDomainProvider = \"alias\" | \"amazon\" | \"cloudflare\" | \"custom\";\n\nexport type CustomDomainStage = \"api\" | \"dev-portal\";\n\n// Custom domains can't be for working copies.\nexport type CustomDomainEnvironmentType = \"PREVIEW\" | \"PRODUCTION\";\n\nexport interface CustomDomainDeployment {\n deploymentName: string | null;\n branch: string | null;\n environmentType: CustomDomainEnvironmentType | null;\n isDefault: boolean;\n stage: CustomDomainStage | null;\n cname: string | null;\n}\n\nexport interface CustomDomainListItem {\n id: string;\n accountName: string;\n projectName: string;\n deployments: CustomDomainDeployment[];\n hostname: string;\n provider: CustomDomainProvider;\n}\n\nexport interface CustomDomainListResponse {\n data: CustomDomainListItem[];\n limit: number;\n offset: number;\n}\n\nexport interface OwnershipVerification {\n name: string;\n type: string;\n value: string;\n}\n\nexport interface CustomDomainMutationResult {\n deploymentName: string | null;\n hostname: string;\n stage: CustomDomainStage | null;\n ownershipVerification: OwnershipVerification | null;\n cname: string | null;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/custom-domain/update/handler.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC7B;AAcD,wBAAsB,MAAM,CAAC,IAAI,EAAE,SAAS,iBA8C3C"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { logger } from "../../common/logger.js";
|
|
2
|
+
import { printCriticalFailureToConsoleAndExit, printJsonToConsoleAndExitGracefully, printTableToConsoleAndExitGracefully, textOrJson, } from "../../common/output.js";
|
|
3
|
+
import settings from "../../common/settings.js";
|
|
4
|
+
function toMutationTable(result) {
|
|
5
|
+
return {
|
|
6
|
+
hostname: result.hostname,
|
|
7
|
+
"deployment-name": result.deploymentName ?? "",
|
|
8
|
+
stage: result.stage ?? "",
|
|
9
|
+
cname: result.cname ?? "",
|
|
10
|
+
"ownership-verification-name": result.ownershipVerification?.name ?? "",
|
|
11
|
+
"ownership-verification-type": result.ownershipVerification?.type ?? "",
|
|
12
|
+
"ownership-verification-value": result.ownershipVerification?.value ?? "",
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export async function update(argv) {
|
|
16
|
+
const { account, hostname } = argv;
|
|
17
|
+
const body = { hostname };
|
|
18
|
+
if (argv["deployment-name"]) {
|
|
19
|
+
body.deploymentName = argv["deployment-name"];
|
|
20
|
+
}
|
|
21
|
+
const updateResponse = await fetch(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/custom-domains`, {
|
|
22
|
+
method: "PATCH",
|
|
23
|
+
headers: {
|
|
24
|
+
Authorization: `Bearer ${argv.authToken}`,
|
|
25
|
+
"Content-Type": "application/json",
|
|
26
|
+
},
|
|
27
|
+
body: JSON.stringify(body),
|
|
28
|
+
});
|
|
29
|
+
if (updateResponse.ok) {
|
|
30
|
+
const result = await updateResponse.json();
|
|
31
|
+
if (argv.output === "json") {
|
|
32
|
+
await printJsonToConsoleAndExitGracefully(result);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
await printTableToConsoleAndExitGracefully(toMutationTable(result));
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const response = textOrJson(await updateResponse.text());
|
|
40
|
+
logger.error({
|
|
41
|
+
status: updateResponse.status,
|
|
42
|
+
statusText: updateResponse.statusText,
|
|
43
|
+
response,
|
|
44
|
+
}, "Failed to update custom domain for account");
|
|
45
|
+
await printCriticalFailureToConsoleAndExit("Error: Failed to update custom domain for your account. Check the arguments.");
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/custom-domain/update/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,oCAAoC,EACpC,mCAAmC,EACnC,oCAAoC,EACpC,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAWhD,SAAS,eAAe,CAAC,MAAkC;IACzD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,iBAAiB,EAAE,MAAM,CAAC,cAAc,IAAI,EAAE;QAC9C,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;QACzB,6BAA6B,EAAE,MAAM,CAAC,qBAAqB,EAAE,IAAI,IAAI,EAAE;QACvE,6BAA6B,EAAE,MAAM,CAAC,qBAAqB,EAAE,IAAI,IAAI,EAAE;QACvE,8BAA8B,EAAE,MAAM,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAe;IAC1C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IACnC,MAAM,IAAI,GAGN,EAAE,QAAQ,EAAE,CAAC;IAEjB,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,iBAAiB,EAChF;QACE,MAAM,EAAE,OAAO;QACf,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;YACzC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CACF,CAAC;IAEF,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,MAAM,GAA+B,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QACvE,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,mCAAmC,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,oCAAoC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,KAAK,CACV;QACE,MAAM,EAAE,cAAc,CAAC,MAAM;QAC7B,UAAU,EAAE,cAAc,CAAC,UAAU;QACrC,QAAQ;KACT,EACD,4CAA4C,CAC7C,CAAC;IACF,MAAM,oCAAoC,CACxC,8EAA8E,CAC/E,CAAC;AACJ,CAAC","sourcesContent":["import { logger } from \"../../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printJsonToConsoleAndExitGracefully,\n printTableToConsoleAndExitGracefully,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { CustomDomainMutationResult } from \"../models.js\";\n\nexport interface Arguments {\n account: string;\n authToken: string;\n hostname: string;\n \"deployment-name\"?: string;\n output?: \"default\" | \"json\";\n}\n\nfunction toMutationTable(result: CustomDomainMutationResult) {\n return {\n hostname: result.hostname,\n \"deployment-name\": result.deploymentName ?? \"\",\n stage: result.stage ?? \"\",\n cname: result.cname ?? \"\",\n \"ownership-verification-name\": result.ownershipVerification?.name ?? \"\",\n \"ownership-verification-type\": result.ownershipVerification?.type ?? \"\",\n \"ownership-verification-value\": result.ownershipVerification?.value ?? \"\",\n };\n}\n\nexport async function update(argv: Arguments) {\n const { account, hostname } = argv;\n const body: {\n hostname: string;\n deploymentName?: string;\n } = { hostname };\n\n if (argv[\"deployment-name\"]) {\n body.deploymentName = argv[\"deployment-name\"];\n }\n\n const updateResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/custom-domains`,\n {\n method: \"PATCH\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n }\n );\n\n if (updateResponse.ok) {\n const result: CustomDomainMutationResult = await updateResponse.json();\n if (argv.output === \"json\") {\n await printJsonToConsoleAndExitGracefully(result);\n } else {\n await printTableToConsoleAndExitGracefully(toMutationTable(result));\n }\n return;\n }\n\n const response = textOrJson(await updateResponse.text());\n logger.error(\n {\n status: updateResponse.status,\n statusText: updateResponse.statusText,\n response,\n },\n \"Failed to update custom domain for account\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to update custom domain for your account. Check the arguments.\"\n );\n}\n"]}
|
package/dist/login/login.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export declare const CLIENT_ID
|
|
2
|
-
export declare const AUTH0_DOMAIN
|
|
1
|
+
export declare const CLIENT_ID: string;
|
|
2
|
+
export declare const AUTH0_DOMAIN: string;
|
|
3
3
|
export declare const OAUTH_SCOPE = "offline_access";
|
|
4
4
|
export declare const OAUTH_AUDIENCE = "https://dev.zuplo.com/";
|
|
5
5
|
export declare function login(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/login/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/login/login.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,SAAS,QAA2B,CAAC;AAClD,eAAO,MAAM,YAAY,QAAwB,CAAC;AAClD,eAAO,MAAM,WAAW,mBAAmB,CAAC;AAC5C,eAAO,MAAM,cAAc,2BAA2B,CAAC;AAoMvD,wBAAsB,KAAK,kBAqD1B"}
|
package/dist/login/login.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import opn from "open";
|
|
2
2
|
import { logger } from "../common/logger.js";
|
|
3
3
|
import { printCriticalFailureToConsoleAndExit } from "../common/output.js";
|
|
4
|
+
import settings from "../common/settings.js";
|
|
4
5
|
import box from "../common/utils/box.js";
|
|
5
6
|
import { saveAuthState } from "./tokens.js";
|
|
6
|
-
export const CLIENT_ID =
|
|
7
|
-
export const AUTH0_DOMAIN =
|
|
7
|
+
export const CLIENT_ID = settings.AUTH0_CLIENT_ID;
|
|
8
|
+
export const AUTH0_DOMAIN = settings.AUTH0_DOMAIN;
|
|
8
9
|
export const OAUTH_SCOPE = "offline_access";
|
|
9
10
|
export const OAUTH_AUDIENCE = "https://dev.zuplo.com/";
|
|
10
11
|
class OAuthError extends Error {
|
package/dist/login/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/login/login.ts"],"names":[],"mappings":"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","sourcesContent":["import opn from \"open\";\nimport { logger } from \"../common/logger.js\";\nimport { printCriticalFailureToConsoleAndExit } from \"../common/output.js\";\nimport box from \"../common/utils/box.js\";\nimport { OAuthResponse, saveAuthState } from \"./tokens.js\";\n\nexport const CLIENT_ID = \"mYLGcH7kB4P0pw0HAk6GH7raRwYhSlW4\";\nexport const AUTH0_DOMAIN = \"auth.zuplo.com\";\nexport const OAUTH_SCOPE = \"offline_access\";\nexport const OAUTH_AUDIENCE = \"https://dev.zuplo.com/\";\n\ninterface DeviceCodeResponse {\n // biome-ignore lint/style/useNamingConvention: API field\n device_code: string;\n // biome-ignore lint/style/useNamingConvention: API field\n user_code: string;\n // biome-ignore lint/style/useNamingConvention: API field\n verification_uri: string;\n // biome-ignore lint/style/useNamingConvention: API field\n verification_uri_complete: string;\n // biome-ignore lint/style/useNamingConvention: API field\n expires_in: number;\n interval: number;\n}\n\ninterface DeviceTokenResponse extends OAuthResponse {\n error?: string;\n // biome-ignore lint/style/useNamingConvention: API field\n error_description?: string;\n}\n\nclass OAuthError extends Error {}\n\n/**\n * Initiates the device authorization flow\n */\nasync function initiateDeviceFlow(): Promise<DeviceCodeResponse> {\n const response = await fetch(`https://${AUTH0_DOMAIN}/oauth/device/code`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: new URLSearchParams({\n // biome-ignore lint/style/useNamingConvention: External API property\n client_id: CLIENT_ID,\n scope: OAUTH_SCOPE,\n audience: OAUTH_AUDIENCE,\n }),\n });\n\n if (!response.ok) {\n // biome-ignore lint/suspicious/noExplicitAny: Migrated from ESLint\n let errorDetails: any = {};\n try {\n errorDetails = await response.json();\n } catch {\n // If response body is not JSON, continue with status text\n }\n\n const Sentry = await import(\"@sentry/node\");\n const errorMessage =\n errorDetails.error_description ||\n errorDetails.error ||\n response.statusText;\n\n Sentry.captureException(\n new Error(`Failed to initiate device flow: ${errorMessage}`),\n {\n tags: {\n // biome-ignore lint/style/useNamingConvention: External API property\n oauth_error: errorDetails.error || \"device_code_failed\",\n source: \"cli_device_flow_init\",\n // biome-ignore lint/style/useNamingConvention: External API property\n status_code: response.status,\n },\n extra: {\n // biome-ignore lint/style/useNamingConvention: External API property\n error_description: errorDetails.error_description,\n // biome-ignore lint/style/useNamingConvention: External API property\n error_details: errorDetails,\n status: response.status,\n // biome-ignore lint/style/useNamingConvention: External API property\n status_text: response.statusText,\n },\n }\n );\n\n throw new Error(`Failed to initiate device flow: ${errorMessage}`);\n }\n\n return response.json();\n}\n\n/**\n * Polls for the device token\n */\nasync function pollForToken(\n deviceCode: string,\n interval: number,\n expiresIn: number\n): Promise<OAuthResponse> {\n const startTime = Date.now();\n const expirationTime = startTime + expiresIn * 1000;\n\n while (Date.now() < expirationTime) {\n // Wait for the specified interval before polling\n await new Promise((resolve) => setTimeout(resolve, interval * 1000));\n\n const response = await fetch(`https://${AUTH0_DOMAIN}/oauth/token`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: new URLSearchParams({\n // biome-ignore lint/style/useNamingConvention: External API property\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n // biome-ignore lint/style/useNamingConvention: External API property\n device_code: deviceCode,\n // biome-ignore lint/style/useNamingConvention: External API property\n client_id: CLIENT_ID,\n }),\n });\n\n const result: DeviceTokenResponse = await response.json();\n\n // Check for specific device flow errors\n if (result.error) {\n if (result.error === \"authorization_pending\") {\n // User hasn't authorized yet, continue polling\n logger.debug(\"Authorization pending, continuing to poll...\");\n continue;\n } else if (result.error === \"slow_down\") {\n // Increase polling interval as requested by the server\n interval = interval + 5;\n logger.debug(`Slowing down polling interval to ${interval} seconds`);\n continue;\n } else if (result.error === \"expired_token\") {\n // Device code has expired\n const Sentry = await import(\"@sentry/node\");\n Sentry.captureException(\n new Error(\"Device code expired before user authorization\"),\n {\n tags: {\n // biome-ignore lint/style/useNamingConvention: External API property\n oauth_error: \"expired_token\",\n source: \"cli_device_flow_poll\",\n },\n }\n );\n throw new OAuthError(\"The device code has expired.\");\n } else if (result.error === \"access_denied\") {\n // User denied the authorization\n const Sentry = await import(\"@sentry/node\");\n Sentry.captureException(new Error(\"User denied authorization\"), {\n tags: {\n // biome-ignore lint/style/useNamingConvention: External API property\n oauth_error: \"access_denied\",\n source: \"cli_device_flow_poll\",\n },\n });\n throw new OAuthError(\"Authorization was denied.\");\n } else {\n // Unknown error\n const Sentry = await import(\"@sentry/node\");\n Sentry.captureException(\n new Error(`Device flow error: ${result.error}`),\n {\n tags: {\n // biome-ignore lint/style/useNamingConvention: External API property\n oauth_error: result.error,\n source: \"cli_device_flow_poll\",\n },\n extra: {\n // biome-ignore lint/style/useNamingConvention: External API property\n error_description: result.error_description,\n },\n }\n );\n throw new OAuthError(\n result.error_description || `OAuth error: ${result.error}`\n );\n }\n }\n\n // Success! We have the tokens\n if (result.access_token) {\n return result as OAuthResponse;\n }\n }\n\n // Timeout reached\n const Sentry = await import(\"@sentry/node\");\n Sentry.captureException(\n new Error(\"Device flow timed out waiting for user authorization\"),\n {\n tags: {\n // biome-ignore lint/style/useNamingConvention: External API property\n oauth_error: \"timeout\",\n source: \"cli_device_flow_poll\",\n },\n }\n );\n throw new OAuthError(\"Timed out waiting for authorization.\");\n}\n\nexport async function login() {\n try {\n // Step 1: Initiate device flow\n const deviceResponse = await initiateDeviceFlow();\n\n // Step 2: Print login message\n // biome-ignore lint/suspicious/noConsole: Migrated from ESLint\n console.log(\n box(\n ` To login, please visit:\n\n${deviceResponse.verification_uri_complete}\n\nAfter completing login in the browser you can close the tab.`,\n {\n borderColor: \"white\",\n }\n )\n );\n\n // Step 3: Try to open the browser automatically\n try {\n await opn(deviceResponse.verification_uri_complete);\n } catch {\n // Ignore\n }\n\n // Step 4: Poll for the token\n let tokenResponse: OAuthResponse;\n try {\n tokenResponse = await pollForToken(\n deviceResponse.device_code,\n deviceResponse.interval,\n deviceResponse.expires_in\n );\n } catch (err) {\n if (err instanceof OAuthError) {\n return printCriticalFailureToConsoleAndExit(\n `${err.message}. Please run the login command again.`\n );\n } else {\n return printCriticalFailureToConsoleAndExit(\n \"An error occurred while attempting to authenticate. Please run the login command again. If the problem persists, contact support@zuplo.com.\"\n );\n }\n }\n\n // Step 5: Save the authentication state\n await saveAuthState(tokenResponse);\n } catch (error) {\n logger.error(error, \"Login failed\");\n throw error;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/login/login.ts"],"names":[],"mappings":"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","sourcesContent":["import opn from \"open\";\nimport { logger } from \"../common/logger.js\";\nimport { printCriticalFailureToConsoleAndExit } from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport box from \"../common/utils/box.js\";\nimport { OAuthResponse, saveAuthState } from \"./tokens.js\";\n\nexport const CLIENT_ID = settings.AUTH0_CLIENT_ID;\nexport const AUTH0_DOMAIN = settings.AUTH0_DOMAIN;\nexport const OAUTH_SCOPE = \"offline_access\";\nexport const OAUTH_AUDIENCE = \"https://dev.zuplo.com/\";\n\ninterface DeviceCodeResponse {\n // biome-ignore lint/style/useNamingConvention: API field\n device_code: string;\n // biome-ignore lint/style/useNamingConvention: API field\n user_code: string;\n // biome-ignore lint/style/useNamingConvention: API field\n verification_uri: string;\n // biome-ignore lint/style/useNamingConvention: API field\n verification_uri_complete: string;\n // biome-ignore lint/style/useNamingConvention: API field\n expires_in: number;\n interval: number;\n}\n\ninterface DeviceTokenResponse extends OAuthResponse {\n error?: string;\n // biome-ignore lint/style/useNamingConvention: API field\n error_description?: string;\n}\n\nclass OAuthError extends Error {}\n\n/**\n * Initiates the device authorization flow\n */\nasync function initiateDeviceFlow(): Promise<DeviceCodeResponse> {\n const response = await fetch(`https://${AUTH0_DOMAIN}/oauth/device/code`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: new URLSearchParams({\n // biome-ignore lint/style/useNamingConvention: External API property\n client_id: CLIENT_ID,\n scope: OAUTH_SCOPE,\n audience: OAUTH_AUDIENCE,\n }),\n });\n\n if (!response.ok) {\n // biome-ignore lint/suspicious/noExplicitAny: Migrated from ESLint\n let errorDetails: any = {};\n try {\n errorDetails = await response.json();\n } catch {\n // If response body is not JSON, continue with status text\n }\n\n const Sentry = await import(\"@sentry/node\");\n const errorMessage =\n errorDetails.error_description ||\n errorDetails.error ||\n response.statusText;\n\n Sentry.captureException(\n new Error(`Failed to initiate device flow: ${errorMessage}`),\n {\n tags: {\n // biome-ignore lint/style/useNamingConvention: External API property\n oauth_error: errorDetails.error || \"device_code_failed\",\n source: \"cli_device_flow_init\",\n // biome-ignore lint/style/useNamingConvention: External API property\n status_code: response.status,\n },\n extra: {\n // biome-ignore lint/style/useNamingConvention: External API property\n error_description: errorDetails.error_description,\n // biome-ignore lint/style/useNamingConvention: External API property\n error_details: errorDetails,\n status: response.status,\n // biome-ignore lint/style/useNamingConvention: External API property\n status_text: response.statusText,\n },\n }\n );\n\n throw new Error(`Failed to initiate device flow: ${errorMessage}`);\n }\n\n return response.json();\n}\n\n/**\n * Polls for the device token\n */\nasync function pollForToken(\n deviceCode: string,\n interval: number,\n expiresIn: number\n): Promise<OAuthResponse> {\n const startTime = Date.now();\n const expirationTime = startTime + expiresIn * 1000;\n\n while (Date.now() < expirationTime) {\n // Wait for the specified interval before polling\n await new Promise((resolve) => setTimeout(resolve, interval * 1000));\n\n const response = await fetch(`https://${AUTH0_DOMAIN}/oauth/token`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: new URLSearchParams({\n // biome-ignore lint/style/useNamingConvention: External API property\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n // biome-ignore lint/style/useNamingConvention: External API property\n device_code: deviceCode,\n // biome-ignore lint/style/useNamingConvention: External API property\n client_id: CLIENT_ID,\n }),\n });\n\n const result: DeviceTokenResponse = await response.json();\n\n // Check for specific device flow errors\n if (result.error) {\n if (result.error === \"authorization_pending\") {\n // User hasn't authorized yet, continue polling\n logger.debug(\"Authorization pending, continuing to poll...\");\n continue;\n } else if (result.error === \"slow_down\") {\n // Increase polling interval as requested by the server\n interval = interval + 5;\n logger.debug(`Slowing down polling interval to ${interval} seconds`);\n continue;\n } else if (result.error === \"expired_token\") {\n // Device code has expired\n const Sentry = await import(\"@sentry/node\");\n Sentry.captureException(\n new Error(\"Device code expired before user authorization\"),\n {\n tags: {\n // biome-ignore lint/style/useNamingConvention: External API property\n oauth_error: \"expired_token\",\n source: \"cli_device_flow_poll\",\n },\n }\n );\n throw new OAuthError(\"The device code has expired.\");\n } else if (result.error === \"access_denied\") {\n // User denied the authorization\n const Sentry = await import(\"@sentry/node\");\n Sentry.captureException(new Error(\"User denied authorization\"), {\n tags: {\n // biome-ignore lint/style/useNamingConvention: External API property\n oauth_error: \"access_denied\",\n source: \"cli_device_flow_poll\",\n },\n });\n throw new OAuthError(\"Authorization was denied.\");\n } else {\n // Unknown error\n const Sentry = await import(\"@sentry/node\");\n Sentry.captureException(\n new Error(`Device flow error: ${result.error}`),\n {\n tags: {\n // biome-ignore lint/style/useNamingConvention: External API property\n oauth_error: result.error,\n source: \"cli_device_flow_poll\",\n },\n extra: {\n // biome-ignore lint/style/useNamingConvention: External API property\n error_description: result.error_description,\n },\n }\n );\n throw new OAuthError(\n result.error_description || `OAuth error: ${result.error}`\n );\n }\n }\n\n // Success! We have the tokens\n if (result.access_token) {\n return result as OAuthResponse;\n }\n }\n\n // Timeout reached\n const Sentry = await import(\"@sentry/node\");\n Sentry.captureException(\n new Error(\"Device flow timed out waiting for user authorization\"),\n {\n tags: {\n // biome-ignore lint/style/useNamingConvention: External API property\n oauth_error: \"timeout\",\n source: \"cli_device_flow_poll\",\n },\n }\n );\n throw new OAuthError(\"Timed out waiting for authorization.\");\n}\n\nexport async function login() {\n try {\n // Step 1: Initiate device flow\n const deviceResponse = await initiateDeviceFlow();\n\n // Step 2: Print login message\n // biome-ignore lint/suspicious/noConsole: Migrated from ESLint\n console.log(\n box(\n ` To login, please visit:\n\n${deviceResponse.verification_uri_complete}\n\nAfter completing login in the browser you can close the tab.`,\n {\n borderColor: \"white\",\n }\n )\n );\n\n // Step 3: Try to open the browser automatically\n try {\n await opn(deviceResponse.verification_uri_complete);\n } catch {\n // Ignore\n }\n\n // Step 4: Poll for the token\n let tokenResponse: OAuthResponse;\n try {\n tokenResponse = await pollForToken(\n deviceResponse.device_code,\n deviceResponse.interval,\n deviceResponse.expires_in\n );\n } catch (err) {\n if (err instanceof OAuthError) {\n return printCriticalFailureToConsoleAndExit(\n `${err.message}. Please run the login command again.`\n );\n } else {\n return printCriticalFailureToConsoleAndExit(\n \"An error occurred while attempting to authenticate. Please run the login command again. If the problem persists, contact support@zuplo.com.\"\n );\n }\n }\n\n // Step 5: Save the authentication state\n await saveAuthState(tokenResponse);\n } catch (error) {\n logger.error(error, \"Login failed\");\n throw error;\n }\n}\n"]}
|