diff --git a/CHANGELOG.md b/CHANGELOG.md index dffc95a..bcda316 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +### Version: 5.1.0 +#### Date: Mar-02-2026 +Fix: Added support of asset fields in assets & entries class. + ### Version: 5.0.1 #### Date: feb-23-2026 Fix: Added support of special symbols in regex method with safe pattern. diff --git a/package-lock.json b/package-lock.json index ee39539..5c806de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@contentstack/delivery-sdk", - "version": "5.0.1", + "version": "5.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@contentstack/delivery-sdk", - "version": "5.0.1", + "version": "5.1.0", "license": "MIT", "dependencies": { "@contentstack/core": "^1.3.10", @@ -566,9 +566,9 @@ } }, "node_modules/@contentstack/utils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@contentstack/utils/-/utils-1.7.0.tgz", - "integrity": "sha512-wNWNt+wkoGJzCr5ZhAMKWJ5ND5xbD7N3t++Y6s1O+FB+AFzJszqCT740j6VqwjhQzw5sGfHoGjHIvlQA9dCcBw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@contentstack/utils/-/utils-1.7.1.tgz", + "integrity": "sha512-b/0t1malpJeFCNd9+1uN3BuO8mRn2b5+aNtrYEZ6YlSNjYNRu9IjqSxZ5Clhs5267950UV1ayhgFE8z3qre2eQ==", "license": "MIT" }, "node_modules/@cspotcode/source-map-support": { @@ -1379,9 +1379,9 @@ } }, "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -2069,13 +2069,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", - "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "version": "25.3.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.2.tgz", + "integrity": "sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/node-localstorage": { @@ -2205,9 +2205,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -2229,9 +2229,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, "license": "MIT", "dependencies": { @@ -2488,13 +2488,16 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", "dev": true, "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/basic-auth": { @@ -2689,9 +2692,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001770", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz", - "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==", + "version": "1.0.30001774", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz", + "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==", "dev": true, "funding": [ { @@ -3233,9 +3236,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", "dev": true, "license": "ISC" }, @@ -4675,9 +4678,9 @@ } }, "node_modules/jest-config/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -5140,9 +5143,9 @@ } }, "node_modules/jest-runtime/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -5785,13 +5788,13 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -5811,11 +5814,11 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -6567,9 +6570,9 @@ } }, "node_modules/rollup": { - "version": "3.29.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", - "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.30.0.tgz", + "integrity": "sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA==", "dev": true, "license": "MIT", "bin": { @@ -6998,13 +7001,13 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -7152,9 +7155,9 @@ } }, "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -7439,9 +7442,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index abc8bb0..60844cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/delivery-sdk", - "version": "5.0.1", + "version": "5.1.0", "type": "module", "license": "MIT", "engines": { diff --git a/src/assets/asset.ts b/src/assets/asset.ts index b5c7c23..9a1d1d0 100644 --- a/src/assets/asset.ts +++ b/src/assets/asset.ts @@ -3,7 +3,7 @@ import { AxiosInstance, getData } from '@contentstack/core'; export class Asset { private _client: AxiosInstance; private _urlPath: string; - _queryParams: { [key: string]: string | number } = {}; + _queryParams: { [key: string]: string | number | string[] } = {}; constructor(client: AxiosInstance, assetUid: string) { this._client = client; @@ -129,6 +129,27 @@ export class Asset { return this; } + /** + * @method assetFields + * @memberof Asset + * @description Include specific asset fields in the response (CDA getAssets - single asset). + * Use with asset_fields[]: user_defined_fields, embedded, ai_suggested, visual_markups. + * @example + * import contentstack from '@contentstack/delivery-sdk' + * + * const stack = contentstack.stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); + * const result = await stack.asset("assetUid").assetFields("user_defined_fields", "embedded_metadata").fetch(); + * + * @param {...string} fields - Asset field names to include (e.g. user_defined_fields, embedded, ai_suggested, visual_markups) + * @returns {Asset} - Returns the Asset instance for chaining. + */ + assetFields(...fields: string[]): this { + if (fields.length > 0) { + this._queryParams['asset_fields[]'] = fields; + } + return this; + } + /** * @method fetch * @memberof Asset diff --git a/src/entries/entries.ts b/src/entries/entries.ts index a384272..0107efb 100644 --- a/src/entries/entries.ts +++ b/src/entries/entries.ts @@ -277,6 +277,27 @@ export class Entries extends BaseQuery { return this; } + /** + * @method assetFields + * @memberof Entries + * @description Include specific asset fields in the response (CDA getEntry/entries). + * Use with asset_fields[]: user_defined_fields, embedded, ai_suggested, visual_markups. + * @example + * import contentstack from '@contentstack/delivery-sdk' + * + * const stack = contentstack.stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); + * const result = await stack.contentType("contentTypeUid").entry().assetFields("user_defined_fields", "embedded_metadata").find(); + * + * @param {...string} fields - Asset field names to include (e.g. user_defined_fields, embedded, ai_suggested, visual_markups) + * @returns {Entries} - Returns the Entries instance for chaining. + */ + assetFields(...fields: string[]): this { + if (fields.length > 0) { + this._queryParams['asset_fields[]'] = fields; + } + return this; + } + /** * Override find method to include content type UID directly for better caching */ diff --git a/src/entries/entry.ts b/src/entries/entry.ts index 1f9376e..9e472f8 100644 --- a/src/entries/entry.ts +++ b/src/entries/entry.ts @@ -273,4 +273,25 @@ export class Entry { } return this; } + + /** + * @method assetFields + * @memberof Entry + * @description Include specific asset fields in the response (CDA getEntry). + * Use with asset_fields[]: user_defined_fields, embedded, ai_suggested, visual_markups. + * @example + * import contentstack from '@contentstack/delivery-sdk' + * + * const stack = contentstack.stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); + * const result = await stack.contentType("contentTypeUid").entry("entryUid").assetFields("user_defined_fields", "embedded_metadata").fetch(); + * + * @param {...string} fields - Asset field names to include (e.g. user_defined_fields, embedded, ai_suggested, visual_markups) + * @returns {Entry} - Returns the Entry instance for chaining. + */ + assetFields(...fields: string[]): this { + if (fields.length > 0) { + this._queryParams['asset_fields[]'] = fields; + } + return this; + } } diff --git a/src/query/asset-query.ts b/src/query/asset-query.ts index 0c1b906..8e1db8b 100644 --- a/src/query/asset-query.ts +++ b/src/query/asset-query.ts @@ -126,6 +126,28 @@ export class AssetQuery extends BaseQuery { return this; } + + /** + * @method assetFields + * @memberof AssetQuery + * @description Include specific asset fields in the response (CDA getAssets). + * Use with asset_fields[]: user_defined_fields, embedded, ai_suggested, visual_markups. + * @example + * import contentstack from '@contentstack/delivery-sdk' + * + * const stack = contentstack.stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); + * const result = await stack.asset().assetFields("user_defined_fields", "embedded_metadata").find(); + * + * @param {...string} fields - Asset field names to include (e.g. user_defined_fields, embedded, ai_suggested, visual_markups) + * @returns {AssetQuery} - Returns the AssetQuery instance for chaining. + */ + assetFields(...fields: string[]): this { + if (fields.length > 0) { + this._queryParams['asset_fields[]'] = fields; + } + return this; + } + /** * @method query * @memberof AssetQuery diff --git a/test/api/asset-query.spec.ts b/test/api/asset-query.spec.ts index 4e2ff1a..c21903c 100644 --- a/test/api/asset-query.spec.ts +++ b/test/api/asset-query.spec.ts @@ -130,6 +130,20 @@ describe("AssetQuery API tests", () => { console.log('No assets found in stack - test data dependent'); } }); + it("should query assets with asset_fields[] CDA param (user_defined_fields, embedded, ai_suggested, visual_markups)", async () => { + const result = await makeAssetQuery() + .assetFields("user_defined_fields", "embedded_metadata", "ai_suggested", "visual_markups") + .limit(2) + .find(); + if (result.assets) { + expect(result.assets).toBeDefined(); + if (result.assets.length > 0) { + expect(result.assets[0].uid).toBeDefined(); + expect(result.assets[0]._version).toBeDefined(); + expect(result.assets[0].content_type).toBeDefined(); + } + } + }); }); function makeAssetQuery(): AssetQuery { const asset = stack.asset(); diff --git a/test/api/asset.spec.ts b/test/api/asset.spec.ts index 739df50..b906cec 100644 --- a/test/api/asset.spec.ts +++ b/test/api/asset.spec.ts @@ -103,6 +103,17 @@ describe('Asset API tests', () => { expect(result.created_by).toBeDefined(); expect(result.updated_by).toBeDefined(); }); + + it('should fetch asset with asset_fields[] CDA param (user_defined_fields, embedded, ai_suggested, visual_markups)', async () => { + const result = await makeAsset(assetUid) + .assetFields('user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups') + .fetch(); + expect(result).toBeDefined(); + expect(result.uid).toBeDefined(); + expect(result._version).toBeDefined(); + expect(result.url).toBeDefined(); + expect(result.filename).toBeDefined(); + }); }); function makeAsset(uid = ''): Asset { const asset = stack.asset(uid); diff --git a/test/api/entries.spec.ts b/test/api/entries.spec.ts index d9ebb19..b67290d 100644 --- a/test/api/entries.spec.ts +++ b/test/api/entries.spec.ts @@ -171,6 +171,19 @@ describe("Entries API test cases", () => { if (data.entries) expect(data.entries.length).toBeGreaterThan(0); }); + it("should query entries with asset_fields[] CDA param (user_defined_fields, embedded, ai_suggested, visual_markups)", async () => { + const result = await makeEntries(BLOG_POST_CT) + .assetFields("user_defined_fields", "embedded_metadata", "ai_suggested", "visual_markups") + .find(); + if (result.entries) { + expect(result.entries).toBeDefined(); + if (result.entries.length > 0) { + expect(result.entries[0].uid).toBeDefined(); + expect(result.entries[0]._version).toBeDefined(); + } + } + }); + it("CT Taxonomies Query: Get Entries With Taxonomy Terms Parent and Excluding the term itself ($above, level)", async () => { // ABOVE operation finds entries tagged with PARENT terms of the given term // Requires a child term (e.g., term_one_child) to find its parents diff --git a/test/api/entry.spec.ts b/test/api/entry.spec.ts index 700d909..c442acd 100644 --- a/test/api/entry.spec.ts +++ b/test/api/entry.spec.ts @@ -67,6 +67,16 @@ describe('Entry API tests', () => { expect(result._version).toBeDefined(); expect(result.publish_details).toBeDefined(); }); + + it('should fetch entry with asset_fields[] CDA param (user_defined_fields, embedded, ai_suggested, visual_markups)', async () => { + const result = await makeEntry(entryUid) + .assetFields('user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups') + .fetch(); + expect(result).toBeDefined(); + expect(result.uid).toBeDefined(); + expect(result._version).toBeDefined(); + expect(result.locale).toBeDefined(); + }); }); function makeEntry(uid = ''): Entry { const entry = stack.contentType(BLOG_POST_CT).entry(uid); diff --git a/test/unit/asset-query.spec.ts b/test/unit/asset-query.spec.ts index a22f3d3..5eae8d1 100644 --- a/test/unit/asset-query.spec.ts +++ b/test/unit/asset-query.spec.ts @@ -60,6 +60,17 @@ describe('AssetQuery class', () => { expect(assetQuery._queryParams.locale).toBe('en-us'); }); + it('should add "asset_fields[]" in _queryParams when assetFields method is called', () => { + const returnedValue = assetQuery.assetFields('user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups'); + expect(returnedValue).toBeInstanceOf(AssetQuery); + expect(assetQuery._queryParams['asset_fields[]']).toEqual(['user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups']); + }); + + it('should not set asset_fields[] when assetFields is called with no arguments', () => { + assetQuery.assetFields(); + expect(assetQuery._queryParams['asset_fields[]']).toBeUndefined(); + }); + it('should return response data when successful', async () => { mockClient.onGet('/assets').reply(200, assetQueryFindResponseDataMock); const response = await assetQuery.find(); @@ -72,4 +83,15 @@ describe('AssetQuery class', () => { expect(returnedValue._parameters).toEqual({ fieldUid: 'value' }); } }); + + it('should call find with asset_fields[] query params when assetFields is set', async () => { + mockClient.onGet('/assets').reply((config) => { + expect(config.params).toBeDefined(); + expect(config.params['asset_fields[]']).toEqual(['user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups']); + return [200, assetQueryFindResponseDataMock]; + }); + assetQuery.assetFields('user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups'); + const result = await assetQuery.find(); + expect(result).toEqual(assetQueryFindResponseDataMock); + }); }); diff --git a/test/unit/asset.spec.ts b/test/unit/asset.spec.ts index 2532ce0..dad5055 100644 --- a/test/unit/asset.spec.ts +++ b/test/unit/asset.spec.ts @@ -60,6 +60,17 @@ describe('Asset class', () => { expect(asset._queryParams.version).toBe('1'); }); + it('should add "asset_fields[]" in _queryParams when assetFields method is called', () => { + const returnedValue = asset.assetFields('user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups'); + expect(returnedValue).toBeInstanceOf(Asset); + expect(asset._queryParams['asset_fields[]']).toEqual(['user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups']); + }); + + it('should not set asset_fields[] when assetFields is called with no arguments', () => { + asset.assetFields(); + expect(asset._queryParams['asset_fields[]']).toBeUndefined(); + }); + it('should add "fetch" in _queryParams when fetch method is called', async () => { mockClient.onGet(`/assets/assetUid`).reply(200, assetFetchDataMock); const returnedValue = await asset.fetch(); @@ -74,4 +85,15 @@ describe('Asset class', () => { expect(result).toEqual(responseWithoutAsset); }); + + it('should call fetch with asset_fields[] query params when assetFields is set', async () => { + mockClient.onGet(`/assets/assetUid`).reply((config) => { + expect(config.params).toBeDefined(); + expect(config.params['asset_fields[]']).toEqual(['user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups']); + return [200, assetFetchDataMock]; + }); + asset.assetFields('user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups'); + const result = await asset.fetch(); + expect(result).toEqual(assetFetchDataMock.asset); + }); }); diff --git a/test/unit/entries.spec.ts b/test/unit/entries.spec.ts index 08f2e79..461a9d6 100644 --- a/test/unit/entries.spec.ts +++ b/test/unit/entries.spec.ts @@ -75,6 +75,17 @@ describe('Entries class', () => { expect(entry._queryParams.include_content_type).toBe('true'); }); + it('should add "asset_fields[]" in _queryParams when assetFields method is called', () => { + const returnedValue = entry.assetFields('user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups'); + expect(returnedValue).toBeInstanceOf(Entries); + expect(entry._queryParams['asset_fields[]']).toEqual(['user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups']); + }); + + it('should not set asset_fields[] when assetFields is called with no arguments', () => { + entry.assetFields(); + expect(entry._queryParams['asset_fields[]']).toBeUndefined(); + }); + it('should add "include_reference_content_type_uid" in _queryParams when includeReferenceContentTypeUID method is called', () => { const returnedValue = entry.includeReferenceContentTypeUID(); expect(returnedValue).toBeInstanceOf(Entries); @@ -149,6 +160,17 @@ describe('Entries class', () => { expect(returnedValue).toEqual(entryFindMock); }); + it('should call find with asset_fields[] query params when assetFields is set', async () => { + mockClient.onGet(`/content_types/contentTypeUid/entries`).reply((config) => { + expect(config.params).toBeDefined(); + expect(config.params['asset_fields[]']).toEqual(['user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups']); + return [200, entryFindMock]; + }); + entry.assetFields('user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups'); + const result = await entry.find(); + expect(result).toEqual(entryFindMock); + }); + it('CT Taxonomy Query: Get entries with one term', () => { const query = entry.query().where("taxonomies.taxonomy_uid", QueryOperation.EQUALS, "term_uid"); expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": "term_uid"}); diff --git a/test/unit/entry.spec.ts b/test/unit/entry.spec.ts index f342810..65730ae 100644 --- a/test/unit/entry.spec.ts +++ b/test/unit/entry.spec.ts @@ -128,6 +128,17 @@ describe('Entry class', () => { expect(entry._queryParams.key3).toEqual(['value3']); }); + it('should add "asset_fields[]" in _queryParams when assetFields method is called', () => { + const returnedValue = entry.assetFields('user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups'); + expect(returnedValue).toBeInstanceOf(Entry); + expect(entry._queryParams['asset_fields[]']).toEqual(['user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups']); + }); + + it('should not set asset_fields[] when assetFields is called with no arguments', () => { + entry.assetFields(); + expect(entry._queryParams['asset_fields[]']).toBeUndefined(); + }); + it('should get the API response when fetch method is called', async () => { mockClient.onGet(`/content_types/contentTypeUid/entries/entryUid`).reply(200, entryFetchMock); const returnedValue = await entry.fetch(); @@ -237,4 +248,17 @@ describe('Fetch with variants', () => { expect(result).toEqual(responseWithoutEntry); }); + + it('should call fetch with asset_fields[] query params when assetFields is set', async () => { + mockClient.onGet('/content_types/contentTypeUid/entries/entryUid').reply((config) => { + expect(config.params).toBeDefined(); + expect(config.params['asset_fields[]']).toEqual(['user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups']); + return [200, entryFetchMock]; + }); + + entry.assetFields('user_defined_fields', 'embedded', 'ai_suggested', 'visual_markups'); + const result = await entry.fetch(); + + expect(result).toEqual(entryFetchMock.entry); + }); })