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

Commit 3c36e0c

Browse files
committed
refactor(config): add a config to customize the directories analyzed for deeplinks (not for public u
add a config to customize the directories analyzed for deeplinks (not for public usage)
1 parent 97a6f2f commit 3c36e0c

File tree

5 files changed

+101
-30
lines changed

5 files changed

+101
-30
lines changed

src/deep-linking/util.spec.ts

Lines changed: 86 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,53 @@
11
import { join } from 'path';
22
import * as util from './util';
33

4+
import * as Constants from '../util/constants';
45
import { FileCache } from '../util/file-cache';
56
import * as helpers from '../util/helpers';
67
import { DeepLinkConfigEntry } from '../util/interfaces';
78
import * as tsUtils from '../util/typescript-utils';
89

910
describe('util', () => {
11+
describe('filterTypescriptFilesForDeepLinks', () => {
12+
it('should return a list of files that are in the directory specified for deeplinking', () => {
13+
const pagesDir = join('Users', 'dan', 'myApp', 'src', 'pages');
14+
15+
const knownFileContent = 'Some string';
16+
const pageOneTs = join(pagesDir, 'page-one', 'page-one.ts');
17+
const pageOneHtml = join(pagesDir, 'page-one', 'page-one.html');
18+
const pageOneModule = join(pagesDir, 'page-one', 'page-one.module.ts');
19+
20+
const pageTwoTs = join(pagesDir, 'page-two', 'page-two.ts');
21+
const pageTwoHtml = join(pagesDir, 'page-two', 'page-two.html');
22+
const pageTwoModule = join(pagesDir, 'page-two', 'page-two.module.ts');
23+
24+
const pageThreeTs = join(pagesDir, 'page-three', 'page-three.ts');
25+
const pageThreeHtml = join(pagesDir, 'page-three', 'page-three.html');
26+
const pageThreeModule = join(pagesDir, 'page-three', 'page-three.module.ts');
27+
28+
const someOtherFile = join('Users', 'hans-gruber', 'test.ts');
29+
30+
const fileCache = new FileCache();
31+
fileCache.set(pageOneTs, { path: pageOneTs, content: knownFileContent});
32+
fileCache.set(pageOneHtml, { path: pageOneHtml, content: knownFileContent});
33+
fileCache.set(pageOneModule, { path: pageOneModule, content: knownFileContent});
34+
fileCache.set(pageTwoTs, { path: pageTwoTs, content: knownFileContent});
35+
fileCache.set(pageTwoHtml, { path: pageTwoHtml, content: knownFileContent});
36+
fileCache.set(pageTwoModule, { path: pageTwoModule, content: knownFileContent});
37+
fileCache.set(pageThreeTs, { path: pageThreeTs, content: knownFileContent});
38+
fileCache.set(pageThreeHtml, { path: pageThreeHtml, content: knownFileContent});
39+
fileCache.set(pageThreeModule, { path: pageThreeModule, content: knownFileContent});
40+
fileCache.set(someOtherFile, { path: someOtherFile, content: knownFileContent});
41+
42+
spyOn(helpers, helpers.getStringPropertyValue.name).and.returnValues(pagesDir, '.module.ts');
43+
44+
const results = util.filterTypescriptFilesForDeepLinks(fileCache);
45+
expect(results.length).toEqual(3);
46+
expect(results[0].path).toEqual(pageOneTs);
47+
expect(results[1].path).toEqual(pageTwoTs);
48+
expect(results[2].path).toEqual(pageThreeTs);
49+
});
50+
});
1051
describe('parseDeepLinkDecorator', () => {
1152
it('should return the decorator content from fully hydrated decorator', () => {
1253
const knownContent = `
@@ -1062,14 +1103,14 @@ export class PageThreeModule {
10621103
10631104
`;
10641105

1065-
const prefix = join('Users', 'dan', 'myApp', 'src');
1066-
const appNgModulePath = join(prefix, 'app', 'app.module.ts');
1067-
const pageOneNgModulePath = join(prefix, 'pages', 'page-one', 'page-one.module.ts');
1068-
const pageOnePath = join(prefix, 'pages', 'page-one', 'page-one.ts');
1069-
const pageTwoNgModulePath = join(prefix, 'pages', 'page-two', 'page-two.module.ts');
1070-
const pageTwoPath = join(prefix, 'pages', 'page-two', 'page-two.ts');
1071-
const pageSettingsNgModulePath = join(prefix, 'pages', 'settings-page', 'settings-page.module.ts');
1072-
const pageSettingsPath = join(prefix, 'pages', 'settings-page', 'settings-page.ts');
1106+
const srcDir = join('Users', 'dan', 'myApp', 'src');
1107+
const appNgModulePath = join(srcDir, 'app', 'app.module.ts');
1108+
const pageOneNgModulePath = join(srcDir, 'pages', 'page-one', 'page-one.module.ts');
1109+
const pageOnePath = join(srcDir, 'pages', 'page-one', 'page-one.ts');
1110+
const pageTwoNgModulePath = join(srcDir, 'pages', 'page-two', 'page-two.module.ts');
1111+
const pageTwoPath = join(srcDir, 'pages', 'page-two', 'page-two.ts');
1112+
const pageSettingsNgModulePath = join(srcDir, 'pages', 'settings-page', 'settings-page.module.ts');
1113+
const pageSettingsPath = join(srcDir, 'pages', 'settings-page', 'settings-page.ts');
10731114

10741115
const fileCache = new FileCache();
10751116
fileCache.set(pageOnePath, { path: pageOnePath, content: pageOneContent});
@@ -1081,7 +1122,13 @@ export class PageThreeModule {
10811122
fileCache.set(pageSettingsPath, { path: pageSettingsPath, content: pageSettingsContent});
10821123
fileCache.set(pageSettingsNgModulePath, { path: pageSettingsNgModulePath, content: pageSettingsNgModuleContent});
10831124

1084-
spyOn(helpers, helpers.getStringPropertyValue.name).and.returnValue('.module.ts');
1125+
spyOn(helpers, helpers.getStringPropertyValue.name).and.callFake((input: string) => {
1126+
if (input === Constants.ENV_VAR_DEEPLINKS_DIR) {
1127+
return srcDir;
1128+
} else {
1129+
return '.module.ts';
1130+
}
1131+
});
10851132

10861133
const results = util.getDeepLinkData(appNgModulePath, fileCache, false);
10871134
expect(results.length).toEqual(2);
@@ -1249,14 +1296,14 @@ export class PageThreeModule {
12491296
12501297
`;
12511298

1252-
const prefix = join('/Users', 'dan', 'myApp', 'src');
1253-
const appNgModulePath = join(prefix, 'app', 'app.module.ts');
1254-
const pageOneNgModulePath = join(prefix, 'pages', 'page-one', 'page-one.module.ts');
1255-
const pageOnePath = join(prefix, 'pages', 'page-one', 'page-one.ts');
1256-
const pageTwoNgModulePath = join(prefix, 'pages', 'page-two', 'page-two.module.ts');
1257-
const pageTwoPath = join(prefix, 'pages', 'page-two', 'page-two.ts');
1258-
const pageSettingsNgModulePath = join(prefix, 'pages', 'settings-page', 'fake-dir', 'settings-page.module.ts');
1259-
const pageSettingsPath = join(prefix, 'pages', 'settings-page', 'fake-dir', 'settings-page.ts');
1299+
const srcDir = join('/Users', 'dan', 'myApp', 'src');
1300+
const appNgModulePath = join(srcDir, 'app', 'app.module.ts');
1301+
const pageOneNgModulePath = join(srcDir, 'pages', 'page-one', 'page-one.module.ts');
1302+
const pageOnePath = join(srcDir, 'pages', 'page-one', 'page-one.ts');
1303+
const pageTwoNgModulePath = join(srcDir, 'pages', 'page-two', 'page-two.module.ts');
1304+
const pageTwoPath = join(srcDir, 'pages', 'page-two', 'page-two.ts');
1305+
const pageSettingsNgModulePath = join(srcDir, 'pages', 'settings-page', 'fake-dir', 'settings-page.module.ts');
1306+
const pageSettingsPath = join(srcDir, 'pages', 'settings-page', 'fake-dir', 'settings-page.ts');
12601307

12611308
const fileCache = new FileCache();
12621309
fileCache.set(pageOnePath, { path: pageOnePath, content: pageOneContent});
@@ -1268,7 +1315,13 @@ export class PageThreeModule {
12681315
fileCache.set(pageSettingsPath, { path: pageSettingsPath, content: pageSettingsContent});
12691316
fileCache.set(pageSettingsNgModulePath, { path: pageSettingsNgModulePath, content: pageSettingsNgModuleContent});
12701317

1271-
spyOn(helpers, helpers.getStringPropertyValue.name).and.returnValue('.module.ts');
1318+
spyOn(helpers, helpers.getStringPropertyValue.name).and.callFake((input: string) => {
1319+
if (input === Constants.ENV_VAR_DEEPLINKS_DIR) {
1320+
return srcDir;
1321+
} else {
1322+
return '.module.ts';
1323+
}
1324+
});
12721325

12731326
const results = util.getDeepLinkData(appNgModulePath, fileCache, false);
12741327
expect(results.length).toEqual(3);
@@ -1461,14 +1514,14 @@ export class PageThreeModule {
14611514
14621515
`;
14631516

1464-
const prefix = join('/Users', 'dan', 'myApp', 'src');
1465-
const appNgModulePath = join(prefix, 'app', 'app.module.ts');
1466-
const pageOneNgModulePath = join(prefix, 'pages', 'page-one', 'page-one.not-module.ts');
1467-
const pageOnePath = join(prefix, 'pages', 'page-one', 'page-one.ts');
1468-
const pageTwoNgModulePath = join(prefix, 'pages', 'page-two', 'page-two.module.ts');
1469-
const pageTwoPath = join(prefix, 'pages', 'page-two', 'page-two.ts');
1470-
const pageSettingsNgModulePath = join(prefix, 'pages', 'settings-page', 'fake-dir', 'settings-page.module.ts');
1471-
const pageSettingsPath = join(prefix, 'pages', 'settings-page', 'fake-dir', 'settings-page.ts');
1517+
const srcDir = join('/Users', 'dan', 'myApp', 'src');
1518+
const appNgModulePath = join(srcDir, 'app', 'app.module.ts');
1519+
const pageOneNgModulePath = join(srcDir, 'pages', 'page-one', 'page-one.not-module.ts');
1520+
const pageOnePath = join(srcDir, 'pages', 'page-one', 'page-one.ts');
1521+
const pageTwoNgModulePath = join(srcDir, 'pages', 'page-two', 'page-two.module.ts');
1522+
const pageTwoPath = join(srcDir, 'pages', 'page-two', 'page-two.ts');
1523+
const pageSettingsNgModulePath = join(srcDir, 'pages', 'settings-page', 'fake-dir', 'settings-page.module.ts');
1524+
const pageSettingsPath = join(srcDir, 'pages', 'settings-page', 'fake-dir', 'settings-page.ts');
14721525

14731526
const fileCache = new FileCache();
14741527
fileCache.set(pageOnePath, { path: pageOnePath, content: pageOneContent});
@@ -1480,7 +1533,13 @@ export class PageThreeModule {
14801533
fileCache.set(pageSettingsPath, { path: pageSettingsPath, content: pageSettingsContent});
14811534
fileCache.set(pageSettingsNgModulePath, { path: pageSettingsNgModulePath, content: pageSettingsNgModuleContent});
14821535

1483-
spyOn(helpers, helpers.getStringPropertyValue.name).and.returnValue('.module.ts');
1536+
spyOn(helpers, helpers.getStringPropertyValue.name).and.callFake((input: string) => {
1537+
if (input === Constants.ENV_VAR_DEEPLINKS_DIR) {
1538+
return srcDir;
1539+
} else {
1540+
return '.module.ts';
1541+
}
1542+
});
14841543

14851544
const knownError = 'should never get here';
14861545

src/deep-linking/util.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ import { Logger } from '../logger/logger';
1818
import * as Constants from '../util/constants';
1919
import { FileCache } from '../util/file-cache';
2020
import { changeExtension, getStringPropertyValue, replaceAll } from '../util/helpers';
21-
import { BuildContext, ChangedFile, DeepLinkConfigEntry, DeepLinkDecoratorAndClass, DeepLinkPathInfo } from '../util/interfaces';
21+
import { BuildContext, ChangedFile, DeepLinkConfigEntry, DeepLinkDecoratorAndClass, DeepLinkPathInfo, File } from '../util/interfaces';
2222
import { appendAfter, getClassDeclarations, getTypescriptSourceFile, getNodeStringContent, replaceNode } from '../util/typescript-utils';
2323

2424
import { transpileTsString } from '../transpile';
2525

2626
export function getDeepLinkData(appNgModuleFilePath: string, fileCache: FileCache, isAot: boolean): DeepLinkConfigEntry[] {
27-
// TODO, get `node_modules` out of here, use the property instead
28-
const typescriptFiles = fileCache.getAll().filter(file => extname(file.path) === '.ts' && file.path.indexOf('node_modules') === -1);
27+
// we only care about analyzing a subset of typescript files, so do that for efficiency
28+
const typescriptFiles = filterTypescriptFilesForDeepLinks(fileCache);
2929
const deepLinkConfigEntries: DeepLinkConfigEntry[] = [];
3030
typescriptFiles.forEach(file => {
3131
const sourceFile = getTypescriptSourceFile(file.path, file.content);
@@ -41,6 +41,12 @@ export function getDeepLinkData(appNgModuleFilePath: string, fileCache: FileCach
4141
return deepLinkConfigEntries;
4242
}
4343

44+
export function filterTypescriptFilesForDeepLinks(fileCache: FileCache): File[] {
45+
const deepLinksDir = getStringPropertyValue(Constants.ENV_VAR_DEEPLINKS_DIR);
46+
const moduleSuffix = getStringPropertyValue(Constants.ENV_NG_MODULE_FILE_NAME_SUFFIX);
47+
return fileCache.getAll().filter(file => extname(file.path) === '.ts' && file.path.indexOf(moduleSuffix) === -1 && file.path.indexOf(deepLinksDir) >= 0);
48+
}
49+
4450
export function getNgModulePathFromCorrespondingPage(filePath: string) {
4551
const newExtension = getStringPropertyValue(Constants.ENV_NG_MODULE_FILE_NAME_SUFFIX);
4652
return changeExtension(filePath, newExtension);

src/util/config.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ describe('config', () => {
7070
expect(context.rootDir).toEqual(process.cwd());
7171
expect(context.tmpDir).toEqual(join(process.cwd(), Constants.TMP_DIR));
7272
expect(context.srcDir).toEqual(join(process.cwd(), Constants.SRC_DIR));
73+
expect(fakeConfig[Constants.ENV_VAR_DEEPLINKS_DIR]).toEqual(context.srcDir);
7374
expect(context.wwwDir).toEqual(join(process.cwd(), Constants.WWW_DIR));
7475
expect(context.wwwIndex).toEqual('index.html');
7576
expect(context.buildDir).toEqual(join(process.cwd(), Constants.WWW_DIR, Constants.BUILD_DIR));

src/util/config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ export function generateContext(context?: BuildContext): BuildContext {
7171
setProcessEnvVar(Constants.ENV_VAR_SRC_DIR, context.srcDir);
7272
Logger.debug(`srcDir set to ${context.srcDir}`);
7373

74+
const deepLinksDir = resolve(getConfigValue(context, '--deepLinksDir', null, Constants.ENV_VAR_DEEPLINKS_DIR, Constants.ENV_VAR_DEEPLINKS_DIR.toLowerCase(), context.srcDir));
75+
setProcessEnvVar(Constants.ENV_VAR_DEEPLINKS_DIR, deepLinksDir);
76+
Logger.debug(`deepLinksDir set to ${deepLinksDir}`);
77+
7478
context.wwwDir = resolve(context.wwwDir || getConfigValue(context, '--wwwDir', null, Constants.ENV_VAR_WWW_DIR, Constants.ENV_VAR_WWW_DIR.toLowerCase(), join(context.rootDir, Constants.WWW_DIR)));
7579
setProcessEnvVar(Constants.ENV_VAR_WWW_DIR, context.wwwDir);
7680
Logger.debug(`wwwDir set to ${context.wwwDir}`);

src/util/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export const ENV_VAR_DEV = 'dev';
2626
export const ENV_VAR_IONIC_ENV = 'IONIC_ENV';
2727
export const ENV_VAR_ROOT_DIR = 'IONIC_ROOT_DIR';
2828
export const ENV_VAR_SRC_DIR = 'IONIC_SRC_DIR';
29+
export const ENV_VAR_DEEPLINKS_DIR = 'IONIC_DEEPLINKS_DIR';
2930
export const ENV_VAR_PAGES_DIR = 'IONIC_PAGES_DIR';
3031
export const ENV_VAR_COMPONENTS_DIR = 'IONIC_COMPONENTS_DIR';
3132
export const ENV_VAR_DIRECTIVES_DIR = 'IONIC_DIRECTIVES_DIR';

0 commit comments

Comments
 (0)