Skip to content

Commit ffc81c1

Browse files
Merge pull request #493 from contentstack/fix/dx-3894
Removed content-type header from release delete method
2 parents 9d41e9a + 3e8bfb4 commit ffc81c1

File tree

5 files changed

+81
-10
lines changed

5 files changed

+81
-10
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## [v1.27.3](https://github.com/contentstack/contentstack-management-javascript/tree/v1.27.3) (2026-02-02)
4+
- Fix
5+
- Removed content-type header from the release delete method
6+
37
## [v1.27.2](https://github.com/contentstack/contentstack-management-javascript/tree/v1.27.2) (2026-01-12)
48
- Enhancement
59
- Improved error messages

lib/stack/release/index.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
create,
44
fetch,
55
update,
6-
deleteEntity,
76
query
87
} from '../../entity'
98
import error from '../../core/contentstackError'
@@ -94,7 +93,31 @@ export function Release (http, data = {}) {
9493
* client.stack({ api_key: 'api_key'}).release('release_uid').delete()
9594
* .then((response) => console.log(response.notice))
9695
*/
97-
this.delete = deleteEntity(http)
96+
this.delete = (function (http) {
97+
return async function (param = {}) {
98+
try {
99+
const requestConfig = {
100+
headers: { ...cloneDeep(this.stackHeaders) },
101+
params: { ...cloneDeep(param) }
102+
}
103+
// Omit Content-Type for DELETE; no body is sent and fastify v5 rejects it when present
104+
requestConfig.headers['Content-Type'] = null
105+
const response = await http.delete(this.urlPath, requestConfig)
106+
if (response.data) {
107+
return response.data
108+
}
109+
if (response.status >= 200 && response.status < 300) {
110+
return {
111+
status: response.status,
112+
statusText: response.statusText
113+
}
114+
}
115+
throw error(response)
116+
} catch (err) {
117+
throw error(err)
118+
}
119+
}
120+
})(http)
98121

99122
/**
100123
* @description A ReleaseItem is a set of entries and assets that needs to be deployed (published or unpublished) all at once to a particular environment.

package-lock.json

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@contentstack/management",
3-
"version": "1.27.2",
3+
"version": "1.27.3",
44
"description": "The Content Management API is used to manage the content of your Contentstack account",
55
"main": "./dist/node/contentstack-management.js",
66
"browser": "./dist/web/contentstack-management.js",
@@ -58,7 +58,7 @@
5858
"buffer": "^6.0.3",
5959
"form-data": "^4.0.5",
6060
"husky": "^9.1.7",
61-
"lodash": "^4.17.21",
61+
"lodash": "^4.17.23",
6262
"otplib": "^12.0.1",
6363
"qs": "6.14.1",
6464
"stream-browserify": "^3.0.0"

test/unit/release-test.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,50 @@ describe('Contentstack Release test', () => {
172172
.catch(done)
173173
})
174174

175+
it('Release delete should not send Content-Type header (no body for DELETE)', done => {
176+
var mock = new MockAdapter(Axios)
177+
let capturedConfig = null
178+
mock.onDelete('/releases/UID').reply((config) => {
179+
capturedConfig = config
180+
return [200, { ...noticeMock }]
181+
})
182+
makeRelease({
183+
release: {
184+
...systemUidMock
185+
},
186+
stackHeaders: stackHeadersMock
187+
})
188+
.delete()
189+
.then(() => {
190+
const contentType = capturedConfig?.headers?.['Content-Type']
191+
expect(contentType).to.satisfy(
192+
(val) => val === null || val === undefined,
193+
'Content-Type should be null or undefined for DELETE (no body)'
194+
)
195+
done()
196+
})
197+
.catch(done)
198+
})
199+
200+
it('Release delete with params', done => {
201+
var mock = new MockAdapter(Axios)
202+
mock.onDelete('/releases/UID').reply(200, {
203+
...noticeMock
204+
})
205+
makeRelease({
206+
release: {
207+
...systemUidMock
208+
},
209+
stackHeaders: stackHeadersMock
210+
})
211+
.delete({ someParam: 'value' })
212+
.then((release) => {
213+
expect(release.notice).to.be.equal(noticeMock.notice)
214+
done()
215+
})
216+
.catch(done)
217+
})
218+
175219
it('Release deploy test', done => {
176220
var mock = new MockAdapter(Axios)
177221
mock.onPost('/releases/UID/deploy').reply(200, {

0 commit comments

Comments
 (0)