Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Changelog

## [v1.31.0](https://github.com/contentstack/contentstack-management-javascript/tree/v1.31.0) (2026-05-12)

- Enh
- 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.
- Test
- Unit tests and sanity API tests for entry variants with an explicit branch.

## [v1.30.2](https://github.com/contentstack/contentstack-management-javascript/tree/v1.30.2) (2026-04-22)

- Update dependencies
Expand Down
52 changes: 45 additions & 7 deletions lib/stack/contentType/entry/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -285,22 +285,60 @@ export function Entry (http, data) {
* @description The variants call returns a Variants instance for managing variants of an entry.
* @memberof Entry
* @func variants
* @param {String=} uid - Variant UID. If not provided, returns Variants instance for querying all variants.
* @param {string|string[]=} variantUidOrUids - Variant UID, list of UIDs (comma-separated in the path), or omit to query all variants.
* @param {string=} branchName - Optional branch UID or alias for this variants scope (sent as the branch header). Omit to use the stack default branch.
* @returns {Variants} Instance of Variants.
* @example
* import * as contentstack from '@contentstack/management'
* const client = contentstack.client()
* const variants = client.stack({ api_key: 'api_key'}).contentType('content_type_uid').entry('uid').variants('uid')
* variants.fetch()
* .then((response) => console.log(response));
* @example
* client.stack({ api_key: 'api_key'}).contentType('content_type_uid').entry('uid').variants('uid', 'branch_name').update(data)
* .then((response) => console.log(response));
*/
this.variants = (uid = null) => {
const data = { stackHeaders: this.stackHeaders }
data.content_type_uid = this.content_type_uid
data.entry_uid = this.uid
if (uid) {
data.variants_uid = uid
this.variants = (variantUidOrUids, branchName) => {
const uidInput = variantUidOrUids === undefined ? null : variantUidOrUids
const branch =
typeof branchName === 'string' && branchName !== ''
? branchName
: undefined

const data = {
content_type_uid: this.content_type_uid,
entry_uid: this.uid
}

if (branch === undefined) {
data.stackHeaders = this.stackHeaders
} else {
data.stackHeaders = {
...cloneDeep(this.stackHeaders || {}),
branch
}
}

let variantsUid = null
if (Array.isArray(uidInput)) {
const uids = uidInput.filter(
(uid) => typeof uid === 'string' && uid.length > 0
)
if (uids.length === 1) {
variantsUid = uids[0]
} else if (uids.length > 1) {
variantsUid = uids.join(',')
}
} else if (typeof uidInput === 'string' && uidInput.length > 0) {
variantsUid = uidInput
} else if (uidInput != null && uidInput !== '') {
variantsUid = uidInput
}

if (variantsUid != null && variantsUid !== '') {
data.variants_uid = variantsUid
}

return new Variants(http, data)
}

Expand Down
16 changes: 13 additions & 3 deletions lib/stack/contentType/entry/variants/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,18 @@ import { bindModuleHeaders } from '../../../../core/moduleHeaderSupport.js'
export function Variants (http, data) {
Object.assign(this, cloneDeep(data))
this.urlPath = `/content_types/${this.content_type_uid}/entries/${this.entry_uid}/variants`
if (data && data.variants_uid) {
this.urlPath += `/${this.variants_uid}`
let variantPathSegment = ''
if (data?.variants_uid != null && data.variants_uid !== '') {
if (Array.isArray(data.variants_uid)) {
variantPathSegment = data.variants_uid
.filter((uid) => typeof uid === 'string' && uid.length > 0)
.join(',')
} else {
variantPathSegment = String(data.variants_uid)
}
}
if (variantPathSegment) {
this.urlPath += `/${variantPathSegment}`
/**
* @description The Update a variant call updates an existing variant for the selected content type.
* @memberof Variants
Expand All @@ -38,7 +48,7 @@ export function Variants (http, data) {
* }
* }
* }
* client.stack({ api_key: 'api_key'}).contentType('content_type_uid').entry('entry_uid').variants('uid').update(data)
* client.stack({ api_key: 'api_key'}).contentType('content_type_uid').entry('entry_uid').variants('uid', 'branch_name').update(data)
* .then((variants) => console.log(variants))
*/
this.update = async (data, params = {}) => {
Expand Down
Loading
Loading