From cd33e177751a15b2835255571afb59ec08852599 Mon Sep 17 00:00:00 2001 From: Christel Westerberg Date: Wed, 15 May 2024 13:20:43 +0200 Subject: [PATCH] fix: install clean-deep --- package-lock.json | 29 +++++++++++++++++++ package.json | 3 +- .../routers/contentstack/accountPage/query.ts | 7 +++-- .../routers/contentstack/loyaltyPage/query.ts | 5 +++- server/routers/utils/index.ts | 15 ++++++++++ utils/contentType.ts | 23 --------------- 6 files changed, 55 insertions(+), 27 deletions(-) create mode 100644 server/routers/utils/index.ts diff --git a/package-lock.json b/package-lock.json index 3f28fd1bb..1c08c991b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "@trpc/react-query": "^11.0.0-next-beta.318", "@trpc/server": "^11.0.0-next-beta.318", "class-variance-authority": "^0.7.0", + "clean-deep": "^3.4.0", "dayjs": "^1.11.10", "deepmerge": "^4.3.1", "graphql": "^16.8.1", @@ -3494,6 +3495,19 @@ "url": "https://joebell.co.uk" } }, + "node_modules/clean-deep": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/clean-deep/-/clean-deep-3.4.0.tgz", + "integrity": "sha512-Lo78NV5ItJL/jl+B5w0BycAisaieJGXK1qYi/9m4SjR8zbqmrUtO7Yhro40wEShGmmxs/aJLI/A+jNhdkXK8mw==", + "dependencies": { + "lodash.isempty": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.transform": "^4.6.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -7503,6 +7517,16 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, + "node_modules/lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -7521,6 +7545,11 @@ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "dev": true }, + "node_modules/lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha512-LO37ZnhmBVx0GvOU/caQuipEh4GN82TcWv3yHlebGDgOxbxiwwzW5Pcx2AcvpIv2WmvmSMoC492yQFNhy/l/UQ==" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", diff --git a/package.json b/package.json index 1b57ae279..4560cf305 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "@trpc/react-query": "^11.0.0-next-beta.318", "@trpc/server": "^11.0.0-next-beta.318", "class-variance-authority": "^0.7.0", + "clean-deep": "^3.4.0", "dayjs": "^1.11.10", "deepmerge": "^4.3.1", "graphql": "^16.8.1", @@ -73,4 +74,4 @@ "engines": { "node": "18" } -} \ No newline at end of file +} diff --git a/server/routers/contentstack/accountPage/query.ts b/server/routers/contentstack/accountPage/query.ts index 5102e836c..350dc6719 100644 --- a/server/routers/contentstack/accountPage/query.ts +++ b/server/routers/contentstack/accountPage/query.ts @@ -6,13 +6,13 @@ import { request } from "@/lib/graphql/request" import { badRequestError, internalServerError } from "@/server/errors/trpc" import { publicProcedure, router } from "@/server/trpc" -import { removeEmptyObjects } from "@/utils/contentType" import { generateRefsResponseTag, generateTag, generateTags, } from "@/utils/generateTag" +import { removeEmptyObjects } from "../../utils" import { getAccountPageInput } from "./input" import { type AccountPage, @@ -51,6 +51,9 @@ export const accountPageQueryRouter = router({ throw internalServerError() } + // Remove empty objects from a fetched content type. Needed since + // Contentstack returns empty objects for all non queried blocks in modular blocks. + // This is an ongoing support case in Contentstack, ticker number #00031579 const cleanedData = removeEmptyObjects(refsResponse.data) const validatedAccountPageRefs = @@ -71,7 +74,7 @@ export const accountPageQueryRouter = router({ validatedAccountPageRefs.data.all_account_page.items[0].system.uid ) ) - const response = await request( + const response = await request( GetAccountPage, { locale: lang, diff --git a/server/routers/contentstack/loyaltyPage/query.ts b/server/routers/contentstack/loyaltyPage/query.ts index 0466b46ca..99521ba79 100644 --- a/server/routers/contentstack/loyaltyPage/query.ts +++ b/server/routers/contentstack/loyaltyPage/query.ts @@ -7,13 +7,13 @@ import { _ } from "@/lib/translation" import { badRequestError, internalServerError } from "@/server/errors/trpc" import { publicProcedure, router } from "@/server/trpc" -import { removeEmptyObjects } from "@/utils/contentType" import { generateRefsResponseTag, generateTag, generateTags, } from "@/utils/generateTag" +import { removeEmptyObjects } from "../../utils" import { getLoyaltyPageInput } from "./input" import { type LoyaltyPage, @@ -56,6 +56,9 @@ export const loyaltyPageQueryRouter = router({ throw internalServerError() } + // Remove empty objects from a fetched content type. Needed since + // Contentstack returns empty objects for all non queried blocks in modular blocks. + // This is an ongoing support case in Contentstack, ticker number #00031579 const cleanedData = removeEmptyObjects(refsResponse.data) const validatedLoyaltyPageRefs = diff --git a/server/routers/utils/index.ts b/server/routers/utils/index.ts new file mode 100644 index 000000000..01019aa41 --- /dev/null +++ b/server/routers/utils/index.ts @@ -0,0 +1,15 @@ +import cleaner from "clean-deep" + +/** + * Function to remove empty objects from a fetched content type. + * Used since Contentstack returns empty objects for all non + * queried in modular blocks. + */ +export function removeEmptyObjects(obj: T) { + return cleaner(obj, { + emptyArrays: false, + emptyStrings: false, + nullValues: false, + undefinedValues: false, + }) +} diff --git a/utils/contentType.ts b/utils/contentType.ts index 2093b1a7d..656c9731c 100644 --- a/utils/contentType.ts +++ b/utils/contentType.ts @@ -53,26 +53,3 @@ export async function getContentTypeByPathName( return PageTypeEnum.CurrentBlocksPage } } -/** - * Function to remove empty objects from a fetched content type. - * Used since Contentstack returns empty objects for all non - * queried in modular blocks. - */ -export function removeEmptyObjects(obj: T): T { - const copy = obj as any - - for (let key in copy) { - if (typeof copy[key] === "object" && copy[key] !== null) { - copy[key] = removeEmptyObjects(copy[key]) - if (Object.keys(copy[key]).length === 0 && !Array.isArray(copy[key])) { - delete copy[key] - } - } - } - - if (Array.isArray(copy)) { - return copy.filter((item) => item != null).map(removeEmptyObjects) as T - } - - return copy as T -}