@credibledata/cred-cli 0.0.7 → 0.0.102

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 (159) hide show
  1. package/README-DEV.md +2 -2
  2. package/bun.lock +113 -337
  3. package/dist/client/api.js +2999 -1953
  4. package/dist/client/api.js.map +1 -1
  5. package/dist/client/base.js +1 -1
  6. package/dist/client/common.js +1 -1
  7. package/dist/client/configuration.js +1 -1
  8. package/dist/client/index.js +1 -1
  9. package/dist/clientconfiguration.js +59 -24
  10. package/dist/clientconfiguration.js.map +1 -1
  11. package/dist/clientconfiguration.spec.js +69 -37
  12. package/dist/clientconfiguration.spec.js.map +1 -1
  13. package/dist/commands/add.js +18 -5
  14. package/dist/commands/add.js.map +1 -1
  15. package/dist/commands/connection/createconnections.js +4 -4
  16. package/dist/commands/connection/createconnections.js.map +1 -1
  17. package/dist/commands/connection/createconnections.spec.js +11 -1
  18. package/dist/commands/connection/createconnections.spec.js.map +1 -1
  19. package/dist/commands/connection/deleteconnection.js +4 -4
  20. package/dist/commands/connection/deleteconnection.js.map +1 -1
  21. package/dist/commands/connection/deleteconnection.spec.js +1 -1
  22. package/dist/commands/connection/deleteconnection.spec.js.map +1 -1
  23. package/dist/commands/connection/listconnections.js +4 -4
  24. package/dist/commands/connection/listconnections.js.map +1 -1
  25. package/dist/commands/connection/listconnections.spec.js +1 -1
  26. package/dist/commands/connection/listconnections.spec.js.map +1 -1
  27. package/dist/commands/{project/createproject.js → environment/createenvironment.js} +17 -14
  28. package/dist/commands/environment/createenvironment.js.map +1 -0
  29. package/dist/commands/{project/createproject.spec.js → environment/createenvironment.spec.js} +46 -46
  30. package/dist/commands/environment/createenvironment.spec.js.map +1 -0
  31. package/dist/commands/{project/deleteproject.js → environment/deleteenvironment.js} +9 -9
  32. package/dist/commands/environment/deleteenvironment.js.map +1 -0
  33. package/dist/commands/{project/deleteproject.spec.js → environment/deleteenvironment.spec.js} +29 -29
  34. package/dist/commands/environment/deleteenvironment.spec.js.map +1 -0
  35. package/dist/commands/{project/getproject.js → environment/getenvironment.js} +8 -8
  36. package/dist/commands/environment/getenvironment.js.map +1 -0
  37. package/dist/commands/{project/getproject.spec.js → environment/getenvironment.spec.js} +32 -33
  38. package/dist/commands/environment/getenvironment.spec.js.map +1 -0
  39. package/dist/commands/{project/listprojects.js → environment/listenvironments.js} +10 -10
  40. package/dist/commands/environment/listenvironments.js.map +1 -0
  41. package/dist/commands/{project/listprojects.spec.js → environment/listenvironments.spec.js} +35 -35
  42. package/dist/commands/environment/listenvironments.spec.js.map +1 -0
  43. package/dist/commands/{project/setproject.js → environment/setenvironment.js} +6 -5
  44. package/dist/commands/environment/setenvironment.js.map +1 -0
  45. package/dist/commands/{project/setproject.spec.js → environment/setenvironment.spec.js} +9 -9
  46. package/dist/commands/environment/setenvironment.spec.js.map +1 -0
  47. package/dist/commands/{project/updateproject.js → environment/updateenvironment.js} +13 -13
  48. package/dist/commands/environment/updateenvironment.js.map +1 -0
  49. package/dist/commands/{project/updateproject.spec.js → environment/updateenvironment.spec.js} +44 -44
  50. package/dist/commands/environment/updateenvironment.spec.js.map +1 -0
  51. package/dist/commands/get.js +15 -5
  52. package/dist/commands/get.js.map +1 -1
  53. package/dist/commands/legacy.js +9 -0
  54. package/dist/commands/legacy.js.map +1 -0
  55. package/dist/commands/list.js +17 -4
  56. package/dist/commands/list.js.map +1 -1
  57. package/dist/commands/misc/login.js +2 -2
  58. package/dist/commands/misc/login.js.map +1 -1
  59. package/dist/commands/misc/login.spec.js +41 -5
  60. package/dist/commands/misc/login.spec.js.map +1 -1
  61. package/dist/commands/package/deletepackage.js +4 -4
  62. package/dist/commands/package/deletepackage.js.map +1 -1
  63. package/dist/commands/package/deletepackage.spec.js +1 -1
  64. package/dist/commands/package/deletepackage.spec.js.map +1 -1
  65. package/dist/commands/package/listpackages.js +4 -4
  66. package/dist/commands/package/listpackages.js.map +1 -1
  67. package/dist/commands/package/listpackages.spec.js +1 -1
  68. package/dist/commands/package/listpackages.spec.js.map +1 -1
  69. package/dist/commands/package/publish.js +10 -10
  70. package/dist/commands/package/publish.js.map +1 -1
  71. package/dist/commands/package/publish.spec.js +34 -6
  72. package/dist/commands/package/publish.spec.js.map +1 -1
  73. package/dist/commands/package/updatepackage.js +4 -4
  74. package/dist/commands/package/updatepackage.js.map +1 -1
  75. package/dist/commands/package/updatepackage.spec.js +1 -1
  76. package/dist/commands/package/updatepackage.spec.js.map +1 -1
  77. package/dist/commands/rm.js +15 -4
  78. package/dist/commands/rm.js.map +1 -1
  79. package/dist/commands/set.js +12 -4
  80. package/dist/commands/set.js.map +1 -1
  81. package/dist/commands/update.js +19 -6
  82. package/dist/commands/update.js.map +1 -1
  83. package/dist/commands/version/archive-unarchive-version.js +4 -5
  84. package/dist/commands/version/archive-unarchive-version.js.map +1 -1
  85. package/dist/commands/version/archive-unarchive-version.spec.js +4 -4
  86. package/dist/commands/version/archive-unarchive-version.spec.js.map +1 -1
  87. package/dist/commands/version/listversions.js +4 -4
  88. package/dist/commands/version/listversions.js.map +1 -1
  89. package/dist/commands/version/listversions.spec.js +1 -1
  90. package/dist/commands/version/listversions.spec.js.map +1 -1
  91. package/dist/constants.js +47 -19
  92. package/dist/constants.js.map +1 -1
  93. package/dist/constants.spec.js +90 -0
  94. package/dist/constants.spec.js.map +1 -0
  95. package/dist/index.js +74 -16
  96. package/dist/index.js.map +1 -1
  97. package/package.json +7 -8
  98. package/src/client/api.ts +3552 -2182
  99. package/src/client/base.ts +1 -1
  100. package/src/client/common.ts +1 -1
  101. package/src/client/configuration.ts +1 -1
  102. package/src/client/index.ts +1 -1
  103. package/src/clientconfiguration.spec.ts +113 -114
  104. package/src/clientconfiguration.ts +69 -28
  105. package/src/commands/add.ts +35 -12
  106. package/src/commands/connection/createconnections.spec.ts +11 -1
  107. package/src/commands/connection/createconnections.ts +4 -4
  108. package/src/commands/connection/deleteconnection.spec.ts +1 -1
  109. package/src/commands/connection/deleteconnection.ts +4 -4
  110. package/src/commands/connection/listconnections.spec.ts +1 -1
  111. package/src/commands/connection/listconnections.ts +4 -4
  112. package/src/commands/{project/createproject.spec.ts → environment/createenvironment.spec.ts} +56 -54
  113. package/src/commands/{project/createproject.ts → environment/createenvironment.ts} +17 -14
  114. package/src/commands/{project/deleteproject.spec.ts → environment/deleteenvironment.spec.ts} +59 -30
  115. package/src/commands/{project/deleteproject.ts → environment/deleteenvironment.ts} +10 -10
  116. package/src/commands/environment/getenvironment.spec.ts +110 -0
  117. package/src/commands/{project/getproject.ts → environment/getenvironment.ts} +9 -9
  118. package/src/commands/{project/listprojects.spec.ts → environment/listenvironments.spec.ts} +37 -35
  119. package/src/commands/{project/listprojects.ts → environment/listenvironments.ts} +13 -8
  120. package/src/commands/{project/setproject.spec.ts → environment/setenvironment.spec.ts} +8 -8
  121. package/src/commands/{project/setproject.ts → environment/setenvironment.ts} +4 -4
  122. package/src/commands/{project/updateproject.spec.ts → environment/updateenvironment.spec.ts} +53 -51
  123. package/src/commands/{project/updateproject.ts → environment/updateenvironment.ts} +19 -17
  124. package/src/commands/get.ts +22 -9
  125. package/src/commands/legacy.ts +5 -0
  126. package/src/commands/list.ts +33 -9
  127. package/src/commands/misc/login.spec.ts +47 -5
  128. package/src/commands/misc/login.ts +6 -2
  129. package/src/commands/package/deletepackage.spec.ts +1 -1
  130. package/src/commands/package/deletepackage.ts +4 -4
  131. package/src/commands/package/listpackages.spec.ts +1 -1
  132. package/src/commands/package/listpackages.ts +4 -4
  133. package/src/commands/package/publish.spec.ts +36 -6
  134. package/src/commands/package/publish.ts +12 -8
  135. package/src/commands/package/updatepackage.spec.ts +1 -1
  136. package/src/commands/package/updatepackage.ts +4 -4
  137. package/src/commands/rm.ts +25 -9
  138. package/src/commands/set.ts +13 -4
  139. package/src/commands/update.ts +32 -12
  140. package/src/commands/version/archive-unarchive-version.spec.ts +4 -4
  141. package/src/commands/version/archive-unarchive-version.ts +4 -7
  142. package/src/commands/version/listversions.spec.ts +1 -1
  143. package/src/commands/version/listversions.ts +4 -4
  144. package/src/constants.spec.ts +111 -0
  145. package/src/constants.ts +81 -18
  146. package/src/index.ts +103 -17
  147. package/dist/commands/project/createproject.js.map +0 -1
  148. package/dist/commands/project/createproject.spec.js.map +0 -1
  149. package/dist/commands/project/deleteproject.js.map +0 -1
  150. package/dist/commands/project/deleteproject.spec.js.map +0 -1
  151. package/dist/commands/project/getproject.js.map +0 -1
  152. package/dist/commands/project/getproject.spec.js.map +0 -1
  153. package/dist/commands/project/listprojects.js.map +0 -1
  154. package/dist/commands/project/listprojects.spec.js.map +0 -1
  155. package/dist/commands/project/setproject.js.map +0 -1
  156. package/dist/commands/project/setproject.spec.js.map +0 -1
  157. package/dist/commands/project/updateproject.js.map +0 -1
  158. package/dist/commands/project/updateproject.spec.js.map +0 -1
  159. package/src/commands/project/getproject.spec.ts +0 -109
