Skip to content
This repository was archived by the owner on May 1, 2020. It is now read-only.

Commit e4b311c

Browse files
committed
refactor(optimization): clean-up treeshaking code for better constant re-use
clean-up treeshaking code for better constant re-use
1 parent 6b4115c commit e4b311c

File tree

5 files changed

+110
-40
lines changed

5 files changed

+110
-40
lines changed

src/optimization/treeshake.spec.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import * as treeshake from './treeshake';
1+
import { join } from 'path';
2+
import * as treeshake from './treeshake'
23
import * as Constants from '../util/constants';
34

45

@@ -18,6 +19,21 @@ describe('treeshake', () => {
1819
env[Constants.ENV_VAR_SRC_DIR] = '/Users/dan/myApp/';
1920
env[Constants.ENV_APP_ENTRY_POINT] = main;
2021
env[Constants.ENV_APP_NG_MODULE_PATH] = appModule;
22+
env[Constants.ENV_ACTION_SHEET_COMPONENT_FACTORY_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'action-sheet', 'action-sheet-component.ngfactory.js');
23+
env[Constants.ENV_ACTION_SHEET_CONTROLLER_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'action-sheet', 'action-sheet-controller.js');
24+
env[Constants.ENV_ALERT_COMPONENT_FACTORY_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'alert', 'alert-component.ngfactory.js');
25+
env[Constants.ENV_ALERT_CONTROLLER_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'alert', 'alert-controller.js');
26+
env[Constants.ENV_LOADING_COMPONENT_FACTORY_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'loading', 'loading-component.ngfactory.js');
27+
env[Constants.ENV_LOADING_CONTROLLER_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'loading', 'loading-controller.js');
28+
env[Constants.ENV_MODAL_COMPONENT_FACTORY_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'modal', 'modal-component.ngfactory.js');
29+
env[Constants.ENV_MODAL_CONTROLLER_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'modal', 'modal-controller.js');
30+
env[Constants.ENV_PICKER_COMPONENT_FACTORY_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'picker', 'picker-component.ngfactory.js');
31+
env[Constants.ENV_PICKER_CONTROLLER_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'picker', 'picker-controller.js');
32+
env[Constants.ENV_POPOVER_COMPONENT_FACTORY_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'popover', 'popover-component.ngfactory.js');
33+
env[Constants.ENV_POPOVER_CONTROLLER_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'popover', 'popover-controller.js');
34+
env[Constants.ENV_TOAST_COMPONENT_FACTORY_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'toast', 'toast-component.ngfactory.js');
35+
env[Constants.ENV_TOAST_CONTROLLER_PATH] = join(env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'toast', 'toast-controller.js');
36+
2137
process.env = env;
2238
});
2339

src/optimization/treeshake.ts

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { basename, dirname, join, relative } from 'path';
1+
import { dirname, join, relative } from 'path';
22
import { Logger } from '../logger/logger';
33
import * as Constants from '../util/constants';
4-
import { changeExtension, escapeStringForRegex } from '../util/helpers';
4+
import { changeExtension, convertFilePathToNgFactoryPath, escapeStringForRegex } from '../util/helpers';
55
import { TreeShakeCalcResults } from '../util/interfaces';
66

77
export function calculateUnusedComponents(dependencyMap: Map<string, Set<string>>): TreeShakeCalcResults {
@@ -71,43 +71,24 @@ function processImportTree(dependencyMap: Map<string, Set<string>>, importee: st
7171
}
7272

7373
function calculateUnusedIonicProviders(dependencyMap: Map<string, Set<string>>) {
74-
const ACTION_SHEET_CONTROLLER = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'action-sheet', 'action-sheet-controller.js');
75-
const ACTION_SHEET_COMPONENT_FACTORY = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'action-sheet', 'action-sheet-component.ngfactory.js');
7674

77-
const ALERT_CONTROLLER = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'alert', 'alert-controller.js');
78-
const ALERT_COMPONENT_FACTORY = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'alert', 'alert-component.ngfactory.js');
7975

