Skip to content

Commit ac2fd82

Browse files
mistrykaran91spike-rabbit
authored andcommitted
fix(schematics): add symbols in exports as well for NgModule
Currently, when migrating from SimplElementNgModule symbols are added only in imports but if exports are there then it should be added in there too
1 parent a031159 commit ac2fd82

File tree

6 files changed

+297
-34
lines changed

6 files changed

+297
-34
lines changed
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
import { NgModule } from '@angular/core';
2+
import { CommonModule } from '@angular/common';
3+
import { SiAboutModule } from '@siemens/element-ng/about';
4+
import { SiAccordionModule } from '@siemens/element-ng/accordion';
5+
import { SiBreadcrumbModule } from '@siemens/element-ng/breadcrumb';
6+
import { SiBreadcrumbRouterModule } from '@siemens/element-ng/breadcrumb-router';
7+
import { SiCardModule } from '@siemens/element-ng/card';
8+
import { SiCircleStatusModule } from '@siemens/element-ng/circle-status';
9+
import { SiConnectionStrengthModule } from '@siemens/element-ng/connection-strength';
10+
import { SiContentActionBarModule } from '@siemens/element-ng/content-action-bar';
11+
import { SiCopyrightNoticeModule } from '@siemens/element-ng/copyright-notice';
12+
import { SiDateRangeFilterModule } from '@siemens/element-ng/date-range-filter';
13+
import { SiDatepickerModule } from '@siemens/element-ng/datepicker';
14+
import { SiElectrontitlebarModule } from '@siemens/element-ng/electron-titlebar';
15+
import { SiEmptyStateModule } from '@siemens/element-ng/empty-state';
16+
import { SiFileUploaderModule } from '@siemens/element-ng/file-uploader';
17+
import { SiFilterBarModule } from '@siemens/element-ng/filter-bar';
18+
import { SiFilteredSearchModule } from '@siemens/element-ng/filtered-search';
19+
import { SiFooterModule } from '@siemens/element-ng/footer';
20+
import { SiFormModule } from '@siemens/element-ng/form';
21+
import { SiIconModule } from '@siemens/element-ng/icon';
22+
import { SiIconStatusModule } from '@siemens/element-ng/icon-status';
23+
import { SiInlineNotificationModule } from '@siemens/element-ng/inline-notification';
24+
import { SiLandingPageModule } from '@siemens/element-ng/landing-page';
25+
import { SiLanguageSwitcherModule } from '@siemens/element-ng/language-switcher';
26+
import { SiLinkModule } from '@siemens/element-ng/link';
27+
import { SiLoadingSpinnerModule } from '@siemens/element-ng/loading-spinner';
28+
import { SiMainDetailContainerModule } from '@siemens/element-ng/main-detail-container';
29+
import { SiNavbarModule } from '@siemens/element-ng/navbar';
30+
import { SiNavbarVerticalModule } from '@siemens/element-ng/navbar-vertical';
31+
import { SiNumberInputModule } from '@siemens/element-ng/number-input';
32+
import { SiPaginationModule } from '@siemens/element-ng/pagination';
33+
import { SiPasswordStrengthModule } from '@siemens/element-ng/password-strength';
34+
import { SiPasswordToggleModule } from '@siemens/element-ng/password-toggle';
35+
import { SiPillsInputModule } from '@siemens/element-ng/pills-input';
36+
import { SiPopoverLegacyModule } from '@siemens/element-ng/popover-legacy';
37+
import { SiProgressbarModule } from '@siemens/element-ng/progressbar';
38+
import { SiResizeObserverModule } from '@siemens/element-ng/resize-observer';
39+
import { SiResultDetailsListModule } from '@siemens/element-ng/result-details-list';
40+
import { SiSearchBarModule } from '@siemens/element-ng/search-bar';
41+
import { SiSelectModule } from '@siemens/element-ng/select';
42+
import { SiSidePanelModule } from '@siemens/element-ng/side-panel';
43+
import { SiSliderModule } from '@siemens/element-ng/slider';
44+
import { SiSortBarModule } from '@siemens/element-ng/sort-bar';
45+
import { SiSplitModule } from '@siemens/element-ng/split';
46+
import { SiStatusBarModule } from '@siemens/element-ng/status-bar';
47+
import { SiTabsLegacyModule } from '@siemens/element-ng/tabs-legacy';
48+
import { SiThresholdModule } from '@siemens/element-ng/threshold';
49+
import { SiTooltipModule } from '@siemens/element-ng/tooltip';
50+
import { SiTreeViewModule } from '@siemens/element-ng/tree-view';
51+
import { SiTypeaheadModule } from '@siemens/element-ng/typeahead';
52+
import { SiUnauthorizedPageModule } from '@siemens/element-ng/unauthorized-page';
53+
import { SiWizardModule } from '@siemens/element-ng/wizard';
54+
import { TranslateModule } from '@ngx-translate/core';
55+
import { ReactiveFormsModule } from '@angular/forms';
56+
57+
@NgModule({
58+
imports: [
59+
CommonModule,
60+
TranslateModule,
61+
ReactiveFormsModule,
62+
SiAboutModule,
63+
SiAccordionModule,
64+
SiBreadcrumbModule,
65+
SiBreadcrumbRouterModule,
66+
SiCardModule,
67+
SiCircleStatusModule,
68+
SiConnectionStrengthModule,
69+
SiContentActionBarModule,
70+
SiCopyrightNoticeModule,
71+
SiDatepickerModule,
72+
SiDateRangeFilterModule,
73+
SiElectrontitlebarModule,
74+
SiEmptyStateModule,
75+
SiFileUploaderModule,
76+
SiFilterBarModule,
77+
SiFilteredSearchModule,
78+
SiFooterModule,
79+
SiFormModule,
80+
SiIconModule,
81+
SiIconStatusModule,
82+
SiInlineNotificationModule,
83+
SiLandingPageModule,
84+
SiLanguageSwitcherModule,
85+
SiLinkModule,
86+
SiLoadingSpinnerModule,
87+
SiMainDetailContainerModule,
88+
SiNavbarModule,
89+
SiNavbarVerticalModule,
90+
SiNumberInputModule,
91+
SiPaginationModule,
92+
SiPasswordStrengthModule,
93+
SiPasswordToggleModule,
94+
SiPillsInputModule,
95+
SiPopoverLegacyModule,
96+
SiProgressbarModule,
97+
SiResizeObserverModule,
98+
SiResultDetailsListModule,
99+
SiSearchBarModule,
100+
SiSelectModule,
101+
SiSidePanelModule,
102+
SiSliderModule,
103+
SiSortBarModule,
104+
SiSplitModule,
105+
SiStatusBarModule,
106+
SiTabsLegacyModule,
107+
SiThresholdModule,
108+
SiTooltipModule,
109+
SiTreeViewModule,
110+
SiTypeaheadModule,
111+
SiUnauthorizedPageModule,
112+
SiWizardModule
113+
],
114+
exports: [
115+
CommonModule,
116+
ReactiveFormsModule,
117+
SiAboutModule,
118+
SiAccordionModule,
119+
SiBreadcrumbModule,
120+
SiBreadcrumbRouterModule,
121+
SiCardModule,
122+
SiCircleStatusModule,
123+
SiConnectionStrengthModule,
124+
SiContentActionBarModule,
125+
SiCopyrightNoticeModule,
126+
SiDatepickerModule,
127+
SiDateRangeFilterModule,
128+
SiElectrontitlebarModule,
129+
SiEmptyStateModule,
130+
SiFileUploaderModule,
131+
SiFilterBarModule,
132+
SiFilteredSearchModule,
133+
SiFooterModule,
134+
SiFormModule,
135+
SiIconModule,
136+
SiIconStatusModule,
137+
SiInlineNotificationModule,
138+
SiLandingPageModule,
139+
SiLanguageSwitcherModule,
140+
SiLinkModule,
141+
SiLoadingSpinnerModule,
142+
SiMainDetailContainerModule,
143+
SiNavbarModule,
144+
SiNavbarVerticalModule,
145+
SiNumberInputModule,
146+
SiPaginationModule,
147+
SiPasswordStrengthModule,
148+
SiPasswordToggleModule,
149+
SiPillsInputModule,
150+
SiPopoverLegacyModule,
151+
SiProgressbarModule,
152+
SiResizeObserverModule,
153+
SiResultDetailsListModule,
154+
SiSearchBarModule,
155+
SiSelectModule,
156+
SiSidePanelModule,
157+
SiSliderModule,
158+
SiSortBarModule,
159+
SiSplitModule,
160+
SiStatusBarModule,
161+
SiTabsLegacyModule,
162+
SiThresholdModule,
163+
SiTooltipModule,
164+
SiTreeViewModule,
165+
SiTypeaheadModule,
166+
SiUnauthorizedPageModule,
167+
SiWizardModule
168+
]
169+
})
170+
export class MyModule {}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { NgModule } from '@angular/core';
2+
import { SiAboutModule } from '@siemens/element-ng/about';
3+
import { SiAccordionModule } from '@siemens/element-ng/accordion';
4+
import { SiBreadcrumbModule } from '@siemens/element-ng/breadcrumb';
5+
import { SiBreadcrumbRouterModule } from '@siemens/element-ng/breadcrumb-router';
6+
import { SiCardModule } from '@siemens/element-ng/card';
7+
import { SiCircleStatusModule } from '@siemens/element-ng/circle-status';
8+
import { SiConnectionStrengthModule } from '@siemens/element-ng/connection-strength';
9+
import { SiContentActionBarModule } from '@siemens/element-ng/content-action-bar';
10+
import { SiCopyrightNoticeModule } from '@siemens/element-ng/copyright-notice';
11+
import { SiDateRangeFilterModule } from '@siemens/element-ng/date-range-filter';
12+
import { SiDatepickerModule } from '@siemens/element-ng/datepicker';
13+
import { SiElectrontitlebarModule } from '@siemens/element-ng/electron-titlebar';
14+
import { SiEmptyStateModule } from '@siemens/element-ng/empty-state';
15+
import { SiFileUploaderModule } from '@siemens/element-ng/file-uploader';
16+
import { SiFilterBarModule } from '@siemens/element-ng/filter-bar';
17+
import { SiFilteredSearchModule } from '@siemens/element-ng/filtered-search';
18+
import { SiFooterModule } from '@siemens/element-ng/footer';
19+
import { SiFormModule } from '@siemens/element-ng/form';
20+
import { SiIconModule } from '@siemens/element-ng/icon';
21+
import { SiIconStatusModule } from '@siemens/element-ng/icon-status';
22+
import { SiInlineNotificationModule } from '@siemens/element-ng/inline-notification';
23+
import { SiLandingPageModule } from '@siemens/element-ng/landing-page';
24+
import { SiLanguageSwitcherModule } from '@siemens/element-ng/language-switcher';
25+
import { SiLinkModule } from '@siemens/element-ng/link';
26+
import { SiLoadingSpinnerModule } from '@siemens/element-ng/loading-spinner';
27+
import { SiMainDetailContainerModule } from '@siemens/element-ng/main-detail-container';
28+
import { SiNavbarModule } from '@siemens/element-ng/navbar';
29+
import { SiNavbarVerticalModule } from '@siemens/element-ng/navbar-vertical';
30+
import { SiNumberInputModule } from '@siemens/element-ng/number-input';
31+
import { SiPaginationModule } from '@siemens/element-ng/pagination';
32+
import { SiPasswordStrengthModule } from '@siemens/element-ng/password-strength';
33+
import { SiPasswordToggleModule } from '@siemens/element-ng/password-toggle';
34+
import { SiPillsInputModule } from '@siemens/element-ng/pills-input';
35+
import { SiPopoverLegacyModule } from '@siemens/element-ng/popover-legacy';
36+
import { SiProgressbarModule } from '@siemens/element-ng/progressbar';
37+
import { SiResizeObserverModule } from '@siemens/element-ng/resize-observer';
38+
import { SiResultDetailsListModule } from '@siemens/element-ng/result-details-list';
39+
import { SiSearchBarModule } from '@siemens/element-ng/search-bar';
40+
import { SiSelectModule } from '@siemens/element-ng/select';
41+
import { SiSidePanelModule } from '@siemens/element-ng/side-panel';
42+
import { SiSliderModule } from '@siemens/element-ng/slider';
43+
import { SiSortBarModule } from '@siemens/element-ng/sort-bar';
44+
import { SiSplitModule } from '@siemens/element-ng/split';
45+
import { SiStatusBarModule } from '@siemens/element-ng/status-bar';
46+
import { SiTabsLegacyModule } from '@siemens/element-ng/tabs-legacy';
47+
import { SiThresholdModule } from '@siemens/element-ng/threshold';
48+
import { SiTooltipModule } from '@siemens/element-ng/tooltip';
49+
import { SiTreeViewModule } from '@siemens/element-ng/tree-view';
50+
import { SiTypeaheadModule } from '@siemens/element-ng/typeahead';
51+
import { SiUnauthorizedPageModule } from '@siemens/element-ng/unauthorized-page';
52+
import { SiWizardModule } from '@siemens/element-ng/wizard';
53+
54+
@NgModule({
55+
imports: [],
56+
exports: []
57+
})
58+
export class MyModule {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { NgModule } from '@angular/core';
2+
import { CommonModule } from '@angular/common';
3+
import { SimplElementNgModule } from '@simpl/element-ng';
4+
import { TranslateModule } from '@ngx-translate/core';
5+
import { ReactiveFormsModule } from '@angular/forms';
6+
7+
@NgModule({
8+
imports: [CommonModule, TranslateModule, SimplElementNgModule, ReactiveFormsModule],
9+
exports: [CommonModule, SimplElementNgModule, ReactiveFormsModule]
10+
})
11+
export class MyModule {}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { NgModule } from '@angular/core';
2+
import { SimplElementNgModule } from '@simpl/element-ng';
3+
4+
@NgModule({
5+
imports: [],
6+
exports: []
7+
})
8+
export class MyModule {}

projects/element-ng/schematics/ts-import-to-siemens-migration/index.spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,4 +243,12 @@ describe('ts-import-to-siemens migration', () => {
243243
it('should migrate imports correctly if there are multiple imports of the symbol', async () => {
244244
await checkTemplateMigration(['component.simpl-element-ng-module-multiple-imports.ts']);
245245
});
246+
247+
it('should migrate exports from SimplElementNgModule in module', async () => {
248+
await checkTemplateMigration(['module.export.simpl-element-ng-module.ts']);
249+
});
250+
251+
it('should not add SimplElementNgModule in module if they are not imported or exported', async () => {
252+
await checkTemplateMigration(['module.no-import-simpl-element-ng-module.ts']);
253+
});
246254
});

projects/element-ng/schematics/ts-import-to-siemens-migration/index.ts

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -189,51 +189,59 @@ const updateDecoratorImports = (recorder: UpdateRecorder, sourceFile: ts.SourceF
189189
return;
190190
}
191191

192-
const matchingProperties = getMetadataField(decoratorNode, 'imports');
193-
const importsAssignment = matchingProperties[0];
192+
for (const metaDataField of ['imports', 'exports']) {
193+
const matchingProperties = getMetadataField(decoratorNode, metaDataField);
194+
const propertyAssignment = matchingProperties[0];
195+
196+
if (
197+
!propertyAssignment ||
198+
!ts.isPropertyAssignment(propertyAssignment) ||
199+
!ts.isArrayLiteralExpression(propertyAssignment.initializer)
200+
) {
201+
continue;
202+
}
194203

195-
if (
196-
!ts.isPropertyAssignment(importsAssignment) ||
197-
!ts.isArrayLiteralExpression(importsAssignment.initializer)
198-
) {
199-
return;
200-
}
204+
const elements = propertyAssignment.initializer.elements;
201205

202-
const elements = importsAssignment.initializer.elements;
206+
if (elements.find(e => e.getText() === 'SimplElementNgModule') === undefined) {
207+
// No SimplElementNgModule found, nothing to do
208+
continue;
209+
}
203210

204-
// Filter out SimplElementNgModule and get existing modules
205-
const existingModules = elements
206-
.filter(e => e.getText() !== 'SimplElementNgModule')
207-
.map(e => e.getText());
211+
// Filter out SimplElementNgModule and get existing modules
212+
const existingModules = elements
213+
.filter(e => e.getText() !== 'SimplElementNgModule')
214+
.map(e => e.getText());
208215

209-
const existingModulesSet = new Set(existingModules);
216+
const existingModulesSet = new Set(existingModules);
210217

211-
// Only add modules that don't already exist
212-
const newModulesToAdd = SIMPL_ELEMENT_NG_MODULES.filter(m => !existingModulesSet.has(m));
218+
// Only add modules that don't already exist
219+
const newModulesToAdd = SIMPL_ELEMENT_NG_MODULES.filter(m => !existingModulesSet.has(m));
213220

214-
// Combine existing (without SimplElementNgModule) + new modules
215-
const allModules = [...existingModules, ...newModulesToAdd];
221+
// Combine existing (without SimplElementNgModule) + new modules
222+
const allModules = [...existingModules, ...newModulesToAdd];
216223

217-
// Remove existing imports array
218-
recorder.remove(importsAssignment.getFullStart(), importsAssignment.getFullWidth());
224+
// Remove existing imports array
225+
recorder.remove(propertyAssignment.getFullStart(), propertyAssignment.getFullWidth());
219226

220-
// Create and insert the updated property assignment
227+
// Create and insert the updated property assignment
221228

222-
const printer = ts.createPrinter();
223-
const newNode = ts.factory.createArrayLiteralExpression(
224-
allModules.map(m => ts.factory.createIdentifier(m)),
225-
true
226-
);
229+
const printer = ts.createPrinter();
230+
const newNode = ts.factory.createArrayLiteralExpression(
231+
allModules.map(m => ts.factory.createIdentifier(m)),
232+
true
233+
);
227234

228-
const newProperty = ts.factory.updatePropertyAssignment(
229-
importsAssignment,
230-
importsAssignment.name,
231-
newNode
232-
);
235+
const newProperty = ts.factory.updatePropertyAssignment(
236+
propertyAssignment,
237+
propertyAssignment.name,
238+
newNode
239+
);
233240

234-
const propertyText = printer.printNode(ts.EmitHint.Unspecified, newProperty, sourceFile);
235-
// Had to add extra indentation to align properly
236-
recorder.insertLeft(importsAssignment.getStart(), `\n ` + propertyText);
241+
const propertyText = printer.printNode(ts.EmitHint.Unspecified, newProperty, sourceFile);
242+
// Had to add extra indentation to align properly
243+
recorder.insertLeft(propertyAssignment.getStart(), `\n ` + propertyText);
244+
}
237245
};
238246

239247
/**

0 commit comments

Comments
 (0)