@@ -1,18 +1,18 @@
1
1
  import { expect } from "chai";
2
2
  import sinon from "sinon";
3
- import { ProjectsApi } from "../../client/api";
3
+ import { EnvironmentsApi } from "../../client/api";
4
4
  import { ClientConfiguration } from "../../clientconfiguration";
5
5
  import { logger } from "../../logger";
6
- import { updateProject } from "./updateproject";
6
+ import { updateEnvironment } from "./updateenvironment";
7
7
 
8
- describe("update-project", () => {
8
+ describe("update-environment", () => {
9
9
  let sandbox: sinon.SinonSandbox;
10
- let updateProjectStub: sinon.SinonStub;
10
+ let updateEnvironmentStub: sinon.SinonStub;
11
11
  let loggerStub: sinon.SinonStubbedInstance<typeof logger>;
12
12
 
13
13
  beforeEach(() => {
14
14
  sandbox = sinon.createSandbox();
15
- updateProjectStub = sandbox.stub();
15
+ updateEnvironmentStub = sandbox.stub();
16
16
  loggerStub = sandbox.stub(logger);
17
17
 
18
18
  // Mock ClientConfiguration constructor
@@ -26,48 +26,50 @@ describe("update-project", () => {
26
26
  .stub(ClientConfiguration.prototype, "getHeaders")
27
27
  .returns({ Authorization: "Bearer test-token" });
28
28
 
29
- // Mock ProjectsApi constructor and method
29
+ // Mock EnvironmentsApi constructor and method
30
30
  sandbox
31
- .stub(ProjectsApi.prototype, "updateProject")
32
- .callsFake(updateProjectStub);
31
+ .stub(EnvironmentsApi.prototype, "updateEnvironment")
32
+ .callsFake(updateEnvironmentStub);
33
33
  });
34
34
 
35
35
  afterEach(() => {
36
36
  sandbox.restore();
37
37
  });
38
38
 
39
- describe("updateProject", () => {
40
- it("should update project successfully", async () => {
39
+ describe("updateEnvironment", () => {
40
+ it("should update environment successfully", async () => {
41
41
  const mockResponse = { status: 200 };
42
- updateProjectStub.resolves(mockResponse);
42
+ updateEnvironmentStub.resolves(mockResponse);
43
43
 
44
- await updateProject(
44
+ await updateEnvironment(
45
45
  "http://test-server",
46
- "test-project",
46
+ "test-environment",
47
47
  { replicationCount: 3 },
48
48
  false,
49
49
  true,
50
50
  );
51
51
 
52
- expect(updateProjectStub.calledOnce).to.be.true;
53
- expect(updateProjectStub.firstCall.args[0]).to.equal("test-org");
54
- expect(updateProjectStub.firstCall.args[1]).to.equal("test-project");
55
- expect(updateProjectStub.firstCall.args[2]).to.include({
52
+ expect(updateEnvironmentStub.calledOnce).to.be.true;
53
+ expect(updateEnvironmentStub.firstCall.args[0]).to.equal("test-org");
54
+ expect(updateEnvironmentStub.firstCall.args[1]).to.equal(
55
+ "test-environment",
56
+ );
57
+ expect(updateEnvironmentStub.firstCall.args[2]).to.include({
56
58
  replicationCount: 3,
57
59
  });
58
- expect(updateProjectStub.firstCall.args[3]).to.deep.include({
60
+ expect(updateEnvironmentStub.firstCall.args[3]).to.deep.include({
59
61
  baseURL: "http://test-server",
60
62
  headers: { Authorization: "Bearer test-token" },
61
63
  });
62
64
  expect(
63
65
  loggerStub.info.calledWith(
64
- sinon.match("Successfully updated project test-project"),
66
+ sinon.match("Successfully updated environment test-environment"),
65
67
  ),
66
68
  ).to.be.true;
67
69
  });
68
70
 
69
- it("should handle missing project name", async () => {
70
- await updateProject(
71
+ it("should handle missing environment name", async () => {
72
+ await updateEnvironment(
71
73
  "http://test-server",
72
74
  "",
73
75
  { replicationCount: 3 },
@@ -75,50 +77,50 @@ describe("update-project", () => {
75
77
  true,
76
78
  );
77
79
 
78
- expect(updateProjectStub.called).to.be.false;
80
+ expect(updateEnvironmentStub.called).to.be.false;
79
81
  expect(
80
82
  loggerStub.error.calledWith(
81
- sinon.match("Please provide a project name"),
83
+ sinon.match("Please provide an environment name"),
82
84
  ),
83
85
  ).to.be.true;
84
86
  });
85
87
 
86
88
  it("should handle API errors", async () => {
87
89
  const mockError = new Error("API Error");
88
- updateProjectStub.rejects(mockError);
90
+ updateEnvironmentStub.rejects(mockError);
89
91
 
90
- await updateProject(
92
+ await updateEnvironment(
91
93
  "http://test-server",
92
- "test-project",
94
+ "test-environment",
93
95
  { replicationCount: 3 },
94
96
  true,
95
97
  true,
96
98
  );
97
99
 
98
- expect(updateProjectStub.calledOnce).to.be.true;
100
+ expect(updateEnvironmentStub.calledOnce).to.be.true;
99
101
  expect(
100
102
  loggerStub.error.calledWith(
101
- sinon.match("Failed to update project test-project"),
103
+ sinon.match("Failed to update environment test-environment"),
102
104
  ),
103
105
  ).to.be.true;
104
106
  });
105
107
 
106
108
  it("should handle non-200 response status", async () => {
107
109
  const mockResponse = { status: 400 };
108
- updateProjectStub.resolves(mockResponse);
110
+ updateEnvironmentStub.resolves(mockResponse);
109
111
 
110
- await updateProject(
112
+ await updateEnvironment(
111
113
  "http://test-server",
112
- "test-project",
114
+ "test-environment",
113
115
  { replicationCount: 3 },
114
116
  false,
115
117
  true,
116
118
  );
117
119
 
118
- expect(updateProjectStub.calledOnce).to.be.true;
120
+ expect(updateEnvironmentStub.calledOnce).to.be.true;
119
121
  expect(
120
122
  loggerStub.error.calledWith(
121
- sinon.match("Failed to update project. Status: 400"),
123
+ sinon.match("Failed to update environment. Status: 400"),
122
124
  ),
123
125
  ).to.be.true;
124
126
  });
@@ -129,25 +131,25 @@ describe("update-project", () => {
129
131
  it("should fail when user is not logged in", async () => {
130
132
  sandbox.restore();
131
133
  sandbox = sinon.createSandbox();
132
- updateProjectStub = sandbox.stub();
134
+ updateEnvironmentStub = sandbox.stub();
133
135
  loggerStub = sandbox.stub(logger);
134
136
 
135
137
  sandbox
136
138
  .stub(ClientConfiguration.prototype, "doesConfigExists")
137
139
  .returns(false);
138
140
  sandbox
139
- .stub(ProjectsApi.prototype, "updateProject")
140
- .callsFake(updateProjectStub);
141
+ .stub(EnvironmentsApi.prototype, "updateEnvironment")
142
+ .callsFake(updateEnvironmentStub);
141
143
 
142
- await updateProject(
144
+ await updateEnvironment(
143
145
  "http://test-server",
144
- "test-project",
146
+ "test-environment",
145
147
  { replicationCount: 3 },
146
148
  false,
147
149
  true,
148
150
  );
149
151
 
150
- expect(updateProjectStub.called).to.be.false;
152
+ expect(updateEnvironmentStub.called).to.be.false;
151
153
  expect(
152
154
  loggerStub.error.calledWith(
153
155
  sinon.match("Please, make sure that you are logged in"),
@@ -159,36 +161,36 @@ describe("update-project", () => {
159
161
  describe("replication count validation", () => {
160
162
  it("should accept valid replication counts", async () => {
161
163
  const mockResponse = { status: 200 };
162
- updateProjectStub.resolves(mockResponse);
164
+ updateEnvironmentStub.resolves(mockResponse);
163
165
 
164
166
  const validCounts = [1, 2, 5, 10, 100];
165
167
 
166
168
  for (const count of validCounts) {
167
- await updateProject(
169
+ await updateEnvironment(
168
170
  "http://test-server",
169
- "test-project",
171
+ "test-environment",
170
172
  { replicationCount: count },
171
173
  false,
172
174
  true,
173
175
  );
174
- expect(updateProjectStub.called).to.be.true;
175
- expect(updateProjectStub.firstCall.args[2]).to.include({
176
+ expect(updateEnvironmentStub.called).to.be.true;
177
+ expect(updateEnvironmentStub.firstCall.args[2]).to.include({
176
178
  replicationCount: count,
177
179
  });
178
- updateProjectStub.reset();
180
+ updateEnvironmentStub.reset();
179
181
  }
180
182
  });
181
183
 
182
184
  it("should reject replication count less than 1", async () => {
183
- await updateProject(
185
+ await updateEnvironment(
184
186
  "http://test-server",
185
- "test-project",
187
+ "test-environment",
186
188
  { replicationCount: 0 },
187
189
  false,
188
190
  true,
189
191
  );
190
192
 
191
- expect(updateProjectStub.called).to.be.false;
193
+ expect(updateEnvironmentStub.called).to.be.false;
192
194
  expect(
193
195
  loggerStub.error.calledWith(
194
196
  sinon.match("Replication count must be at least 1"),
@@ -197,15 +199,15 @@ describe("update-project", () => {
197
199
  });
198
200
 
199
201
  it("should reject negative replication count", async () => {
200
- await updateProject(
202
+ await updateEnvironment(
201
203
  "http://test-server",
202
- "test-project",
204
+ "test-environment",
203
205
  { replicationCount: -1 },
204
206
  false,
205
207
  true,
206
208
  );
207
209
 
208
- expect(updateProjectStub.called).to.be.false;
210
+ expect(updateEnvironmentStub.called).to.be.false;
209
211
  expect(
210
212
  loggerStub.error.calledWith(
211
213
  sinon.match("Replication count must be at least 1"),
@@ -1,19 +1,19 @@
1
- import { Project, ProjectsApi } from "../../client/api";
1
+ import { Environment, EnvironmentsApi } from "../../client/api";
2
2
  import { Configuration } from "../../client/configuration";
3
3
  import { ClientConfiguration } from "../../clientconfiguration";
4
4
  import { logger } from "../../logger";
5
5
  import { getConfirmation, printOutError } from "../../utils";
6
6
 
7
- const projectsApi = new ProjectsApi(new Configuration());
7
+ const environmentsApi = new EnvironmentsApi(new Configuration());
8
8
 
9
- type UpdateProjectProperties = {
9
+ type UpdateEnvironmentProperties = {
10
10
  replicationCount?: number;
11
11
  };
12
12
 
13
- export async function updateProject(
13
+ export async function updateEnvironment(
14
14
  controlPlane: string,
15
- projectName: string,
16
- properties: UpdateProjectProperties,
15
+ environmentName: string,
16
+ properties: UpdateEnvironmentProperties,
17
17
  debug?: boolean,
18
18
  skipConfirmation?: boolean,
19
19
  ) {
@@ -23,8 +23,8 @@ export async function updateProject(
23
23
  return;
24
24
  }
25
25
 
26
- if (!projectName) {
27
- logger.error("Please provide a project name");
26
+ if (!environmentName) {
27
+ logger.error("Please provide an environment name");
28
28
  return;
29
29
  }
30
30
 
@@ -41,7 +41,7 @@ export async function updateProject(
41
41
  try {
42
42
  if (!skipConfirmation) {
43
43
  const confirmation = await getConfirmation(
44
- `Are you sure you want to update project ${projectName}?`,
44
+ `Are you sure you want to update environment ${environmentName}?`,
45
45
  );
46
46
  if (!confirmation) {
47
47
  logger.info("Operation cancelled.");
@@ -49,16 +49,16 @@ export async function updateProject(
49
49
  }
50
50
  }
51
51
 
52
- const projectUpdate: Project = {};
52
+ const environmentUpdate: Environment = {};
53
53
 
54
54
  if (properties.replicationCount !== undefined) {
55
- projectUpdate.replicationCount = properties.replicationCount;
55
+ environmentUpdate.replicationCount = properties.replicationCount;
56
56
  }
57
57
 
58
- const response = await projectsApi.updateProject(
58
+ const response = await environmentsApi.updateEnvironment(
59
59
  organizationName,
60
- projectName,
61
- projectUpdate,
60
+ environmentName,
61
+ environmentUpdate,
62
62
  {
63
63
  baseURL: controlPlane,
64
64
  headers: clientConfig.getHeaders(),
@@ -66,17 +66,19 @@ export async function updateProject(
66
66
  );
67
67
 
68
68
  if (response.status === 200) {
69
- logger.info(`Successfully updated project ${projectName}`);
69
+ logger.info(`Successfully updated environment ${environmentName}`);
70
70
  if (properties.replicationCount !== undefined) {
71
71
  logger.info(
72
72
  `Replication count set to ${properties.replicationCount}`,
73
73
  );
74
74
  }
75
75
  } else {
76
- logger.error(`Failed to update project. Status: ${response.status}`);
76
+ logger.error(
77
+ `Failed to update environment. Status: ${response.status}`,
78
+ );
77
79
  }
78
80
  } catch (e) {
79
- logger.error(`Failed to update project ${projectName}`);
81
+ logger.error(`Failed to update environment ${environmentName}`);
80
82
  printOutError(e, debug);
81
83
  }
82
84
  }
@@ -1,24 +1,37 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import { Command } from "commander";
2
3
  import { controlPlanesByEnv, Environment } from "../constants";
3
4
  import { getGroup } from "./group/getgroup";
4
- import { getProject } from "./project/getproject";
5
+ import { getEnvironment } from "./environment/getenvironment";
6
+ import { warnProjectDeprecated } from "./legacy";
5
7
 
6
8
  export const registerGetCommands = (cli: Command, environment: Environment) => {
7
9
  const get = cli
8
10
  .command("get")
9
11
  .description("Get a resource")
10
- .argument("<resource>", "The resource to get (project | group)");
12
+ .argument("<resource>", "The resource to get (environment | group)");
13
+
14
+ const getEnvironmentAction = (environmentName: string, options: any) => {
15
+ getEnvironment(
16
+ controlPlanesByEnv[environment],
17
+ environmentName,
18
+ options.debug,
19
+ );
20
+ };
21
+
22
+ get.command("environment")
23
+ .description("Get an environment by name.")
24
+ .argument("<environmentName>", "The name of the environment to get.")
25
+ .option("--debug")
26
+ .action(getEnvironmentAction);
11
27
 
12
28
  get.command("project")
13
- .description("Get a project by name.")
14
- .argument("<projectName>", "The name of the project to get.")
29
+ .description("[deprecated] Alias for 'get environment'.")
30
+ .argument("<projectName>", "The name of the environment to get.")
15
31
  .option("--debug")
16
32
  .action((projectName, options) => {
17
- getProject(
18
- controlPlanesByEnv[environment],
19
- projectName,
20
- options.debug,
21
- );
33
+ warnProjectDeprecated("get environment");
34
+ getEnvironmentAction(projectName, options);
22
35
  });
23
36
 
24
37
  get.command("group")
@@ -0,0 +1,5 @@
1
+ import { logger } from "../logger";
2
+
3
+ export const warnProjectDeprecated = (newCommand: string) => {
4
+ logger.warn(`'project' is deprecated; use '${newCommand}' instead.`);
5
+ };
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import { Command } from "commander";
2
3
  import { controlPlanesByEnv, Environment } from "../constants";
3
4
  import { DEFAULT_PAGE_SIZE, DEFAULT_PAGE } from "../utils";
@@ -5,8 +6,9 @@ import { listConnections } from "./connection/listconnections";
5
6
  import { printOutGroups } from "./group/listgroups";
6
7
  import { listGroupAccessTokens } from "./groupaccesstoken/listTokens";
7
8
  import { printOutPackages } from "./package/listpackages";
8
- import { printOutProjects } from "./project/listprojects";
9
+ import { printOutEnvironments } from "./environment/listenvironments";
9
10
  import { listVersions } from "./version/listversions";
11
+ import { warnProjectDeprecated } from "./legacy";
10
12
 
11
13
  export const registerListCommands = (
12
14
  cli: Command,
@@ -17,10 +19,36 @@ export const registerListCommands = (
17
19
  .description("List resources of a given type")
18
20
  .argument("<resource>", "The resource to list");
19
21
 
22
+ const listEnvironmentsAction = (options: any) => {
23
+ printOutEnvironments(
24
+ controlPlanesByEnv[environment],
25
+ options.debug,
26
+ options.page,
27
+ options.pageSize,
28
+ );
29
+ };
30
+
31
+ list
32
+ .command("environment")
33
+ .alias("environments")
34
+ .description("List all environments.")
35
+ .option("--debug")
36
+ .option(
37
+ "--page <number>",
38
+ `Page number (starts at ${DEFAULT_PAGE})`,
39
+ String(DEFAULT_PAGE),
40
+ )
41
+ .option(
42
+ "--page-size <number>",
43
+ `Items per page (default: all records, max: 500)`,
44
+ String(DEFAULT_PAGE_SIZE),
45
+ )
46
+ .action(listEnvironmentsAction);
47
+
20
48
  list
21
49
  .command("project")
22
50
  .alias("projects")
23
- .description("List all projects.")
51
+ .description("[deprecated] Alias for 'ls environment'.")
24
52
  .option("--debug")
25
53
  .option(
26
54
  "--page <number>",
@@ -33,12 +61,8 @@ export const registerListCommands = (
33
61
  String(DEFAULT_PAGE_SIZE),
34
62
  )
35
63
  .action((options) => {
36
- printOutProjects(
37
- controlPlanesByEnv[environment],
38
- options.debug,
39
- options.page,
40
- options.pageSize,
41
- );
64
+ warnProjectDeprecated("ls environment");
65
+ listEnvironmentsAction(options);
42
66
  });
43
67
 
44
68
  list
@@ -68,7 +92,7 @@ export const registerListCommands = (
68
92
  list
69
93
  .command("package")
70
94
  .alias("packages")
71
- .description("List the packages in the active project.")
95
+ .description("List the packages in the active environment.")
72
96
  .option("--debug")
73
97
  .option(
74
98
  "--page <number>",
@@ -19,6 +19,7 @@ function createFakeIdToken(payload: Record<string, unknown>): string {
19
19
  }
20
20
 
21
21
  describe("login", () => {
22
+ let tmpConfigDir: string;
22
23
  let tmpConfigFilePath: string;
23
24
  let axiosStub: sinon.SinonStub;
24
25
  let orgPermissionsStub: sinon.SinonStub;
@@ -51,8 +52,26 @@ describe("login", () => {
51
52
  };
52
53
 
53
54
  beforeEach(() => {
54
- tmpConfigFilePath = join(os.tmpdir(), "cred.json");
55
- fs.writeFileSync(tmpConfigFilePath, "{}");
55
+ // mkdtempSync atomically creates a private (mode 0700) directory
56
+ // with an unguessable suffix, sidestepping the symlink / clobber
57
+ // class that CodeQL flags as js/insecure-temporary-file when a
58
+ // fixed name is reused inside the shared OS tmpdir.
59
+ tmpConfigDir = fs.mkdtempSync(join(os.tmpdir(), "cred-login-spec-"));
60
+ tmpConfigFilePath = join(tmpConfigDir, "cred.json");
61
+ // Seed with a valid ConfigFile. loadConfig now throws on malformed
62
+ // input rather than silently resetting, so an empty `{}` is no longer
63
+ // an acceptable starting state.
64
+ fs.writeFileSync(
65
+ tmpConfigFilePath,
66
+ JSON.stringify({
67
+ configPerEnvironment: {
68
+ production: {},
69
+ staging: {},
70
+ localhost: {},
71
+ },
72
+ activeEnvironment: "production",
73
+ }),
74
+ );
56
75
  axiosStub = sinon.stub(axios, "request");
57
76
  orgPermissionsStub = sinon
58
77
  .stub(OrganizationsApi.prototype, "getOrganization")
@@ -60,7 +79,7 @@ describe("login", () => {
60
79
  });
61
80
 
62
81
  afterEach(() => {
63
- fs.rmSync(tmpConfigFilePath);
82
+ fs.rmSync(tmpConfigDir, { recursive: true, force: true });
64
83
  sinon.restore();
65
84
  });
66
85
 
@@ -159,7 +178,7 @@ describe("login", () => {
159
178
  "https://admin.videoamp-aws-us-east-1.credibledata.com/api/v0",
160
179
  tmpConfigFilePath,
161
180
  );
162
- expect(orgIdStub.calledOnceWithExactly("videoamp")).to.be.true;
181
+ expect(orgIdStub.calledOnceWithExactly("videoamp", undefined)).to.be.true;
163
182
  expect(loopbackStub.calledOnce).to.be.true;
164
183
  const call = loopbackStub.getCall(0);
165
184
  expect(call.args[0].authorizeUrl).to.contain(
@@ -190,12 +209,35 @@ describe("login", () => {
190
209
  "https://admin.videoamp-aws-us-east-1.credibledata.com/api/v0",
191
210
  tmpConfigFilePath,
192
211
  );
193
- expect(orgIdStub.calledOnceWithExactly("VideoAmp")).to.be.true;
212
+ expect(orgIdStub.calledOnceWithExactly("VideoAmp", undefined)).to.be.true;
194
213
  expect(loopbackStub.getCall(0).args[0].authorizeUrl).to.contain(
195
214
  "organization=org_nMRKafeSuxOiuJeG",
196
215
  );
197
216
  });
198
217
 
218
+ it("forwards the cluster arg to getAuth0OrganizationIdForCliLogin (so -c aws triggers PKCE)", async function () {
219
+ this.timeout(2000);
220
+ const orgIdStub = sinon
221
+ .stub(credConstants, "getAuth0OrganizationIdForCliLogin")
222
+ .returns("org_nMRKafeSuxOiuJeG");
223
+ sinon
224
+ .stub(loopbackOAuth, "authorizationCodeViaLoopback")
225
+ .callsFake(async (opts) => {
226
+ opts.onListening?.();
227
+ return { code: "test-pkce-auth-code" };
228
+ });
229
+ axiosStub.onFirstCall().resolves(mockedAccessTokenResponse);
230
+ const config = new ClientConfiguration(tmpConfigFilePath);
231
+ config.setEnvironment("videoamp");
232
+ await login(
233
+ "videoamp",
234
+ "https://admin.videoamp-aws-us-east-1.credibledata.com/api/v0",
235
+ tmpConfigFilePath,
236
+ "aws",
237
+ );
238
+ expect(orgIdStub.calledOnceWithExactly("videoamp", "aws")).to.be.true;
239
+ });
240
+
199
241
  it("should not pass Auth0 organization for unmapped org names", async function () {
200
242
  this.timeout(2000);
201
243
  axiosStub
@@ -7,6 +7,7 @@ import { ClientConfiguration } from "../../clientconfiguration";
7
7
  import {
8
8
  auth0ConfigsByEnv,
9
9
  AUTH_CLI_LOOPBACK_REDIRECT_URI,
10
+ Cluster,
10
11
  Environment,
11
12
  getAuth0OrganizationIdForCliLogin,
12
13
  LOGIN_TIMEOUT_MS,
@@ -21,6 +22,7 @@ export async function login(
21
22
  organizationName: string,
22
23
  controlPlaneBaseURL?: string,
23
24
  configPath?: string,
25
+ cluster?: Cluster,
24
26
  ) {
25
27
  const config = new ClientConfiguration(configPath);
26
28
  const environment = config.getEnvironment();
@@ -29,8 +31,10 @@ export async function login(
29
31
  return loginM2M(organizationName, config);
30
32
  }
31
33
 
32
- const auth0OrganizationId =
33
- getAuth0OrganizationIdForCliLogin(organizationName);
34
+ const auth0OrganizationId = getAuth0OrganizationIdForCliLogin(
35
+ organizationName,
36
+ cluster,
37
+ );
34
38
  if (auth0OrganizationId) {
35
39
  return loginWithAuthCodePkceOrganization(
36
40
  environment,
@@ -123,7 +123,7 @@ describe("delete-package", () => {
123
123
  expect(deletePackageStub.called).to.be.false;
124
124
  expect(
125
125
  loggerStub.error.calledWith(
126
- sinon.match("Please, make sure to set a project"),
126
+ sinon.match("Please, make sure to set an environment"),
127
127
  ),
128
128
  ).to.be.true;
129
129
  });
@@ -14,7 +14,7 @@ export async function deletePackage(
14
14
  ) {
15
15
  const clientConfig = new ClientConfiguration();
16
16
  const organizationName = clientConfig.getOrganization();
17
- const projectName = clientConfig.getProject();
17
+ const environmentName = clientConfig.getProject();
18
18
  const packageName = packagePath.replace("/", "");
19
19
 
20
20
  if (!clientConfig.doesConfigExists()) {
@@ -22,8 +22,8 @@ export async function deletePackage(
22
22
  return;
23
23
  }
24
24
 
25
- if (!projectName) {
26
- logger.error("Please, make sure to set a project");
25
+ if (!environmentName) {
26
+ logger.error("Please, make sure to set an environment");
27
27
  return;
28
28
  }
29
29
 
@@ -42,7 +42,7 @@ export async function deletePackage(
42
42
  try {
43
43
  await packagesApi.deletePackage(
44
44
  organizationName,
45
- projectName,
45
+ environmentName,
46
46
  packageName,
47
47
  {
48
48
  baseURL: packageServer,
@@ -114,7 +114,7 @@ describe("list-packages", () => {
114
114
  expect(result).to.be.undefined;
115
115
  expect(
116
116
  loggerStub.error.calledWith(
117
- sinon.match("Please, make sure to set a project"),
117
+ sinon.match("Please, make sure to set an environment"),
118
118
  ),
119
119
  ).to.be.true;
120
120
  });
@@ -19,15 +19,15 @@ export async function listPackages(
19
19
  ) {
20
20
  const clientConfig = new ClientConfiguration();
21
21
  const organizationName = clientConfig.getOrganization();
22
- const projectName = clientConfig.getProject();
22
+ const environmentName = clientConfig.getProject();
23
23
 
24
24
  if (!clientConfig.doesConfigExists()) {
25
25
  logger.error("Please, make sure that you are logged in");
26
26
  return;
27
27
  }
28
28
 
29
- if (!projectName) {
30
- logger.error("Please, make sure to set a project");
29
+ if (!environmentName) {
30
+ logger.error("Please, make sure to set an environment");
31
31
  return;
32
32
  }
33
33
 
@@ -35,7 +35,7 @@ export async function listPackages(
35
35
  const { limit, offset } = parsePaginationParams(page, pageSize);
36
36
  const response = await packagesApi.listPackages(
37
37
  organizationName,
38
- projectName,
38
+ environmentName,
39
39
  limit,
40
40
  offset,
41
41
  {