diff --git a/.talismanrc b/.talismanrc index 0b6c5f16..e621bfa6 100644 --- a/.talismanrc +++ b/.talismanrc @@ -5,5 +5,15 @@ fileignoreconfig: - filename: test/utils/mocks.ts checksum: a1cb4b1890a584f1facd30f2a0974c97a66f91417022be79d00516338e244227 - filename: package-lock.json - checksum: c836dacebd78b36e1264e1f99d0e70be665b34b31c03b4f46d272d0581146311 -version: "" \ No newline at end of file + checksum: 9268723da89e00cb39a558ae443ca1bff63255599f5ab22afa221c19c93572c5 +- filename: test/typescript/taxonomy.test.ts + checksum: e4bdf633e147fd60d929d379f20c814eed5f68b11421d7b53ec8826e9142de37 +- filename: src/core/modules/taxonomy.js + checksum: 84589be9805c1be5fd6c56021c41d18365126cf82059ad2cbef1d418c70d08e0 +- filename: src/core/lib/utils.js + checksum: 6018f9f13fa32b724d09b9cdf5f78cf030a6332ca549651e1e35fe91e8c7e0e7 +- filename: src/core/modules/query.js + checksum: c88b336f9a271397ffedcf8c5085941ceb0bd1cd7e25ed9ada3acd8ce4f8970c +- filename: test/typescript/stack.test.ts + checksum: bbb3c425f8e1a63d4793f69ee9eaba9559294ff53f163a28f70ae54b1792276a +version: "" diff --git a/package-lock.json b/package-lock.json index 347ff42d..8b5e416d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,14 @@ { - "name": "@contentstack/typescript", + "name": "@contentstack/delivery", "version": "0.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "@contentstack/typescript", + "name": "@contentstack/delivery", "version": "0.0.1", "dependencies": { - "@contentstack/core": "file:contentstack-core-0.0.1.tgz", + "@contentstack/core": "file:contentstack-core-1.0.0.tgz", "@contentstack/utils": "^1.1.3", "@types/humps": "^2.0.2", "dotenv": "^16.3.1", @@ -25,7 +25,8 @@ "jest-junit": "^16.0.0", "ts-jest": "^29.1.1", "ts-loader": "^9.4.4", - "ts-node": "10.9.1" + "ts-node": "10.9.1", + "webpack-cli": "^5.1.4" } }, "node_modules/@ampproject/remapping": { @@ -1854,12 +1855,12 @@ "dev": true }, "node_modules/@contentstack/core": { - "version": "0.0.1", - "resolved": "file:contentstack-core-0.0.1.tgz", - "integrity": "sha512-JcTfK8pCDkqiEYbkP0rVmGVuNcX95+XT78kb2y1OkUB0obSr+HgPl6JgP3OZDVRjV+fhiK76AvVDob2oMh6oag==", + "version": "1.0.0", + "resolved": "file:contentstack-core-1.0.0.tgz", + "integrity": "sha512-Zqs5/L/Ryr21tVw5SpWBjCN7pJQ+B0KUHFQWryAfXKVqFqch0fo5wSohXvKCya+LZjc/yBvzvRounHQyqziV4g==", "dependencies": { "axios": "^1.6.2", - "axios-mock-adapter": "^1.21.2", + "axios-mock-adapter": "^1.22.0", "lodash": "^4.17.21", "qs": "^6.11.0", "tslib": "^2.4.1" @@ -1892,6 +1893,15 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3976,6 +3986,50 @@ "@xtuc/long": "4.2.2" } }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -4815,6 +4869,20 @@ "node": ">=0.8" } }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -4846,6 +4914,12 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "node_modules/columnify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", @@ -5306,6 +5380,18 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/envinfo": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -5526,6 +5612,15 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -5624,9 +5719,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "funding": [ { "type": "individual", @@ -6094,6 +6189,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -6206,6 +6310,18 @@ "node": ">=0.12.0" } }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -6254,6 +6370,15 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -8304,6 +8429,15 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -9443,6 +9577,18 @@ "node": ">= 6" } }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -9736,6 +9882,18 @@ "node": ">= 0.4" } }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -10761,6 +10919,74 @@ } } }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -10820,6 +11046,12 @@ "node": ">= 8" } }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -12260,11 +12492,11 @@ "dev": true }, "@contentstack/core": { - "version": "file:contentstack-core-0.0.1.tgz", - "integrity": "sha512-JcTfK8pCDkqiEYbkP0rVmGVuNcX95+XT78kb2y1OkUB0obSr+HgPl6JgP3OZDVRjV+fhiK76AvVDob2oMh6oag==", + "version": "file:contentstack-core-1.0.0.tgz", + "integrity": "sha512-Zqs5/L/Ryr21tVw5SpWBjCN7pJQ+B0KUHFQWryAfXKVqFqch0fo5wSohXvKCya+LZjc/yBvzvRounHQyqziV4g==", "requires": { "axios": "^1.6.2", - "axios-mock-adapter": "^1.21.2", + "axios-mock-adapter": "^1.22.0", "lodash": "^4.17.21", "qs": "^6.11.0", "tslib": "^2.4.1" @@ -12296,6 +12528,12 @@ } } }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -13886,6 +14124,27 @@ "@xtuc/long": "4.2.2" } }, + "@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "requires": {} + }, + "@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "requires": {} + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -14506,6 +14765,17 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -14533,6 +14803,12 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "columnify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", @@ -14875,6 +15151,12 @@ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, + "envinfo": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "dev": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -15039,6 +15321,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true + }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -15121,9 +15409,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==" }, "form-data": { "version": "4.0.0", @@ -15448,6 +15736,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -15513,6 +15807,15 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -15546,6 +15849,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, "istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -17073,6 +17382,12 @@ "universalify": "^2.0.0" } }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -17919,6 +18234,15 @@ "util-deprecate": "^1.0.1" } }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "requires": { + "resolve": "^1.20.0" + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -18127,6 +18451,15 @@ "has-property-descriptors": "^1.0.0" } }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -18855,6 +19188,46 @@ "webpack-sources": "^3.2.3" } }, + "webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + } + }, "webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -18896,6 +19269,12 @@ "isexe": "^2.0.0" } }, + "wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/package.json b/package.json index 04cfcb70..1112fff3 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "build:types": "node tools/cleanup types && tsc -p config/tsconfig.types.json" }, "dependencies": { - "@contentstack/core": "file:contentstack-core-0.0.1.tgz", + "@contentstack/core": "file:contentstack-core-1.0.0.tgz", "@contentstack/utils": "^1.1.3", "@types/humps": "^2.0.2", "dotenv": "^16.3.1", @@ -41,6 +41,7 @@ "jest-junit": "^16.0.0", "ts-jest": "^29.1.1", "ts-loader": "^9.4.4", - "ts-node": "10.9.1" + "ts-node": "10.9.1", + "webpack-cli": "^5.1.4" } } diff --git a/src/lib/query.ts b/src/lib/query.ts index 999a7fab..4ffc627b 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -1,6 +1,6 @@ import { AxiosInstance } from '@contentstack/core'; import { BaseQuery } from './base-query'; -import { BaseQueryParameters, QueryOperation, QueryOperator } from './types'; +import { BaseQueryParameters, QueryOperation, QueryOperator, TaxonomyQueryOperation } from './types'; export class Query extends BaseQuery { private _contentTypeUid?: string; @@ -35,11 +35,16 @@ export class Query extends BaseQuery { * const result = await query.where("field_UID", QueryOperation.MATCHES, ["field1", "field2"]).find() * @returns {Query} */ - where(fieldUid: string, queryOperation: QueryOperation, fields: string | string[] | number | number[]): Query { + where( + fieldUid: string, + queryOperation: QueryOperation | TaxonomyQueryOperation, + fields: string | string[] | number | number[] | object | boolean, + additionalData?: object + ): Query { if (queryOperation == QueryOperation.EQUALS) { this._parameters[fieldUid] = fields; } else { - const parameterValue: { [key in QueryOperation]?: string | string[] } = { [queryOperation]: fields }; + const parameterValue: { [key in QueryOperation]?: string | string[] } = { [queryOperation]: fields, ...additionalData }; this._parameters[fieldUid] = parameterValue; } diff --git a/src/lib/stack.ts b/src/lib/stack.ts index 1ad49ba1..dbf7ba4e 100644 --- a/src/lib/stack.ts +++ b/src/lib/stack.ts @@ -5,6 +5,7 @@ import { AssetQuery } from './asset-query'; import { ContentType } from './content-type'; import { ContentTypeQuery } from './contenttype-query'; import { synchronization } from './synchronization'; +import {TaxonomyQuery} from './taxonomy-query'; export class Stack { readonly config: StackConfig; @@ -61,6 +62,22 @@ export class Stack { return new ContentTypeQuery(this._client); } + /** + * @method Taxonomy + * @memberOf Stack + * @description Sets the url to /taxonomies/entries. Pass a query to fetch entries with taxonomies + * + * @returns {TaxonomyQuery} + * @example + * import contentstack from '@contentstack/typescript' + * + * const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); + * const taxonomy = stack.Taxonomy() // For taxonomy query object + */ + Taxonomy(): TaxonomyQuery { + return new TaxonomyQuery(this._client) + }; + /** * @method setLocale * @memberOf Stack diff --git a/src/lib/taxonomy-query.ts b/src/lib/taxonomy-query.ts new file mode 100644 index 00000000..4546f2a3 --- /dev/null +++ b/src/lib/taxonomy-query.ts @@ -0,0 +1,10 @@ +import { Query } from "./query"; +import { AxiosInstance } from "@contentstack/core"; + +export class TaxonomyQuery extends Query { + constructor(client: AxiosInstance) { + super(client, 'taxonomy'); // will need make changes to Query class so that CT uid is not mandatory + this._client = client; + this._urlPath = `/taxonomies/entries`; + } +}; \ No newline at end of file diff --git a/src/lib/types.ts b/src/lib/types.ts index a19d876d..793ff591 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -7,6 +7,7 @@ export enum Region { EU = 'eu', AZURE_NA = 'azure-na', AZURE_EU = 'azure-eu', + GCP_NA = 'gcp-na', } export interface StackConfig extends HttpClientParams { host?: string; @@ -130,6 +131,13 @@ export enum QueryOperation { MATCHES = '$regex', } +export enum TaxonomyQueryOperation { + ABOVE = '$above', + BELOW = '$below', + EQ_ABOVE = '$eq_above', + EQ_BELOW = '$eq_below' +} + export type BaseQueryParameters = { [key: string]: | string diff --git a/test/api/entries.spec.ts b/test/api/entries.spec.ts index 6ce55115..5fa18358 100644 --- a/test/api/entries.spec.ts +++ b/test/api/entries.spec.ts @@ -1,5 +1,6 @@ /* eslint-disable no-console */ /* eslint-disable promise/always-return */ +import { QueryOperation, QueryOperator, TaxonomyQueryOperation } from '../../src/lib/types'; import { Entries } from '../../src/lib/entries'; import { stackInstance } from '../utils/stack-instance'; import { TEntries } from './types'; @@ -56,6 +57,65 @@ describe('Entries API test cases', () => { expect(result.entries[0].uid).toBeDefined(); expect(result.entries[0].author).toBeDefined(); }); + + // //Content Type end point + it('CT Taxonomies Query: Get Entries With One Term', async () => { + let Query = makeEntries('source').query().where('taxonomies.one', QueryOperation.EQUALS, 'term_one'); + const data = await Query.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }); + + it('CT Taxonomies Query: Get Entries With Any Term ($in)', async () => { + let Query = makeEntries('source').query().where('taxonomies.one', QueryOperation.INCLUDES, ['term_one', 'term_two']); + const data = await Query.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + it('CT Taxonomies Query: Get Entries With Any Term ($or)', async () => { + let Query1 = makeEntries('source').query().where('taxonomies.one', QueryOperation.EQUALS, 'term_one'); + let Query2 = makeEntries('source').query().where('taxonomies.two', QueryOperation.EQUALS, 'term_two'); + let Query = makeEntries('source').query().queryOperator(QueryOperator.OR, Query1, Query2); + const data = await Query.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + it('CT Taxonomies Query: Get Entries With All Terms ($and)', async () => { + let Query1 = makeEntries('source').query().where('taxonomies.one', QueryOperation.EQUALS, 'term_one'); + let Query2 = makeEntries('source').query().where('taxonomies.two', QueryOperation.EQUALS, 'term_two'); + let Query = makeEntries('source').query().queryOperator(QueryOperator.AND, Query1, Query2); + const data = await Query.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + it('CT Taxonomies Query: Get Entries With Any Taxonomy Terms ($exists)', async () => { + let Query = makeEntries('source').query().where('taxonomies.one', QueryOperation.EXISTS, true); + const data = await Query.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + it('CT Taxonomies Query: Get Entries With Taxonomy Terms and Also Matching Its Children Term ($eq_below, level)', async () => { + let Query = makeEntries('source').query().where('taxonomies.one', TaxonomyQueryOperation.EQ_BELOW, 'term_one', {"levels": 1}); + const data = await Query.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + it('CT Taxonomies Query: Get Entries With Taxonomy Terms Children\'s and Excluding the term itself ($below, level)', async () => { + let Query = makeEntries('source').query().where('taxonomies.one', TaxonomyQueryOperation.BELOW, 'term_one', {"levels": 1}); + const data = await Query.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + it('CT Taxonomies Query: Get Entries With Taxonomy Terms and Also Matching Its Parent Term ($eq_above, level)', async () => { + let Query = makeEntries('source').query().where('taxonomies.one', TaxonomyQueryOperation.EQ_ABOVE, 'term_one', {"levels": 1}); + const data = await Query.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + it('CT Taxonomies Query: Get Entries With Taxonomy Terms Parent and Excluding the term itself ($above, level)', async () => { + let Query = makeEntries('source').query().where('taxonomies.one', TaxonomyQueryOperation.ABOVE, 'term_one_child', {"levels": 1}); + const data = await Query.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) }); function makeEntries(contentTypeUid = ''): Entries { const entries = stack.ContentType(contentTypeUid).Entry(); diff --git a/test/api/taxonomy-query.spec.ts b/test/api/taxonomy-query.spec.ts new file mode 100644 index 00000000..2d12a6d5 --- /dev/null +++ b/test/api/taxonomy-query.spec.ts @@ -0,0 +1,69 @@ +import { QueryOperation, QueryOperator, TaxonomyQueryOperation } from "../../src/lib/types"; +import { stackInstance } from "../utils/stack-instance"; +import dotenv from "dotenv" +import { TEntries } from "./types"; + +dotenv.config(); +jest.setTimeout(60000); + +const stack = stackInstance(); + +describe('Taxonomy API test cases', () => { + it('Taxonomies Endpoint: Get Entries With One Term', async () => { + let taxonomy = stack.Taxonomy().where('taxonomies.one', QueryOperation.EQUALS, 'term_one') + const data = await taxonomy.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }); + + it('Taxonomies Endpoint: Get Entries With Any Term ($in)', async () => { + let taxonomy = stack.Taxonomy().where('taxonomies.one', QueryOperation.INCLUDES, ['term_one', 'term_two']); + const data = await taxonomy.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + test('Taxonomies Endpoint: Get Entries With Any Term ($or)', async () => { + let taxonomyQuery1 = stack.Taxonomy().where('taxonomies.one', QueryOperation.EQUALS, 'term_one'); + let taxonomyQuery2 = stack.Taxonomy().where('taxonomies.two', QueryOperation.EQUALS, 'term_two'); + let taxonomyQuery = stack.Taxonomy().queryOperator(QueryOperator.OR, taxonomyQuery1, taxonomyQuery2); + const data = await taxonomyQuery.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + test('Taxonomies Endpoint: Get Entries With All Terms ($and)', async () => { + let taxonomyQuery1 = stack.Taxonomy().where('taxonomies.one', QueryOperation.EQUALS, 'term_one'); + let taxonomyQuery2 = stack.Taxonomy().where('taxonomies.two', QueryOperation.EQUALS, 'term_two'); + let taxonomyQuery = stack.Taxonomy().queryOperator(QueryOperator.AND, taxonomyQuery1, taxonomyQuery2); + const data = await taxonomyQuery.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + test('Taxonomies Endpoint: Get Entries With Any Taxonomy Terms ($exists)', async () => { + let taxonomy = stack.Taxonomy().where('taxonomies.one', QueryOperation.EXISTS, true) + const data = await taxonomy.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + test('Taxonomies Endpoint: Get Entries With Taxonomy Terms and Also Matching Its Children Term ($eq_below, level)', async () => { + let taxonomy = stack.Taxonomy().where('taxonomies.one', TaxonomyQueryOperation.EQ_BELOW, 'term_one', {"levels": 1}) + const data = await taxonomy.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + test('Taxonomies Endpoint: Get Entries With Taxonomy Terms Children\'s and Excluding the term itself ($below, level)', async () => { + let taxonomy = stack.Taxonomy().where('taxonomies.one', TaxonomyQueryOperation.BELOW, 'term_one', {"levels": 1}) + const data = await taxonomy.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + test('Taxonomies Endpoint: Get Entries With Taxonomy Terms and Also Matching Its Parent Term ($eq_above, level)', async () => { + let taxonomy = stack.Taxonomy().where('taxonomies.one', TaxonomyQueryOperation.EQ_ABOVE, 'term_one', {"levels": 1}) + const data = await taxonomy.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) + + test('Taxonomies Endpoint: Get Entries With Taxonomy Terms Parent and Excluding the term itself ($above, level)', async () => { + let taxonomy = stack.Taxonomy().where('taxonomies.one', TaxonomyQueryOperation.ABOVE, 'term_one_child', {"levels": 1}) + const data = await taxonomy.find(); + return expect(data.entries.length).toBeGreaterThan(0); + }) +}); \ No newline at end of file diff --git a/test/unit/entries.spec.ts b/test/unit/entries.spec.ts index f9f5c270..5a772ae6 100644 --- a/test/unit/entries.spec.ts +++ b/test/unit/entries.spec.ts @@ -4,6 +4,7 @@ import { Entries } from '../../src/lib/entries'; import MockAdapter from 'axios-mock-adapter'; import { entryFetchMock, entryFindMock } from '../utils/mocks'; import { Query } from '../../src/lib/query'; +import { QueryOperation, QueryOperator, TaxonomyQueryOperation } from '../../src/lib/types'; describe('Entries class', () => { let entry: Entries; @@ -84,4 +85,55 @@ describe('Entries class', () => { const returnedValue = await entry.find(); expect(returnedValue).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"}); + }); + + test('CT Taxonomy Query: Get entries with any term ($in)', () => { + const query = entry.query().where("taxonomies.taxonomy_uid", QueryOperation.INCLUDES, ["term_uid1", "term_uid2"]).getQuery({}); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": { "$in": ["term_uid1", "term_uid2"] }}); + }); + + test('CT Taxonomy Query: Get entries with any term ($or)', () => { + const query1 = new Entries(client, 'contentTypeUid').query().where("taxonomies.taxonomy_uid1",QueryOperation.EQUALS, "term_uid1"); + const query2 = new Entries(client, 'contentTypeUid').query().where("taxonomies.taxonomy_uid2",QueryOperation.EQUALS, "term_uid2"); + const query = entry.query().queryOperator(QueryOperator.OR, query1, query2); + expect(query._parameters).toEqual({ $or: [ {"taxonomies.taxonomy_uid1": "term_uid1"}, {"taxonomies.taxonomy_uid2": "term_uid2"} ] }); + }); + + test('CT Taxonomy Query: Get entries with all term ($and)', () => { + const query1 = new Entries(client, 'contentTypeUid').query().where("taxonomies.taxonomy_uid1", QueryOperation.EQUALS, "term_uid1"); + const query2 = new Entries(client, 'contentTypeUid').query().where("taxonomies.taxonomy_uid2", QueryOperation.EQUALS, "term_uid2"); + const query = entry.query().queryOperator(QueryOperator.AND, query1, query2); + expect(query._parameters).toEqual({$and: [ {"taxonomies.taxonomy_uid1": "term_uid1"}, {"taxonomies.taxonomy_uid2": "term_uid2"} ]}); + }); + + test('CT Taxonomy Query: Get entries with any taxonomy terms ($exists)', () => { + const query = entry.query().where("taxonomies.taxonomy_uid", QueryOperation.EXISTS, true); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": {$exists: true}}); + }); + + test('CT Taxonomy Query: Get entries with taxonomy terms and also matching its children terms ($eq_below, level)', () => { + const query = entry.query().where("taxonomies.taxonomy_uid", TaxonomyQueryOperation.EQ_BELOW, "term_uid", {"levels": 4}); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": {"$eq_below": "term_uid", "levels": 4 }}); + }); + + test('CT Taxonomy Query: Get Entries With Taxonomy Terms Children\'s and Excluding the term itself ($below, level) ', () => { + const query = entry.query().where("taxonomies.taxonomy_uid", TaxonomyQueryOperation.BELOW, "term_uid"); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": {"$below": "term_uid" }}); + }); + + test('CT Taxonomy Query: Get Entries With Taxonomy Terms and Also Matching Its Parent Term ($eq_above, level)', () => { + const query = entry.query().where("taxonomies.taxonomy_uid", TaxonomyQueryOperation.EQ_ABOVE, "term_uid", {"levels": 4}); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": {"$eq_above": "term_uid", "levels": 4 }}); + }); + + test('CT Taxonomy Query: Get Entries With Taxonomy Terms Parent and Excluding the term itself ($above, level)', () => { + const query = entry.query().where("taxonomies.taxonomy_uid", TaxonomyQueryOperation.ABOVE, "term_uid", {"levels": 4}); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": {"$above": "term_uid", "levels": 4 }}); + }); }); diff --git a/test/unit/taxonomy-query.spec.ts b/test/unit/taxonomy-query.spec.ts new file mode 100644 index 00000000..3ff30286 --- /dev/null +++ b/test/unit/taxonomy-query.spec.ts @@ -0,0 +1,81 @@ +import { TaxonomyQuery } from "../../src/lib/taxonomy-query"; +import { AxiosInstance, HttpClientParams, httpClient } from "@contentstack/core"; +import MockAdapter from 'axios-mock-adapter'; +import { QueryOperation, QueryOperator, TaxonomyQueryOperation } from "../../src/lib/types"; + +describe("Taxonomy-query class", () => { + let taxonomyQuery: TaxonomyQuery; + let client: AxiosInstance; + let clientConfig: HttpClientParams; + + beforeAll(() => { + clientConfig = { + apiKey: 'API_KEY', + accessToken: 'DELIVERY_TOKEN', + }; + client = httpClient(clientConfig); + }) + + beforeEach(() => { + taxonomyQuery = new TaxonomyQuery(client); + }) + + it('Taxonomy Query: Get entries with one term', () => { + const query = taxonomyQuery.where("taxonomies.taxonomy_uid", QueryOperation.EQUALS, "term_uid").getQuery({}); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": "term_uid"}); + }); + + it('Taxonomy Query: Get entries with any term ($in)', () => { + const query = taxonomyQuery.where("taxonomies.taxonomy_uid", QueryOperation.INCLUDES, ["term_uid1", "term_uid2"]).getQuery({}); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": { "$in": ["term_uid1", "term_uid2"] }}); + }); + + it('Taxonomy Query: Get entries with any term ($or)', () => { + const query1 = new TaxonomyQuery(client).where("taxonomies.taxonomy_uid1",QueryOperation.EQUALS, "term_uid1"); + const query2 = new TaxonomyQuery(client).where("taxonomies.taxonomy_uid2",QueryOperation.EQUALS, "term_uid2"); + const query = taxonomyQuery.queryOperator(QueryOperator.OR, query1, query2); + expect(query._parameters).toEqual({ $or: [ {"taxonomies.taxonomy_uid1": "term_uid1"}, {"taxonomies.taxonomy_uid2": "term_uid2"} ] }); + }); + + it('Taxonomy Query: Get entries with all term ($and)', () => { + const query1 = new TaxonomyQuery(client).where("taxonomies.taxonomy_uid1", QueryOperation.EQUALS, "term_uid1"); + const query2 = new TaxonomyQuery(client).where("taxonomies.taxonomy_uid2", QueryOperation.EQUALS, "term_uid2"); + const query = taxonomyQuery.queryOperator(QueryOperator.AND, query1, query2); + expect(query._parameters).toEqual({$and: [ {"taxonomies.taxonomy_uid1": "term_uid1"}, {"taxonomies.taxonomy_uid2": "term_uid2"} ]}); + }); + + it('Taxonomy Query: Get entries with any taxonomy terms ($exists)', () => { + const query = taxonomyQuery.where("taxonomies.taxonomy_uid", QueryOperation.EXISTS, true); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": {$exists: true}}); + }); + + it('Taxonomy Query: Get entries with taxonomy terms and also matching its children terms ($eq_below, level)', () => { + const query = taxonomyQuery.where("taxonomies.taxonomy_uid", TaxonomyQueryOperation.EQ_BELOW, "term_uid", {"levels": 4}); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": {"$eq_below": "term_uid", "levels": 4 }}); + }); + + test('Taxonomy Query: Get Entries With Taxonomy Terms Children\'s and Excluding the term itself ($below, level) ', () => { + const query = taxonomyQuery.where("taxonomies.taxonomy_uid", TaxonomyQueryOperation.BELOW, "term_uid"); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": {"$below": "term_uid" }}); + }); + + test('Taxonomy Query: Get Entries With Taxonomy Terms and Also Matching Its Parent Term ($eq_above, level)', () => { + const query = taxonomyQuery.where("taxonomies.taxonomy_uid", TaxonomyQueryOperation.EQ_ABOVE, "term_uid", {"levels": 4}); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": {"$eq_above": "term_uid", "levels": 4 }}); + }); + + test('Taxonomy Query: Get Entries With Taxonomy Terms Parent and Excluding the term itself ($above, level)', () => { + const query = taxonomyQuery.where("taxonomies.taxonomy_uid", TaxonomyQueryOperation.ABOVE, "term_uid", {"levels": 4}); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": {"$above": "term_uid", "levels": 4 }}); + }); + + test('Taxonomy Query: Get All Entries With Taxonomy For One Content type', () => { + const query = taxonomyQuery.where("taxonomies.taxonomy_uid", QueryOperation.EQUALS, "term_uid").where("_content_type", QueryOperation.EQUALS, "ct1"); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": "term_uid", "_content_type": "ct1"}); + }); + + test('Taxonomy Query: Get All Entries With Taxonomy For Multiple Content types', () => { + const query = taxonomyQuery.where("taxonomies.taxonomy_uid", QueryOperation.EQUALS, "term_uid").where("_content_type", QueryOperation.INCLUDES, ["ct1", "ct2"]); + expect(query._parameters).toEqual({"taxonomies.taxonomy_uid": "term_uid", "_content_type": {$in: ["ct1", "ct2"]}}); + }); +}) \ No newline at end of file