@zuplo/cli 6.52.15 → 6.52.16

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.
Files changed (81) hide show
  1. package/dist/__tests__/integration/jest-mocks-setup.js +8 -0
  2. package/dist/__tests__/integration/jest-mocks-setup.js.map +1 -1
  3. package/dist/__tests__/integration/link.integration.test.js +8 -5
  4. package/dist/__tests__/integration/link.integration.test.js.map +1 -1
  5. package/dist/cmds/delete.d.ts.map +1 -1
  6. package/dist/cmds/delete.js +14 -6
  7. package/dist/cmds/delete.js.map +1 -1
  8. package/dist/cmds/deploy.d.ts.map +1 -1
  9. package/dist/cmds/deploy.js +21 -6
  10. package/dist/cmds/deploy.js.map +1 -1
  11. package/dist/cmds/link.d.ts.map +1 -1
  12. package/dist/cmds/link.js +21 -6
  13. package/dist/cmds/link.js.map +1 -1
  14. package/dist/cmds/list.d.ts.map +1 -1
  15. package/dist/cmds/list.js +14 -6
  16. package/dist/cmds/list.js.map +1 -1
  17. package/dist/cmds/tunnel/create.d.ts.map +1 -1
  18. package/dist/cmds/tunnel/create.js +2 -2
  19. package/dist/cmds/tunnel/create.js.map +1 -1
  20. package/dist/cmds/tunnel/delete.d.ts.map +1 -1
  21. package/dist/cmds/tunnel/delete.js +2 -2
  22. package/dist/cmds/tunnel/delete.js.map +1 -1
  23. package/dist/cmds/tunnel/describe.d.ts.map +1 -1
  24. package/dist/cmds/tunnel/describe.js +2 -2
  25. package/dist/cmds/tunnel/describe.js.map +1 -1
  26. package/dist/cmds/tunnel/list.d.ts.map +1 -1
  27. package/dist/cmds/tunnel/list.js +2 -3
  28. package/dist/cmds/tunnel/list.js.map +1 -1
  29. package/dist/cmds/tunnel/rotate-token.d.ts.map +1 -1
  30. package/dist/cmds/tunnel/rotate-token.js +2 -2
  31. package/dist/cmds/tunnel/rotate-token.js.map +1 -1
  32. package/dist/cmds/tunnel/services/describe.d.ts.map +1 -1
  33. package/dist/cmds/tunnel/services/describe.js +2 -2
  34. package/dist/cmds/tunnel/services/describe.js.map +1 -1
  35. package/dist/cmds/tunnel/services/update.d.ts.map +1 -1
  36. package/dist/cmds/tunnel/services/update.js +2 -2
  37. package/dist/cmds/tunnel/services/update.js.map +1 -1
  38. package/dist/cmds/variable/create.d.ts.map +1 -1
  39. package/dist/cmds/variable/create.js +14 -6
  40. package/dist/cmds/variable/create.js.map +1 -1
  41. package/dist/cmds/variable/update.d.ts.map +1 -1
  42. package/dist/cmds/variable/update.js +14 -6
  43. package/dist/cmds/variable/update.js.map +1 -1
  44. package/dist/common/middleware/get-account-param.d.ts +4 -0
  45. package/dist/common/middleware/get-account-param.d.ts.map +1 -0
  46. package/dist/common/middleware/get-account-param.js +53 -0
  47. package/dist/common/middleware/get-account-param.js.map +1 -0
  48. package/dist/common/middleware/get-environment-param.d.ts +4 -0
  49. package/dist/common/middleware/get-environment-param.d.ts.map +1 -0
  50. package/dist/common/middleware/get-environment-param.js +141 -0
  51. package/dist/common/middleware/get-environment-param.js.map +1 -0
  52. package/dist/common/middleware/get-project-param.d.ts +4 -0
  53. package/dist/common/middleware/get-project-param.d.ts.map +1 -0
  54. package/dist/common/middleware/get-project-param.js +59 -0
  55. package/dist/common/middleware/get-project-param.js.map +1 -0
  56. package/dist/common/middleware/user-configuration.d.ts.map +1 -1
  57. package/dist/common/middleware/user-configuration.js +2 -1
  58. package/dist/common/middleware/user-configuration.js.map +1 -1
  59. package/dist/common/utils/pretty-print-environment-prompt.d.ts +6 -0
  60. package/dist/common/utils/pretty-print-environment-prompt.d.ts.map +1 -0
  61. package/dist/common/utils/pretty-print-environment-prompt.js +23 -0
  62. package/dist/common/utils/pretty-print-environment-prompt.js.map +1 -0
  63. package/dist/common/validators/file-system-validator.d.ts.map +1 -1
  64. package/dist/common/validators/file-system-validator.js +2 -3
  65. package/dist/common/validators/file-system-validator.js.map +1 -1
  66. package/dist/common/validators/project-name-validator.d.ts.map +1 -1
  67. package/dist/common/validators/project-name-validator.js +2 -1
  68. package/dist/common/validators/project-name-validator.js.map +1 -1
  69. package/dist/link/handler.d.ts.map +1 -1
  70. package/dist/link/handler.js +6 -138
  71. package/dist/link/handler.js.map +1 -1
  72. package/dist/tsconfig.tsbuildinfo +1 -1
  73. package/package.json +4 -4
  74. package/dist/common/builders/authenticated-command-builder.d.ts +0 -25
  75. package/dist/common/builders/authenticated-command-builder.d.ts.map +0 -1
  76. package/dist/common/builders/authenticated-command-builder.js +0 -87
  77. package/dist/common/builders/authenticated-command-builder.js.map +0 -1
  78. package/dist/common/builders/authenticated-command-builder.spec.d.ts +0 -2
  79. package/dist/common/builders/authenticated-command-builder.spec.d.ts.map +0 -1
  80. package/dist/common/builders/authenticated-command-builder.spec.js +0 -268
  81. package/dist/common/builders/authenticated-command-builder.spec.js.map +0 -1
