Skip to content

Commit 1a3d370

Browse files
Added branch support in entry variants
1 parent 0246189 commit 1a3d370

8 files changed

Lines changed: 1172 additions & 492 deletions

File tree

CHANGELOG.md

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

3+
## [v1.31.0](https://github.com/contentstack/contentstack-management-javascript/tree/v1.31.0) (2026-05-12)
4+
5+
- Enh
6+
- Entry variants: `contentType(...).entry(...).variants(variantUidOrUids, branchName?)` — optional second argument sets the CMA `branch` header for that variants scope (branch UID or alias). First argument accepts a variant UID string or an array of UIDs (comma-separated in the request path). Omitting `branchName` preserves previous behavior.
7+
- Test
8+
- Unit tests and sanity API tests for entry variants with an explicit branch.
9+
310
## [v1.30.2](https://github.com/contentstack/contentstack-management-javascript/tree/v1.30.2) (2026-04-22)
411

512
- Update dependencies

lib/stack/contentType/entry/index.js

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -285,22 +285,60 @@ export function Entry (http, data) {
285285
* @description The variants call returns a Variants instance for managing variants of an entry.
286286
* @memberof Entry
287287
* @func variants
288-
* @param {String=} uid - Variant UID. If not provided, returns Variants instance for querying all variants.
288+
* @param {string|string[]=} variantUidOrUids - Variant UID, list of UIDs (comma-separated in the path), or omit to query all variants.
289+
* @param {string=} branchName - Optional branch UID or alias for this variants scope (sent as the branch header). Omit to use the stack default branch.
289290
* @returns {Variants} Instance of Variants.
290291
* @example
291292
* import * as contentstack from '@contentstack/management'
292293
* const client = contentstack.client()
293294
* const variants = client.stack({ api_key: 'api_key'}).contentType('content_type_uid').entry('uid').variants('uid')
294295
* variants.fetch()
295296
* .then((response) => console.log(response));
297+
* @example
298+
* client.stack({ api_key: 'api_key'}).contentType('content_type_uid').entry('uid').variants('uid', 'branch_name').update(data)
299+
* .then((response) => console.log(response));
296300
*/
297-
this.variants = (uid = null) => {
298-
const data = { stackHeaders: this.stackHeaders }
299-
data.content_type_uid = this.content_type_uid
300-
data.entry_uid = this.uid
301-
if (uid) {
302-
data.variants_uid = uid
301+
this.variants = (variantUidOrUids, branchName) => {
302+
const uidInput = variantUidOrUids === undefined ? null : variantUidOrUids
303+
const branch =
304+
typeof branchName === 'string' && branchName !== ''
305+
? branchName
306+
: undefined
307+
308+
const data = {
309+
content_type_uid: this.content_type_uid,
310+
entry_uid: this.uid
311+
}
312+
313+
if (branch === undefined) {
314+
data.stackHeaders = this.stackHeaders
315+
} else {
316+
data.stackHeaders = {
317+
...cloneDeep(this.stackHeaders || {}),
318+
branch
319+
}
303320
}
321+
322+
let variantsUid = null
323+
if (Array.isArray(uidInput)) {
324+
const uids = uidInput.filter(
325+
(uid) => typeof uid === 'string' && uid.length > 0
326+
)
327+
if (uids.length === 1) {
328+
variantsUid = uids[0]
329+
} else if (uids.length > 1) {
330+
variantsUid = uids.join(',')
331+
}
332+
} else if (typeof uidInput === 'string' && uidInput.length > 0) {
333+
variantsUid = uidInput
334+
} else if (uidInput != null && uidInput !== '') {
335+
variantsUid = uidInput
336+
}
337+
338+
if (variantsUid != null && variantsUid !== '') {
339+
data.variants_uid = variantsUid
340+
}
341+
304342
return new Variants(http, data)
305343
}
306344

lib/stack/contentType/entry/variants/index.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,18 @@ import { bindModuleHeaders } from '../../../../core/moduleHeaderSupport.js'
1414
export function Variants (http, data) {
1515
Object.assign(this, cloneDeep(data))
1616
this.urlPath = `/content_types/${this.content_type_uid}/entries/${this.entry_uid}/variants`
17-
if (data && data.variants_uid) {
18-
this.urlPath += `/${this.variants_uid}`
17+
let variantPathSegment = ''
18+
if (data?.variants_uid != null && data.variants_uid !== '') {
19+
if (Array.isArray(data.variants_uid)) {
20+
variantPathSegment = data.variants_uid
21+
.filter((uid) => typeof uid === 'string' && uid.length > 0)
22+
.join(',')
23+
} else {
24+
variantPathSegment = String(data.variants_uid)
25+
}
26+
}
27+
if (variantPathSegment) {
28+
this.urlPath += `/${variantPathSegment}`
1929
/**
2030
* @description The Update a variant call updates an existing variant for the selected content type.
2131
* @memberof Variants
@@ -38,7 +48,7 @@ export function Variants (http, data) {
3848
* }
3949
* }
4050
* }
41-
* client.stack({ api_key: 'api_key'}).contentType('content_type_uid').entry('entry_uid').variants('uid').update(data)
51+
* client.stack({ api_key: 'api_key'}).contentType('content_type_uid').entry('entry_uid').variants('uid', 'branch_name').update(data)
4252
* .then((variants) => console.log(variants))
4353
*/
4454
this.update = async (data, params = {}) => {

0 commit comments

Comments
 (0)