From 15088421ddac870d02d299d06a240c54bf9651a2 Mon Sep 17 00:00:00 2001 From: sunil-lakshman <104969541+sunil-lakshman@users.noreply.github.com> Date: Wed, 5 Nov 2025 16:02:32 +0530 Subject: [PATCH 1/3] Enh: add type casting helper for BaseQuery methods to return Query type --- package-lock.json | 232 -------------- src/lib/base-query.ts | 57 ++-- test/api/base-query-casting.specs.ts | 463 +++++++++++++++++++++++++++ test/unit/base-query.spec.ts | 221 ++++++++++++- 4 files changed, 715 insertions(+), 258 deletions(-) create mode 100644 test/api/base-query-casting.specs.ts diff --git a/package-lock.json b/package-lock.json index 78b7109..49edb4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3135,186 +3135,6 @@ } } }, - "node_modules/@nx/nx-darwin-arm64": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.3.5.tgz", - "integrity": "sha512-4I5UpZ/x2WO9OQyETXKjaYhXiZKUTYcLPewruRMODWu6lgTM9hHci0SqMQB+TWe3f80K8VT8J8x3+uJjvllGlg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-darwin-x64": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-18.3.5.tgz", - "integrity": "sha512-Drn6jOG237AD/s6OWPt06bsMj0coGKA5Ce1y5gfLhptOGk4S4UPE/Ay5YCjq+/yhTo1gDHzCHxH0uW2X9MN9Fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-freebsd-x64": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.3.5.tgz", - "integrity": "sha512-8tA8Yw0Iir4liFjffIFS5THTS3TtWY/No2tkVj91gwy/QQ/otvKbOyc5RCIPpbZU6GS3ZWfG92VyCSm06dtMFg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.3.5.tgz", - "integrity": "sha512-BrPGAHM9FCGkB9/hbvlJhe+qtjmvpjIjYixGIlUxL3gGc8E/ucTyCnz5pRFFPFQlBM7Z/9XmbHvGPoUi/LYn5A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.3.5.tgz", - "integrity": "sha512-/Xd0Q3LBgJeigJqXC/Jck/9l5b+fK+FCM0nRFMXgPXrhZPhoxWouFkoYl2F1Ofr+AQf4jup4DkVTB5r98uxSCA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm64-musl": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.3.5.tgz", - "integrity": "sha512-r18qd7pUrl1haAZ/e9Q+xaFTsLJnxGARQcf/Y76q+K2psKmiUXoRlqd3HAOw43KTllaUJ5HkzLq2pIwg3p+xBw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.3.5.tgz", - "integrity": "sha512-vYrikG6ff4I9cvr3Ysk3y3gjQ9cDcvr3iAr+4qqcQ4qVE+OLL2++JDS6xfPvG/TbS3GTQpyy2STRBwiHgxTeJw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.3.5.tgz", - "integrity": "sha512-6np86lcYy3+x6kkW/HrBHIdNWbUu/MIsvMuNH5UXgyFs60l5Z7Cocay2f7WOaAbTLVAr0W7p4RxRPamHLRwWFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.3.5.tgz", - "integrity": "sha512-H3p2ZVhHV1WQWTICrQUTplOkNId0y3c23X3A2fXXFDbWSBs0UgW7m55LhMcA9p0XZ7wDHgh+yFtVgu55TXLjug==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-win32-x64-msvc": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.3.5.tgz", - "integrity": "sha512-xFwKVTIXSgjdfxkpriqHv5NpmmFILTrWLEkUGSoimuRaAm1u15YWx/VmaUQ+UWuJnmgqvB/so4SMHSfNkq3ijA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/@nx/workspace": { "version": "17.3.2", "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-17.3.2.tgz", @@ -7953,43 +7773,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/jest-circus/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-circus/node_modules/dedent": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", @@ -11707,21 +11490,6 @@ "webidl-conversions": "^4.0.2" } }, - "node_modules/tsup/node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", diff --git a/src/lib/base-query.ts b/src/lib/base-query.ts index ed75ce6..a1347ed 100644 --- a/src/lib/base-query.ts +++ b/src/lib/base-query.ts @@ -2,6 +2,7 @@ import { AxiosInstance, getData } from '@contentstack/core'; import { Pagination } from './pagination'; import { FindResponse, params } from './types'; import { encodeQueryParams } from './utils'; +import type { Query } from './query'; export class BaseQuery extends Pagination { _parameters: params = {}; // Params of query class ?query={} @@ -10,6 +11,14 @@ export class BaseQuery extends Pagination { protected _urlPath!: string; protected _variants!: string; + /** + * Helper method to cast this instance to Query type + * @private + */ + protected asQuery(): Query { + return this as unknown as Query; + } + /** * @method includeCount * @memberof BaseQuery @@ -23,12 +32,12 @@ export class BaseQuery extends Pagination { * // OR * const asset = await stack.asset().includeCount().find() * - * @returns {BaseQuery} + * @returns {Query} */ - includeCount(): BaseQuery { + includeCount(): Query { this._queryParams.include_count = 'true'; - return this; + return this.asQuery(); } /** @@ -44,12 +53,12 @@ export class BaseQuery extends Pagination { * // OR * const asset = await stack.asset().orderByAscending().find() * - * @returns {BaseQuery} + * @returns {Query} */ - orderByAscending(key: string): BaseQuery { + orderByAscending(key: string): Query { this._queryParams.asc = key; - return this; + return this.asQuery(); } /** @@ -65,12 +74,12 @@ export class BaseQuery extends Pagination { * // OR * const asset = await stack.asset().orderByDescending().find() * - * @returns {BaseQuery} + * @returns {Query} */ - orderByDescending(key: string): BaseQuery { + orderByDescending(key: string): Query { this._queryParams.desc = key; - return this; + return this.asQuery(); } /** @@ -86,12 +95,12 @@ export class BaseQuery extends Pagination { * // OR * const asset = await stack.asset().limit(5).find() * - * @returns {BaseQuery} + * @returns {Query} */ - limit(key: number): BaseQuery { + limit(key: number): Query { this._queryParams.limit = key; - return this; + return this.asQuery(); } /** @@ -107,12 +116,12 @@ export class BaseQuery extends Pagination { * // OR * const asset = await stack.asset().skip(5).find() * - * @returns {BaseQuery} + * @returns {Query} */ - skip(key: number): BaseQuery { + skip(key: number): Query { this._queryParams.skip = key; - return this; + return this.asQuery(); } @@ -130,12 +139,12 @@ export class BaseQuery extends Pagination { * // OR * const asset = await stack.asset().param("key", "value").find() * - * @returns {BaseQuery} + * @returns {Query} */ - param(key: string, value: string | number): BaseQuery { + param(key: string, value: string | number): Query { this._queryParams[key] = value; - return this; + return this.asQuery(); } /** @@ -151,12 +160,12 @@ export class BaseQuery extends Pagination { * // OR * const asset = await stack.asset().addParams({"key": "value"}).find() * - * @returns {BaseQuery} + * @returns {Query} */ - addParams(paramObj: { [key: string]: string | boolean | number }): BaseQuery { + addParams(paramObj: { [key: string]: string | boolean | number }): Query { this._queryParams = { ...this._queryParams, ...paramObj }; - return this; + return this.asQuery(); } /** @@ -172,12 +181,12 @@ export class BaseQuery extends Pagination { * // OR * const asset = await stack.asset().removeParam("query_param_key").find() * - * @returns {BaseQuery} + * @returns {Query} */ - removeParam(key: string): BaseQuery { + removeParam(key: string): Query { delete this._queryParams[key]; - return this; + return this.asQuery(); } /** diff --git a/test/api/base-query-casting.specs.ts b/test/api/base-query-casting.specs.ts new file mode 100644 index 0000000..b9983e1 --- /dev/null +++ b/test/api/base-query-casting.specs.ts @@ -0,0 +1,463 @@ +import { QueryOperation } from "../../src/lib/types"; +import { stackInstance } from "../utils/stack-instance"; +import { TEntries, TEntry, TAssets } from "./types"; + +const stack = stackInstance(); + +function makeQuery(contentType: string, queryObj?: { [key: string]: any }) { + return stack.contentType(contentType).entry().query(queryObj); +} + +function makeAssetQuery() { + return stack.asset().query(); +} + +describe("BaseQuery Casting API Tests", () => { + describe("Query Type Return Enhancement", () => { + it("should support method chaining with Query type for entries", async () => { + const result = await stack + .contentType("blog_post") + .entry() + .query() + .limit(5) + .skip(0) + .includeCount() + .orderByAscending("title") + .find(); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + if (result.count !== undefined) { + expect(typeof result.count).toBe("number"); + } + }); + + it("should support method chaining with Query type for assets", async () => { + const result = await stack + .asset() + .query() + .limit(5) + .skip(0) + .includeCount() + .orderByDescending("created_at") + .find(); + + expect(result).toBeDefined(); + expect(result.assets).toBeDefined(); + }); + + it("should chain multiple BaseQuery methods and maintain Query type", async () => { + const query = makeQuery("blog_post"); + + // Chain all BaseQuery methods + const chainedQuery = query + .limit(10) + .skip(5) + .includeCount() + .orderByAscending("title") + .orderByDescending("created_at") + .param("locale", "en-us") + .addParams({ include_count: "true" }) + .removeParam("locale"); + + // Verify the query is still functional + const result = await chainedQuery.find(); + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should support method chaining with where clauses and BaseQuery methods", async () => { + const result = await makeQuery("blog_post") + .where("title", QueryOperation.EQUALS, "The future of business with AI") + .limit(5) + .skip(0) + .includeCount() + .orderByAscending("title") + .find(); + + expect(result).toBeDefined(); + if (result.entries && result.entries.length > 0) { + expect(result.entries[0].title).toBeDefined(); + } + }); + + it("should support method chaining with asset queries", async () => { + const result = await makeAssetQuery() + .limit(3) + .skip(1) + .includeCount() + .orderByAscending("filename") + .find(); + + expect(result).toBeDefined(); + expect(result.assets).toBeDefined(); + }); + + it("should handle complex method chaining with multiple query operations", async () => { + const result = await makeQuery("blog_post") + .where("_version", QueryOperation.IS_GREATER_THAN, 1) + .limit(5) + .skip(0) + .includeCount() + .orderByDescending("created_at") + .param("locale", "en-us") + .find(); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should support method chaining across different query types", async () => { + // Test entry query + const entryResult = await makeQuery("blog_post") + .limit(2) + .includeCount() + .find(); + expect(entryResult).toBeDefined(); + + // Test asset query + const assetResult = await makeAssetQuery() + .limit(2) + .includeCount() + .find(); + expect(assetResult).toBeDefined(); + }); + }); + + describe("Encoding Enhancement - API Integration Tests", () => { + it("should handle special characters in query parameters with encoding", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + title: "Test & Encode", + description: "URL with ?param=value&other=test" + }; + + const result = await query.find(true); + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle unicode characters with encoding in API calls", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + title: "Café français", + description: "Testing unicode: ñáéíóú 中文" + }; + + const result = await query.find(true); + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should encode nested objects in real API calls", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + author: { + name: "John & Jane", + email: "user@example.com?ref=test" + } + }; + + const result = await query.find(true); + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle encoding with method chaining", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + title: "Test & Special Characters" + }; + + const result = await query + .limit(5) + .skip(0) + .includeCount() + .find(true); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle encoding with where clauses", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + category: "news & tech" + }; + + const result = await query + .where("title", QueryOperation.EQUALS, "The future of business with AI") + .find(true); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle encoding with asset queries", async () => { + const query = makeAssetQuery(); + query._parameters = { + filename: "test & file.jpg", + description: "Image with ?special=chars" + }; + + const result = await query + .limit(5) + .find(true); + + expect(result).toBeDefined(); + expect(result.assets).toBeDefined(); + }); + + it("should handle mixed encoding scenarios with complex queries", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + $and: [ + { title: { $regex: "test & pattern" } }, + { category: "news+tech" }, + { author: { name: "John & Jane" } } + ] + }; + + const result = await query + .limit(10) + .includeCount() + .orderByAscending("title") + .find(true); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should maintain backward compatibility - no encoding by default", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + title: "Simple Title" + }; + + // Default behavior (no encoding) + const result1 = await query.find(); + expect(result1).toBeDefined(); + expect(result1.entries).toBeDefined(); + + // Explicitly no encoding + const result2 = await query.find(false); + expect(result2).toBeDefined(); + expect(result2.entries).toBeDefined(); + }); + + it("should handle encoding with pagination", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + title: "Test & Pagination" + }; + + const result = await query + .limit(5) + .skip(0) + .includeCount() + .find(true); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + if (result.count !== undefined) { + expect(typeof result.count).toBe("number"); + } + }); + + it("should handle encoding with sorting", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + category: "news & updates" + }; + + const result = await query + .orderByAscending("title") + .orderByDescending("created_at") + .find(true); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle encoding with param() method", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + title: "Test & Param" + }; + + const result = await query + .param("locale", "en-us") + .param("include_count", "true") + .find(true); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle encoding with addParams() method", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + title: "Test & AddParams" + }; + + const result = await query + .addParams({ + locale: "en-us", + include_count: "true" + }) + .find(true); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle encoding with deeply nested objects", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + metadata: { + author: { + name: "John & Jane", + contact: { + email: "user@example.com?ref=test" + } + } + } + }; + + const result = await query.find(true); + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle encoding with empty parameters", async () => { + const query = makeQuery("blog_post"); + query._parameters = {}; + + const result = await query + .limit(5) + .find(true); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle encoding with array values in parameters", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + tags: ["tech & news", "development + coding"] + }; + + const result = await query.find(true); + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle encoding with number and boolean values", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + count: 42, + active: true, + title: "Test & Title" + }; + + const result = await query.find(true); + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + }); + + describe("Combined Enhancement Tests", () => { + it("should combine Query type return and encoding in single query", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + title: "Test & Combined" + }; + + const result = await query + .limit(5) + .skip(0) + .includeCount() + .orderByAscending("title") + .param("locale", "en-us") + .find(true); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle complex query with both enhancements", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + $and: [ + { title: { $regex: "test & pattern" } }, + { author: { name: "John & Jane", email: "user@example.com" } } + ] + }; + + const result = await query + .where("_version", QueryOperation.IS_GREATER_THAN, 1) + .limit(10) + .skip(0) + .includeCount() + .orderByDescending("created_at") + .addParams({ locale: "en-us" }) + .find(true); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle method chaining with encoding across different content types", async () => { + // Test with blog_post + const blogQuery = makeQuery("blog_post"); + blogQuery._parameters = { category: "news & tech" }; + const blogResult = await blogQuery + .limit(3) + .includeCount() + .find(true); + expect(blogResult).toBeDefined(); + + // Test with assets + const assetQuery = makeAssetQuery(); + assetQuery._parameters = { filename: "test & file.jpg" }; + const assetResult = await assetQuery + .limit(3) + .includeCount() + .find(true); + expect(assetResult).toBeDefined(); + }); + + it("should handle encoding with removeParam() in method chain", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + title: "Test & RemoveParam" + }; + + const result = await query + .param("locale", "en-us") + .param("include_count", "true") + .removeParam("include_count") + .find(true); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + + it("should handle encoding with multiple addParams() calls", async () => { + const query = makeQuery("blog_post"); + query._parameters = { + title: "Test & MultipleParams" + }; + + const result = await query + .addParams({ locale: "en-us" }) + .addParams({ include_count: "true" }) + .find(true); + + expect(result).toBeDefined(); + expect(result.entries).toBeDefined(); + }); + }); +}); + + diff --git a/test/unit/base-query.spec.ts b/test/unit/base-query.spec.ts index 6f8b943..3d3ba58 100644 --- a/test/unit/base-query.spec.ts +++ b/test/unit/base-query.spec.ts @@ -1,4 +1,5 @@ import { BaseQuery } from '../../src/lib/base-query'; +import { Query } from '../../src/lib/query'; import { httpClient, AxiosInstance } from '@contentstack/core'; import { MOCK_CLIENT_OPTIONS } from '../utils/constant'; import MockAdapter from 'axios-mock-adapter'; @@ -73,6 +74,80 @@ describe('BaseQuery class', () => { baseQuery.removeParam('key2'); expect(baseQuery._queryParams).toEqual({ key1: 'value1' }); }); + + describe('Enhancement: Methods return Query type', () => { + it('should return Query-compatible type from includeCount()', () => { + const returnedValue = baseQuery.includeCount(); + + // Should be instance of BaseQuery (Query extends BaseQuery) + expect(returnedValue).toBeInstanceOf(BaseQuery); + expect(baseQuery._queryParams.include_count).toBe('true'); + }); + + it('should return Query-compatible type from orderByAscending()', () => { + const returnedValue = baseQuery.orderByAscending('title'); + + expect(returnedValue).toBeInstanceOf(BaseQuery); + expect(baseQuery._queryParams.asc).toBe('title'); + }); + + it('should return Query-compatible type from orderByDescending()', () => { + const returnedValue = baseQuery.orderByDescending('created_at'); + + expect(returnedValue).toBeInstanceOf(BaseQuery); + expect(baseQuery._queryParams.desc).toBe('created_at'); + }); + + it('should return Query-compatible type from limit()', () => { + const returnedValue = baseQuery.limit(10); + + expect(returnedValue).toBeInstanceOf(BaseQuery); + expect(baseQuery._queryParams.limit).toBe(10); + }); + + it('should return Query-compatible type from skip()', () => { + const returnedValue = baseQuery.skip(5); + + expect(returnedValue).toBeInstanceOf(BaseQuery); + expect(baseQuery._queryParams.skip).toBe(5); + }); + + it('should return Query-compatible type from param()', () => { + const returnedValue = baseQuery.param('locale', 'en-us'); + + expect(returnedValue).toBeInstanceOf(BaseQuery); + expect(baseQuery._queryParams.locale).toBe('en-us'); + }); + + it('should return Query-compatible type from addParams()', () => { + const returnedValue = baseQuery.addParams({ include_count: 'true' }); + + expect(returnedValue).toBeInstanceOf(BaseQuery); + expect(baseQuery._queryParams.include_count).toBe('true'); + }); + + it('should return Query-compatible type from removeParam()', () => { + baseQuery.param('key1', 'value1'); + const returnedValue = baseQuery.removeParam('key1'); + + expect(returnedValue).toBeInstanceOf(BaseQuery); + expect(baseQuery._queryParams.key1).toBeUndefined(); + }); + + it('should support method chaining with Query type', () => { + const chained = baseQuery + .limit(5) + .skip(0) + .includeCount() + .orderByAscending('title'); + + expect(chained).toBeInstanceOf(BaseQuery); + expect(baseQuery._queryParams.limit).toBe(5); + expect(baseQuery._queryParams.skip).toBe(0); + expect(baseQuery._queryParams.include_count).toBe('true'); + expect(baseQuery._queryParams.asc).toBe('title'); + }); + }); }); class TestableBaseQuery extends BaseQuery { @@ -114,14 +189,113 @@ describe('BaseQuery find method', () => { }); it('should call find with encode parameter true', async () => { - mockClient.onGet('/content_types/test_uid/entries').reply(200, entryFindMock); + mockClient.onGet('/content_types/test_uid/entries').reply((config) => { + // Verify that query parameters are encoded + const queryParam = config.params?.query; + expect(queryParam).toBeDefined(); + // When encoded, special characters should be URL encoded + return [200, entryFindMock]; + }); - query.setParameters({ title: 'Test' }); + query.setParameters({ title: 'Test & Encode' }); const result = await query.find(true); expect(result).toEqual(entryFindMock); }); + it('should encode query parameters when encode is true', async () => { + mockClient.onGet('/content_types/test_uid/entries').reply((config) => { + const queryParam = config.params?.query; + // Verify encoding: 'Test & Value' should be encoded + expect(queryParam.title).toBe('Test%20%26%20Value'); + return [200, entryFindMock]; + }); + + query.setParameters({ title: 'Test & Value' }); + await query.find(true); + }); + + it('should not encode query parameters when encode is false', async () => { + mockClient.onGet('/content_types/test_uid/entries').reply((config) => { + const queryParam = config.params?.query; + // Verify no encoding: raw value should be present + expect(queryParam.title).toBe('Test & Value'); + return [200, entryFindMock]; + }); + + query.setParameters({ title: 'Test & Value' }); + await query.find(false); + }); + + it('should not encode query parameters when encode is not provided', async () => { + mockClient.onGet('/content_types/test_uid/entries').reply((config) => { + const queryParam = config.params?.query; + // Verify no encoding by default + expect(queryParam.title).toBe('Test & Value'); + return [200, entryFindMock]; + }); + + query.setParameters({ title: 'Test & Value' }); + await query.find(); + }); + + it('should encode nested query parameters when encode is true', async () => { + mockClient.onGet('/content_types/test_uid/entries').reply((config) => { + const queryParam = config.params?.query; + // Verify nested object encoding + expect(queryParam.nested.name).toBe('John%20%26%20Jane'); + expect(queryParam.nested.deeply.nested).toBe('value%20%2B%20symbols'); + return [200, entryFindMock]; + }); + + query.setParameters({ + nested: { + name: 'John & Jane', + deeply: { + nested: 'value + symbols' + } + } + }); + await query.find(true); + }); + + it('should encode special characters correctly', async () => { + mockClient.onGet('/content_types/test_uid/entries').reply((config) => { + const queryParam = config.params?.query; + // Test various special characters + expect(queryParam.symbols).toBe('hello%40world.com%3Fparam%3Dvalue'); + expect(queryParam.unicode).toBe('caf%C3%A9%20fran%C3%A7ais'); + return [200, entryFindMock]; + }); + + query.setParameters({ + symbols: 'hello@world.com?param=value', + unicode: 'café français' + }); + await query.find(true); + }); + + it('should preserve non-string values when encoding', async () => { + mockClient.onGet('/content_types/test_uid/entries').reply((config) => { + const queryParam = config.params?.query; + // Numbers and booleans should not be encoded + expect(queryParam.numberValue).toBe(42); + expect(queryParam.booleanTrue).toBe(true); + expect(queryParam.booleanFalse).toBe(false); + // Strings should be encoded + expect(queryParam.stringValue).toBe('encode%20me'); + return [200, entryFindMock]; + }); + + query.setParameters({ + stringValue: 'encode me', + numberValue: 42, + booleanTrue: true, + booleanFalse: false + }); + await query.find(true); + }); + it('should call find without parameters', async () => { mockClient.onGet('/content_types/test_uid/entries').reply(200, entryFindMock); @@ -178,4 +352,47 @@ describe('BaseQuery find method', () => { // Verify that URL path is empty (testing the null check in extractContentTypeUidFromUrl) expect(queryWithoutUrlPath).toBeInstanceOf(TestableBaseQuery); }); + + it('should handle find with empty parameters and encode', async () => { + mockClient.onGet('/content_types/test_uid/entries').reply(200, entryFindMock); + + query.setParameters({}); + const result = await query.find(true); + + expect(result).toEqual(entryFindMock); + }); + + it('should combine query params and _parameters correctly when encoding', async () => { + mockClient.onGet('/content_types/test_uid/entries').reply((config) => { + const params = config.params; + // Verify both query params and _parameters are included + expect(params.limit).toBe(10); + expect(params.query).toBeDefined(); + expect(params.query.title).toBe('Test%20Title'); + return [200, entryFindMock]; + }); + + query.setParameters({ title: 'Test Title' }); + query.limit(10); + await query.find(true); + }); + + it('should handle find with complex nested parameters and encoding', async () => { + mockClient.onGet('/content_types/test_uid/entries').reply((config) => { + const queryParam = config.params?.query; + expect(queryParam.complex.nested.deep.value).toBe('encoded%20value'); + return [200, entryFindMock]; + }); + + query.setParameters({ + complex: { + nested: { + deep: { + value: 'encoded value' + } + } + } + }); + await query.find(true); + }); }); \ No newline at end of file From 5a465b2fa78c4c4ff24efa77125004ebcef59fde Mon Sep 17 00:00:00 2001 From: sunil-lakshman <104969541+sunil-lakshman@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:01:40 +0530 Subject: [PATCH 2/3] Added console.error mock to suppress the error output --- test/unit/content-validation-comprehensive.spec.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/unit/content-validation-comprehensive.spec.ts b/test/unit/content-validation-comprehensive.spec.ts index 2ed1147..5bebc36 100644 --- a/test/unit/content-validation-comprehensive.spec.ts +++ b/test/unit/content-validation-comprehensive.spec.ts @@ -872,6 +872,9 @@ describe('Content Validation - Comprehensive Test Suite', () => { describe('Content Validation Edge Cases', () => { it('should handle null and undefined values gracefully', () => { + // Mock console.error to suppress validation messages + const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); + const query = new Query(client, {}, {}, '', 'blog_post'); // Test with null values @@ -881,6 +884,9 @@ describe('Content Validation - Comprehensive Test Suite', () => { // Test with empty strings expect(() => query.equalTo('title', '')).not.toThrow(); expect(() => query.equalTo('view_count', 0)).not.toThrow(); + + // Restore console.error + consoleSpy.mockRestore(); }); it('should validate content type without schema', async () => { From ffbbd1746e3a4d8b93a8dd9858be35c802eff5a5 Mon Sep 17 00:00:00 2001 From: sunil-lakshman <104969541+sunil-lakshman@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:15:00 +0530 Subject: [PATCH 3/3] Updated package-lock file --- package-lock.json | 502 +++++++++++++++++++++++++++++++++------------- 1 file changed, 367 insertions(+), 135 deletions(-) diff --git a/package-lock.json b/package-lock.json index 49edb4a..e28dc19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1890,12 +1890,12 @@ "license": "MIT" }, "node_modules/@contentstack/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@contentstack/core/-/core-1.3.1.tgz", - "integrity": "sha512-RuaqNMZreN/ihnFJtGvtxK5NYuQuar1qBwWf0wqMsESHZCp+7Ohk1iSwq5E+7JN8Rzz40eiBiXklllzhoC0+5g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@contentstack/core/-/core-1.3.2.tgz", + "integrity": "sha512-GdS/SUR11DEvICME+YpPRzRJpLl+2xqWZWjMcXcNP1LeNVXoQkMGFfh8u/pg8HSI58SqZ/m0YJnJz5dprhZLxA==", "license": "MIT", "dependencies": { - "axios": "^1.11.0", + "axios": "^1.12.2", "axios-mock-adapter": "^2.1.0", "husky": "^9.1.7", "lodash": "^4.17.21", @@ -1957,9 +1957,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", - "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -1974,9 +1974,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", - "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -1991,9 +1991,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", - "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -2008,9 +2008,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", - "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -2025,9 +2025,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", - "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -2042,9 +2042,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", - "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -2059,9 +2059,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", - "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -2076,9 +2076,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", - "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -2093,9 +2093,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", - "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -2110,9 +2110,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", - "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -2127,9 +2127,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", - "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -2144,9 +2144,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", - "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -2161,9 +2161,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", - "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -2178,9 +2178,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", - "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -2195,9 +2195,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", - "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -2212,9 +2212,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", - "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -2229,9 +2229,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", - "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -2246,9 +2246,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", - "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], @@ -2263,9 +2263,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", - "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -2280,9 +2280,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", - "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], @@ -2297,9 +2297,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", - "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -2314,9 +2314,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", - "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", "cpu": [ "arm64" ], @@ -2331,9 +2331,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", - "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -2348,9 +2348,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", - "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -2365,9 +2365,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", - "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -2382,9 +2382,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", - "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -3135,6 +3135,186 @@ } } }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.3.5.tgz", + "integrity": "sha512-4I5UpZ/x2WO9OQyETXKjaYhXiZKUTYcLPewruRMODWu6lgTM9hHci0SqMQB+TWe3f80K8VT8J8x3+uJjvllGlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-18.3.5.tgz", + "integrity": "sha512-Drn6jOG237AD/s6OWPt06bsMj0coGKA5Ce1y5gfLhptOGk4S4UPE/Ay5YCjq+/yhTo1gDHzCHxH0uW2X9MN9Fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.3.5.tgz", + "integrity": "sha512-8tA8Yw0Iir4liFjffIFS5THTS3TtWY/No2tkVj91gwy/QQ/otvKbOyc5RCIPpbZU6GS3ZWfG92VyCSm06dtMFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.3.5.tgz", + "integrity": "sha512-BrPGAHM9FCGkB9/hbvlJhe+qtjmvpjIjYixGIlUxL3gGc8E/ucTyCnz5pRFFPFQlBM7Z/9XmbHvGPoUi/LYn5A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.3.5.tgz", + "integrity": "sha512-/Xd0Q3LBgJeigJqXC/Jck/9l5b+fK+FCM0nRFMXgPXrhZPhoxWouFkoYl2F1Ofr+AQf4jup4DkVTB5r98uxSCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.3.5.tgz", + "integrity": "sha512-r18qd7pUrl1haAZ/e9Q+xaFTsLJnxGARQcf/Y76q+K2psKmiUXoRlqd3HAOw43KTllaUJ5HkzLq2pIwg3p+xBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.3.5.tgz", + "integrity": "sha512-vYrikG6ff4I9cvr3Ysk3y3gjQ9cDcvr3iAr+4qqcQ4qVE+OLL2++JDS6xfPvG/TbS3GTQpyy2STRBwiHgxTeJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.3.5.tgz", + "integrity": "sha512-6np86lcYy3+x6kkW/HrBHIdNWbUu/MIsvMuNH5UXgyFs60l5Z7Cocay2f7WOaAbTLVAr0W7p4RxRPamHLRwWFA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.3.5.tgz", + "integrity": "sha512-H3p2ZVhHV1WQWTICrQUTplOkNId0y3c23X3A2fXXFDbWSBs0UgW7m55LhMcA9p0XZ7wDHgh+yFtVgu55TXLjug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.3.5.tgz", + "integrity": "sha512-xFwKVTIXSgjdfxkpriqHv5NpmmFILTrWLEkUGSoimuRaAm1u15YWx/VmaUQ+UWuJnmgqvB/so4SMHSfNkq3ijA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/@nx/workspace": { "version": "17.3.2", "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-17.3.2.tgz", @@ -4199,9 +4379,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", - "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", + "version": "24.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", + "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", "dev": true, "license": "MIT", "dependencies": { @@ -4856,9 +5036,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz", - "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -5104,9 +5284,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.20", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz", - "integrity": "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==", + "version": "2.8.25", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.25.tgz", + "integrity": "sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5351,9 +5531,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001751", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", - "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "version": "1.0.30001753", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", + "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==", "dev": true, "funding": [ { @@ -6020,9 +6200,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.243", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.243.tgz", - "integrity": "sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==", + "version": "1.5.245", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.245.tgz", + "integrity": "sha512-rdmGfW47ZhL/oWEJAY4qxRtdly2B98ooTJ0pdEI4jhVLZ6tNf8fPtov2wS1IRKwFJT92le3x4Knxiwzl7cPPpQ==", "dev": true, "license": "ISC" }, @@ -6107,9 +6287,9 @@ } }, "node_modules/envinfo": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.19.0.tgz", - "integrity": "sha512-DoSM9VyG6O3vqBf+p3Gjgr/Q52HYBBtO3v+4koAxt1MnWr+zEnxE+nke/yXS4lt2P4SYCHQ4V3f1i88LQVOpAw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.20.0.tgz", + "integrity": "sha512-+zUomDcLXsVkQ37vUqWBvQwLaLlj8eZPSi61llaEFAVBY5mhcXdaSw1pSJVl4yTYD5g/gEfpNl28YYk4IPvrrg==", "dev": true, "license": "MIT", "bin": { @@ -6183,9 +6363,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", - "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6196,32 +6376,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.11", - "@esbuild/android-arm": "0.25.11", - "@esbuild/android-arm64": "0.25.11", - "@esbuild/android-x64": "0.25.11", - "@esbuild/darwin-arm64": "0.25.11", - "@esbuild/darwin-x64": "0.25.11", - "@esbuild/freebsd-arm64": "0.25.11", - "@esbuild/freebsd-x64": "0.25.11", - "@esbuild/linux-arm": "0.25.11", - "@esbuild/linux-arm64": "0.25.11", - "@esbuild/linux-ia32": "0.25.11", - "@esbuild/linux-loong64": "0.25.11", - "@esbuild/linux-mips64el": "0.25.11", - "@esbuild/linux-ppc64": "0.25.11", - "@esbuild/linux-riscv64": "0.25.11", - "@esbuild/linux-s390x": "0.25.11", - "@esbuild/linux-x64": "0.25.11", - "@esbuild/netbsd-arm64": "0.25.11", - "@esbuild/netbsd-x64": "0.25.11", - "@esbuild/openbsd-arm64": "0.25.11", - "@esbuild/openbsd-x64": "0.25.11", - "@esbuild/openharmony-arm64": "0.25.11", - "@esbuild/sunos-x64": "0.25.11", - "@esbuild/win32-arm64": "0.25.11", - "@esbuild/win32-ia32": "0.25.11", - "@esbuild/win32-x64": "0.25.11" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/esbuild-plugin-file-path-extensions": { @@ -7773,6 +7953,43 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-circus/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/jest-circus/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-circus/node_modules/dedent": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", @@ -9086,9 +9303,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", - "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, @@ -10815,9 +11032,9 @@ } }, "node_modules/terser": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", - "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "dev": true, "license": "BSD-2-Clause", "peer": true, @@ -11490,6 +11707,21 @@ "webidl-conversions": "^4.0.2" } }, + "node_modules/tsup/node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",