From 30546ec6ed742aab59f1f5eccf1b38f6d7bfc2e0 Mon Sep 17 00:00:00 2001 From: Jaden Giordano Date: Fri, 10 Sep 2021 09:00:48 -0700 Subject: [PATCH 1/7] escape singleQuotes in rendering of fields and such --- .../contentful/fields/renderSymbol.ts | 3 ++- src/renderers/contentful/renderAllLocales.ts | 6 ++++- src/renderers/contentful/renderContentType.ts | 3 ++- .../contentful/renderDefaultLocale.ts | 3 ++- src/renderers/render.ts | 5 +++- src/renderers/utils.ts | 3 +++ test/renderers/utils.test.ts | 23 +++++++++++++++++++ 7 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 src/renderers/utils.ts create mode 100644 test/renderers/utils.test.ts diff --git a/src/renderers/contentful/fields/renderSymbol.ts b/src/renderers/contentful/fields/renderSymbol.ts index 31960227..d407b05d 100644 --- a/src/renderers/contentful/fields/renderSymbol.ts +++ b/src/renderers/contentful/fields/renderSymbol.ts @@ -1,12 +1,13 @@ import { Field } from "contentful" import { renderUnionValues } from "../../typescript/renderUnion" +import { escapeSingleQuotes } from "../../utils" export default function renderSymbol(field: Field) { const inValidation = field.validations.find(validation => !!validation.in) if (inValidation) { - return renderUnionValues(inValidation.in!.map(value => `'${value}'`)) + return renderUnionValues(inValidation.in!.map(value => `'${escapeSingleQuotes(value)}'`)) } else { return "string" } diff --git a/src/renderers/contentful/renderAllLocales.ts b/src/renderers/contentful/renderAllLocales.ts index b6394709..3a388b3f 100644 --- a/src/renderers/contentful/renderAllLocales.ts +++ b/src/renderers/contentful/renderAllLocales.ts @@ -1,6 +1,10 @@ import renderUnion from "../typescript/renderUnion" import { Locale } from "contentful" +import { escapeSingleQuotes } from "../utils" export default function renderAllLocales(locales: Locale[]): string { - return renderUnion("LOCALE_CODE", locales.map(locale => `'${locale.code}'`)) + return renderUnion( + "LOCALE_CODE", + locales.map(locale => `'${escapeSingleQuotes(locale.code)}'`), + ) } diff --git a/src/renderers/contentful/renderContentType.ts b/src/renderers/contentful/renderContentType.ts index 456cf8eb..567bd0f4 100644 --- a/src/renderers/contentful/renderContentType.ts +++ b/src/renderers/contentful/renderContentType.ts @@ -1,5 +1,6 @@ import { ContentType, Field, FieldType, Sys } from "contentful" +import { escapeSingleQuotes } from "../utils" import renderInterface from "../typescript/renderInterface" import renderField from "./renderField" import renderContentTypeId from "./renderContentTypeId" @@ -67,7 +68,7 @@ function renderSys(sys: Sys) { locale: string; contentType: { sys: { - id: '${sys.id}'; + id: '${escapeSingleQuotes(sys.id)}'; linkType: 'ContentType'; type: 'Link'; } diff --git a/src/renderers/contentful/renderDefaultLocale.ts b/src/renderers/contentful/renderDefaultLocale.ts index 568769d9..c6da1a5c 100644 --- a/src/renderers/contentful/renderDefaultLocale.ts +++ b/src/renderers/contentful/renderDefaultLocale.ts @@ -1,4 +1,5 @@ import { Locale } from "contentful" +import { escapeSingleQuotes } from "../utils" export default function renderDefaultLocale(locales: Locale[]): string { const defaultLocale = locales.find(locale => locale.default) @@ -7,5 +8,5 @@ export default function renderDefaultLocale(locales: Locale[]): string { throw new Error("Could not find a default locale in Contentful.") } - return `export type CONTENTFUL_DEFAULT_LOCALE_CODE = '${defaultLocale.code}';` + return `export type CONTENTFUL_DEFAULT_LOCALE_CODE = '${escapeSingleQuotes(defaultLocale.code)}';` } diff --git a/src/renderers/render.ts b/src/renderers/render.ts index 6b056eef..c1a7bad5 100644 --- a/src/renderers/render.ts +++ b/src/renderers/render.ts @@ -45,5 +45,8 @@ function renderAllContentTypes(contentTypes: ContentType[], localization: boolea } function renderAllContentTypeIds(contentTypes: ContentType[]): string { - return renderUnion("CONTENT_TYPE", contentTypes.map(contentType => `'${contentType.sys.id}'`)) + return renderUnion( + "CONTENT_TYPE", + contentTypes.map(contentType => `'${contentType.sys.id}'`), + ) } diff --git a/src/renderers/utils.ts b/src/renderers/utils.ts new file mode 100644 index 00000000..52839342 --- /dev/null +++ b/src/renderers/utils.ts @@ -0,0 +1,3 @@ +export function escapeSingleQuotes(str: string = ""): string { + return str.replace(/'/g, "'") +} diff --git a/test/renderers/utils.test.ts b/test/renderers/utils.test.ts new file mode 100644 index 00000000..fa6a5b5c --- /dev/null +++ b/test/renderers/utils.test.ts @@ -0,0 +1,23 @@ +import { escapeSingleQuotes } from "../../src/renderers/utils" + +describe("escapeSingleQuotes()", () => { + const testStrings = [ + "no quotes", + "the quote's pie", + "Tom's pie is better than quote's pie", + "Alot of quotes after '''''", + "''''' Alot of quotes before", + ] + + const escapedStrings = [ + "no quotes", + "the quote's pie", + "Tom's pie is better than quote's pie", + "Alot of quotes after '''''", + "''''' Alot of quotes before", + ] + + it("escapes all the single quotes", () => { + expect(testStrings.map(escapeSingleQuotes)).toStrictEqual(escapedStrings) + }) +}) From 1423bd90131ea27cb032163fde2b0cffa98a8730 Mon Sep 17 00:00:00 2001 From: Jaden Giordano Date: Fri, 10 Sep 2021 09:22:14 -0700 Subject: [PATCH 2/7] trying to pass tests --- src/renderers/render.ts | 3 ++- src/renderers/utils.ts | 2 +- test/renderers/render.test.ts | 8 ++++---- test/renderers/utils.test.ts | 10 ++++++---- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/renderers/render.ts b/src/renderers/render.ts index c1a7bad5..fbc4a171 100644 --- a/src/renderers/render.ts +++ b/src/renderers/render.ts @@ -9,6 +9,7 @@ import renderAllLocales from "./contentful/renderAllLocales" import renderDefaultLocale from "./contentful/renderDefaultLocale" import renderNamespace from "./contentful/renderNamespace" import renderLocalizedTypes from "./contentful/renderLocalizedTypes" +import { escapeSingleQuotes } from "./utils" interface Options { localization?: boolean @@ -47,6 +48,6 @@ function renderAllContentTypes(contentTypes: ContentType[], localization: boolea function renderAllContentTypeIds(contentTypes: ContentType[]): string { return renderUnion( "CONTENT_TYPE", - contentTypes.map(contentType => `'${contentType.sys.id}'`), + contentTypes.map(contentType => `'${escapeSingleQuotes(contentType.sys.id)}'`), ) } diff --git a/src/renderers/utils.ts b/src/renderers/utils.ts index 52839342..d419cfae 100644 --- a/src/renderers/utils.ts +++ b/src/renderers/utils.ts @@ -1,3 +1,3 @@ export function escapeSingleQuotes(str: string = ""): string { - return str.replace(/'/g, "'") + return str.replace(/'/g, "\\'") } diff --git a/test/renderers/render.test.ts b/test/renderers/render.test.ts index 384ef2d0..b2ddc9c0 100644 --- a/test/renderers/render.test.ts +++ b/test/renderers/render.test.ts @@ -17,7 +17,7 @@ describe("render()", () => { type: "Symbol", validations: [ { - in: ["one", "of", "the", "above"], + in: ["one's", "of", "the", "above"], }, ], }, @@ -60,7 +60,7 @@ describe("render()", () => { export interface IMyContentTypeFields { /** Array field */ - arrayField: (\\"one\\" | \\"of\\" | \\"the\\" | \\"above\\")[] + arrayField: (\\"one\\'s'\\" | \\"of\\" | \\"the\\" | \\"above\\")[] } export interface IMyContentType extends Entry { @@ -130,7 +130,7 @@ describe("render()", () => { export interface IMyContentTypeFields { /** Array field */ - arrayField: LocalizedField<(\\"one\\" | \\"of\\" | \\"the\\" | \\"above\\")[]> + arrayField: LocalizedField<(\\"one\\'s\\" | \\"of\\" | \\"the\\" | \\"above\\")[]> } export interface IMyContentType extends Entry { @@ -193,7 +193,7 @@ describe("render()", () => { declare namespace Codegen { export interface IMyContentTypeFields { /** Array field */ - arrayField: (\\"one\\" | \\"of\\" | \\"the\\" | \\"above\\")[] + arrayField: (\\"one\\'s\\" | \\"of\\" | \\"the\\" | \\"above\\")[] } export interface IMyContentType extends Entry { diff --git a/test/renderers/utils.test.ts b/test/renderers/utils.test.ts index fa6a5b5c..caaf6936 100644 --- a/test/renderers/utils.test.ts +++ b/test/renderers/utils.test.ts @@ -2,6 +2,7 @@ import { escapeSingleQuotes } from "../../src/renderers/utils" describe("escapeSingleQuotes()", () => { const testStrings = [ + "one's", "no quotes", "the quote's pie", "Tom's pie is better than quote's pie", @@ -10,11 +11,12 @@ describe("escapeSingleQuotes()", () => { ] const escapedStrings = [ + "one\\'s", "no quotes", - "the quote's pie", - "Tom's pie is better than quote's pie", - "Alot of quotes after '''''", - "''''' Alot of quotes before", + "the quote\\'s pie", + "Tom\\'s pie is better than quote\\'s pie", + "Alot of quotes after \\'\\'\\'\\'\\'", + "\\'\\'\\'\\'\\' Alot of quotes before", ] it("escapes all the single quotes", () => { From d9b2f5045920de1c57cfd7565f82d0cbdfca80de Mon Sep 17 00:00:00 2001 From: Jaden Giordano Date: Fri, 10 Sep 2021 12:19:45 -0700 Subject: [PATCH 3/7] properly escape --- test/renderers/render.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/renderers/render.test.ts b/test/renderers/render.test.ts index b2ddc9c0..2d3aaee3 100644 --- a/test/renderers/render.test.ts +++ b/test/renderers/render.test.ts @@ -60,7 +60,7 @@ describe("render()", () => { export interface IMyContentTypeFields { /** Array field */ - arrayField: (\\"one\\'s'\\" | \\"of\\" | \\"the\\" | \\"above\\")[] + arrayField: (\\"one's\\" | \\"of\\" | \\"the\\" | \\"above\\")[] } export interface IMyContentType extends Entry { @@ -105,7 +105,7 @@ describe("render()", () => { type: "Symbol", validations: [ { - in: ["one", "of", "the", "above"], + in: ["one's", "of", "the", "above"], }, ], }, @@ -130,7 +130,7 @@ describe("render()", () => { export interface IMyContentTypeFields { /** Array field */ - arrayField: LocalizedField<(\\"one\\'s\\" | \\"of\\" | \\"the\\" | \\"above\\")[]> + arrayField: LocalizedField<(\\"one's\\" | \\"of\\" | \\"the\\" | \\"above\\")[]> } export interface IMyContentType extends Entry { @@ -193,7 +193,7 @@ describe("render()", () => { declare namespace Codegen { export interface IMyContentTypeFields { /** Array field */ - arrayField: (\\"one\\'s\\" | \\"of\\" | \\"the\\" | \\"above\\")[] + arrayField: (\\"one's\\" | \\"of\\" | \\"the\\" | \\"above\\")[] } export interface IMyContentType extends Entry { From 8510cc04cf4d9a28f11bef362e8f0bd12753fe66 Mon Sep 17 00:00:00 2001 From: Jaden Giordano Date: Thu, 16 Sep 2021 07:24:48 -0700 Subject: [PATCH 4/7] remove unnecessary escapes --- src/renderers/contentful/renderDefaultLocale.ts | 3 +-- src/renderers/render.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/renderers/contentful/renderDefaultLocale.ts b/src/renderers/contentful/renderDefaultLocale.ts index c6da1a5c..568769d9 100644 --- a/src/renderers/contentful/renderDefaultLocale.ts +++ b/src/renderers/contentful/renderDefaultLocale.ts @@ -1,5 +1,4 @@ import { Locale } from "contentful" -import { escapeSingleQuotes } from "../utils" export default function renderDefaultLocale(locales: Locale[]): string { const defaultLocale = locales.find(locale => locale.default) @@ -8,5 +7,5 @@ export default function renderDefaultLocale(locales: Locale[]): string { throw new Error("Could not find a default locale in Contentful.") } - return `export type CONTENTFUL_DEFAULT_LOCALE_CODE = '${escapeSingleQuotes(defaultLocale.code)}';` + return `export type CONTENTFUL_DEFAULT_LOCALE_CODE = '${defaultLocale.code}';` } diff --git a/src/renderers/render.ts b/src/renderers/render.ts index fbc4a171..c1a7bad5 100644 --- a/src/renderers/render.ts +++ b/src/renderers/render.ts @@ -9,7 +9,6 @@ import renderAllLocales from "./contentful/renderAllLocales" import renderDefaultLocale from "./contentful/renderDefaultLocale" import renderNamespace from "./contentful/renderNamespace" import renderLocalizedTypes from "./contentful/renderLocalizedTypes" -import { escapeSingleQuotes } from "./utils" interface Options { localization?: boolean @@ -48,6 +47,6 @@ function renderAllContentTypes(contentTypes: ContentType[], localization: boolea function renderAllContentTypeIds(contentTypes: ContentType[]): string { return renderUnion( "CONTENT_TYPE", - contentTypes.map(contentType => `'${escapeSingleQuotes(contentType.sys.id)}'`), + contentTypes.map(contentType => `'${contentType.sys.id}'`), ) } From a90cd15a4aa6ac6c477c1da3ec4a205b87e1db94 Mon Sep 17 00:00:00 2001 From: Jaden Giordano Date: Fri, 17 Sep 2021 08:43:36 -0700 Subject: [PATCH 5/7] remove more unneccessary escapes --- src/renderers/contentful/renderAllLocales.ts | 2 +- src/renderers/contentful/renderContentType.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderers/contentful/renderAllLocales.ts b/src/renderers/contentful/renderAllLocales.ts index 3a388b3f..957b710b 100644 --- a/src/renderers/contentful/renderAllLocales.ts +++ b/src/renderers/contentful/renderAllLocales.ts @@ -5,6 +5,6 @@ import { escapeSingleQuotes } from "../utils" export default function renderAllLocales(locales: Locale[]): string { return renderUnion( "LOCALE_CODE", - locales.map(locale => `'${escapeSingleQuotes(locale.code)}'`), + locales.map(locale => `'${locale.code}'`), ) } diff --git a/src/renderers/contentful/renderContentType.ts b/src/renderers/contentful/renderContentType.ts index 567bd0f4..d396ff95 100644 --- a/src/renderers/contentful/renderContentType.ts +++ b/src/renderers/contentful/renderContentType.ts @@ -68,7 +68,7 @@ function renderSys(sys: Sys) { locale: string; contentType: { sys: { - id: '${escapeSingleQuotes(sys.id)}'; + id: '${sys.id}'; linkType: 'ContentType'; type: 'Link'; } From 2c3a06bb7ed2f3c52d407edb79dc3b525fe5d495 Mon Sep 17 00:00:00 2001 From: Jaden Giordano Date: Mon, 20 Sep 2021 13:19:37 -0700 Subject: [PATCH 6/7] Update src/renderers/contentful/renderContentType.ts Co-authored-by: Gabriel Anca Corral --- src/renderers/contentful/renderContentType.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderers/contentful/renderContentType.ts b/src/renderers/contentful/renderContentType.ts index d396ff95..456cf8eb 100644 --- a/src/renderers/contentful/renderContentType.ts +++ b/src/renderers/contentful/renderContentType.ts @@ -1,6 +1,5 @@ import { ContentType, Field, FieldType, Sys } from "contentful" -import { escapeSingleQuotes } from "../utils" import renderInterface from "../typescript/renderInterface" import renderField from "./renderField" import renderContentTypeId from "./renderContentTypeId" From 3abb3ffa51c7e3917404b998b7618ddd6adbefda Mon Sep 17 00:00:00 2001 From: Gabriel Anca Corral Date: Thu, 23 Sep 2021 10:38:10 +0200 Subject: [PATCH 7/7] Remove unused import --- src/renderers/contentful/renderAllLocales.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderers/contentful/renderAllLocales.ts b/src/renderers/contentful/renderAllLocales.ts index 957b710b..234cf2b8 100644 --- a/src/renderers/contentful/renderAllLocales.ts +++ b/src/renderers/contentful/renderAllLocales.ts @@ -1,6 +1,5 @@ import renderUnion from "../typescript/renderUnion" import { Locale } from "contentful" -import { escapeSingleQuotes } from "../utils" export default function renderAllLocales(locales: Locale[]): string { return renderUnion(