Skip to content

Commit 934687f

Browse files
authored
Generate reexports in components (#809)
1 parent b74fafd commit 934687f

File tree

7 files changed

+38
-20
lines changed

7 files changed

+38
-20
lines changed

package-lock.json

Lines changed: 5 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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": "^9.4.0",
16+
"devextreme-internal-tools": "10.0.0-beta.2",
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-lock.json

Lines changed: 7 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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.0.0",
4+
"version": "3.1.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": "^9.4.0",
30+
"devextreme-internal-tools": "10.0.0-beta.2",
3131
"dot": "^1.1.3"
3232
},
3333
"devDependencies": {

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

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ type IComponent = {
2424
} & {
2525
nestedComponents?: INestedComponent[];
2626
configComponentPath?: string;
27+
containsReexports?: boolean
2728
};
2829

2930
interface INestedComponent {
@@ -167,6 +168,7 @@ const renderModule: (model: {
167168
renderedNestedComponents?: string[];
168169
defaultExport: string;
169170
renderedExports: string;
171+
renderedReExports?: string;
170172
}) => string = createTempate(
171173
'<#= it.renderedImports #>\n'
172174

@@ -186,7 +188,10 @@ const renderModule: (model: {
186188
+ `export {
187189
<#= it.renderedExports #>
188190
};
189-
`,
191+
`
192+
+ '<#? it.renderedReExports #>'
193+
+ '<#= it.renderedReExports #>\n\n'
194+
+ '<#?#>',
190195
);
191196

192197
const renderImports: (model: {
@@ -402,6 +407,11 @@ function renderExports(exportsNames: string[]) {
402407
.join(',\n');
403408
}
404409

410+
function renderReExports(componentName: string, exportPath: string) {
411+
return `import type * as ${componentName}Types from '${exportPath}_types';\n`
412+
+ `export { ${componentName}Types };`;
413+
}
414+
405415
function formatTemplatePropName(name: string, suffix: string): string {
406416
return lowercaseFirst(name.replace(/template$/i, suffix));
407417
}
@@ -441,7 +451,7 @@ function createPropTypingModel(typing: IPropTyping): IRenderedPropTyping {
441451
};
442452
}
443453

444-
function generate(component: IComponent): string {
454+
function generate(component: IComponent, generateReexports = false): string {
445455
const nestedComponents = component.nestedComponents
446456
? component.nestedComponents
447457
.sort(createKeyComparator<INestedComponent>((o) => o.className))
@@ -549,6 +559,8 @@ function generate(component: IComponent): string {
549559
.map((t) => renderPropTyping(createPropTypingModel(t)))
550560
: undefined;
551561

562+
const hasExplicitTypes = !!component.optionsTypeParams?.length;
563+
552564
return renderModule({
553565

554566
renderedImports: renderImports({
@@ -561,7 +573,7 @@ function generate(component: IComponent): string {
561573
optionsAliasName: hasExtraOptions ? undefined : optionsName,
562574
hasExtraOptions,
563575
hasPropTypings: isNotEmptyArray(renderedPropTypings),
564-
hasExplicitTypes: !!component.optionsTypeParams?.length,
576+
hasExplicitTypes,
565577
configComponentPath: isNotEmptyArray(nestedComponents)
566578
? component.configComponentPath
567579
: undefined,
@@ -598,6 +610,9 @@ function generate(component: IComponent): string {
598610

599611
defaultExport: component.name,
600612
renderedExports: renderExports(exportNames),
613+
renderedReExports: generateReexports && component.containsReexports
614+
? renderReExports(component.name, component.dxExportPath)
615+
: undefined,
601616
});
602617
}
603618

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,14 +273,15 @@ export function mapWidget(
273273
const propTypings = extractPropTypings(raw.options, customTypeHash)
274274
.filter((propType) => propType !== null) as IPropTyping[];
275275

276+
const dxExportPath = `${widgetPackage}/${raw.exportPath}`;
276277
return {
277278
fileName: `${toKebabCase(name)}.ts`,
278279
component: {
279280
name,
280281
baseComponentPath: baseComponent,
281282
extensionComponentPath: extensionComponent,
282283
configComponentPath: configComponent,
283-
dxExportPath: `${widgetPackage}/${raw.exportPath}`,
284+
dxExportPath,
284285
isExtension: raw.isExtension,
285286
templates: raw.templates,
286287
subscribableOptions: subscribableOptions.length > 0 ? subscribableOptions : undefined,
@@ -289,6 +290,7 @@ export function mapWidget(
289290
expectedChildren: raw.nesteds,
290291
propTypings: propTypings.length > 0 ? propTypings : undefined,
291292
optionsTypeParams: raw.optionsTypeParams,
293+
containsReexports: !!raw.reexports.filter((r) => r !== 'default').length,
292294
},
293295
};
294296
}
@@ -325,8 +327,7 @@ function generate({
325327
);
326328
const widgetFilePath = joinPaths(out.componentsDir, widgetFile.fileName);
327329
const indexFileDir = getDirName(out.indexFileName);
328-
329-
writeFile(widgetFilePath, generateComponent(widgetFile.component), { encoding: 'utf8' });
330+
writeFile(widgetFilePath, generateComponent(widgetFile.component, generateReexports), { encoding: 'utf8' });
330331
modulePaths.push({
331332
name: widgetFile.component.name,
332333
path: `./${removeExtension(getRelativePath(indexFileDir, widgetFilePath)).replace(pathSeparator, '/')}`,

packages/devextreme-react/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"@types/react-dom": "^16.9.16",
3636
"del": "^3.0.0",
3737
"devextreme": "23.1-next",
38-
"devextreme-react-generator": "^3.0.0",
38+
"devextreme-react-generator": "^3.1.0",
3939
"gulp": "^4.0.2",
4040
"jest": "^25.0.0",
4141
"react": "~18.0.0",

0 commit comments

Comments
 (0)