Skip to content

Commit 9ea51f4

Browse files
authored
Generate types for config-components props: custom types (#818)
1 parent 934687f commit 9ea51f4

14 files changed

+503
-51
lines changed

.eslintrc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,15 @@
2828
"unschedule",
2929
"subscribable",
3030
"renderer",
31-
"rerender"
31+
"rerender",
32+
"dx",
33+
"descr",
34+
"params",
35+
"typings",
36+
"wildcard",
37+
"metadata",
38+
"namespace",
39+
"namespaces"
3240
]
3341
}
3442
]

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"@typescript-eslint/parser": "^4.33.0",
1414
"cpy-cli": "^3.1.1",
1515
"del-cli": "^3.0.1",
16-
"devextreme-internal-tools": "10.0.0-beta.2",
16+
"devextreme-internal-tools": "10.0.0-beta.4",
1717
"eslint": "^7.32.0",
1818
"eslint-config-airbnb-base": "^14.2.1",
1919
"eslint-config-airbnb-typescript": "^12.3.1",

packages/devextreme-react-generator/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"author": "Developer Express Inc.",
33
"name": "devextreme-react-generator",
4-
"version": "3.1.0",
4+
"version": "4.0.0",
55
"description": "DevExtreme React UI and Visualization Components",
66
"repository": {
77
"type": "git",
@@ -27,7 +27,7 @@
2727
"license": "MIT",
2828
"dependencies": {
2929
"dasherize": "^2.0.0",
30-
"devextreme-internal-tools": "10.0.0-beta.2",
30+
"devextreme-internal-tools": "10.0.0-beta.4",
3131
"dot": "^1.1.3"
3232
},
3333
"devDependencies": {

packages/devextreme-react-generator/src/common-reexports-generator.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { createTempate } from './template';
1+
import { createTemplate } from './template';
22

3-
const render: (model: { module: string, reexports: string[] }) => string = createTempate(`
3+
const render: (model: { module: string, reexports: string[] }) => string = createTemplate(`
44
export {<#~ it.reexports :reExport #>
55
<#= reExport #>,<#~#>
66
} from "devextreme/<#= it.module #>";

packages/devextreme-react-generator/src/component-generator.ts

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {
2-
createTempate, L1, L2, L3,
2+
createTemplate, L1, L2, L3,
33
} from './template';
44

55
import {
@@ -106,7 +106,7 @@ function getIndent(indent: number) {
106106
const renderObjectEntry: (model: {
107107
key: string;
108108
value: string;
109-
}) => string = createTempate(`
109+
}) => string = createTemplate(`
110110
<#= it.key #>: "<#= it.value #>"
111111
`.trimRight());
112112

@@ -136,7 +136,7 @@ const renderTemplateOption: (model: {
136136
actualOptionName: string;
137137
render: string;
138138
component: string;
139-
}) => string = createTempate(`
139+
}) => string = createTemplate(`
140140
{
141141
tmplOption: "<#= it.actualOptionName #>",
142142
render: "<#= it.render #>",
@@ -145,9 +145,9 @@ const renderTemplateOption: (model: {
145145
}
146146
`.trim());
147147

148-
const renderStringEntry: (value: string) => string = createTempate('"<#= it #>"');
148+
const renderStringEntry: (value: string) => string = createTemplate('"<#= it #>"');
149149

150-
const renderPropTyping: (model: IRenderedPropTyping) => string = createTempate(
150+
const renderPropTyping: (model: IRenderedPropTyping) => string = createTemplate(
151151
' <#= it.propName #>: '
152152

153153
+ '<#? it.renderedTypes.length === 1 #>'
@@ -169,7 +169,7 @@ const renderModule: (model: {
169169
defaultExport: string;
170170
renderedExports: string;
171171
renderedReExports?: string;
172-
}) => string = createTempate(
172+
}) => string = createTemplate(
173173
'<#= it.renderedImports #>\n'
174174

175175
+ '<#? it.renderedOptionsInterface #>'
@@ -204,7 +204,10 @@ const renderImports: (model: {
204204
hasPropTypings: boolean;
205205
hasExplicitTypes: boolean;
206206
configComponentPath?: string;
207-
}) => string = createTempate(
207+
customTypeImports?: Record<string, Array<string>>;
208+
defaultTypeImports?: Record<string, string>;
209+
wildcardTypeImports?: Record<string, string>;
210+
}) => string = createTemplate(
208211
'<#? it.hasExplicitTypes #>'
209212
+ 'export { ExplicitTypes } from "<#= it.dxExportPath #>";\n'
210213
+ '<#?#>'
@@ -225,6 +228,26 @@ const renderImports: (model: {
225228

226229
+ '<#? it.configComponentPath #>'
227230
+ 'import NestedOption from "<#= it.configComponentPath #>";\n'
231+
+ '<#?#>'
232+
233+
+ '<#? it.customTypeImports && Object.keys(it.customTypeImports).length #>\n'
234+
+ '<#~ Object.keys(it.customTypeImports) : module #>'
235+
+ 'import type { <#= it.customTypeImports[module].join(", ")#> } from "<#= module #>";\n'
236+
+ '<#~#>'
237+
+ '<#?#>'
238+
239+
+ '<#? it.defaultTypeImports && Object.keys(it.defaultTypeImports).length #>\n'
240+
+ '<#~ Object.keys(it.defaultTypeImports) : defaultImport #>'
241+
+ '<#? defaultImport !== it.widgetName #>'
242+
+ 'import type <#= defaultImport #> from "<#= it.defaultTypeImports[defaultImport] #>";\n'
243+
+ '<#?#>'
244+
+ '<#~#>'
245+
+ '<#?#>'
246+
247+
+ '<#? it.wildcardTypeImports && Object.keys(it.wildcardTypeImports).length #>\n'
248+
+ '<#~ Object.keys(it.wildcardTypeImports) : wildcardImportModule #>'
249+
+ 'import type * as <#= it.wildcardTypeImports[wildcardImportModule] #> from "<#= wildcardImportModule #>";\n'
250+
+ '<#~#>'
228251
+ '<#?#>',
229252
);
230253

@@ -242,7 +265,7 @@ const renderNestedComponent: (model: {
242265
renderedSubscribableOptions?: string[];
243266
renderedTemplateProps?: string[];
244267
owners: string[];
245-
}) => string = createTempate(
268+
}) => string = createTemplate(
246269
`${'// owners:\n'
247270
+ '<#~ it.owners : owner #>'
248271
+ '// <#= owner #>\n'
@@ -312,7 +335,7 @@ const renderOptionsInterface: (model: {
312335
name: string;
313336
type: string;
314337
}>;
315-
}) => string = createTempate(
338+
}) => string = createTemplate(
316339
`type <#= it.optionsName #>${TYPE_PARAMS_WITH_DEFAULTS} = React.PropsWithChildren<Properties${TYPE_PARAMS} & IHtmlOptions & {\n`
317340

318341
+ '<#? it.typeParams #>'
@@ -349,7 +372,7 @@ const renderComponent: (model: {
349372
isPortalComponent?: boolean;
350373
useRequestAnimationFrameFlag?: boolean;
351374
typeParams: string[] | undefined;
352-
}) => string = createTempate(
375+
}) => string = createTemplate(
353376
`class <#= it.className #>${TYPE_PARAMS_WITH_DEFAULTS} extends BaseComponent<React.PropsWithChildren<<#= it.optionsName #>${TYPE_PARAMS}>> {
354377
355378
public get instance(): <#= it.widgetName #>${TYPE_PARAMS} {
@@ -451,7 +474,13 @@ function createPropTypingModel(typing: IPropTyping): IRenderedPropTyping {
451474
};
452475
}
453476

454-
function generate(component: IComponent, generateReexports = false): string {
477+
function generate(
478+
component: IComponent,
479+
generateReexports = false,
480+
customTypeImports?: Record<string, Array<string>>,
481+
defaultTypeImports?: Record<string, string>,
482+
wildcardTypeImports?: Record<string, string>,
483+
): string {
455484
const nestedComponents = component.nestedComponents
456485
? component.nestedComponents
457486
.sort(createKeyComparator<INestedComponent>((o) => o.className))
@@ -577,6 +606,9 @@ function generate(component: IComponent, generateReexports = false): string {
577606
configComponentPath: isNotEmptyArray(nestedComponents)
578607
? component.configComponentPath
579608
: undefined,
609+
customTypeImports,
610+
defaultTypeImports,
611+
wildcardTypeImports,
580612
}),
581613

582614
renderedOptionsInterface: !hasExtraOptions ? undefined : renderOptionsInterface({

packages/devextreme-react-generator/src/converter.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ it('expands custom types', () => {
6767
],
6868
props: [],
6969
templates: [],
70+
module: '',
7071
},
7172
},
7273
)).toEqual(['object', 'string', 'number']);

0 commit comments

Comments
 (0)