Skip to content

Commit dbd9ddd

Browse files
author
Johannes Sjoberg
committed
feat: add option for default modifier for v10 types
1 parent 6fd778c commit dbd9ddd

File tree

4 files changed

+89
-10
lines changed

4 files changed

+89
-10
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ OPTIONS
5050
-p, --preserve preserve output folder
5151
-X --v10 create contentful.js v10 types
5252
-r, --response add response types (only for v10 types)
53+
-m, --modifier add default modifier (only for v10 types)
5354
-l, --localized add localized types
5455
-d, --jsdoc add JSDoc comments
5556
-g, --typeguard add type guards

src/commands/index.ts

+21-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class ContentfulMdg extends Command {
3131
jsdoc: Flags.boolean({ char: 'd', description: 'add JSDoc comments' }),
3232
typeguard: Flags.boolean({ char: 'g', description: 'add type guards' }),
3333
response: Flags.boolean({ char: 'r', description: 'add response types' }),
34+
modifier: Flags.string({ char: 'm', description: 'add default modifier (v10 only)' }),
3435

3536
// remote access
3637
spaceId: Flags.string({ char: 's', description: 'space id' }),
@@ -75,8 +76,27 @@ class ContentfulMdg extends Command {
7576
});
7677
}
7778

79+
const v10Options: ConstructorParameters<typeof V10ContentTypeRenderer>[0] = {};
80+
81+
if (flags.modifier) {
82+
if (!flags.v10) {
83+
this.error('"--modifier" option is only available for contentful.js v10 types.');
84+
}
85+
86+
if (
87+
flags.modifier !== 'WITHOUT_UNRESOLVABLE_LINKS' &&
88+
flags.modifier !== 'WITHOUT_LINK_RESOLUTION'
89+
) {
90+
this.error(
91+
`--modifier" option only allows values: WITHOUT_UNRESOLVABLE_LINKS | WITHOUT_LINK_RESOLUTION.`,
92+
);
93+
}
94+
95+
v10Options.defaultModifier = flags.modifier;
96+
}
97+
7898
const renderers: ContentTypeRenderer[] = flags.v10
79-
? [new V10ContentTypeRenderer()]
99+
? [new V10ContentTypeRenderer(v10Options)]
80100
: [new DefaultContentTypeRenderer()];
81101
if (flags.localized) {
82102
if (flags.v10) {

src/renderer/type/v10-content-type-renderer.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ import { RenderContext } from './create-default-context';
1313
import { createV10Context } from './create-v10-context';
1414

1515
export class V10ContentTypeRenderer extends BaseContentTypeRenderer {
16+
defaultModifier: 'WITHOUT_LINK_RESOLUTION' | 'WITHOUT_UNRESOLVABLE_LINKS' | undefined;
17+
18+
constructor(
19+
options: {
20+
defaultModifier?: 'WITHOUT_LINK_RESOLUTION' | 'WITHOUT_UNRESOLVABLE_LINKS';
21+
} = {},
22+
) {
23+
super();
24+
if (options.defaultModifier) this.defaultModifier = options.defaultModifier;
25+
}
26+
1627
public render(contentType: CFContentType, file: SourceFile): void {
1728
const context = this.createContext();
1829

@@ -101,7 +112,9 @@ export class V10ContentTypeRenderer extends BaseContentTypeRenderer {
101112
return {
102113
name: renderTypeGeneric(
103114
context.moduleName(contentType.sys.id),
104-
'Modifiers extends ChainModifiers',
115+
`Modifiers extends ChainModifiers${
116+
this.defaultModifier ? ` = '${this.defaultModifier}'` : ''
117+
}`,
105118
'Locales extends LocaleCode = LocaleCode',
106119
),
107120
isExported: true,

test/renderer/type/v10-content-type-renderer.test.ts

+53-8
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,61 @@ describe('The v10 content type renderer', () => {
6363
stripIndent(`
6464
import type { ChainModifiers, Entry, EntryFieldTypes, EntrySkeletonType, LocaleCode } from "contentful";
6565
import type { TypeLinkedTypeSkeleton } from "./TypeLinkedType";
66-
66+
6767
export interface TypeTestFields {
6868
linkFieldId: EntryFieldTypes.EntryLink<TypeLinkedTypeSkeleton>;
6969
}
70-
70+
7171
export type TypeTestSkeleton = EntrySkeletonType<TypeTestFields, "test">;
7272
export type TypeTest<Modifiers extends ChainModifiers, Locales extends LocaleCode = LocaleCode> = Entry<TypeTestSkeleton, Modifiers, Locales>;
7373
`),
7474
);
7575
});
76+
77+
it('adds default modifier', () => {
78+
const renderer = new V10ContentTypeRenderer({ defaultModifier: 'WITHOUT_UNRESOLVABLE_LINKS' });
79+
80+
const contentType: CFContentType = {
81+
name: 'unused-name',
82+
sys: {
83+
id: 'test',
84+
type: 'Symbol',
85+
},
86+
fields: [
87+
{
88+
id: 'linkFieldId',
89+
name: 'Linked entry Field',
90+
type: 'Link',
91+
localized: false,
92+
required: true,
93+
validations: [
94+
{
95+
linkContentType: ['linkedType'],
96+
},
97+
],
98+
disabled: false,
99+
omitted: false,
100+
linkType: 'Entry',
101+
},
102+
],
103+
};
104+
105+
renderer.render(contentType, testFile);
106+
107+
expect('\n' + testFile.getFullText()).toEqual(
108+
stripIndent(`
109+
import type { ChainModifiers, Entry, EntryFieldTypes, EntrySkeletonType, LocaleCode } from "contentful";
110+
import type { TypeLinkedTypeSkeleton } from "./TypeLinkedType";
111+
112+
export interface TypeTestFields {
113+
linkFieldId: EntryFieldTypes.EntryLink<TypeLinkedTypeSkeleton>;
114+
}
115+
116+
export type TypeTestSkeleton = EntrySkeletonType<TypeTestFields, "test">;
117+
export type TypeTest<Modifiers extends ChainModifiers = 'WITHOUT_UNRESOLVABLE_LINKS', Locales extends LocaleCode = LocaleCode> = Entry<TypeTestSkeleton, Modifiers, Locales>;
118+
`),
119+
);
120+
});
76121
});
77122

78123
const symbolTypeRenderer = () => {
@@ -141,11 +186,11 @@ describe('A derived content type renderer class', () => {
141186
expect('\n' + testFile.getFullText()).toEqual(
142187
stripIndent(`
143188
import type { ChainModifiers, Entry, EntrySkeletonType, LocaleCode } from "contentful";
144-
189+
145190
export interface TypeTestFields {
146191
field_id: Test.Symbol;
147192
}
148-
193+
149194
export type TypeTestSkeleton = EntrySkeletonType<TypeTestFields, "test">;
150195
export type TypeTest<Modifiers extends ChainModifiers, Locales extends LocaleCode = LocaleCode> = Entry<TypeTestSkeleton, Modifiers, Locales>;
151196
`),
@@ -204,12 +249,12 @@ describe('A derived content type renderer class', () => {
204249
expect('\n' + testFile.getFullText()).toEqual(
205250
stripIndent(`
206251
import type { Entry, EntryFieldTypes, EntrySkeletonType } from "contentful";
207-
252+
208253
export interface TypeTestFields {
209254
/** Field of type "Symbol" */
210255
field_id: EntryFieldTypes.Symbol;
211256
}
212-
257+
213258
export type TypeTestSkeleton = EntrySkeletonType<TypeTestFields, "test">;
214259
/** content type "display name" with id: test */
215260
export type TypeTest = Entry<TypeTestSkeleton, Modifiers, Locales>;
@@ -262,11 +307,11 @@ describe('A derived content type renderer class', () => {
262307
stripIndent(`
263308
import type { CustomEntry } from "@custom";
264309
import type { EntryFieldTypes, EntrySkeletonType } from "contentful";
265-
310+
266311
export interface TypeTestFields {
267312
field_id: EntryFieldTypes.Symbol;
268313
}
269-
314+
270315
export type TypeTestSkeleton = EntrySkeletonType<TypeTestFields, "test">;
271316
export type TypeTest<Modifiers extends ChainModifiers, Locales extends LocaleCode = LocaleCode> = CustomEntry<TypeTestSkeleton, Modifiers, Locales>;
272317
`),

0 commit comments

Comments
 (0)