Skip to content

Commit 95e62d6

Browse files
committed
Using required constants throught the shared interfaces.
1 parent efc107b commit 95e62d6

File tree

7 files changed

+54
-55
lines changed

7 files changed

+54
-55
lines changed

src/constants/constants.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -319,12 +319,6 @@ export const DBProjectConfigurationKey = "sqlDatabaseProjects";
319319
export const enablePreviewFeaturesKey = "enablePreviewFeatures";
320320
export const AzureSqlV12 = "AzureV12";
321321

322-
export const PublishTargets = {
323-
EXISTING_SERVER: "existingServer" as const,
324-
LOCAL_CONTAINER: "localContainer" as const,
325-
NEW_AZURE_SERVER: "newAzureServer" as const,
326-
} as const;
327-
export type PublishTargetType = (typeof PublishTargets)[keyof typeof PublishTargets];
328322
export const PublishFormFields = {
329323
PublishProfilePath: "publishProfilePath",
330324
ServerName: "serverName",
@@ -337,10 +331,6 @@ export const PublishFormFields = {
337331
ContainerImageTag: "containerImageTag",
338332
AcceptContainerLicense: "acceptContainerLicense",
339333
} as const;
340-
341-
// Group of all container-specific publish form field identifiers used together when
342-
// the target is a local container. Centralizing this list avoids duplication in
343-
// controllers (e.g., building active component arrays and computing hidden fields).
344334
export const PublishFormContainerFields = [
345335
PublishFormFields.ContainerPort,
346336
PublishFormFields.ContainerAdminPassword,

src/publishProject/formComponentHelpers.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
IPublishForm,
1212
PublishDialogFormItemSpec,
1313
PublishDialogState,
14+
PublishTarget,
1415
} from "../sharedInterfaces/publishDialog";
1516
import { getPublishServerName, validateSqlServerPortNumber } from "./projectUtils";
1617
import { validateSqlServerPassword } from "../deployment/dockerUtils";
@@ -40,21 +41,21 @@ function generatePublishTargetOptions(projectTargetVersion?: string): FormItemOp
4041
displayName: isAzureSqlProject
4142
? Loc.PublishTargetExistingLogical
4243
: Loc.PublishTargetExisting,
43-
value: constants.PublishTargets.EXISTING_SERVER,
44+
value: PublishTarget.ExistingServer,
4445
},
4546
{
4647
displayName: isAzureSqlProject
4748
? Loc.PublishTargetAzureEmulator
4849
: Loc.PublishTargetContainer,
49-
value: constants.PublishTargets.LOCAL_CONTAINER,
50+
value: PublishTarget.LocalContainer,
5051
},
5152
];
5253
if (isAzureSqlProject) {
5354
// Only show "Publish to New Azure Server" option if preview feature tag is enabled
5455
if (isPreviewFeaturesEnabled()) {
5556
options.push({
5657
displayName: Loc.PublishTargetNewAzureServer,
57-
value: constants.PublishTargets.NEW_AZURE_SERVER,
58+
value: PublishTarget.NewAzureServer,
5859
});
5960
}
6061
}

src/publishProject/publishProjectWebViewController.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
PublishDialogFormItemSpec,
1515
IPublishForm,
1616
PublishDialogState,
17+
PublishTarget,
1718
} from "../sharedInterfaces/publishDialog";
1819
import { generatePublishFormComponents } from "./formComponentHelpers";
1920
import { loadDockerTags } from "./dockerUtils";
@@ -170,7 +171,7 @@ export class PublishProjectWebViewController extends FormWebviewController<
170171
constants.PublishFormFields.DatabaseName,
171172
] as (keyof IPublishForm)[];
172173

