Skip to content

Commit a123900

Browse files
authored
chore: remove coder/preview dependency from codersdk (#17939)
1 parent e76d58f commit a123900

File tree

11 files changed

+292
-87
lines changed

11 files changed

+292
-87
lines changed

cli/parameterresolver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ func (pr *ParameterResolver) resolveWithInput(resolved []codersdk.WorkspaceBuild
226226
if p != nil {
227227
continue
228228
}
229-
// Parameter has not been resolved yet, so CLI needs to determine if user should input it.
229+
// PreviewParameter has not been resolved yet, so CLI needs to determine if user should input it.
230230

231231
firstTimeUse := pr.isFirstTimeUse(tvp.Name)
232232
promptParameterOption := pr.isLastBuildParameterInvalidOption(tvp)

coderd/database/db2sdk/db2sdk.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"time"
1313

1414
"github.com/google/uuid"
15+
"github.com/hashicorp/hcl/v2"
1516
"golang.org/x/xerrors"
1617
"tailscale.com/tailcfg"
1718

@@ -24,6 +25,7 @@ import (
2425
"github.com/coder/coder/v2/codersdk"
2526
"github.com/coder/coder/v2/provisionersdk/proto"
2627
"github.com/coder/coder/v2/tailnet"
28+
previewtypes "github.com/coder/preview/types"
2729
)
2830

2931
// List is a helper function to reduce boilerplate when converting slices of
@@ -764,3 +766,83 @@ func Chat(chat database.Chat) codersdk.Chat {
764766
func Chats(chats []database.Chat) []codersdk.Chat {
765767
return List(chats, Chat)
766768
}
769+
770+
func PreviewParameter(param previewtypes.Parameter) codersdk.PreviewParameter {
771+
return codersdk.PreviewParameter{
772+
PreviewParameterData: codersdk.PreviewParameterData{
773+
Name: param.Name,
774+
DisplayName: param.DisplayName,
775+
Description: param.Description,
776+
Type: codersdk.OptionType(param.Type),
777+
FormType: codersdk.ParameterFormType(param.FormType),
778+
Styling: codersdk.PreviewParameterStyling{
779+
Placeholder: param.Styling.Placeholder,
780+
Disabled: param.Styling.Disabled,
781+
Label: param.Styling.Label,
782+
},
783+
Mutable: param.Mutable,
784+
DefaultValue: PreviewHCLString(param.DefaultValue),
785+
Icon: param.Icon,
786+
Options: List(param.Options, PreviewParameterOption),
787+
Validations: List(param.Validations, PreviewParameterValidation),
788+
Required: param.Required,
789+
Order: param.Order,
790+
Ephemeral: param.Ephemeral,
791+
},
792+
Value: PreviewHCLString(param.Value),
793+
Diagnostics: PreviewDiagnostics(param.Diagnostics),
794+
}
795+
}
796+
797+
func HCLDiagnostics(d hcl.Diagnostics) []codersdk.FriendlyDiagnostic {
798+
return PreviewDiagnostics(previewtypes.Diagnostics(d))
799+
}
800+
801+
func PreviewDiagnostics(d previewtypes.Diagnostics) []codersdk.FriendlyDiagnostic {
802+
f := d.FriendlyDiagnostics()
803+
return List(f, func(f previewtypes.FriendlyDiagnostic) codersdk.FriendlyDiagnostic {
804+
return codersdk.FriendlyDiagnostic{
805+
Severity: codersdk.DiagnosticSeverityString(f.Severity),
806+
Summary: f.Summary,
807+
Detail: f.Detail,
808+
Extra: codersdk.DiagnosticExtra{
809+
Code: f.Extra.Code,
810+
},
811+
}
812+
})
813+
}
814+
815+
func PreviewHCLString(h previewtypes.HCLString) codersdk.NullHCLString {
816+
n := h.NullHCLString()
817+
return codersdk.NullHCLString{
818+
Value: n.Value,
819+
Valid: n.Valid,
820+
}
821+
}
822+
823+
func PreviewParameterOption(o *previewtypes.ParameterOption) codersdk.PreviewParameterOption {
824+
if o == nil {
825+
// This should never be sent
826+
return codersdk.PreviewParameterOption{}
827+
}
828+
return codersdk.PreviewParameterOption{
829+
Name: o.Name,
830+
Description: o.Description,
831+
Value: PreviewHCLString(o.Value),
832+
Icon: o.Icon,
833+
}
834+
}
835+
836+
func PreviewParameterValidation(v *previewtypes.ParameterValidation) codersdk.PreviewParameterValidation {
837+
if v == nil {
838+
// This should never be sent
839+
return codersdk.PreviewParameterValidation{}
840+
}
841+
return codersdk.PreviewParameterValidation{
842+
Error: v.Error,
843+
Regex: v.Regex,
844+
Min: v.Min,
845+
Max: v.Max,
846+
Monotonic: v.Monotonic,
847+
}
848+
}

coderd/parameters.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"golang.org/x/xerrors"
1414

1515
"github.com/coder/coder/v2/coderd/database"
16+
"github.com/coder/coder/v2/coderd/database/db2sdk"
1617
"github.com/coder/coder/v2/coderd/database/dbauthz"
1718
"github.com/coder/coder/v2/coderd/files"
1819
"github.com/coder/coder/v2/coderd/httpapi"
@@ -286,10 +287,10 @@ func (api *API) handleParameterWebsocket(rw http.ResponseWriter, r *http.Request
286287
result, diagnostics := render(ctx, map[string]string{})
287288
response := codersdk.DynamicParametersResponse{
288289
ID: -1, // Always start with -1.
289-
Diagnostics: previewtypes.Diagnostics(diagnostics),
290+
Diagnostics: db2sdk.HCLDiagnostics(diagnostics),
290291
}
291292
if result != nil {
292-
response.Parameters = result.Parameters
293+
response.Parameters = db2sdk.List(result.Parameters, db2sdk.PreviewParameter)
293294
}
294295
err = stream.Send(response)
295296
if err != nil {
@@ -314,10 +315,10 @@ func (api *API) handleParameterWebsocket(rw http.ResponseWriter, r *http.Request
314315
result, diagnostics := render(ctx, update.Inputs)
315316
response := codersdk.DynamicParametersResponse{
316317
ID: update.ID,
317-
Diagnostics: previewtypes.Diagnostics(diagnostics),
318+
Diagnostics: db2sdk.HCLDiagnostics(diagnostics),
318319
}
319320
if result != nil {
320-
response.Parameters = result.Parameters
321+
response.Parameters = db2sdk.List(result.Parameters, db2sdk.PreviewParameter)
321322
}
322323
err = stream.Send(response)
323324
if err != nil {

coderd/parameters_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ func TestDynamicParametersOwnerSSHPublicKey(t *testing.T) {
6868
require.Equal(t, -1, preview.ID)
6969
require.Empty(t, preview.Diagnostics)
7070
require.Equal(t, "public_key", preview.Parameters[0].Name)
71-
require.True(t, preview.Parameters[0].Value.Valid())
72-
require.Equal(t, sshKey.PublicKey, preview.Parameters[0].Value.Value.AsString())
71+
require.True(t, preview.Parameters[0].Value.Valid)
72+
require.Equal(t, sshKey.PublicKey, preview.Parameters[0].Value.Value)
7373
}
7474

7575
func TestDynamicParametersWithTerraformValues(t *testing.T) {
@@ -103,8 +103,8 @@ func TestDynamicParametersWithTerraformValues(t *testing.T) {
103103

104104
require.Len(t, preview.Parameters, 1)
105105
require.Equal(t, "jetbrains_ide", preview.Parameters[0].Name)
106-
require.True(t, preview.Parameters[0].Value.Valid())
107-
require.Equal(t, "CL", preview.Parameters[0].Value.AsString())
106+
require.True(t, preview.Parameters[0].Value.Valid)
107+
require.Equal(t, "CL", preview.Parameters[0].Value.Value)
108108
})
109109

110110
// OldProvisioners use the static parameters in the dynamic param flow
@@ -154,8 +154,8 @@ func TestDynamicParametersWithTerraformValues(t *testing.T) {
154154
require.Contains(t, preview.Diagnostics[0].Summary, "required metadata to support dynamic parameters")
155155
require.Len(t, preview.Parameters, 1)
156156
require.Equal(t, "jetbrains_ide", preview.Parameters[0].Name)
157-
require.True(t, preview.Parameters[0].Value.Valid())
158-
require.Equal(t, defaultValue, preview.Parameters[0].Value.AsString())
157+
require.True(t, preview.Parameters[0].Value.Valid)
158+
require.Equal(t, defaultValue, preview.Parameters[0].Value.Value)
159159

160160
// Test some inputs
161161
for _, exp := range []string{defaultValue, "GO", "Invalid", defaultValue} {
@@ -182,8 +182,8 @@ func TestDynamicParametersWithTerraformValues(t *testing.T) {
182182
require.Len(t, preview.Parameters[0].Diagnostics, 0)
183183
}
184184
require.Equal(t, "jetbrains_ide", preview.Parameters[0].Name)
185-
require.True(t, preview.Parameters[0].Value.Valid())
186-
require.Equal(t, exp, preview.Parameters[0].Value.AsString())
185+
require.True(t, preview.Parameters[0].Value.Valid)
186+
require.Equal(t, exp, preview.Parameters[0].Value.Value)
187187
}
188188
})
189189

codersdk/parameters.go

Lines changed: 111 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,121 @@ import (
77
"github.com/google/uuid"
88

99
"github.com/coder/coder/v2/codersdk/wsjson"
10-
previewtypes "github.com/coder/preview/types"
1110
"github.com/coder/websocket"
1211
)
1312

14-
// FriendlyDiagnostic is included to guarantee it is generated in the output
15-
// types. This is used as the type override for `previewtypes.Diagnostic`.
16-
type FriendlyDiagnostic = previewtypes.FriendlyDiagnostic
13+
type ParameterFormType string
1714

18-
// NullHCLString is included to guarantee it is generated in the output
19-
// types. This is used as the type override for `previewtypes.HCLString`.
20-
type NullHCLString = previewtypes.NullHCLString
15+
const (
16+
ParameterFormTypeDefault ParameterFormType = ""
17+
ParameterFormTypeRadio ParameterFormType = "radio"
18+
ParameterFormTypeSlider ParameterFormType = "slider"
19+
ParameterFormTypeInput ParameterFormType = "input"
20+
ParameterFormTypeDropdown ParameterFormType = "dropdown"
21+
ParameterFormTypeCheckbox ParameterFormType = "checkbox"
22+
ParameterFormTypeSwitch ParameterFormType = "switch"
23+
ParameterFormTypeMultiSelect ParameterFormType = "multi-select"
24+
ParameterFormTypeTagSelect ParameterFormType = "tag-select"
25+
ParameterFormTypeTextArea ParameterFormType = "textarea"
26+
ParameterFormTypeError ParameterFormType = "error"
27+
)
28+
29+
type OptionType string
30+
31+
const (
32+
OptionTypeString OptionType = "string"
33+
OptionTypeNumber OptionType = "number"
34+
OptionTypeBoolean OptionType = "bool"
35+
OptionTypeListString OptionType = "list(string)"
36+
)
37+
38+
type DiagnosticSeverityString string
39+
40+
const (
41+
DiagnosticSeverityError DiagnosticSeverityString = "error"
42+
DiagnosticSeverityWarning DiagnosticSeverityString = "warning"
43+
)
44+
45+
// FriendlyDiagnostic == previewtypes.FriendlyDiagnostic
46+
// Copied to avoid import deps
47+
type FriendlyDiagnostic struct {
48+
Severity DiagnosticSeverityString `json:"severity"`
49+
Summary string `json:"summary"`
50+
Detail string `json:"detail"`
51+
52+
Extra DiagnosticExtra `json:"extra"`
53+
}
54+
55+
type DiagnosticExtra struct {
56+
Code string `json:"code"`
57+
}
58+
59+
// NullHCLString == `previewtypes.NullHCLString`.
60+
type NullHCLString struct {
61+
Value string `json:"value"`
62+
Valid bool `json:"valid"`
63+
}
64+
65+
type PreviewParameter struct {
66+
PreviewParameterData
67+
Value NullHCLString `json:"value"`
68+
Diagnostics []FriendlyDiagnostic `json:"diagnostics"`
69+
}
70+
71+
type PreviewParameterData struct {
72+
Name string `json:"name"`
73+
DisplayName string `json:"display_name"`
74+
Description string `json:"description"`
75+
Type OptionType `json:"type"`
76+
FormType ParameterFormType `json:"form_type"`
77+
Styling PreviewParameterStyling `json:"styling"`
78+
Mutable bool `json:"mutable"`
79+
DefaultValue NullHCLString `json:"default_value"`
80+
Icon string `json:"icon"`
81+
Options []PreviewParameterOption `json:"options"`
82+
Validations []PreviewParameterValidation `json:"validations"`
83+
Required bool `json:"required"`
84+
// legacy_variable_name was removed (= 14)
85+
Order int64 `json:"order"`
86+
Ephemeral bool `json:"ephemeral"`
87+
}
88+
89+
type PreviewParameterStyling struct {
90+
Placeholder *string `json:"placeholder,omitempty"`
91+
Disabled *bool `json:"disabled,omitempty"`
92+
Label *string `json:"label,omitempty"`
93+
}
94+
95+
type PreviewParameterOption struct {
96+
Name string `json:"name"`
97+
Description string `json:"description"`
98+
Value NullHCLString `json:"value"`
99+
Icon string `json:"icon"`
100+
}
101+
102+
type PreviewParameterValidation struct {
103+
Error string `json:"validation_error"`
104+
105+
// All validation attributes are optional.
106+
Regex *string `json:"validation_regex"`
107+
Min *int64 `json:"validation_min"`
108+
Max *int64 `json:"validation_max"`
109+
Monotonic *string `json:"validation_monotonic"`
110+
}
111+
112+
type DynamicParametersRequest struct {
113+
// ID identifies the request. The response contains the same
114+
// ID so that the client can match it to the request.
115+
ID int `json:"id"`
116+
Inputs map[string]string `json:"inputs"`
117+
}
118+
119+
type DynamicParametersResponse struct {
120+
ID int `json:"id"`
121+
Diagnostics []FriendlyDiagnostic `json:"diagnostics"`
122+
Parameters []PreviewParameter `json:"parameters"`
123+
// TODO: Workspace tags
124+
}
21125

22126
func (c *Client) TemplateVersionDynamicParameters(ctx context.Context, userID, version uuid.UUID) (*wsjson.Stream[DynamicParametersResponse, DynamicParametersRequest], error) {
23127
conn, err := c.Dial(ctx, fmt.Sprintf("/api/v2/users/%s/templateversions/%s/parameters", userID, version), nil)

codersdk/templateversions.go

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import (
99
"time"
1010

1111
"github.com/google/uuid"
12-
13-
previewtypes "github.com/coder/preview/types"
1412
)
1513

1614
type TemplateVersionWarning string
@@ -125,20 +123,6 @@ func (c *Client) CancelTemplateVersion(ctx context.Context, version uuid.UUID) e
125123
return nil
126124
}
127125

128-
type DynamicParametersRequest struct {
129-
// ID identifies the request. The response contains the same
130-
// ID so that the client can match it to the request.
131-
ID int `json:"id"`
132-
Inputs map[string]string `json:"inputs"`
133-
}
134-
135-
type DynamicParametersResponse struct {
136-
ID int `json:"id"`
137-
Diagnostics previewtypes.Diagnostics `json:"diagnostics"`
138-
Parameters []previewtypes.Parameter `json:"parameters"`
139-
// TODO: Workspace tags
140-
}
141-
142126
// TemplateVersionParameters returns parameters a template version exposes.
143127
func (c *Client) TemplateVersionRichParameters(ctx context.Context, version uuid.UUID) ([]TemplateVersionParameter, error) {
144128
res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/templateversions/%s/rich-parameters", version), nil)

enterprise/coderd/parameters_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ func TestDynamicParametersOwnerGroups(t *testing.T) {
7070
require.Equal(t, -1, preview.ID)
7171
require.Empty(t, preview.Diagnostics)
7272
require.Equal(t, "group", preview.Parameters[0].Name)
73-
require.True(t, preview.Parameters[0].Value.Valid())
74-
require.Equal(t, database.EveryoneGroup, preview.Parameters[0].Value.Value.AsString())
73+
require.True(t, preview.Parameters[0].Value.Valid)
74+
require.Equal(t, database.EveryoneGroup, preview.Parameters[0].Value.Value)
7575

7676
// Send a new value, and see it reflected
7777
err = stream.Send(codersdk.DynamicParametersRequest{
@@ -83,8 +83,8 @@ func TestDynamicParametersOwnerGroups(t *testing.T) {
8383
require.Equal(t, 1, preview.ID)
8484
require.Empty(t, preview.Diagnostics)
8585
require.Equal(t, "group", preview.Parameters[0].Name)
86-
require.True(t, preview.Parameters[0].Value.Valid())
87-
require.Equal(t, group.Name, preview.Parameters[0].Value.Value.AsString())
86+
require.True(t, preview.Parameters[0].Value.Valid)
87+
require.Equal(t, group.Name, preview.Parameters[0].Value.Value)
8888

8989
// Back to default
9090
err = stream.Send(codersdk.DynamicParametersRequest{
@@ -96,6 +96,6 @@ func TestDynamicParametersOwnerGroups(t *testing.T) {
9696
require.Equal(t, 3, preview.ID)
9797
require.Empty(t, preview.Diagnostics)
9898
require.Equal(t, "group", preview.Parameters[0].Name)
99-
require.True(t, preview.Parameters[0].Value.Valid())
100-
require.Equal(t, database.EveryoneGroup, preview.Parameters[0].Value.Value.AsString())
99+
require.True(t, preview.Parameters[0].Value.Valid)
100+
require.Equal(t, database.EveryoneGroup, preview.Parameters[0].Value.Value)
101101
}

0 commit comments

Comments
 (0)