Skip to content

Commit 529887f

Browse files
committed
chore: remove coder/preview dependency from codersdk
`go list -deps github.com/coder/coder/v2/codersdk | grep preview`
1 parent 108bf8c commit 529887f

File tree

7 files changed

+209
-38
lines changed

7 files changed

+209
-38
lines changed

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.Parameter {
771+
return codersdk.Parameter{
772+
ParameterData: codersdk.ParameterData{
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.ParameterStyling{
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.ParameterOption {
824+
if o == nil {
825+
// This should never be sent
826+
return codersdk.ParameterOption{}
827+
}
828+
return codersdk.ParameterOption{
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.ParameterValidation {
837+
if v == nil {
838+
// This should never be sent
839+
return codersdk.ParameterValidation{}
840+
}
841+
return codersdk.ParameterValidation{
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
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/coder/coder/v2/apiversion"
1616
"github.com/coder/coder/v2/coderd/database"
17+
"github.com/coder/coder/v2/coderd/database/db2sdk"
1718
"github.com/coder/coder/v2/coderd/database/dbauthz"
1819
"github.com/coder/coder/v2/coderd/files"
1920
"github.com/coder/coder/v2/coderd/httpapi"
@@ -289,10 +290,10 @@ func (api *API) handleParameterWebsocket(rw http.ResponseWriter, r *http.Request
289290
result, diagnostics := render(ctx, map[string]string{})
290291
response := codersdk.DynamicParametersResponse{
291292
ID: -1, // Always start with -1.
292-
Diagnostics: previewtypes.Diagnostics(diagnostics),
293+
Diagnostics: db2sdk.HCLDiagnostics(diagnostics),
293294
}
294295
if result != nil {
295-
response.Parameters = result.Parameters
296+
response.Parameters = db2sdk.List(result.Parameters, db2sdk.PreviewParameter)
296297
}
297298
err = stream.Send(response)
298299
if err != nil {
@@ -317,10 +318,10 @@ func (api *API) handleParameterWebsocket(rw http.ResponseWriter, r *http.Request
317318
result, diagnostics := render(ctx, update.Inputs)
318319
response := codersdk.DynamicParametersResponse{
319320
ID: update.ID,
320-
Diagnostics: previewtypes.Diagnostics(diagnostics),
321+
Diagnostics: db2sdk.HCLDiagnostics(diagnostics),
321322
}
322323
if result != nil {
323-
response.Parameters = result.Parameters
324+
response.Parameters = db2sdk.List(result.Parameters, db2sdk.PreviewParameter)
324325
}
325326
err = stream.Send(response)
326327
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 Parameter struct {
66+
ParameterData
67+
Value NullHCLString `json:"value"`
68+
Diagnostics []FriendlyDiagnostic `json:"diagnostics"`
69+
}
70+
71+
type ParameterData 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 ParameterStyling `json:"styling"`
78+
Mutable bool `json:"mutable"`
79+
DefaultValue NullHCLString `json:"default_value"`
80+
Icon string `json:"icon"`
81+
Options []ParameterOption `json:"options"`
82+
Validations []ParameterValidation `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 ParameterStyling struct {
90+
Placeholder *string `json:"placeholder,omitempty"`
91+
Disabled *bool `json:"disabled,omitempty"`
92+
Label *string `json:"label,omitempty"`
93+
}
94+
95+
type ParameterOption 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 ParameterValidation 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 []Parameter `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)

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ require (
485485

486486
require (
487487
github.com/anthropics/anthropic-sdk-go v0.2.0-beta.3
488-
github.com/coder/preview v0.0.2-0.20250520124122-9606efe6cefd
488+
github.com/coder/preview v0.0.2-0.20250520134327-ac391431027d
489489
github.com/fsnotify/fsnotify v1.9.0
490490
github.com/kylecarbs/aisdk-go v0.0.8
491491
github.com/mark3labs/mcp-go v0.28.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -911,8 +911,8 @@ github.com/coder/pq v1.10.5-0.20240813183442-0c420cb5a048 h1:3jzYUlGH7ZELIH4XggX
911911
github.com/coder/pq v1.10.5-0.20240813183442-0c420cb5a048/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
912912
github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0 h1:3A0ES21Ke+FxEM8CXx9n47SZOKOpgSE1bbJzlE4qPVs=
913913
github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0/go.mod h1:5UuS2Ts+nTToAMeOjNlnHFkPahrtDkmpydBen/3wgZc=
914-
github.com/coder/preview v0.0.2-0.20250520124122-9606efe6cefd h1:or+1WfA3I6XZMElKbZvZszo20BCphb3JeF7+nPAKbvw=
915-
github.com/coder/preview v0.0.2-0.20250520124122-9606efe6cefd/go.mod h1:9bwyhQSVDjcxAWuFFaG6/qBqhaiW5oqF5PEQMhevKLs=
914+
github.com/coder/preview v0.0.2-0.20250520134327-ac391431027d h1:MxAAuqcno5hMM45Ihl3KAjVOXbyZyt/+tjSiq9XMTC0=
915+
github.com/coder/preview v0.0.2-0.20250520134327-ac391431027d/go.mod h1:9bwyhQSVDjcxAWuFFaG6/qBqhaiW5oqF5PEQMhevKLs=
916916
github.com/coder/quartz v0.1.3 h1:hA2nI8uUA2fNN9uhXv2I4xZD4aHkA7oH3g2t03v4xf8=
917917
github.com/coder/quartz v0.1.3/go.mod h1:vsiCc+AHViMKH2CQpGIpFgdHIEQsxwm8yCscqKmzbRA=
918918
github.com/coder/retry v1.5.1 h1:iWu8YnD8YqHs3XwqrqsjoBTAVqT9ml6z9ViJ2wlMiqc=

0 commit comments

Comments
 (0)