173-
if (state.formState.publishTarget === constants.PublishTargets.LOCAL_CONTAINER) {
174+
if (state.formState.publishTarget === PublishTarget.LocalContainer) {
174175
activeComponents.push(...constants.PublishFormContainerFields);
175176
}
176177

@@ -182,12 +183,12 @@ export class PublishProjectWebViewController extends FormWebviewController<
182183
const target = currentState.formState?.publishTarget;
183184
const hidden: string[] = [];
184185

185-
if (target === constants.PublishTargets.LOCAL_CONTAINER) {
186+
if (target === PublishTarget.LocalContainer) {
186187
// Container deployment: hide server name field
187188
hidden.push(constants.PublishFormFields.ServerName);
188189
} else if (
189-
target === constants.PublishTargets.EXISTING_SERVER ||
190-
target === constants.PublishTargets.NEW_AZURE_SERVER
190+
target === PublishTarget.ExistingServer ||
191+
target === PublishTarget.NewAzureServer
191192
) {
192193
// Existing server or new Azure server: hide container-specific fields
193194
hidden.push(...constants.PublishFormContainerFields);

src/reactviews/pages/PublishProject/components/PublishTargetSection.tsx

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import { useContext, useEffect, useState } from "react";
77
import { makeStyles } from "@fluentui/react-components";
88
import { PublishProjectContext } from "../publishProjectStateProvider";
99
import { usePublishDialogSelector } from "../publishDialogSelector";
10-
import * as constants from "../../../../constants/constants";
10+
import {
11+
PublishTarget,
12+
PublishFormFields,
13+
DefaultSqlPortNumber,
14+
} from "../../../../sharedInterfaces/publishDialog";
1115
import { renderInput, renderDropdown, renderCheckbox } from "./FormFieldComponents";
1216
import { parseHtmlLabel } from "../../../common/utils";
1317

@@ -34,48 +38,46 @@ export const PublishTargetSection: React.FC = () => {
3438

3539
// Select form components and values - components needed for rendering, values for logic
3640
const targetComponent = usePublishDialogSelector(
37-
(s) => s.formComponents[constants.PublishFormFields.PublishTarget],
41+
(s) => s.formComponents[PublishFormFields.PublishTarget],
3842
);
3943
const targetValue = usePublishDialogSelector(
40-
(s) => s.formState[constants.PublishFormFields.PublishTarget],
44+
(s) => s.formState[PublishFormFields.PublishTarget],
4145
);
4246

43-
const isContainer = targetValue === constants.PublishTargets.LOCAL_CONTAINER;
47+
const isContainer = targetValue === PublishTarget.LocalContainer;
4448

4549
// Container-specific fields (only select when needed)
4650
const portComponent = usePublishDialogSelector(
47-
(s) => s.formComponents[constants.PublishFormFields.ContainerPort],
48-
);
49-
const portValue = usePublishDialogSelector(
50-
(s) => s.formState[constants.PublishFormFields.ContainerPort],
51+
(s) => s.formComponents[PublishFormFields.ContainerPort],
5152
);
53+
const portValue = usePublishDialogSelector((s) => s.formState[PublishFormFields.ContainerPort]);
5254

5355
const passwordComponent = usePublishDialogSelector(
54-
(s) => s.formComponents[constants.PublishFormFields.ContainerAdminPassword],
56+
(s) => s.formComponents[PublishFormFields.ContainerAdminPassword],
5557
);
5658
const passwordValue = usePublishDialogSelector(
57-
(s) => s.formState[constants.PublishFormFields.ContainerAdminPassword],
59+
(s) => s.formState[PublishFormFields.ContainerAdminPassword],
5860
);
5961

6062
const confirmPasswordComponent = usePublishDialogSelector(
61-
(s) => s.formComponents[constants.PublishFormFields.ContainerAdminPasswordConfirm],
63+
(s) => s.formComponents[PublishFormFields.ContainerAdminPasswordConfirm],
6264
);
6365
const confirmPasswordValue = usePublishDialogSelector(
64-
(s) => s.formState[constants.PublishFormFields.ContainerAdminPasswordConfirm],
66+
(s) => s.formState[PublishFormFields.ContainerAdminPasswordConfirm],
6567
);
6668

6769
const imageTagComponent = usePublishDialogSelector(
68-
(s) => s.formComponents[constants.PublishFormFields.ContainerImageTag],
70+
(s) => s.formComponents[PublishFormFields.ContainerImageTag],
6971
);
7072
const imageTagValue = usePublishDialogSelector(
71-
(s) => s.formState[constants.PublishFormFields.ContainerImageTag],
73+
(s) => s.formState[PublishFormFields.ContainerImageTag],
7274
);
7375

7476
const licenseComponent = usePublishDialogSelector(
75-
(s) => s.formComponents[constants.PublishFormFields.AcceptContainerLicense],
77+
(s) => s.formComponents[PublishFormFields.AcceptContainerLicense],
7678
);
7779
const licenseValue = usePublishDialogSelector(
78-
(s) => s.formState[constants.PublishFormFields.AcceptContainerLicense],
80+
(s) => s.formState[PublishFormFields.AcceptContainerLicense],
7981
);
8082

8183
// Password visibility state management
@@ -106,17 +108,17 @@ export const PublishTargetSection: React.FC = () => {
106108
// Default container port if not set
107109
if (!portValue) {
108110
publishCtx.formAction({
109-
propertyName: constants.PublishFormFields.ContainerPort,
111+
propertyName: PublishFormFields.ContainerPort,
110112
isAction: false,
111-
value: constants.DefaultSqlPortNumber,
113+
value: DefaultSqlPortNumber,
112114
updateValidation: true,
113115
});
114116
}
115117

116118
// Auto-select first image tag if not set
117119
if (!imageTagValue && imageTagComponent?.options?.[0]) {
118120
publishCtx.formAction({
119-
propertyName: constants.PublishFormFields.ContainerImageTag,
121+
propertyName: PublishFormFields.ContainerImageTag,
120122
isAction: false,
121123
value: imageTagComponent.options[0].value,
122124
updateValidation: true,
@@ -133,7 +135,7 @@ export const PublishTargetSection: React.FC = () => {
133135
// Only revalidate if confirm password field has a value
134136
if (confirmPasswordValue !== undefined && confirmPasswordValue !== "") {
135137
publishCtx.formAction({
136-
propertyName: constants.PublishFormFields.ContainerAdminPasswordConfirm,
138+
propertyName: PublishFormFields.ContainerAdminPasswordConfirm,
137139
isAction: false,
138140
value: confirmPasswordValue as string,
139141
updateValidation: true,

src/reactviews/pages/PublishProject/publishProject.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ import { useContext } from "react";
77
import { Button, makeStyles } from "@fluentui/react-components";
88
import { useFormStyles } from "../../common/forms/form.component";
99
import { PublishProjectContext } from "./publishProjectStateProvider";
10-
import { IPublishForm } from "../../../sharedInterfaces/publishDialog";
10+
import { IPublishForm, PublishTarget } from "../../../sharedInterfaces/publishDialog";
1111
import { usePublishDialogSelector } from "./publishDialogSelector";
1212
import { LocConstants } from "../../common/locConstants";
1313
import { PublishProfileField } from "./components/PublishProfileSection";
1414
import { PublishTargetSection } from "./components/PublishTargetSection";
1515
import { ConnectionSection } from "./components/ConnectionSection";
16-
import * as constants from "../../../constants/constants";
1716

1817
const useStyles = makeStyles({
1918
root: { padding: "12px" },
@@ -101,8 +100,7 @@ function PublishProjectDialog() {
101100
appearance="secondary"
102101
disabled={
103102
readyToPublish ||
104-
formState?.publishTarget !==
105-
constants.PublishTargets.EXISTING_SERVER
103+
formState?.publishTarget !== PublishTarget.ExistingServer
106104
}
107105
onClick={() => context.generatePublishScript()}>
108106
{loc.generateScript}

src/sharedInterfaces/publishDialog.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,25 @@
66
import * as constants from "../constants/constants";
77
import { FormItemSpec, FormState, FormReducers, FormEvent } from "./form";
88

9+
// Publish target options - defines where the database project will be published
10+
export enum PublishTarget {
11+
ExistingServer = "existingServer",
12+
LocalContainer = "localContainer",
13+
NewAzureServer = "newAzureServer",
14+
}
15+
16+
// export publish-related constants for use in webview code
17+
export const PublishFormFields = constants.PublishFormFields;
18+
export const DefaultSqlPortNumber = constants.DefaultSqlPortNumber;
19+
920
/**
1021
* Data fields shown in the Publish form.
1122
*/
1223
export interface IPublishForm {
1324
publishProfilePath?: string;
1425
serverName?: string;
1526
databaseName?: string;
16-
publishTarget?: constants.PublishTargetType;
27+
publishTarget?: PublishTarget;
1728
sqlCmdVariables?: { [key: string]: string };
1829
// Container deployment specific fields (only used when publishTarget === 'localContainer')
1930
containerPort?: string;

test/unit/publishProjectWebViewController.test.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import * as vscode from "vscode";
77
import { expect } from "chai";
88
import * as sinon from "sinon";
9-
import * as constants from "../../src/constants/constants";
109

1110
import VscodeWrapper from "../../src/controllers/vscodeWrapper";
1211
import { PublishProjectWebViewController } from "../../src/publishProject/publishProjectWebViewController";
@@ -15,6 +14,7 @@ import {
1514
isValidSqlAdminPassword,
1615
} from "../../src/publishProject/projectUtils";
1716
import { stubVscodeWrapper } from "./utils";
17+
import { PublishTarget } from "../../src/sharedInterfaces/publishDialog";
1818

1919
suite("PublishProjectWebViewController Tests", () => {
2020
let sandbox: sinon.SinonSandbox;
@@ -99,9 +99,7 @@ suite("PublishProjectWebViewController Tests", () => {
9999

100100
await controller.initialized.promise;
101101

102-
expect(controller.state.formState.publishTarget).to.equal(
103-
constants.PublishTargets.EXISTING_SERVER,
104-
);
102+
expect(controller.state.formState.publishTarget).to.equal(PublishTarget.ExistingServer);
105103
});
106104

107105
test("getActiveFormComponents returns correct fields for EXISTING_SERVER target", async () => {
@@ -115,7 +113,7 @@ suite("PublishProjectWebViewController Tests", () => {
115113
await controller.initialized.promise;
116114

117115
// Set publish target to EXISTING_SERVER (default)
118-
controller.state.formState.publishTarget = constants.PublishTargets.EXISTING_SERVER;
116+
controller.state.formState.publishTarget = PublishTarget.ExistingServer;
119117

120118
const activeComponents = controller["getActiveFormComponents"](controller.state);
121119

@@ -141,7 +139,7 @@ suite("PublishProjectWebViewController Tests", () => {
141139
await controller.initialized.promise;
142140

143141
// Set publish target to LOCAL_CONTAINER
144-
controller.state.formState.publishTarget = constants.PublishTargets.LOCAL_CONTAINER;
142+
controller.state.formState.publishTarget = PublishTarget.LocalContainer;
145143

146144
const activeComponents = controller["getActiveFormComponents"](controller.state);
147145

@@ -195,7 +193,7 @@ suite("PublishProjectWebViewController Tests", () => {
195193
await formAction(controller.state, {
196194
event: {
197195
propertyName: "publishTarget",
198-
value: constants.PublishTargets.LOCAL_CONTAINER,
196+
value: PublishTarget.LocalContainer,
199197
isAction: false,
200198
},
201199
});
@@ -226,9 +224,7 @@ suite("PublishProjectWebViewController Tests", () => {
226224
});
227225

228226
// Verify all values are saved
229-
expect(controller.state.formState.publishTarget).to.equal(
230-
constants.PublishTargets.LOCAL_CONTAINER,
231-
);
227+
expect(controller.state.formState.publishTarget).to.equal(PublishTarget.LocalContainer);
232228
expect(controller.state.formState.containerPort).to.equal("1434");
233229
expect(controller.state.formState.containerAdminPassword).to.equal("TestPassword123!");
234230
expect(controller.state.formState.containerAdminPasswordConfirm).to.equal(
@@ -263,10 +259,10 @@ suite("PublishProjectWebViewController Tests", () => {
263259

264260
const publishTargetComponent = controller.state.formComponents.publishTarget;
265261
const existingServerOption = publishTargetComponent.options?.find(
266-
(opt) => opt.value === constants.PublishTargets.EXISTING_SERVER,
262+
(opt) => opt.value === PublishTarget.ExistingServer,
267263
);
268264
const containerOption = publishTargetComponent.options?.find(
269-
(opt) => opt.value === constants.PublishTargets.LOCAL_CONTAINER,
265+
(opt) => opt.value === PublishTarget.LocalContainer,
270266
);
271267

272268
expect(existingServerOption?.displayName).to.equal("Existing Azure SQL logical server");
@@ -303,7 +299,7 @@ suite("PublishProjectWebViewController Tests", () => {
303299
expect(publishTargetComponent.options?.length).to.equal(3);
304300

305301
const azureOption = publishTargetComponent.options?.find(
306-
(opt) => opt.value === constants.PublishTargets.NEW_AZURE_SERVER,
302+
(opt) => opt.value === PublishTarget.NewAzureServer,
307303
);
308304
expect(azureOption).to.exist;
309305
expect(azureOption?.displayName).to.equal("New Azure SQL logical server (Preview)");

0 commit comments

Comments
 (0)