From d775143bf9fd19dab7b042bf78885629a4bcb56e Mon Sep 17 00:00:00 2001 From: naman-contentstack Date: Tue, 4 Feb 2025 18:41:13 +0530 Subject: [PATCH 1/3] [DX-2038] - added config to support extensions and custom types --- src/generateTS/factory.ts | 9 +++++++-- src/generateTS/index.ts | 3 ++- src/types/schema.ts | 2 ++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/generateTS/factory.ts b/src/generateTS/factory.ts index 0fa8b12..aa392e3 100644 --- a/src/generateTS/factory.ts +++ b/src/generateTS/factory.ts @@ -428,13 +428,18 @@ export default function (userOptions: TSGenOptions) { } function type_json_rte(field: ContentstackTypes.Field) { - return `{ + let json_rte; + if (field.config && field.field_metadata?.extension) { + json_rte = `{ value: { key: string; value: string }[] }`; + } else { + json_rte = `{ type: string; uid: string; _version: number; attrs: Record; children: JSONRTENode[]; + }`; } - `; + return json_rte; } } diff --git a/src/generateTS/index.ts b/src/generateTS/index.ts index fd41df3..b3dfbe2 100644 --- a/src/generateTS/index.ts +++ b/src/generateTS/index.ts @@ -133,7 +133,8 @@ export const generateTSFromContentTypes = async ({ for (const contentType of contentTypes) { const tsgenResult = tsgen(contentType); hasJsonField = contentType.schema.some( - (field: { data_type: string }) => field.data_type === "json" + (field: { field_metadata: any; data_type: string }) => + field.data_type === "json" && field.field_metadata.allow_json_rte ); if (tsgenResult.isGlobalField) { globalFields.add(tsgenResult.definition); diff --git a/src/types/schema.ts b/src/types/schema.ts index c8c19d2..7be562c 100644 --- a/src/types/schema.ts +++ b/src/types/schema.ts @@ -17,6 +17,8 @@ export type FieldOptions = { non_localizable: boolean; max_instance: boolean | undefined; display_type: string; + config?: Record; + field_metadata?: Record; } & Identifier; export type Block = { From b76331052c61c26418d81ec88f77ec7e1c3891ad Mon Sep 17 00:00:00 2001 From: naman-contentstack Date: Wed, 5 Feb 2025 13:23:09 +0530 Subject: [PATCH 2/3] [DX-2038], added test cases for custom field type --- tests/unit/tsgen/custom-field.ct.js | 85 +++++++++++++++++++++++++++ tests/unit/tsgen/custom-field.test.ts | 29 +++++++++ 2 files changed, 114 insertions(+) create mode 100644 tests/unit/tsgen/custom-field.ct.js create mode 100644 tests/unit/tsgen/custom-field.test.ts diff --git a/tests/unit/tsgen/custom-field.ct.js b/tests/unit/tsgen/custom-field.ct.js new file mode 100644 index 0000000..9ba87d9 --- /dev/null +++ b/tests/unit/tsgen/custom-field.ct.js @@ -0,0 +1,85 @@ +const customField = { + title: "home", + description: "", + options: { + is_page: false, + singleton: false, + sub_title: [ + ], + title: "title", + }, + schema: [ + { + data_type: "text", + display_name: "Title", + field_metadata: { + _default: true, + version: 3, + }, + mandatory: true, + uid: "title", + unique: true, + multiple: false, + non_localizable: false, + }, + { + display_name: "Custom key value pair", + extension_uid: "blt819d8b90b0236e1f", + field_metadata: { + extension: true, + }, + uid: "custom_key_value_pair", + mandatory: false, + non_localizable: false, + unique: false, + config: { + }, + data_type: "json", + multiple: false, + }, + ], + uid: "home", + DEFAULT_ACL: { + others: { + read: false, + create: false, + }, + users: [ + ], + }, + SYS_ACL: { + others: { + read: false, + create: false, + update: false, + delete: false, + sub_acl: { + read: false, + create: false, + update: false, + delete: false, + publish: false, + }, + }, + roles: [ + ], + }, + created_at: "2025-01-10T09:18:20.450Z", + updated_at: "2025-02-05T07:47:19.736Z", + inbuilt_class: false, + abilities: { + get_one_object: true, + get_all_objects: true, + create_object: true, + update_object: true, + delete_object: true, + delete_all_objects: true, + }, + last_activity: { + }, + maintain_revisions: true, + _version: 24, + } + + module.exports = {customField} + \ No newline at end of file diff --git a/tests/unit/tsgen/custom-field.test.ts b/tests/unit/tsgen/custom-field.test.ts new file mode 100644 index 0000000..7432c11 --- /dev/null +++ b/tests/unit/tsgen/custom-field.test.ts @@ -0,0 +1,29 @@ +const testData = require("./custom-field.ct"); + +import NullDocumentationGenerator from "../../../src/generateTS/docgen/nulldoc"; +import tsgenFactory from "../../../src/generateTS/factory"; + +const tsgen = tsgenFactory({ + docgen: new NullDocumentationGenerator(), +}); + +describe("JSON RTE", () => { + const result = tsgen(testData.customField); + + test("metadata", () => { + const types = result.metadata.types; + + expect([...types.javascript]).toEqual(expect.arrayContaining(["string"])); + }); + test("definition", () => { + expect(result.definition).toMatchInlineSnapshot(` + "export interface Home + { + /** Version */ + _version: number; + title: string; + custom_key_value_pair?: { value: { key: string; value: string }[] }; + }" + `); + }); +}); From 54b7ea7db87c793dda68aec21cb2ec02dcd6439d Mon Sep 17 00:00:00 2001 From: naman-contentstack Date: Wed, 5 Feb 2025 14:22:45 +0530 Subject: [PATCH 3/3] updated reference file --- tests/unit/tsgen/custom-field.ct.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/tsgen/custom-field.ct.js b/tests/unit/tsgen/custom-field.ct.js index 9ba87d9..443468e 100644 --- a/tests/unit/tsgen/custom-field.ct.js +++ b/tests/unit/tsgen/custom-field.ct.js @@ -24,7 +24,7 @@ const customField = { }, { display_name: "Custom key value pair", - extension_uid: "blt819d8b90b0236e1f", + extension_uid: "uid", field_metadata: { extension: true, },