80-
const LOADING_CONTROLLER = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'loading', 'loading-controller.js');
81-
const LOADING_COMPONENT_FACTORY = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'loading', 'loading-component.ngfactory.js');
82-
83-
const MODAL_CONTROLLER = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'modal', 'modal-controller.js');
84-
const MODAL_COMPONENT_FACTORY = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'modal', 'modal-component.ngfactory.js');
85-
86-
const PICKER_CONTROLLER = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'picker', 'picker-controller.js');
87-
const PICKER_COMPONENT_FACTORY = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'picker', 'picker-component.ngfactory.js');
88-
89-
const POPOVER_CONTROLLER = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'popover', 'popover-controller.js');
90-
const POPOVER_COMPONENT_FACTORY = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'popover', 'popover-component.ngfactory.js');
91-
92-
const TOAST_CONTROLLER = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'toast', 'toast-controller.js');
93-
const TOAST_COMPONENT_FACTORY = join(process.env[Constants.ENV_VAR_IONIC_ANGULAR_DIR], 'components', 'toast', 'toast-component.ngfactory.js');
94-
95-
processIonicProviders(dependencyMap, ACTION_SHEET_CONTROLLER);
96-
processIonicProviders(dependencyMap, ALERT_CONTROLLER);
97-
processIonicProviders(dependencyMap, LOADING_CONTROLLER);
98-
processIonicProviders(dependencyMap, MODAL_CONTROLLER);
99-
processIonicProviders(dependencyMap, PICKER_CONTROLLER);
100-
processIonicProviders(dependencyMap, POPOVER_CONTROLLER);
101-
processIonicProviders(dependencyMap, TOAST_CONTROLLER);
76+
processIonicProviders(dependencyMap, process.env[Constants.ENV_ACTION_SHEET_CONTROLLER_PATH]);
77+
processIonicProviders(dependencyMap, process.env[Constants.ENV_ALERT_CONTROLLER_PATH]);
78+
processIonicProviders(dependencyMap, process.env[Constants.ENV_LOADING_CONTROLLER_PATH]);
79+
processIonicProviders(dependencyMap, process.env[Constants.ENV_MODAL_CONTROLLER_PATH]);
80+
processIonicProviders(dependencyMap, process.env[Constants.ENV_PICKER_CONTROLLER_PATH]);
81+
processIonicProviders(dependencyMap, process.env[Constants.ENV_POPOVER_CONTROLLER_PATH]);
82+
processIonicProviders(dependencyMap, process.env[Constants.ENV_TOAST_CONTROLLER_PATH]);
10283

10384
// check if the controllers were deleted, if so, purge the component too
104-
processIonicProviderComponents(dependencyMap, ACTION_SHEET_CONTROLLER, ACTION_SHEET_COMPONENT_FACTORY);
105-
processIonicProviderComponents(dependencyMap, ALERT_CONTROLLER, ALERT_COMPONENT_FACTORY);
106-
processIonicProviderComponents(dependencyMap, LOADING_CONTROLLER, LOADING_COMPONENT_FACTORY);
107-
processIonicProviderComponents(dependencyMap, MODAL_CONTROLLER, MODAL_COMPONENT_FACTORY);
108-
processIonicProviderComponents(dependencyMap, PICKER_CONTROLLER, PICKER_COMPONENT_FACTORY);
109-
processIonicProviderComponents(dependencyMap, POPOVER_CONTROLLER, POPOVER_COMPONENT_FACTORY);
110-
processIonicProviderComponents(dependencyMap, TOAST_CONTROLLER, TOAST_COMPONENT_FACTORY);
85+
processIonicProviderComponents(dependencyMap, process.env[Constants.ENV_ACTION_SHEET_CONTROLLER_PATH], process.env[Constants.ENV_ACTION_SHEET_COMPONENT_FACTORY_PATH]);
86+
processIonicProviderComponents(dependencyMap, process.env[Constants.ENV_ALERT_CONTROLLER_PATH], process.env[Constants.ENV_ALERT_COMPONENT_FACTORY_PATH]);
87+
processIonicProviderComponents(dependencyMap, process.env[Constants.ENV_LOADING_CONTROLLER_PATH], process.env[Constants.ENV_LOADING_COMPONENT_FACTORY_PATH]);
88+
processIonicProviderComponents(dependencyMap, process.env[Constants.ENV_MODAL_CONTROLLER_PATH], process.env[Constants.ENV_MODAL_COMPONENT_FACTORY_PATH]);
89+
processIonicProviderComponents(dependencyMap, process.env[Constants.ENV_PICKER_CONTROLLER_PATH], process.env[Constants.ENV_PICKER_COMPONENT_FACTORY_PATH]);
90+
processIonicProviderComponents(dependencyMap, process.env[Constants.ENV_POPOVER_CONTROLLER_PATH], process.env[Constants.ENV_POPOVER_COMPONENT_FACTORY_PATH]);
91+
processIonicProviderComponents(dependencyMap, process.env[Constants.ENV_TOAST_CONTROLLER_PATH], process.env[Constants.ENV_TOAST_COMPONENT_FACTORY_PATH]);
11192
}
11293

