From 50f30d54155e769ca1f57311a3186af143874e2e Mon Sep 17 00:00:00 2001 From: Aman Kumar Date: Fri, 21 Mar 2025 16:25:34 +0530 Subject: [PATCH 1/2] fix: Global fields get the same key name in custom Content Type --- src/generateTS/factory.ts | 59 +++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/src/generateTS/factory.ts b/src/generateTS/factory.ts index d82e4df..d5cf5dd 100644 --- a/src/generateTS/factory.ts +++ b/src/generateTS/factory.ts @@ -214,35 +214,29 @@ export default function (userOptions: TSGenOptions) { return op_array(type, field); } - function visit_field(field: ContentstackTypes.Field) { + // Helper function to handle global fields + const handleGlobalField = ( + field: ContentstackTypes.Field, + schemaType?: string + ): string => { + const referenceName = name_type(field.reference_to); + const isCached = cachedGlobalFields[referenceName]; + + // Handle 'global_field' schemaType case + if (schemaType === "global_field" && !isCached) { + return `${referenceName}${field.multiple ? "[]" : ""}`; + } else if (schemaType === undefined && isCached) { + return `${referenceName}${field.multiple ? "[]" : ""}`; + } + + return ""; + }; + + function visit_field(field: ContentstackTypes.Field, schemaType?: string) { let fieldType = ""; // Check if the field is a global field if (field.data_type === "global_field") { - // Check if the field is cached - const isCached = cachedGlobalFields[name_type(field.reference_to)]; - - // Generate the referred_content_types array - const referredContentTypes = [ - { - title: name_type(field.reference_to), - uid: field.reference_to, - }, - ]; - - // Assign the new structure for the global field - fieldType = `referred_content_types: ${JSON.stringify( - referredContentTypes - )}`; - - // If it's a multiple field, append '[]' to the fieldType - if (field.multiple) { - fieldType += "[]"; - } - - // If the field is not cached and there is a reference, update fieldType accordingly - if (!isCached && field.reference_to) { - fieldType = type_reference(field); - } + fieldType = handleGlobalField(field, schemaType); } else if (field.data_type === "blocks") { // Handle blocks type (unchanged) fieldType = type_modular_blocks(field); @@ -263,18 +257,17 @@ export default function (userOptions: TSGenOptions) { : " | null" : ""; - if (fieldType.startsWith("referred_content_types")) { - // For global_field or referred_content_types, omit field.uid in output - return `${fieldType}`; - } // Ensure the formatting is correct, and avoid concatenating field.uid directly to a string return `${field.uid}${requiredFlag}: ${fieldType}${typeModifier};`; } - function visit_fields(schema: ContentstackTypes.Schema) { + function visit_fields(schema: ContentstackTypes.Schema, schemaType?: string) { return schema .map((v) => { - return [options.docgen.field(v.display_name), visit_field(v)] + return [ + options.docgen.field(v.display_name), + visit_field(v, schemaType), + ] .filter((v) => v) .join("\n"); }) @@ -291,7 +284,7 @@ export default function (userOptions: TSGenOptions) { "{", ["/**", "Version", "*/"].join(" "), `_version: number;`, - visit_fields(contentType.schema), + visit_fields(contentType.schema, contentType?.schema_type), "}", ] .filter((v) => v) From 515a1f8a40d40281158b765574ef018b7bb8efd0 Mon Sep 17 00:00:00 2001 From: Aman Kumar Date: Fri, 21 Mar 2025 16:45:08 +0530 Subject: [PATCH 2/2] fix: test cases --- src/generateTS/factory.ts | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/generateTS/factory.ts b/src/generateTS/factory.ts index d5cf5dd..18e93ad 100644 --- a/src/generateTS/factory.ts +++ b/src/generateTS/factory.ts @@ -214,29 +214,18 @@ export default function (userOptions: TSGenOptions) { return op_array(type, field); } - // Helper function to handle global fields - const handleGlobalField = ( - field: ContentstackTypes.Field, - schemaType?: string - ): string => { + const handleGlobalField = (field: ContentstackTypes.Field): string => { const referenceName = name_type(field.reference_to); - const isCached = cachedGlobalFields[referenceName]; - - // Handle 'global_field' schemaType case - if (schemaType === "global_field" && !isCached) { - return `${referenceName}${field.multiple ? "[]" : ""}`; - } else if (schemaType === undefined && isCached) { - return `${referenceName}${field.multiple ? "[]" : ""}`; - } - - return ""; + // Return the reference name with array brackets if the field is multiple + return `${referenceName}${field.multiple ? "[]" : ""}`; }; + - function visit_field(field: ContentstackTypes.Field, schemaType?: string) { + function visit_field(field: ContentstackTypes.Field) { let fieldType = ""; // Check if the field is a global field if (field.data_type === "global_field") { - fieldType = handleGlobalField(field, schemaType); + fieldType = handleGlobalField(field); } else if (field.data_type === "blocks") { // Handle blocks type (unchanged) fieldType = type_modular_blocks(field); @@ -261,12 +250,12 @@ export default function (userOptions: TSGenOptions) { return `${field.uid}${requiredFlag}: ${fieldType}${typeModifier};`; } - function visit_fields(schema: ContentstackTypes.Schema, schemaType?: string) { + function visit_fields(schema: ContentstackTypes.Schema) { return schema .map((v) => { return [ options.docgen.field(v.display_name), - visit_field(v, schemaType), + visit_field(v), ] .filter((v) => v) .join("\n"); @@ -284,7 +273,7 @@ export default function (userOptions: TSGenOptions) { "{", ["/**", "Version", "*/"].join(" "), `_version: number;`, - visit_fields(contentType.schema, contentType?.schema_type), + visit_fields(contentType.schema), "}", ] .filter((v) => v)