@@ -1,87 +0,0 @@
1
- import { authenticate } from "../middleware/authentication.js";
2
- import { configure } from "../middleware/user-configuration.js";
3
- import { identify } from "../middleware/user-identification.js";
4
- import setBlocking from "../output.js";
5
- import { YargsChecker } from "../validators/lib.js";
6
- import { ProjectIsSetValidator } from "../validators/project-name-validator.js";
7
- export class AuthenticatedCommandBuilder {
8
- options;
9
- constructor(options = {}) {
10
- this.options = options;
11
- }
12
- build(yargs, customBuilder) {
13
- let builder;
14
- if (customBuilder) {
15
- builder = customBuilder(yargs);
16
- }
17
- builder = this.addStandardOptions(yargs);
18
- builder = builder.middleware([
19
- setBlocking,
20
- authenticate,
21
- configure,
22
- identify,
23
- ]);
24
- if (this.options.additionalMiddleware) {
25
- builder = builder.middleware(this.options.additionalMiddleware);
26
- }
27
- return this.addValidationChecks(builder);
28
- }
29
- static create(options) {
30
- return new AuthenticatedCommandBuilder(options);
31
- }
32
- static withSelfHosted(options) {
33
- return new AuthenticatedCommandBuilder({
34
- ...options,
35
- requireSelfHostedEndpoint: true,
36
- });
37
- }
38
- static withMiddleware(middleware, options) {
39
- return new AuthenticatedCommandBuilder({
40
- ...options,
41
- additionalMiddleware: middleware,
42
- });
43
- }
44
- addStandardOptions(yargs) {
45
- let builder = yargs.option("api-key", {
46
- type: "string",
47
- describe: "The API Key from Zuplo",
48
- envVar: "API_KEY",
49
- });
50
- builder = builder.option("project", {
51
- type: "string",
52
- describe: "The project name",
53
- });
54
- if (this.options.requireSelfHostedEndpoint) {
55
- builder = builder.option("self-hosted-endpoint", {
56
- type: "string",
57
- describe: "The endpoint of your self-hosted service to deploy to",
58
- });
59
- }
60
- return builder;
61
- }
62
- addValidationChecks(yargs) {
63
- const validators = [];
64
- validators.push(new ProjectIsSetValidator());
65
- if (this.options.additionalValidators) {
66
- validators.push(...this.options.additionalValidators);
67
- }
68
- if (validators.length === 1) {
69
- return yargs.check(async (argv) => {
70
- return await new YargsChecker(validators[0]).check(argv);
71
- });
72
- }
73
- else if (validators.length > 1) {
74
- return yargs.check(async (argv) => {
75
- for (const validator of validators) {
76
- const result = await new YargsChecker(validator).check(argv);
77
- if (result !== true) {
78
- return result;
79
- }
80
- }
81
- return true;
82
- });
83
- }
84
- return yargs;
85
- }
86
- }
87
- //# sourceMappingURL=authenticated-command-builder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authenticated-command-builder.js","sourceRoot":"","sources":["../../../src/common/builders/authenticated-command-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Argv, MiddlewareFunction } from \"yargs\";\nimport { authenticate } from \"../middleware/authentication.js\";\nimport { configure } from \"../middleware/user-configuration.js\";\nimport { identify } from \"../middleware/user-identification.js\";\nimport setBlocking from \"../output.js\";\nimport { YargsChecker } from \"../validators/lib.js\";\nimport { ProjectIsSetValidator } from \"../validators/project-name-validator.js\";\nimport type { ValidationRule } from \"../validators/lib.js\";\n\ntype AuthenticatedCommandArgv<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = Argv<\n {\n \"api-key\": string;\n project: string;\n \"self-hosted-endpoint\"?: string;\n } & T\n>;\n\nexport interface AuthenticatedCommandOptions {\n requireSelfHostedEndpoint?: boolean;\n additionalValidators?: ValidationRule<unknown>[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n additionalMiddleware?: MiddlewareFunction[];\n}\n\n/**\n * Builder for creating authenticated CLI commands with standardized options and validation.\n *\n * Examples:\n *\n * 1. Basic authenticated command:\n * ```\n * builder: (yargs: Argv): Argv<unknown> => {\n * return AuthenticatedCommandBuilder.create().build(yargs);\n * }\n * ```\n *\n * 2. Command with custom options:\n * ```\n * builder: (yargs: Argv): Argv<unknown> => {\n * return AuthenticatedCommandBuilder.create().build(yargs, (yargs) =>\n * yargs\n * .option(\"url\", { type: \"string\", describe: \"The URL of the Zuplo API to delete\" })\n * .option(\"wait\", { type: \"boolean\", describe: \"Should the CLI wait until deleted\" })\n * .demandOption([\"url\"])\n * );\n * }\n * ```\n *\n * 3. Command requiring self-hosted endpoint:\n * ```\n * builder: (yargs: Argv): Argv<unknown> => {\n * return AuthenticatedCommandBuilder.withSelfHosted().build(yargs, (yargs) =>\n * yargs.option(\"config\", { type: \"string\", describe: \"Configuration file path\" })\n * );\n * }\n * ```\n *\n * 4. Command with additional middleware:\n * ```\n * builder: (yargs: Argv): Argv<unknown> => {\n * return AuthenticatedCommandBuilder.withMiddleware([customMiddleware]).build(yargs);\n * }\n * ```\n *\n * 5. Command with custom validators:\n * ```\n * builder: (yargs: Argv): Argv<unknown> => {\n * return AuthenticatedCommandBuilder.create({\n * additionalValidators: [new CustomValidator()]\n * }).build(yargs, (yargs) =>\n * yargs.option(\"file\", { type: \"string\", describe: \"File to validate\" })\n * );\n * }\n * ```\n *\n * 6. Complex command combining multiple features:\n * ```\n * builder: (yargs: Argv): Argv<unknown> => {\n * return AuthenticatedCommandBuilder.withSelfHosted({\n * additionalValidators: [new FileExistsValidator()],\n * }).build(yargs, (yargs) =>\n * yargs\n * .option(\"source\", { type: \"string\", describe: \"Source directory\" })\n * .option(\"destination\", { type: \"string\", describe: \"Destination path\" })\n * .demandOption([\"source\", \"destination\"])\n * );\n * }\n * ```\n */\nexport class AuthenticatedCommandBuilder {\n private options: AuthenticatedCommandOptions;\n\n private constructor(options: AuthenticatedCommandOptions = {}) {\n this.options = options;\n }\n\n /**\n * Builds a yargs configuration with standard authentication options and middleware\n * @param yargs - The yargs instance\n * @param customBuilder - Optional function to add command-specific options\n * @returns Configured yargs instance\n */\n build(yargs: Argv, customBuilder?: (yargs: Argv) => Argv): Argv {\n let builder;\n if (customBuilder) {\n builder = customBuilder(yargs);\n }\n\n builder = this.addStandardOptions(yargs);\n\n builder = builder.middleware([\n setBlocking,\n authenticate,\n configure,\n identify,\n ]);\n if (this.options.additionalMiddleware) {\n builder = builder.middleware(this.options.additionalMiddleware);\n }\n\n // Add validation checks\n return this.addValidationChecks(builder);\n }\n\n /**\n * Creates a new builder instance with additional options\n */\n static create(\n options?: AuthenticatedCommandOptions\n ): AuthenticatedCommandBuilder {\n return new AuthenticatedCommandBuilder(options);\n }\n\n /**\n * Pre-configured builder for commands that require self-hosted endpoint\n */\n static withSelfHosted(\n options?: Omit<AuthenticatedCommandOptions, \"requireSelfHostedEndpoint\">\n ): AuthenticatedCommandBuilder {\n return new AuthenticatedCommandBuilder({\n ...options,\n requireSelfHostedEndpoint: true,\n });\n }\n\n /**\n * Adds custom middleware to the builder. Note that this will be added\n * after the standard middleware, and executed *in order*, after the standard middleware\n * of `setBlocking`, `authenticate`, `configure`, and `identify` have run.\n */\n static withMiddleware(\n middleware: MiddlewareFunction[],\n options?: Omit<AuthenticatedCommandOptions, \"middleware\">\n ): AuthenticatedCommandBuilder {\n return new AuthenticatedCommandBuilder({\n ...options,\n additionalMiddleware: middleware,\n });\n }\n\n private addStandardOptions(yargs: Argv): AuthenticatedCommandArgv {\n let builder = yargs.option(\"api-key\", {\n type: \"string\",\n describe: \"The API Key from Zuplo\",\n envVar: \"API_KEY\",\n } as const);\n\n builder = builder.option(\"project\", {\n type: \"string\",\n describe: \"The project name\",\n } as const);\n\n if (this.options.requireSelfHostedEndpoint) {\n builder = builder.option(\"self-hosted-endpoint\", {\n type: \"string\",\n describe: \"The endpoint of your self-hosted service to deploy to\",\n } as const);\n }\n\n return builder as AuthenticatedCommandArgv;\n }\n\n private addValidationChecks<T>(yargs: Argv<T>): Argv<T> {\n const validators: ValidationRule<unknown>[] = [];\n\n validators.push(new ProjectIsSetValidator());\n\n // Add any additional validators\n if (this.options.additionalValidators) {\n validators.push(...this.options.additionalValidators);\n }\n\n // Apply validators\n if (validators.length === 1) {\n return yargs.check(async (argv) => {\n return await new YargsChecker<typeof argv>(validators[0]).check(argv);\n });\n } else if (validators.length > 1) {\n return yargs.check(async (argv) => {\n for (const validator of validators) {\n const result = await new YargsChecker<typeof argv>(validator).check(\n argv\n );\n if (result !== true) {\n return result;\n }\n }\n return true;\n });\n }\n\n return yargs;\n }\n}\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=authenticated-command-builder.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authenticated-command-builder.spec.d.ts","sourceRoot":"","sources":["../../../src/common/builders/authenticated-command-builder.spec.ts"],"names":[],"mappings":""}
@@ -1,268 +0,0 @@
1
- import { describe, it, beforeEach, afterEach } from "node:test";
2
- import { expect } from "chai";
3
- import sinon from "sinon";
4
- import { AuthenticatedCommandBuilder, } from "./authenticated-command-builder.js";
5
- import { authenticate } from "../middleware/authentication.js";
6
- import { configure } from "../middleware/user-configuration.js";
7
- import { identify } from "../middleware/user-identification.js";
8
- import setBlocking from "../output.js";
9
- import { YargsChecker } from "../validators/lib.js";
10
- class MockYargs {
11
- options = {};
12
- middlewareList = [];
13
- checkFunction = null;
14
- option(key, config) {
15
- this.options[key] = config;
16
- return this;
17
- }
18
- middleware(middlewareArray) {
19
- this.middlewareList.push(...middlewareArray);
20
- return this;
21
- }
22
- check(fn) {
23
- this.checkFunction = fn;
24
- return this;
25
- }
26
- getOptions() {
27
- return this.options;
28
- }
29
- getMiddleware() {
30
- return this.middlewareList;
31
- }
32
- getCheckFunction() {
33
- return this.checkFunction;
34
- }
35
- }
36
- describe("AuthenticatedCommandBuilder", () => {
37
- let yargsCheckerStub;
38
- beforeEach(() => {
39
- yargsCheckerStub = sinon.stub(YargsChecker.prototype, "check");
40
- });
41
- afterEach(() => {
42
- sinon.restore();
43
- });
44
- describe("private constructor", () => {
45
- it("should only be accessible through static factory methods", () => {
46
- const builder = AuthenticatedCommandBuilder.create();
47
- expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);
48
- });
49
- });
50
- describe("static factory methods", () => {
51
- describe("create", () => {
52
- it("should create new instance with provided options", () => {
53
- const options = {
54
- requireSelfHostedEndpoint: true,
55
- additionalValidators: [],
56
- };
57
- const builder = AuthenticatedCommandBuilder.create(options);
58
- expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);
59
- });
60
- it("should create new instance with default options when none provided", () => {
61
- const builder = AuthenticatedCommandBuilder.create();
62
- expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);
63
- });
64
- });
65
- describe("withSelfHosted", () => {
66
- it("should create instance with requireSelfHostedEndpoint set to true", () => {
67
- const builder = AuthenticatedCommandBuilder.withSelfHosted();
68
- expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);
69
- });
70
- it("should merge additional options with requireSelfHostedEndpoint", () => {
71
- const options = { additionalValidators: [] };
72
- const builder = AuthenticatedCommandBuilder.withSelfHosted(options);
73
- expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);
74
- });
75
- });
76
- describe("withMiddleware", () => {
77
- it("should create instance with additional middleware", () => {
78
- const mockMiddleware = sinon.stub();
79
- const builder = AuthenticatedCommandBuilder.withMiddleware([
80
- mockMiddleware,
81
- ]);
82
- expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);
83
- });
84
- it("should merge additional options with middleware", () => {
85
- const mockMiddleware = sinon.stub();
86
- const options = { requireSelfHostedEndpoint: true };
87
- const builder = AuthenticatedCommandBuilder.withMiddleware([mockMiddleware], options);
88
- expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);
89
- });
90
- });
91
- });
92
- describe("build", () => {
93
- let mockYargs;
94
- beforeEach(() => {
95
- mockYargs = new MockYargs();
96
- yargsCheckerStub.resolves(true);
97
- });
98
- it("should add standard options (api-key and project by default)", () => {
99
- const builder = AuthenticatedCommandBuilder.create();
100
- builder.build(mockYargs);
101
- const options = mockYargs.getOptions();
102
- expect(options).to.have.property("api-key");
103
- expect(options).to.have.property("project");
104
- expect(options).to.not.have.property("self-hosted-endpoint");
105
- });
106
- it("should add self-hosted-endpoint option when requireSelfHostedEndpoint is true", () => {
107
- const builder = AuthenticatedCommandBuilder.create({
108
- requireSelfHostedEndpoint: true,
109
- });
110
- builder.build(mockYargs);
111
- const options = mockYargs.getOptions();
112
- expect(options).to.have.property("self-hosted-endpoint");
113
- });
114
- it("should apply custom builder function when provided", () => {
115
- const builder = AuthenticatedCommandBuilder.create();
116
- const customBuilder = (yargs) => yargs.option("test-option", {
117
- type: "string",
118
- describe: "Test option",
119
- });
120
- builder.build(mockYargs, customBuilder);
121
- const options = mockYargs.getOptions();
122
- expect(options).to.have.property("test-option");
123
- });
124
- it("should add all required middleware", () => {
125
- const builder = AuthenticatedCommandBuilder.create();
126
- builder.build(mockYargs);
127
- const middleware = mockYargs.getMiddleware();
128
- expect(middleware).to.have.length(4);
129
- expect(middleware).to.include(setBlocking);
130
- expect(middleware).to.include(authenticate);
131
- expect(middleware).to.include(configure);
132
- expect(middleware).to.include(identify);
133
- });
134
- it("should add additional middleware when provided", () => {
135
- const customMiddleware = sinon.stub();
136
- const builder = AuthenticatedCommandBuilder.withMiddleware([
137
- customMiddleware,
138
- ]);
139
- builder.build(mockYargs);
140
- const middleware = mockYargs.getMiddleware();
141
- expect(middleware).to.have.length(5);
142
- expect(middleware).to.include(customMiddleware);
143
- });
144
- it("should always add project validator", () => {
145
- const builder = AuthenticatedCommandBuilder.create();
146
- builder.build(mockYargs);
147
- const checkFunction = mockYargs.getCheckFunction();
148
- expect(checkFunction).to.not.be.null;
149
- });
150
- it("should add additional validators when provided", () => {
151
- const mockValidator = {
152
- validate: sinon.stub().resolves({ ok: true }),
153
- };
154
- const builder = AuthenticatedCommandBuilder.create({
155
- additionalValidators: [mockValidator],
156
- });
157
- builder.build(mockYargs);
158
- const checkFunction = mockYargs.getCheckFunction();
159
- expect(checkFunction).to.not.be.null;
160
- });
161
- it("should handle single validator correctly", async () => {
162
- const builder = AuthenticatedCommandBuilder.create();
163
- builder.build(mockYargs);
164
- const checkFunction = mockYargs.getCheckFunction();
165
- expect(checkFunction).to.not.be.null;
166
- if (checkFunction) {
167
- await checkFunction({ project: "test-project" });
168
- expect(yargsCheckerStub.callCount).to.equal(1);
169
- }
170
- });
171
- it("should handle multiple validators correctly", async () => {
172
- const mockValidator1 = {
173
- validate: sinon.stub().resolves({ ok: true }),
174
- };
175
- const mockValidator2 = {
176
- validate: sinon.stub().resolves({ ok: true }),
177
- };
178
- const builder = AuthenticatedCommandBuilder.create({
179
- additionalValidators: [mockValidator1, mockValidator2],
180
- });
181
- builder.build(mockYargs);
182
- const checkFunction = mockYargs.getCheckFunction();
183
- expect(checkFunction).to.not.be.null;
184
- if (checkFunction) {
185
- yargsCheckerStub.onFirstCall().resolves(true);
186
- yargsCheckerStub.onSecondCall().resolves(true);
187
- yargsCheckerStub.onThirdCall().resolves(true);
188
- const result = await checkFunction({ project: "test-project" });
189
- expect(result).to.be.true;
190
- expect(yargsCheckerStub.callCount).to.equal(3);
191
- }
192
- });
193
- it("should return early from validation if any validator fails", async () => {
194
- const mockValidator1 = {
195
- validate: sinon.stub().resolves({ ok: true }),
196
- };
197
- const mockValidator2 = {
198
- validate: sinon.stub().resolves({ ok: true }),
199
- };
200
- const builder = AuthenticatedCommandBuilder.create({
201
- additionalValidators: [mockValidator1, mockValidator2],
202
- });
203
- builder.build(mockYargs);
204
- const checkFunction = mockYargs.getCheckFunction();
205
- expect(checkFunction).to.not.be.null;
206
- if (checkFunction) {
207
- yargsCheckerStub.onFirstCall().resolves(true);
208
- yargsCheckerStub.onSecondCall().resolves("Validation failed");
209
- const result = await checkFunction({ project: "test-project" });
210
- expect(result).to.equal("Validation failed");
211
- expect(yargsCheckerStub.callCount).to.equal(2);
212
- }
213
- });
214
- });
215
- describe("integration scenarios", () => {
216
- let mockYargs;
217
- beforeEach(() => {
218
- mockYargs = new MockYargs();
219
- yargsCheckerStub.resolves(true);
220
- });
221
- it("should build command for basic authenticated scenario", () => {
222
- const builder = AuthenticatedCommandBuilder.create();
223
- const result = builder.build(mockYargs);
224
- const options = mockYargs.getOptions();
225
- expect(options).to.have.property("api-key");
226
- expect(options).to.have.property("project");
227
- expect(result).to.equal(mockYargs);
228
- });
229
- it("should build command with self-hosted endpoint support", () => {
230
- const builder = AuthenticatedCommandBuilder.create({
231
- requireSelfHostedEndpoint: true,
232
- });
233
- builder.build(mockYargs);
234
- const options = mockYargs.getOptions();
235
- expect(options).to.have.property("api-key");
236
- expect(options).to.have.property("project");
237
- expect(options).to.have.property("self-hosted-endpoint");
238
- });
239
- it("should build command with custom options and validation", () => {
240
- AuthenticatedCommandBuilder.create().build(mockYargs, (yargs) => yargs
241
- .option("url", {
242
- type: "string",
243
- describe: "The URL to process",
244
- })
245
- .option("wait", {
246
- type: "boolean",
247
- describe: "Wait for completion",
248
- }));
249
- const options = mockYargs.getOptions();
250
- expect(options).to.have.property("url");
251
- expect(options).to.have.property("wait");
252
- });
253
- it("should build command with additional middleware", () => {
254
- const customMiddleware = sinon.stub();
255
- const builder = AuthenticatedCommandBuilder.withMiddleware([
256
- customMiddleware,
257
- ]);
258
- builder.build(mockYargs, (yargs) => yargs.option("name", { type: "string", describe: "Project name" }));
259
- const options = mockYargs.getOptions();
260
- expect(options).to.have.property("api-key");
261
- expect(options).to.have.property("project");
262
- expect(options).to.have.property("name");
263
- const checkFunction = mockYargs.getCheckFunction();
264
- expect(checkFunction).to.not.be.null;
265
- });
266
- });
267
- });
268
- //# sourceMappingURL=authenticated-command-builder.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authenticated-command-builder.spec.js","sourceRoot":"","sources":["../../../src/common/builders/authenticated-command-builder.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-floating-promises */\n\nimport { describe, it, beforeEach, afterEach } from \"node:test\";\nimport { expect } from \"chai\";\nimport sinon from \"sinon\";\nimport type { Argv } from \"yargs\";\nimport {\n AuthenticatedCommandBuilder,\n type AuthenticatedCommandOptions,\n} from \"./authenticated-command-builder.js\";\nimport { authenticate } from \"../middleware/authentication.js\";\nimport { configure } from \"../middleware/user-configuration.js\";\nimport { identify } from \"../middleware/user-identification.js\";\nimport setBlocking from \"../output.js\";\nimport { YargsChecker } from \"../validators/lib.js\";\n\n// Mock yargs instance for testing\nclass MockYargs {\n private options: Record<string, unknown> = {};\n private middlewareList: unknown[] = [];\n private checkFunction:\n | ((argv: unknown) => boolean | string | Promise<boolean | string>)\n | null = null;\n\n option(key: string, config: unknown): MockYargs {\n this.options[key] = config;\n return this;\n }\n\n middleware(middlewareArray: unknown[]): MockYargs {\n this.middlewareList.push(...middlewareArray);\n return this;\n }\n\n check(\n fn: (argv: unknown) => boolean | string | Promise<boolean | string>\n ): MockYargs {\n this.checkFunction = fn;\n return this;\n }\n\n // Helper methods for testing\n getOptions(): Record<string, unknown> {\n return this.options;\n }\n\n getMiddleware(): unknown[] {\n return this.middlewareList;\n }\n\n getCheckFunction():\n | ((argv: unknown) => boolean | string | Promise<boolean | string>)\n | null {\n return this.checkFunction;\n }\n}\n\ndescribe(\"AuthenticatedCommandBuilder\", () => {\n let yargsCheckerStub: sinon.SinonStub;\n\n beforeEach(() => {\n yargsCheckerStub = sinon.stub(YargsChecker.prototype, \"check\");\n });\n\n afterEach(() => {\n sinon.restore();\n });\n\n describe(\"private constructor\", () => {\n it(\"should only be accessible through static factory methods\", () => {\n // Constructor is private, so we test through factory methods\n const builder = AuthenticatedCommandBuilder.create();\n expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);\n });\n });\n\n describe(\"static factory methods\", () => {\n describe(\"create\", () => {\n it(\"should create new instance with provided options\", () => {\n const options: AuthenticatedCommandOptions = {\n requireSelfHostedEndpoint: true,\n additionalValidators: [],\n };\n const builder = AuthenticatedCommandBuilder.create(options);\n expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);\n });\n\n it(\"should create new instance with default options when none provided\", () => {\n const builder = AuthenticatedCommandBuilder.create();\n expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);\n });\n });\n\n describe(\"withSelfHosted\", () => {\n it(\"should create instance with requireSelfHostedEndpoint set to true\", () => {\n const builder = AuthenticatedCommandBuilder.withSelfHosted();\n expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);\n });\n\n it(\"should merge additional options with requireSelfHostedEndpoint\", () => {\n const options = { additionalValidators: [] };\n const builder = AuthenticatedCommandBuilder.withSelfHosted(options);\n expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);\n });\n });\n\n describe(\"withMiddleware\", () => {\n it(\"should create instance with additional middleware\", () => {\n const mockMiddleware = sinon.stub();\n const builder = AuthenticatedCommandBuilder.withMiddleware([\n mockMiddleware,\n ]);\n expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);\n });\n\n it(\"should merge additional options with middleware\", () => {\n const mockMiddleware = sinon.stub();\n const options = { requireSelfHostedEndpoint: true };\n const builder = AuthenticatedCommandBuilder.withMiddleware(\n [mockMiddleware],\n options\n );\n expect(builder).to.be.instanceOf(AuthenticatedCommandBuilder);\n });\n });\n });\n\n describe(\"build\", () => {\n let mockYargs: MockYargs;\n\n beforeEach(() => {\n mockYargs = new MockYargs();\n yargsCheckerStub.resolves(true);\n });\n\n it(\"should add standard options (api-key and project by default)\", () => {\n const builder = AuthenticatedCommandBuilder.create();\n builder.build(mockYargs as unknown as Argv);\n\n const options = mockYargs.getOptions();\n expect(options).to.have.property(\"api-key\");\n expect(options).to.have.property(\"project\");\n expect(options).to.not.have.property(\"self-hosted-endpoint\");\n });\n\n // Project is always required now, so this test is no longer relevant\n\n it(\"should add self-hosted-endpoint option when requireSelfHostedEndpoint is true\", () => {\n const builder = AuthenticatedCommandBuilder.create({\n requireSelfHostedEndpoint: true,\n });\n builder.build(mockYargs as unknown as Argv);\n\n const options = mockYargs.getOptions();\n expect(options).to.have.property(\"self-hosted-endpoint\");\n });\n\n // Custom options are now handled through the customBuilder function parameter\n\n it(\"should apply custom builder function when provided\", () => {\n const builder = AuthenticatedCommandBuilder.create();\n const customBuilder = (yargs: Argv) =>\n yargs.option(\"test-option\", {\n type: \"string\",\n describe: \"Test option\",\n });\n\n builder.build(mockYargs as unknown as Argv, customBuilder);\n\n const options = mockYargs.getOptions();\n expect(options).to.have.property(\"test-option\");\n });\n\n it(\"should add all required middleware\", () => {\n const builder = AuthenticatedCommandBuilder.create();\n builder.build(mockYargs as unknown as Argv);\n\n const middleware = mockYargs.getMiddleware();\n expect(middleware).to.have.length(4);\n expect(middleware).to.include(setBlocking);\n expect(middleware).to.include(authenticate);\n expect(middleware).to.include(configure);\n expect(middleware).to.include(identify);\n });\n\n it(\"should add additional middleware when provided\", () => {\n const customMiddleware = sinon.stub();\n const builder = AuthenticatedCommandBuilder.withMiddleware([\n customMiddleware,\n ]);\n builder.build(mockYargs as unknown as Argv);\n\n const middleware = mockYargs.getMiddleware();\n expect(middleware).to.have.length(5);\n expect(middleware).to.include(customMiddleware);\n });\n\n it(\"should always add project validator\", () => {\n const builder = AuthenticatedCommandBuilder.create();\n builder.build(mockYargs as unknown as Argv);\n\n const checkFunction = mockYargs.getCheckFunction();\n expect(checkFunction).to.not.be.null;\n });\n\n // Project validator is always added now, so this test is no longer relevant\n\n it(\"should add additional validators when provided\", () => {\n const mockValidator = {\n validate: sinon.stub().resolves({ ok: true }),\n };\n const builder = AuthenticatedCommandBuilder.create({\n additionalValidators: [mockValidator],\n });\n builder.build(mockYargs as unknown as Argv);\n\n const checkFunction = mockYargs.getCheckFunction();\n expect(checkFunction).to.not.be.null;\n });\n\n it(\"should handle single validator correctly\", async () => {\n const builder = AuthenticatedCommandBuilder.create();\n builder.build(mockYargs as unknown as Argv);\n\n const checkFunction = mockYargs.getCheckFunction();\n expect(checkFunction).to.not.be.null;\n\n if (checkFunction) {\n await checkFunction({ project: \"test-project\" });\n expect(yargsCheckerStub.callCount).to.equal(1);\n }\n });\n\n it(\"should handle multiple validators correctly\", async () => {\n const mockValidator1 = {\n validate: sinon.stub().resolves({ ok: true }),\n };\n const mockValidator2 = {\n validate: sinon.stub().resolves({ ok: true }),\n };\n const builder = AuthenticatedCommandBuilder.create({\n additionalValidators: [mockValidator1, mockValidator2],\n });\n builder.build(mockYargs as unknown as Argv);\n\n const checkFunction = mockYargs.getCheckFunction();\n expect(checkFunction).to.not.be.null;\n\n if (checkFunction) {\n yargsCheckerStub.onFirstCall().resolves(true);\n yargsCheckerStub.onSecondCall().resolves(true);\n yargsCheckerStub.onThirdCall().resolves(true);\n\n const result = await checkFunction({ project: \"test-project\" });\n expect(result).to.be.true;\n expect(yargsCheckerStub.callCount).to.equal(3);\n }\n });\n\n it(\"should return early from validation if any validator fails\", async () => {\n const mockValidator1 = {\n validate: sinon.stub().resolves({ ok: true }),\n };\n const mockValidator2 = {\n validate: sinon.stub().resolves({ ok: true }),\n };\n const builder = AuthenticatedCommandBuilder.create({\n additionalValidators: [mockValidator1, mockValidator2],\n });\n builder.build(mockYargs as unknown as Argv);\n\n const checkFunction = mockYargs.getCheckFunction();\n expect(checkFunction).to.not.be.null;\n\n if (checkFunction) {\n yargsCheckerStub.onFirstCall().resolves(true);\n yargsCheckerStub.onSecondCall().resolves(\"Validation failed\");\n\n const result = await checkFunction({ project: \"test-project\" });\n expect(result).to.equal(\"Validation failed\");\n expect(yargsCheckerStub.callCount).to.equal(2);\n }\n });\n });\n\n describe(\"integration scenarios\", () => {\n let mockYargs: MockYargs;\n\n beforeEach(() => {\n mockYargs = new MockYargs();\n yargsCheckerStub.resolves(true);\n });\n\n it(\"should build command for basic authenticated scenario\", () => {\n const builder = AuthenticatedCommandBuilder.create();\n const result = builder.build(mockYargs as unknown as Argv);\n\n const options = mockYargs.getOptions();\n expect(options).to.have.property(\"api-key\");\n expect(options).to.have.property(\"project\");\n expect(result).to.equal(mockYargs);\n });\n\n it(\"should build command with self-hosted endpoint support\", () => {\n const builder = AuthenticatedCommandBuilder.create({\n requireSelfHostedEndpoint: true,\n });\n builder.build(mockYargs as unknown as Argv);\n\n const options = mockYargs.getOptions();\n expect(options).to.have.property(\"api-key\");\n expect(options).to.have.property(\"project\");\n expect(options).to.have.property(\"self-hosted-endpoint\");\n });\n\n it(\"should build command with custom options and validation\", () => {\n AuthenticatedCommandBuilder.create().build(\n mockYargs as unknown as Argv,\n (yargs: Argv) =>\n yargs\n .option(\"url\", {\n type: \"string\" as const,\n describe: \"The URL to process\",\n })\n .option(\"wait\", {\n type: \"boolean\" as const,\n describe: \"Wait for completion\",\n })\n );\n\n const options = mockYargs.getOptions();\n expect(options).to.have.property(\"url\");\n expect(options).to.have.property(\"wait\");\n });\n\n it(\"should build command with additional middleware\", () => {\n const customMiddleware = sinon.stub();\n const builder = AuthenticatedCommandBuilder.withMiddleware([\n customMiddleware,\n ]);\n builder.build(mockYargs as unknown as Argv, (yargs: Argv) =>\n yargs.option(\"name\", { type: \"string\", describe: \"Project name\" })\n );\n\n const options = mockYargs.getOptions();\n expect(options).to.have.property(\"api-key\");\n expect(options).to.have.property(\"project\");\n expect(options).to.have.property(\"name\");\n\n // Project validation is always present now\n const checkFunction = mockYargs.getCheckFunction();\n expect(checkFunction).to.not.be.null;\n });\n });\n});\n"]}