11394
function processIonicProviderComponents(dependencyMap: Map<string, Set<string>>, providerPath: string, componentPath: string) {
@@ -119,10 +100,7 @@ function processIonicProviderComponents(dependencyMap: Map<string, Set<string>>,
119100

120101
function getAppModuleNgFactoryPath() {
121102
const appNgModulePath = process.env[Constants.ENV_APP_NG_MODULE_PATH];
122-
const directory = dirname(appNgModulePath);
123-
const extensionlessFileName = basename(appNgModulePath, '.js');
124-
const ngFactoryFileName = extensionlessFileName + '.ngfactory.js';
125-
return join(directory, ngFactoryFileName);
103+
return convertFilePathToNgFactoryPath(appNgModulePath);
126104
}
127105

128106
function processIonicProviders(dependencyMap: Map<string, Set<string>>, providerPath: string) {

src/util/config.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,51 @@ export function generateContext(context?: BuildContext): BuildContext {
144144
const bailOnLintError = getConfigValue(context, '--bailOnLintError', null, Constants.ENV_BAIL_ON_LINT_ERROR, Constants.ENV_BAIL_ON_LINT_ERROR.toLowerCase(), null);
145145
setProcessEnvVar(Constants.ENV_BAIL_ON_LINT_ERROR, bailOnLintError);
146146

147+
/* Provider Path Stuff */
148+
149+
const actionSheetControllerPath = getConfigValue(context, '--actionSheetControllerPath', null, Constants.ENV_ACTION_SHEET_CONTROLLER_PATH, Constants.ENV_ACTION_SHEET_CONTROLLER_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'action-sheet', 'action-sheet-controller.js'));
150+
setProcessEnvVar(Constants.ENV_ACTION_SHEET_CONTROLLER_PATH, actionSheetControllerPath);
151+
152+
const actionSheetComponentFactoryPath = getConfigValue(context, '--actionSheetComponentFactoryPath', null, Constants.ENV_ACTION_SHEET_COMPONENT_FACTORY_PATH, Constants.ENV_ACTION_SHEET_COMPONENT_FACTORY_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'action-sheet', 'action-sheet-component.ngfactory.js'));
153+
setProcessEnvVar(Constants.ENV_ACTION_SHEET_COMPONENT_FACTORY_PATH, actionSheetComponentFactoryPath);
154+
155+
const alertControllerPath = getConfigValue(context, '--alertControllerPath', null, Constants.ENV_ALERT_CONTROLLER_PATH, Constants.ENV_ALERT_CONTROLLER_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'alert', 'alert-controller.js'));
156+
setProcessEnvVar(Constants.ENV_ALERT_CONTROLLER_PATH, alertControllerPath);
157+
158+
const alertComponentFactoryPath = getConfigValue(context, '--alertComponentFactoryPath', null, Constants.ENV_ALERT_COMPONENT_FACTORY_PATH, Constants.ENV_ALERT_COMPONENT_FACTORY_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'alert', 'alert-component.ngfactory.js'));
159+
setProcessEnvVar(Constants.ENV_ALERT_COMPONENT_FACTORY_PATH, alertComponentFactoryPath);
160+
161+
const loadingControllerPath = getConfigValue(context, '--loadingControllerPath', null, Constants.ENV_LOADING_CONTROLLER_PATH, Constants.ENV_LOADING_CONTROLLER_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'loading', 'loading-controller.js'));
162+
setProcessEnvVar(Constants.ENV_LOADING_CONTROLLER_PATH, loadingControllerPath);
163+
164+
const loadingComponentFactoryPath = getConfigValue(context, '--loadingComponentFactoryPath', null, Constants.ENV_LOADING_COMPONENT_FACTORY_PATH, Constants.ENV_LOADING_COMPONENT_FACTORY_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'loading', 'loading-component.ngfactory.js'));
165+
setProcessEnvVar(Constants.ENV_LOADING_COMPONENT_FACTORY_PATH, loadingComponentFactoryPath);
166+
167+
const modalControllerPath = getConfigValue(context, '--modalControllerPath', null, Constants.ENV_MODAL_CONTROLLER_PATH, Constants.ENV_MODAL_CONTROLLER_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'modal', 'modal-controller.js'));
168+
setProcessEnvVar(Constants.ENV_MODAL_CONTROLLER_PATH, modalControllerPath);
169+
170+
const modalComponentFactoryPath = getConfigValue(context, '--modalComponentFactoryPath', null, Constants.ENV_MODAL_COMPONENT_FACTORY_PATH, Constants.ENV_MODAL_COMPONENT_FACTORY_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'modal', 'modal-component.ngfactory.js'));
171+
setProcessEnvVar(Constants.ENV_MODAL_COMPONENT_FACTORY_PATH, modalComponentFactoryPath);
172+
173+
const pickerControllerPath = getConfigValue(context, '--pickerControllerPath', null, Constants.ENV_PICKER_CONTROLLER_PATH, Constants.ENV_PICKER_CONTROLLER_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'picker', 'picker-controller.js'));
174+
setProcessEnvVar(Constants.ENV_PICKER_CONTROLLER_PATH, pickerControllerPath);
175+
176+
const pickerComponentFactoryPath = getConfigValue(context, '--pickerComponentFactoryPath', null, Constants.ENV_PICKER_COMPONENT_FACTORY_PATH, Constants.ENV_PICKER_COMPONENT_FACTORY_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'picker', 'picker-component.ngfactory.js'));
177+
setProcessEnvVar(Constants.ENV_PICKER_COMPONENT_FACTORY_PATH, pickerComponentFactoryPath);
178+
179+
const popoverControllerPath = getConfigValue(context, '--popoverControllerPath', null, Constants.ENV_POPOVER_CONTROLLER_PATH, Constants.ENV_POPOVER_CONTROLLER_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'popover', 'popover-controller.js'));
180+
setProcessEnvVar(Constants.ENV_POPOVER_CONTROLLER_PATH, popoverControllerPath);
181+
182+
const popoverComponentFactoryPath = getConfigValue(context, '--popoverComponentFactoryPath', null, Constants.ENV_POPOVER_COMPONENT_FACTORY_PATH, Constants.ENV_POPOVER_COMPONENT_FACTORY_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'popover', 'popover-component.ngfactory.js'));
183+
setProcessEnvVar(Constants.ENV_POPOVER_COMPONENT_FACTORY_PATH, popoverComponentFactoryPath);
184+
185+
const toastControllerPath = getConfigValue(context, '--toastControllerPath', null, Constants.ENV_TOAST_CONTROLLER_PATH, Constants.ENV_TOAST_CONTROLLER_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'toast', 'toast-controller.js'));
186+
setProcessEnvVar(Constants.ENV_TOAST_CONTROLLER_PATH, toastControllerPath);
187+
188+
const toastComponentFactoryPath = getConfigValue(context, '--toastComponentFactoryPath', null, Constants.ENV_TOAST_COMPONENT_FACTORY_PATH, Constants.ENV_TOAST_COMPONENT_FACTORY_PATH.toLowerCase(), join(context.ionicAngularDir, 'components', 'toast', 'toast-component.ngfactory.js'));
189+
setProcessEnvVar(Constants.ENV_TOAST_COMPONENT_FACTORY_PATH, toastComponentFactoryPath);
190+
191+
/* Experimental Flags */
147192
const experimentalManualTreeshaking = getConfigValue(context, '--experimentalManualTreeshaking', null, Constants.ENV_EXPERIMENTAL_MANUAL_TREESHAKING, Constants.ENV_EXPERIMENTAL_MANUAL_TREESHAKING.toLowerCase(), null);
148193
setProcessEnvVar(Constants.ENV_EXPERIMENTAL_MANUAL_TREESHAKING, experimentalManualTreeshaking);
149194

