From cc0f1d54bcfdfe59866069c685b805c5f6e691f8 Mon Sep 17 00:00:00 2001 From: zernie Date: Mon, 30 Mar 2020 14:46:04 +0300 Subject: [PATCH 1/8] feat(localization): add --localization flag --- src/contentful-typescript-codegen.ts | 6 + src/renderers/contentful/renderContentType.ts | 8 +- src/renderers/contentful/renderField.ts | 8 +- src/renderers/render.ts | 16 ++- .../typescript/renderInterfaceProperty.ts | 3 +- test/renderers/render.test.ts | 134 +++++++++++------- .../renderInterfaceProperty.test.ts | 6 +- 7 files changed, 119 insertions(+), 62 deletions(-) diff --git a/src/contentful-typescript-codegen.ts b/src/contentful-typescript-codegen.ts index 9ac6840f..9eae242d 100644 --- a/src/contentful-typescript-codegen.ts +++ b/src/contentful-typescript-codegen.ts @@ -18,6 +18,7 @@ const cli = meow( and present, and does not provide types for Sys, Assets, or Rich Text. This is useful for ensuring raw Contentful responses will be compatible with your code. + --localization -l Output fields with localized values Examples $ contentful-typescript-codegen -o src/@types/generated/contentful.d.ts @@ -43,6 +44,11 @@ const cli = meow( alias: "i", required: false, }, + localization: { + type: "boolean", + alias: "l", + required: false, + }, }, }, ) diff --git a/src/renderers/contentful/renderContentType.ts b/src/renderers/contentful/renderContentType.ts index 3f408833..456cf8eb 100644 --- a/src/renderers/contentful/renderContentType.ts +++ b/src/renderers/contentful/renderContentType.ts @@ -13,9 +13,9 @@ import renderObject from "./fields/renderObject" import renderRichText from "./fields/renderRichText" import renderSymbol from "./fields/renderSymbol" -export default function renderContentType(contentType: ContentType): string { +export default function renderContentType(contentType: ContentType, localization: boolean): string { const name = renderContentTypeId(contentType.sys.id) - const fields = renderContentTypeFields(contentType.fields) + const fields = renderContentTypeFields(contentType.fields, localization) const sys = renderSys(contentType.sys) return ` @@ -34,7 +34,7 @@ function descriptionComment(description: string | undefined) { return "" } -function renderContentTypeFields(fields: Field[]): string { +function renderContentTypeFields(fields: Field[], localization: boolean): string { return fields .filter(field => !field.omitted) .map(field => { @@ -52,7 +52,7 @@ function renderContentTypeFields(fields: Field[]): string { Text: renderSymbol, } - return renderField(field, functionMap[field.type](field)) + return renderField(field, functionMap[field.type](field), localization) }) .join("\n\n") } diff --git a/src/renderers/contentful/renderField.ts b/src/renderers/contentful/renderField.ts index 7ee1731b..ae8bb1c8 100644 --- a/src/renderers/contentful/renderField.ts +++ b/src/renderers/contentful/renderField.ts @@ -1,6 +1,10 @@ import { Field } from "contentful" import renderInterfaceProperty from "../typescript/renderInterfaceProperty" -export default function renderField(field: Field, type: string): string { - return renderInterfaceProperty(field.id, type, field.required, field.name) +export default function renderField( + field: Field, + type: string, + localization: boolean = false, +): string { + return renderInterfaceProperty(field.id, type, field.required, localization, field.name) } diff --git a/src/renderers/render.ts b/src/renderers/render.ts index 3ff3768b..2a7cc32e 100644 --- a/src/renderers/render.ts +++ b/src/renderers/render.ts @@ -8,13 +8,21 @@ import renderUnion from "./typescript/renderUnion" import renderAllLocales from "./contentful/renderAllLocales" import renderDefaultLocale from "./contentful/renderDefaultLocale" -export default async function render(contentTypes: ContentType[], locales: Locale[]) { +interface Options { + localization?: boolean +} + +export default async function render( + contentTypes: ContentType[], + locales: Locale[], + { localization = false }: Options = {}, +) { const sortedContentTypes = contentTypes.sort((a, b) => a.sys.id.localeCompare(b.sys.id)) const sortedLocales = locales.sort((a, b) => a.code.localeCompare(b.code)) const source = [ renderContentfulImports(), - renderAllContentTypes(sortedContentTypes), + renderAllContentTypes(sortedContentTypes, localization), renderAllContentTypeIds(sortedContentTypes), renderAllLocales(sortedLocales), renderDefaultLocale(sortedLocales), @@ -24,8 +32,8 @@ export default async function render(contentTypes: ContentType[], locales: Local return format(source, { ...prettierConfig, parser: "typescript" }) } -function renderAllContentTypes(contentTypes: ContentType[]): string { - return contentTypes.map(contentType => renderContentType(contentType)).join("\n\n") +function renderAllContentTypes(contentTypes: ContentType[], localization: boolean): string { + return contentTypes.map(contentType => renderContentType(contentType, localization)).join("\n\n") } function renderAllContentTypeIds(contentTypes: ContentType[]): string { diff --git a/src/renderers/typescript/renderInterfaceProperty.ts b/src/renderers/typescript/renderInterfaceProperty.ts index 9e5c75f4..18bc4dcd 100644 --- a/src/renderers/typescript/renderInterfaceProperty.ts +++ b/src/renderers/typescript/renderInterfaceProperty.ts @@ -2,6 +2,7 @@ export default function renderInterfaceProperty( name: string, type: string, required: boolean, + localization: boolean, description?: string, ): string { return [ @@ -9,7 +10,7 @@ export default function renderInterfaceProperty( name, required ? "" : "?", ": ", - type, + localization ? `Record` : type, required ? "" : " | undefined", ";", ].join("") diff --git a/test/renderers/render.test.ts b/test/renderers/render.test.ts index 0737832e..6ed29771 100644 --- a/test/renderers/render.test.ts +++ b/test/renderers/render.test.ts @@ -2,56 +2,56 @@ import render from "../../src/renderers/render" import { ContentType, Sys, Locale } from "contentful" describe("render()", () => { - it("renders given a content type", async () => { - const contentTypes: ContentType[] = [ - { - sys: { - id: "myContentType", - } as Sys, - fields: [ - { - id: "arrayField", - name: "Array field", - required: true, - validations: [{}], - items: { - type: "Symbol", - validations: [ - { - in: ["one", "of", "the", "above"], - }, - ], - }, - disabled: false, - omitted: false, - localized: false, - type: "Array", + const contentTypes: ContentType[] = [ + { + sys: { + id: "myContentType", + } as Sys, + fields: [ + { + id: "arrayField", + name: "Array field", + required: true, + validations: [{}], + items: { + type: "Symbol", + validations: [ + { + in: ["one", "of", "the", "above"], + }, + ], }, - ], - description: "", - displayField: "", - name: "", - toPlainObject: () => ({} as ContentType), - }, - ] - - const locales: Locale[] = [ - { - name: "English (US)", - fallbackCode: null, - code: "en-US", - default: true, - sys: {} as Locale["sys"], - }, - { - name: "Brazilian Portuguese", - fallbackCode: "en-US", - code: "pt-BR", - default: false, - sys: {} as Locale["sys"], - }, - ] + disabled: false, + omitted: false, + localized: false, + type: "Array", + }, + ], + description: "", + displayField: "", + name: "", + toPlainObject: () => ({} as ContentType), + }, + ] + + const locales: Locale[] = [ + { + name: "English (US)", + fallbackCode: null, + code: "en-US", + default: true, + sys: {} as Locale["sys"], + }, + { + name: "Brazilian Portuguese", + fallbackCode: "en-US", + code: "pt-BR", + default: false, + sys: {} as Locale["sys"], + }, + ] + it("renders a given content type", async () => { expect(await render(contentTypes, locales)).toMatchInlineSnapshot(` "// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY IT. @@ -88,4 +88,42 @@ describe("render()", () => { " `) }) + + it("renders a given localized content type", async () => { + expect(await render(contentTypes, locales, { localization: true })).toMatchInlineSnapshot(` + "// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY IT. + + import { Asset, Entry } from \\"contentful\\" + import { Document } from \\"@contentful/rich-text-types\\" + + export interface IMyContentTypeFields { + /** Array field */ + arrayField: Record + } + + export interface IMyContentType extends Entry { + sys: { + id: string + type: string + createdAt: string + updatedAt: string + locale: string + contentType: { + sys: { + id: \\"myContentType\\" + linkType: \\"ContentType\\" + type: \\"Link\\" + } + } + } + } + + type CONTENT_TYPE = \\"myContentType\\" + + type LOCALE_CODE = \\"en-US\\" | \\"pt-BR\\" + + type CONTENTFUL_DEFAULT_LOCALE_CODE = \\"en-US\\" + " + `) + }) }) diff --git a/test/renderers/typescript/renderInterfaceProperty.test.ts b/test/renderers/typescript/renderInterfaceProperty.test.ts index 09f6d3e0..c1cb8015 100644 --- a/test/renderers/typescript/renderInterfaceProperty.test.ts +++ b/test/renderers/typescript/renderInterfaceProperty.test.ts @@ -2,19 +2,19 @@ import renderInterfaceProperty from "../../../src/renderers/typescript/renderInt describe("renderInterfaceProperty()", () => { it("works with unrequired properties", () => { - expect(renderInterfaceProperty("property", "type", false).trim()).toMatchInlineSnapshot( + expect(renderInterfaceProperty("property", "type", false, false).trim()).toMatchInlineSnapshot( `"property?: type | undefined;"`, ) }) it("works with required properties", () => { - expect(renderInterfaceProperty("property", "type", true).trim()).toMatchInlineSnapshot( + expect(renderInterfaceProperty("property", "type", true, false).trim()).toMatchInlineSnapshot( `"property: type;"`, ) }) it("adds descriptions", () => { - expect(renderInterfaceProperty("property", "type", false, "Description").trim()) + expect(renderInterfaceProperty("property", "type", false, false, "Description").trim()) .toMatchInlineSnapshot(` "/** Description */ property?: type | undefined;" From 14385547ae80bc7672ea5ea79aca44ce0184e65e Mon Sep 17 00:00:00 2001 From: zernie Date: Mon, 30 Mar 2020 17:24:06 +0300 Subject: [PATCH 2/8] test(renderInterfaceProperty): add test for localized arg --- test/renderers/typescript/renderInterfaceProperty.test.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/renderers/typescript/renderInterfaceProperty.test.ts b/test/renderers/typescript/renderInterfaceProperty.test.ts index c1cb8015..30f67cff 100644 --- a/test/renderers/typescript/renderInterfaceProperty.test.ts +++ b/test/renderers/typescript/renderInterfaceProperty.test.ts @@ -20,4 +20,10 @@ describe("renderInterfaceProperty()", () => { property?: type | undefined;" `) }) + + it("supports localized fields", () => { + expect(renderInterfaceProperty("property", "type", false, true).trim()).toMatchInlineSnapshot( + `"property?: Record | undefined;"`, + ) + }) }) From 9ebef6ee0fc66ca53d49304c3cf29fdcdb99fd7c Mon Sep 17 00:00:00 2001 From: zernie Date: Mon, 30 Mar 2020 17:57:19 +0300 Subject: [PATCH 3/8] fix: use cli.flags.localization --- src/contentful-typescript-codegen.ts | 4 +- src/renderers/contentful/renderField.ts | 8 +++- .../contentful/renderContentType.test.ts | 37 +++++++++++++++++-- test/renderers/render.test.ts | 34 ++++++++++++++++- 4 files changed, 76 insertions(+), 7 deletions(-) diff --git a/src/contentful-typescript-codegen.ts b/src/contentful-typescript-codegen.ts index 9eae242d..55f2291e 100644 --- a/src/contentful-typescript-codegen.ts +++ b/src/contentful-typescript-codegen.ts @@ -65,7 +65,9 @@ async function runCodegen(outputFile: string) { if (cli.flags.fieldsOnly) { output = await renderFieldsOnly(contentTypes.items) } else { - output = await render(contentTypes.items, locales.items) + output = await render(contentTypes.items, locales.items, { + localization: cli.flags.localization, + }) } outputFileSync(outputPath, output) diff --git a/src/renderers/contentful/renderField.ts b/src/renderers/contentful/renderField.ts index ae8bb1c8..da5c7764 100644 --- a/src/renderers/contentful/renderField.ts +++ b/src/renderers/contentful/renderField.ts @@ -6,5 +6,11 @@ export default function renderField( type: string, localization: boolean = false, ): string { - return renderInterfaceProperty(field.id, type, field.required, localization, field.name) + return renderInterfaceProperty( + field.id, + type, + field.required, + field.localized && localization, + field.name, + ) } diff --git a/test/renderers/contentful/renderContentType.test.ts b/test/renderers/contentful/renderContentType.test.ts index 072645f0..19a2b129 100644 --- a/test/renderers/contentful/renderContentType.test.ts +++ b/test/renderers/contentful/renderContentType.test.ts @@ -15,7 +15,7 @@ describe("renderContentType()", () => { validations: [], disabled: false, omitted: false, - localized: false, + localized: true, type: "Symbol", }, { @@ -33,7 +33,7 @@ describe("renderContentType()", () => { }, disabled: false, omitted: false, - localized: false, + localized: true, type: "Array", }, ], @@ -55,7 +55,7 @@ describe("renderContentType()", () => { } it("works with miscellaneous field types", () => { - expect(format(renderContentType(contentType))).toMatchInlineSnapshot(` + expect(format(renderContentType(contentType, false))).toMatchInlineSnapshot(` "export interface IMyContentTypeFields { /** Symbol Field™ */ symbolField?: string | undefined; @@ -84,7 +84,7 @@ describe("renderContentType()", () => { }) it("supports descriptions", () => { - expect(format(renderContentType(contentTypeWithDescription))).toMatchInlineSnapshot(` + expect(format(renderContentType(contentTypeWithDescription, false))).toMatchInlineSnapshot(` "export interface IMyContentTypeFields {} /** This is a description */ @@ -107,4 +107,33 @@ describe("renderContentType()", () => { }" `) }) + + it("works with localized fields", () => { + expect(format(renderContentType(contentType, true))).toMatchInlineSnapshot(` + "export interface IMyContentTypeFields { + /** Symbol Field™ */ + symbolField?: Record | undefined; + + /** Array field */ + arrayField: Record; + } + + export interface IMyContentType extends Entry { + sys: { + id: string, + type: string, + createdAt: string, + updatedAt: string, + locale: string, + contentType: { + sys: { + id: \\"myContentType\\", + linkType: \\"ContentType\\", + type: \\"Link\\" + } + } + }; + }" + `) + }) }) diff --git a/test/renderers/render.test.ts b/test/renderers/render.test.ts index 6ed29771..c3e9f6cc 100644 --- a/test/renderers/render.test.ts +++ b/test/renderers/render.test.ts @@ -23,7 +23,7 @@ describe("render()", () => { }, disabled: false, omitted: false, - localized: false, + localized: true, type: "Array", }, ], @@ -90,6 +90,38 @@ describe("render()", () => { }) it("renders a given localized content type", async () => { + const contentTypes: ContentType[] = [ + { + sys: { + id: "myContentType", + } as Sys, + fields: [ + { + id: "arrayField", + name: "Array field", + required: true, + validations: [{}], + items: { + type: "Symbol", + validations: [ + { + in: ["one", "of", "the", "above"], + }, + ], + }, + disabled: false, + omitted: false, + localized: true, + type: "Array", + }, + ], + description: "", + displayField: "", + name: "", + toPlainObject: () => ({} as ContentType), + }, + ] + expect(await render(contentTypes, locales, { localization: true })).toMatchInlineSnapshot(` "// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY IT. From 3a0f53b8561f921b959cbd2dac9f0e718f04b787 Mon Sep 17 00:00:00 2001 From: zernie Date: Mon, 30 Mar 2020 18:20:41 +0300 Subject: [PATCH 4/8] fix(renderField): ignore field.required. --- src/renderers/contentful/renderField.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/renderers/contentful/renderField.ts b/src/renderers/contentful/renderField.ts index da5c7764..ae8bb1c8 100644 --- a/src/renderers/contentful/renderField.ts +++ b/src/renderers/contentful/renderField.ts @@ -6,11 +6,5 @@ export default function renderField( type: string, localization: boolean = false, ): string { - return renderInterfaceProperty( - field.id, - type, - field.required, - field.localized && localization, - field.name, - ) + return renderInterfaceProperty(field.id, type, field.required, localization, field.name) } From 47d77daf5c9146ecf866a44807441eb33a33772a Mon Sep 17 00:00:00 2001 From: zernie Date: Mon, 30 Mar 2020 18:49:21 +0300 Subject: [PATCH 5/8] fix: localized fields --- src/renderers/typescript/renderInterfaceProperty.ts | 2 +- test/renderers/contentful/renderContentType.test.ts | 4 ++-- test/renderers/render.test.ts | 2 +- test/renderers/typescript/renderInterfaceProperty.test.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/renderers/typescript/renderInterfaceProperty.ts b/src/renderers/typescript/renderInterfaceProperty.ts index 18bc4dcd..a49231e4 100644 --- a/src/renderers/typescript/renderInterfaceProperty.ts +++ b/src/renderers/typescript/renderInterfaceProperty.ts @@ -10,7 +10,7 @@ export default function renderInterfaceProperty( name, required ? "" : "?", ": ", - localization ? `Record` : type, + localization ? `Record` : type, required ? "" : " | undefined", ";", ].join("") diff --git a/test/renderers/contentful/renderContentType.test.ts b/test/renderers/contentful/renderContentType.test.ts index 19a2b129..a3654c52 100644 --- a/test/renderers/contentful/renderContentType.test.ts +++ b/test/renderers/contentful/renderContentType.test.ts @@ -112,10 +112,10 @@ describe("renderContentType()", () => { expect(format(renderContentType(contentType, true))).toMatchInlineSnapshot(` "export interface IMyContentTypeFields { /** Symbol Field™ */ - symbolField?: Record | undefined; + symbolField?: Record | undefined; /** Array field */ - arrayField: Record; + arrayField: Record; } export interface IMyContentType extends Entry { diff --git a/test/renderers/render.test.ts b/test/renderers/render.test.ts index c3e9f6cc..e84dd2b6 100644 --- a/test/renderers/render.test.ts +++ b/test/renderers/render.test.ts @@ -130,7 +130,7 @@ describe("render()", () => { export interface IMyContentTypeFields { /** Array field */ - arrayField: Record + arrayField: Record } export interface IMyContentType extends Entry { diff --git a/test/renderers/typescript/renderInterfaceProperty.test.ts b/test/renderers/typescript/renderInterfaceProperty.test.ts index 30f67cff..b55a5d21 100644 --- a/test/renderers/typescript/renderInterfaceProperty.test.ts +++ b/test/renderers/typescript/renderInterfaceProperty.test.ts @@ -23,7 +23,7 @@ property?: type | undefined;" it("supports localized fields", () => { expect(renderInterfaceProperty("property", "type", false, true).trim()).toMatchInlineSnapshot( - `"property?: Record | undefined;"`, + `"property?: Record | undefined;"`, ) }) }) From 0280961ebde45683f75b86d7752bbd1860c8624d Mon Sep 17 00:00:00 2001 From: zernie Date: Tue, 31 Mar 2020 12:14:56 +0300 Subject: [PATCH 6/8] test(render): fix tests --- test/renderers/contentful/renderContentType.test.ts | 4 ++-- test/renderers/render.test.ts | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/test/renderers/contentful/renderContentType.test.ts b/test/renderers/contentful/renderContentType.test.ts index a3654c52..490b7b2e 100644 --- a/test/renderers/contentful/renderContentType.test.ts +++ b/test/renderers/contentful/renderContentType.test.ts @@ -15,7 +15,7 @@ describe("renderContentType()", () => { validations: [], disabled: false, omitted: false, - localized: true, + localized: false, type: "Symbol", }, { @@ -33,7 +33,7 @@ describe("renderContentType()", () => { }, disabled: false, omitted: false, - localized: true, + localized: false, type: "Array", }, ], diff --git a/test/renderers/render.test.ts b/test/renderers/render.test.ts index 6547d1bc..99f33c86 100644 --- a/test/renderers/render.test.ts +++ b/test/renderers/render.test.ts @@ -23,7 +23,7 @@ describe("render()", () => { }, disabled: false, omitted: false, - localized: true, + localized: false, type: "Array", }, ], @@ -80,11 +80,11 @@ describe("render()", () => { } } - type CONTENT_TYPE = \\"myContentType\\" + export type CONTENT_TYPE = \\"myContentType\\" - type LOCALE_CODE = \\"en-US\\" | \\"pt-BR\\" + export type LOCALE_CODE = \\"en-US\\" | \\"pt-BR\\" - type CONTENTFUL_DEFAULT_LOCALE_CODE = \\"en-US\\" + export type CONTENTFUL_DEFAULT_LOCALE_CODE = \\"en-US\\" " `) }) @@ -111,7 +111,7 @@ describe("render()", () => { }, disabled: false, omitted: false, - localized: true, + localized: false, type: "Array", }, ], From 6b56db372e2b90e6b6ff9d556bc5f325620114a8 Mon Sep 17 00:00:00 2001 From: zernie Date: Tue, 31 Mar 2020 15:40:59 +0300 Subject: [PATCH 7/8] fix(renderContentfulImports): export localized Asset. --- .../contentful/renderContentfulImports.ts | 33 ++++++++++++++++++- src/renderers/render.ts | 2 +- .../renderContentfulImports.test.ts | 31 +++++++++++++++++ test/renderers/render.test.ts | 24 +++++++++++++- 4 files changed, 87 insertions(+), 3 deletions(-) diff --git a/src/renderers/contentful/renderContentfulImports.ts b/src/renderers/contentful/renderContentfulImports.ts index d9d21cda..77f6b3c8 100644 --- a/src/renderers/contentful/renderContentfulImports.ts +++ b/src/renderers/contentful/renderContentfulImports.ts @@ -1,4 +1,35 @@ -export default function renderContentfulImports(): string { +export default function renderContentfulImports(localization: boolean = false): string { + if (localization) { + return ` + // THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY IT. + + import { Entry } from 'contentful' + import { Document } from '@contentful/rich-text-types' + + // We have to use our own localized version of Asset because of a bug in contentful https://github.com/contentful/contentful.js/issues/208 + interface Asset { + sys: Sys; + fields: { + title: string; + description: string; + file: { + url: string; + details: { + size: number; + image?: { + width: number; + height: number; + }; + }; + fileName: string; + contentType: string; + }; + }; + toPlainObject(): object; + } + ` + } + return ` // THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY IT. diff --git a/src/renderers/render.ts b/src/renderers/render.ts index 2a7cc32e..d67f21fd 100644 --- a/src/renderers/render.ts +++ b/src/renderers/render.ts @@ -21,7 +21,7 @@ export default async function render( const sortedLocales = locales.sort((a, b) => a.code.localeCompare(b.code)) const source = [ - renderContentfulImports(), + renderContentfulImports(localization), renderAllContentTypes(sortedContentTypes, localization), renderAllContentTypeIds(sortedContentTypes), renderAllLocales(sortedLocales), diff --git a/test/renderers/contentful/renderContentfulImports.test.ts b/test/renderers/contentful/renderContentfulImports.test.ts index 4f30c78e..cdd5939b 100644 --- a/test/renderers/contentful/renderContentfulImports.test.ts +++ b/test/renderers/contentful/renderContentfulImports.test.ts @@ -10,4 +10,35 @@ import { Asset, Entry } from \\"contentful\\"; import { Document } from \\"@contentful/rich-text-types\\";" `) }) + + it("renders the localized top of the codegen file", () => { + expect(format(renderContentfulImports(true))).toMatchInlineSnapshot(` + "// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY IT. + + import { Entry } from \\"contentful\\"; + import { Document } from \\"@contentful/rich-text-types\\"; + + // We have to use our own localized version of Asset because of a bug in contentful https://github.com/contentful/contentful.js/issues/208 + interface Asset { + sys: Sys; + fields: { + title: string, + description: string, + file: { + url: string, + details: { + size: number, + image?: { + width: number, + height: number + } + }, + fileName: string, + contentType: string + } + }; + toPlainObject(): object; + }" + `) + }) }) diff --git a/test/renderers/render.test.ts b/test/renderers/render.test.ts index 99f33c86..26c637f9 100644 --- a/test/renderers/render.test.ts +++ b/test/renderers/render.test.ts @@ -125,9 +125,31 @@ describe("render()", () => { expect(await render(contentTypes, locales, { localization: true })).toMatchInlineSnapshot(` "// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY IT. - import { Asset, Entry } from \\"contentful\\" + import { Entry } from \\"contentful\\" import { Document } from \\"@contentful/rich-text-types\\" + // We have to use our own localized version of Asset because of a bug in contentful https://github.com/contentful/contentful.js/issues/208 + interface Asset { + sys: Sys + fields: { + title: string + description: string + file: { + url: string + details: { + size: number + image?: { + width: number + height: number + } + } + fileName: string + contentType: string + } + } + toPlainObject(): object + } + export interface IMyContentTypeFields { /** Array field */ arrayField: Record From 9d76a9bafeb13beeaeff9346a0e0d9c1034080ae Mon Sep 17 00:00:00 2001 From: zernie Date: Tue, 31 Mar 2020 15:56:34 +0300 Subject: [PATCH 8/8] fix(render): Extract Asset, Localized field helper types --- .../contentful/renderContentfulImports.ts | 22 --------- .../contentful/renderLocalizedTypes.ts | 30 ++++++++++++ src/renderers/render.ts | 2 + .../typescript/renderInterfaceProperty.ts | 2 +- .../contentful/renderContentType.test.ts | 46 +++++++++--------- .../renderContentfulImports.test.ts | 32 ++----------- test/renderers/render.test.ts | 48 ++++++++++--------- .../renderInterfaceProperty.test.ts | 8 ++-- 8 files changed, 90 insertions(+), 100 deletions(-) create mode 100644 src/renderers/contentful/renderLocalizedTypes.ts diff --git a/src/renderers/contentful/renderContentfulImports.ts b/src/renderers/contentful/renderContentfulImports.ts index 77f6b3c8..cf8a8b98 100644 --- a/src/renderers/contentful/renderContentfulImports.ts +++ b/src/renderers/contentful/renderContentfulImports.ts @@ -5,28 +5,6 @@ export default function renderContentfulImports(localization: boolean = false): import { Entry } from 'contentful' import { Document } from '@contentful/rich-text-types' - - // We have to use our own localized version of Asset because of a bug in contentful https://github.com/contentful/contentful.js/issues/208 - interface Asset { - sys: Sys; - fields: { - title: string; - description: string; - file: { - url: string; - details: { - size: number; - image?: { - width: number; - height: number; - }; - }; - fileName: string; - contentType: string; - }; - }; - toPlainObject(): object; - } ` } diff --git a/src/renderers/contentful/renderLocalizedTypes.ts b/src/renderers/contentful/renderLocalizedTypes.ts new file mode 100644 index 00000000..a2b17066 --- /dev/null +++ b/src/renderers/contentful/renderLocalizedTypes.ts @@ -0,0 +1,30 @@ +/** renders helper types for --localization flag */ +export default function renderLocalizedTypes(localization: boolean) { + if (!localization) return null + + return ` + export type LocalizedField = Partial> + + // We have to use our own localized version of Asset because of a bug in contentful https://github.com/contentful/contentful.js/issues/208 + export interface Asset { + sys: Sys + fields: { + title: LocalizedField + description: LocalizedField + file: LocalizedField<{ + url: string + details: { + size: number + image?: { + width: number + height: number + } + } + fileName: string + contentType: string + }> + } + toPlainObject(): object + } + ` +} diff --git a/src/renderers/render.ts b/src/renderers/render.ts index d67f21fd..65e2a962 100644 --- a/src/renderers/render.ts +++ b/src/renderers/render.ts @@ -7,6 +7,7 @@ import renderContentType from "./contentful/renderContentType" import renderUnion from "./typescript/renderUnion" import renderAllLocales from "./contentful/renderAllLocales" import renderDefaultLocale from "./contentful/renderDefaultLocale" +import renderLocalizedTypes from "./contentful/renderLocalizedTypes" interface Options { localization?: boolean @@ -26,6 +27,7 @@ export default async function render( renderAllContentTypeIds(sortedContentTypes), renderAllLocales(sortedLocales), renderDefaultLocale(sortedLocales), + renderLocalizedTypes(localization), ].join("\n\n") const prettierConfig = await resolveConfig(process.cwd()) diff --git a/src/renderers/typescript/renderInterfaceProperty.ts b/src/renderers/typescript/renderInterfaceProperty.ts index a49231e4..2f514049 100644 --- a/src/renderers/typescript/renderInterfaceProperty.ts +++ b/src/renderers/typescript/renderInterfaceProperty.ts @@ -10,7 +10,7 @@ export default function renderInterfaceProperty( name, required ? "" : "?", ": ", - localization ? `Record` : type, + localization ? `LocalizedField<${type}>` : type, required ? "" : " | undefined", ";", ].join("") diff --git a/test/renderers/contentful/renderContentType.test.ts b/test/renderers/contentful/renderContentType.test.ts index 490b7b2e..af9df218 100644 --- a/test/renderers/contentful/renderContentType.test.ts +++ b/test/renderers/contentful/renderContentType.test.ts @@ -110,30 +110,30 @@ describe("renderContentType()", () => { it("works with localized fields", () => { expect(format(renderContentType(contentType, true))).toMatchInlineSnapshot(` - "export interface IMyContentTypeFields { - /** Symbol Field™ */ - symbolField?: Record | undefined; + "export interface IMyContentTypeFields { + /** Symbol Field™ */ + symbolField?: LocalizedField | undefined; - /** Array field */ - arrayField: Record; - } + /** Array field */ + arrayField: LocalizedField<(\\"one\\" | \\"of\\" | \\"the\\" | \\"above\\")[]>; + } - export interface IMyContentType extends Entry { - sys: { - id: string, - type: string, - createdAt: string, - updatedAt: string, - locale: string, - contentType: { - sys: { - id: \\"myContentType\\", - linkType: \\"ContentType\\", - type: \\"Link\\" - } - } - }; - }" - `) + export interface IMyContentType extends Entry { + sys: { + id: string, + type: string, + createdAt: string, + updatedAt: string, + locale: string, + contentType: { + sys: { + id: \\"myContentType\\", + linkType: \\"ContentType\\", + type: \\"Link\\" + } + } + }; + }" + `) }) }) diff --git a/test/renderers/contentful/renderContentfulImports.test.ts b/test/renderers/contentful/renderContentfulImports.test.ts index cdd5939b..5c8f3c87 100644 --- a/test/renderers/contentful/renderContentfulImports.test.ts +++ b/test/renderers/contentful/renderContentfulImports.test.ts @@ -4,11 +4,11 @@ import format from "../../support/format" describe("renderContentfulImports()", () => { it("renders the top of the codegen file", () => { expect(format(renderContentfulImports())).toMatchInlineSnapshot(` -"// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY IT. + "// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY IT. -import { Asset, Entry } from \\"contentful\\"; -import { Document } from \\"@contentful/rich-text-types\\";" -`) + import { Asset, Entry } from \\"contentful\\"; + import { Document } from \\"@contentful/rich-text-types\\";" + `) }) it("renders the localized top of the codegen file", () => { @@ -16,29 +16,7 @@ import { Document } from \\"@contentful/rich-text-types\\";" "// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY IT. import { Entry } from \\"contentful\\"; - import { Document } from \\"@contentful/rich-text-types\\"; - - // We have to use our own localized version of Asset because of a bug in contentful https://github.com/contentful/contentful.js/issues/208 - interface Asset { - sys: Sys; - fields: { - title: string, - description: string, - file: { - url: string, - details: { - size: number, - image?: { - width: number, - height: number - } - }, - fileName: string, - contentType: string - } - }; - toPlainObject(): object; - }" + import { Document } from \\"@contentful/rich-text-types\\";" `) }) }) diff --git a/test/renderers/render.test.ts b/test/renderers/render.test.ts index 26c637f9..1ade6004 100644 --- a/test/renderers/render.test.ts +++ b/test/renderers/render.test.ts @@ -128,31 +128,9 @@ describe("render()", () => { import { Entry } from \\"contentful\\" import { Document } from \\"@contentful/rich-text-types\\" - // We have to use our own localized version of Asset because of a bug in contentful https://github.com/contentful/contentful.js/issues/208 - interface Asset { - sys: Sys - fields: { - title: string - description: string - file: { - url: string - details: { - size: number - image?: { - width: number - height: number - } - } - fileName: string - contentType: string - } - } - toPlainObject(): object - } - export interface IMyContentTypeFields { /** Array field */ - arrayField: Record + arrayField: LocalizedField<(\\"one\\" | \\"of\\" | \\"the\\" | \\"above\\")[]> } export interface IMyContentType extends Entry { @@ -177,6 +155,30 @@ describe("render()", () => { export type LOCALE_CODE = \\"en-US\\" | \\"pt-BR\\" export type CONTENTFUL_DEFAULT_LOCALE_CODE = \\"en-US\\" + + export type LocalizedField = Partial> + + // We have to use our own localized version of Asset because of a bug in contentful https://github.com/contentful/contentful.js/issues/208 + export interface Asset { + sys: Sys + fields: { + title: LocalizedField + description: LocalizedField + file: LocalizedField<{ + url: string + details: { + size: number + image?: { + width: number + height: number + } + } + fileName: string + contentType: string + }> + } + toPlainObject(): object + } " `) }) diff --git a/test/renderers/typescript/renderInterfaceProperty.test.ts b/test/renderers/typescript/renderInterfaceProperty.test.ts index b55a5d21..b98b5d3c 100644 --- a/test/renderers/typescript/renderInterfaceProperty.test.ts +++ b/test/renderers/typescript/renderInterfaceProperty.test.ts @@ -16,14 +16,14 @@ describe("renderInterfaceProperty()", () => { it("adds descriptions", () => { expect(renderInterfaceProperty("property", "type", false, false, "Description").trim()) .toMatchInlineSnapshot(` -"/** Description */ -property?: type | undefined;" -`) + "/** Description */ + property?: type | undefined;" + `) }) it("supports localized fields", () => { expect(renderInterfaceProperty("property", "type", false, true).trim()).toMatchInlineSnapshot( - `"property?: Record | undefined;"`, + `"property?: LocalizedField | undefined;"`, ) }) })