diff --git a/.changeset/stale-apricots-itch.md b/.changeset/stale-apricots-itch.md new file mode 100644 index 0000000000..0fd3b9487b --- /dev/null +++ b/.changeset/stale-apricots-itch.md @@ -0,0 +1,5 @@ +--- +"@medusajs/utils": patch +--- + +feat(utils): Utils to create an object select, relation from a string[] diff --git a/packages/utils/src/common/__tests__/string-to-select-relation-object.ts b/packages/utils/src/common/__tests__/string-to-select-relation-object.ts new file mode 100644 index 0000000000..f455858a2f --- /dev/null +++ b/packages/utils/src/common/__tests__/string-to-select-relation-object.ts @@ -0,0 +1,68 @@ +import { stringToSelectRelationObject } from "../string-to-select-relation-object" + +const fields = [ + "id", + "created_at", + "updated_at", + "deleted_at", + "url", + "metadata", + "tags.id", + "tags.created_at", + "tags.updated_at", + "tags.deleted_at", + "tags.value", + "options.id", + "options.created_at", + "options.updated_at", + "options.deleted_at", + "options.title", + "options.product_id", + "options.metadata", + "options.values.id", + "options.values.created_at", + "options.values.updated_at", + "options.values.deleted_at", + "options.values.value", + "options.values.option_id", + "options.values.variant_id", + "options.values.metadata", +] + +describe("stringToSelectRelationObject", function () { + it("should return an object containing the select and relation properties", function () { + const output = stringToSelectRelationObject(fields) + + expect(output).toEqual({ + select: [ + "id", + "created_at", + "updated_at", + "deleted_at", + "url", + "metadata", + "tags.id", + "tags.created_at", + "tags.updated_at", + "tags.deleted_at", + "tags.value", + "options.id", + "options.created_at", + "options.updated_at", + "options.deleted_at", + "options.title", + "options.product_id", + "options.metadata", + "options.values.id", + "options.values.created_at", + "options.values.updated_at", + "options.values.deleted_at", + "options.values.value", + "options.values.option_id", + "options.values.variant_id", + "options.values.metadata", + ], + relations: ["tags", "options", "options.values"], + }) + }) +}) diff --git a/packages/utils/src/common/index.ts b/packages/utils/src/common/index.ts index 39e0488f4e..2b4c8fb071 100644 --- a/packages/utils/src/common/index.ts +++ b/packages/utils/src/common/index.ts @@ -25,3 +25,5 @@ export * from "./to-pascal-case" export * from "./transaction" export * from "./upper-case-first" export * from "./wrap-handler" +export * from "./string-to-remote-query-object" +export * from "./string-to-select-relation-object" diff --git a/packages/utils/src/common/string-to-select-relation-object.ts b/packages/utils/src/common/string-to-select-relation-object.ts new file mode 100644 index 0000000000..9ad934b5d2 --- /dev/null +++ b/packages/utils/src/common/string-to-select-relation-object.ts @@ -0,0 +1,97 @@ +/** + * Convert a string fields array to a specific object such as { select, relation } + * @param fields + * + * @example + * const fields = [ + * "id", + * "created_at", + * "updated_at", + * "deleted_at", + * "url", + * "metadata", + * "tags.id", + * "tags.created_at", + * "tags.updated_at", + * "tags.deleted_at", + * "tags.value", + * "options.id", + * "options.created_at", + * "options.updated_at", + * "options.deleted_at", + * "options.title", + * "options.product_id", + * "options.metadata", + * "options.values.id", + * "options.values.created_at", + * "options.values.updated_at", + * "options.values.deleted_at", + * "options.values.value", + * "options.values.option_id", + * "options.values.variant_id", + * "options.values.metadata", + * ] + * + * const remoteQueryObject = stringToSelectRelationObject(fields) + * + * console.log(remoteQueryObject) + * // { + * // select: [ + * // "id", + * // "created_at", + * // "updated_at", + * // "deleted_at", + * // "url", + * // "metadata", + * // "tags.id", + * // "tags.created_at", + * // "tags.updated_at", + * // "tags.deleted_at", + * // "tags.value", + * // "options.id", + * // "options.created_at", + * // "options.updated_at", + * // "options.deleted_at", + * // "options.title", + * // "options.product_id", + * // "options.metadata", + * // "options.values.id", + * // "options.values.created_at", + * // "options.values.updated_at", + * // "options.values.deleted_at", + * // "options.values.value", + * // "options.values.option_id", + * // "options.values.variant_id", + * // "options.values.metadata", + * // ], + * // relations: ["tags", "options", "options.values"], + * // } + */ +export function stringToSelectRelationObject(fields: string[]): { + select: string[] + relations: string[] +} { + const tempResult = { + select: new Set(), + relations: new Set(), + } + + for (const field of fields) { + tempResult.select.add(field) + + if (!field.includes(".")) { + continue + } + + const segments = field.split(".") + segments.pop() + const relationPath = segments.join(".") + + tempResult.relations.add(relationPath) + } + + return { + select: Array.from(tempResult.select), + relations: Array.from(tempResult.relations), + } +}