src/util/constants.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,34 @@ export const ENV_BAIL_ON_LINT_ERROR = 'IONIC_BAIL_ON_LINT_ERROR';
5151
export const ENV_BUILD_TO_ES5 = 'IONIC_BUILD_TO_ES5';
5252
export const ENV_PRINT_DEPENDENCY_TREE = 'IONIC_PRINT_DEPENDENCY_TREE';
5353

54+
/* Flags for experimental stuff */
5455
export const ENV_EXPERIMENTAL_PARSE_DEEPLINKS = 'IONIC_EXPERIMENTAL_PARSE_DEEPLINKS';
5556
export const ENV_EXPERIMENTAL_MANUAL_TREESHAKING = 'IONIC_EXPERIMENTAL_MANUAL_TREESHAKING';
5657
export const ENV_EXPERIMENTAL_PURGE_DECORATORS = 'IONIC_EXPERIMENTAL_PURGE_DECORATORS';
5758
export const ENV_USE_EXPERIMENTAL_CLOSURE = 'IONIC_USE_EXPERIMENTAL_CLOSURE';
5859
export const ENV_USE_EXPERIMENTAL_BABILI = 'IONIC_USE_EXPERIMENTAL_BABILI';
5960

61+
/* Providers */
62+
export const ENV_ACTION_SHEET_CONTROLLER_PATH = 'IONIC_ACTION_SHEET_CONTROLLER_PATH';
63+
export const ENV_ACTION_SHEET_COMPONENT_FACTORY_PATH = 'IONIC_ACTION_SHEET_COMPONENT_FACTORY_PATH';
64+
65+
export const ENV_ALERT_CONTROLLER_PATH = 'IONIC_ALERT_CONTROLLER_PATH';
66+
export const ENV_ALERT_COMPONENT_FACTORY_PATH = 'IONIC_ALERT_COMPONENT_FACTORY_PATH';
67+
68+
export const ENV_LOADING_CONTROLLER_PATH = 'IONIC_LOADING_CONTROLLER_PATH';
69+
export const ENV_LOADING_COMPONENT_FACTORY_PATH = 'IONIC_LOADING_COMPONENT_FACTORY_PATH';
70+
71+
export const ENV_MODAL_CONTROLLER_PATH = 'IONIC_MODAL_CONTROLLER_PATH';
72+
export const ENV_MODAL_COMPONENT_FACTORY_PATH = 'IONIC_MODAL_COMPONENT_FACTORY_PATH';
73+
74+
export const ENV_PICKER_CONTROLLER_PATH = 'IONIC_PICKER_CONTROLLER_PATH';
75+
export const ENV_PICKER_COMPONENT_FACTORY_PATH = 'IONIC_PICKER_COMPONENT_FACTORY_PATH';
76+
77+
export const ENV_POPOVER_CONTROLLER_PATH = 'IONIC_POPOVER_CONTROLLER_PATH';
78+
export const ENV_POPOVER_COMPONENT_FACTORY_PATH = 'IONIC_POPOVER_COMPONENT_FACTORY_PATH';
79+
80+
export const ENV_TOAST_CONTROLLER_PATH = 'IONIC_TOAST_CONTROLLER_PATH';
81+
export const ENV_TOAST_COMPONENT_FACTORY_PATH = 'IONIC_TOAST_COMPONENT_FACTORY_PATH';
82+
6083
export const BUNDLER_ROLLUP = 'rollup';
6184
export const BUNDLER_WEBPACK = 'webpack';

src/util/helpers.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,3 +265,11 @@ export function getBooleanPropertyValue(propertyName: string) {
265265
const result = process.env[propertyName];
266266
return result === 'true';
267267
}
268+
269+
export function convertFilePathToNgFactoryPath(filePath: string) {
270+
const directory = dirname(filePath);
271+
const extension = extname(filePath);
272+
const extensionlessFileName = basename(filePath, extension);
273+
const ngFactoryFileName = extensionlessFileName + '.ngfactory' + extension;
274+
return join(directory, ngFactoryFileName);
275+
}

0 commit comments

Comments
 (0)