@@ -39,8 +39,7 @@ type RegisteredScriptResourceArgs struct {
3939 // Version is the Semantic Version (SemVer) string for the script.
4040 // Format: "major.minor.patch" (e.g., "1.0.0", "2.3.1")
4141 // See https://semver.org/ for more information.
42- // Note: Marked as optional because Webflow's list API doesn't always return this field.
43- Version string `pulumi:"version,optional"`
42+ Version string `pulumi:"version"`
4443 // CanCopy indicates whether the script can be copied on site duplication.
4544 // Default: false
4645 CanCopy bool `pulumi:"canCopy,optional"`
@@ -122,57 +121,43 @@ func (state *RegisteredScriptResourceState) Annotate(a infer.Annotator) {
122121}
123122
124123// Diff determines what changes need to be made to the registered script resource.
125- // SiteID and DisplayName changes trigger replacement .
126- // Other changes trigger in-place update .
124+ // NOTE: Webflow API does not support updating registered scripts (no PATCH endpoint) .
125+ // All changes require replacement (delete + recreate), similar to Webhook resources .
127126func (r * RegisteredScriptResource ) Diff (
128127 ctx context.Context , req infer.DiffRequest [RegisteredScriptResourceArgs , RegisteredScriptResourceState ],
129128) (infer.DiffResponse , error ) {
130129 diff := infer.DiffResponse {}
131130 detailedDiff := map [string ]p.PropertyDiff {}
132131
133- // Check for siteId change (requires replacement - primary key)
132+ // All field changes trigger replacement since Webflow API doesn't support PATCH
134133 if req .State .SiteID != req .Inputs .SiteID {
135134 detailedDiff ["siteId" ] = p.PropertyDiff {Kind : p .UpdateReplace }
136135 }
137136
138- // Check for displayName change (requires replacement - secondary key)
139137 if req .State .DisplayName != req .Inputs .DisplayName {
140138 detailedDiff ["displayName" ] = p.PropertyDiff {Kind : p .UpdateReplace }
141139 }
142140
143- // Check for hostedLocation change (supports update)
144141 if req .State .HostedLocation != req .Inputs .HostedLocation {
145- detailedDiff ["hostedLocation" ] = p.PropertyDiff {Kind : p .Update }
142+ detailedDiff ["hostedLocation" ] = p.PropertyDiff {Kind : p .UpdateReplace }
146143 }
147144
148- // Check for integrityHash change (supports update)
149145 if req .State .IntegrityHash != req .Inputs .IntegrityHash {
150- detailedDiff ["integrityHash" ] = p.PropertyDiff {Kind : p .Update }
146+ detailedDiff ["integrityHash" ] = p.PropertyDiff {Kind : p .UpdateReplace }
151147 }
152148
153- // Check for version change (supports update)
154- // Only report change if user explicitly specified a version that differs from state.
155- // This handles the case where req.Inputs.Version may be empty due to deserialization issues
156- // in pulumi-go-provider when the field is marked optional.
157- if req .Inputs .Version != "" && req .State .Version != req .Inputs .Version {
158- detailedDiff ["version" ] = p.PropertyDiff {Kind : p .Update }
149+ if req .State .Version != req .Inputs .Version {
150+ detailedDiff ["version" ] = p.PropertyDiff {Kind : p .UpdateReplace }
159151 }
160152
161- // Check for canCopy change (supports update)
162153 if req .State .CanCopy != req .Inputs .CanCopy {
163- detailedDiff ["canCopy" ] = p.PropertyDiff {Kind : p .Update }
154+ detailedDiff ["canCopy" ] = p.PropertyDiff {Kind : p .UpdateReplace }
164155 }
165156
166- // If any changes were detected, populate the diff response
157+ // If any changes were detected, all require replacement
167158 if len (detailedDiff ) > 0 {
168159 diff .HasChanges = true
169- // Only set DeleteBeforeReplace if any replacement changes are needed
170- for _ , change := range detailedDiff {
171- if change .Kind == p .UpdateReplace {
172- diff .DeleteBeforeReplace = true
173- break
174- }
175- }
160+ diff .DeleteBeforeReplace = true
176161 diff .DetailedDiff = detailedDiff
177162 }
178163
@@ -357,76 +342,17 @@ func (r *RegisteredScriptResource) Read(
357342 }, nil
358343}
359344
360- // Update modifies an existing registered script.
345+ // Update is not supported by Webflow API for registered scripts.
346+ // All changes trigger replacement via Diff, so this method should never be called.
347+ // This is a safety net that returns an error if somehow invoked.
361348func (r * RegisteredScriptResource ) Update (
362- ctx context.Context , req infer.UpdateRequest [RegisteredScriptResourceArgs , RegisteredScriptResourceState ],
349+ _ context.Context , _ infer.UpdateRequest [RegisteredScriptResourceArgs , RegisteredScriptResourceState ],
363350) (infer.UpdateResponse [RegisteredScriptResourceState ], error ) {
364- // Validate inputs BEFORE making API calls
365- if err := ValidateSiteID (req .Inputs .SiteID ); err != nil {
366- return infer.UpdateResponse [RegisteredScriptResourceState ]{},
367- fmt .Errorf ("validation failed for RegisteredScript resource: %w" , err )
368- }
369- if err := ValidateScriptDisplayName (req .Inputs .DisplayName ); err != nil {
370- return infer.UpdateResponse [RegisteredScriptResourceState ]{},
371- fmt .Errorf ("validation failed for RegisteredScript resource: %w" , err )
372- }
373- if err := ValidateHostedLocation (req .Inputs .HostedLocation ); err != nil {
374- return infer.UpdateResponse [RegisteredScriptResourceState ]{},
375- fmt .Errorf ("validation failed for RegisteredScript resource: %w" , err )
376- }
377- if err := ValidateIntegrityHash (req .Inputs .IntegrityHash ); err != nil {
378- return infer.UpdateResponse [RegisteredScriptResourceState ]{},
379- fmt .Errorf ("validation failed for RegisteredScript resource: %w" , err )
380- }
381- if err := ValidateVersion (req .Inputs .Version ); err != nil {
382- return infer.UpdateResponse [RegisteredScriptResourceState ]{},
383- fmt .Errorf ("validation failed for RegisteredScript resource: %w" , err )
384- }
385-
386- state := RegisteredScriptResourceState {
387- RegisteredScriptResourceArgs : req .Inputs ,
388- ScriptID : req .State .ScriptID , // Preserve the script ID from current state
389- CreatedOn : req .State .CreatedOn , // Preserve the creation timestamp from current state
390- LastUpdated : "" , // Will be updated from API response
391- }
392-
393- // During preview, return expected state without making API calls
394- if req .DryRun {
395- state .LastUpdated = time .Now ().Format (time .RFC3339 )
396- return infer.UpdateResponse [RegisteredScriptResourceState ]{
397- Output : state ,
398- }, nil
399- }
400-
401- // Extract the Webflow script ID from the Pulumi resource ID
402- _ , scriptID , err := ExtractIDsFromRegisteredScriptResourceID (req .ID )
403- if err != nil {
404- return infer.UpdateResponse [RegisteredScriptResourceState ]{}, fmt .Errorf ("invalid resource ID: %w" , err )
405- }
406-
407- // Get HTTP client
408- client , err := GetHTTPClient (ctx , providerVersion )
409- if err != nil {
410- return infer.UpdateResponse [RegisteredScriptResourceState ]{}, fmt .Errorf ("failed to create HTTP client: %w" , err )
411- }
412-
413- // Call Webflow API
414- response , err := PatchRegisteredScript (
415- ctx , client , req .Inputs .SiteID , scriptID ,
416- req .Inputs .DisplayName , req .Inputs .HostedLocation , req .Inputs .IntegrityHash ,
417- req .Inputs .Version , req .Inputs .CanCopy ,
418- )
419- if err != nil {
420- return infer.UpdateResponse [RegisteredScriptResourceState ]{},
421- fmt .Errorf ("failed to update registered script: %w" , err )
422- }
423-
424- // Update state with values from API response
425- state .LastUpdated = response .LastUpdated
426-
427- return infer.UpdateResponse [RegisteredScriptResourceState ]{
428- Output : state ,
429- }, nil
351+ return infer.UpdateResponse [RegisteredScriptResourceState ]{},
352+ errors .New ("registered scripts cannot be updated in-place: " +
353+ "Webflow API does not support PATCH for registered scripts. " +
354+ "All changes require replacement (delete + recreate). " +
355+ "If you see this error, please report it as a provider bug" )
430356}
431357
432358// Delete removes a registered script from the Webflow site.
0 commit comments