util.spec.js 71KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var path_1 = require("path");
  4. var ts = require("typescript");
  5. var util = require("./util");
  6. var Constants = require("../util/constants");
  7. var file_cache_1 = require("../util/file-cache");
  8. var helpers = require("../util/helpers");
  9. var tsUtils = require("../util/typescript-utils");
  10. describe('util', function () {
  11. describe('filterTypescriptFilesForDeepLinks', function () {
  12. it('should return a list of files that are in the directory specified for deeplinking', function () {
  13. var pagesDir = path_1.join(process.cwd(), 'myApp', 'src', 'pages');
  14. var knownFileContent = 'Some string';
  15. var pageOneTs = path_1.join(pagesDir, 'page-one', 'page-one.ts');
  16. var pageOneHtml = path_1.join(pagesDir, 'page-one', 'page-one.html');
  17. var pageOneModule = path_1.join(pagesDir, 'page-one', 'page-one.module.ts');
  18. var pageTwoTs = path_1.join(pagesDir, 'page-two', 'page-two.ts');
  19. var pageTwoHtml = path_1.join(pagesDir, 'page-two', 'page-two.html');
  20. var pageTwoModule = path_1.join(pagesDir, 'page-two', 'page-two.module.ts');
  21. var pageThreeTs = path_1.join(pagesDir, 'page-three', 'page-three.ts');
  22. var pageThreeHtml = path_1.join(pagesDir, 'page-three', 'page-three.html');
  23. var pageThreeModule = path_1.join(pagesDir, 'page-three', 'page-three.module.ts');
  24. var someOtherFile = path_1.join('Users', 'hans-gruber', 'test.ts');
  25. var fileCache = new file_cache_1.FileCache();
  26. fileCache.set(pageOneTs, { path: pageOneTs, content: knownFileContent });
  27. fileCache.set(pageOneHtml, { path: pageOneHtml, content: knownFileContent });
  28. fileCache.set(pageOneModule, { path: pageOneModule, content: knownFileContent });
  29. fileCache.set(pageTwoTs, { path: pageTwoTs, content: knownFileContent });
  30. fileCache.set(pageTwoHtml, { path: pageTwoHtml, content: knownFileContent });
  31. fileCache.set(pageTwoModule, { path: pageTwoModule, content: knownFileContent });
  32. fileCache.set(pageThreeTs, { path: pageThreeTs, content: knownFileContent });
  33. fileCache.set(pageThreeHtml, { path: pageThreeHtml, content: knownFileContent });
  34. fileCache.set(pageThreeModule, { path: pageThreeModule, content: knownFileContent });
  35. fileCache.set(someOtherFile, { path: someOtherFile, content: knownFileContent });
  36. spyOn(helpers, helpers.getStringPropertyValue.name).and.callFake(function (input) {
  37. if (input === Constants.ENV_VAR_DEEPLINKS_DIR) {
  38. return pagesDir;
  39. }
  40. return '.module.ts';
  41. });
  42. var results = util.filterTypescriptFilesForDeepLinks(fileCache);
  43. expect(results.length).toEqual(3);
  44. expect(results[0].path).toEqual(pageOneTs);
  45. expect(results[1].path).toEqual(pageTwoTs);
  46. expect(results[2].path).toEqual(pageThreeTs);
  47. });
  48. });
  49. describe('parseDeepLinkDecorator', function () {
  50. it('should return the decorator content from fully hydrated decorator', function () {
  51. var knownContent = "\nimport { Component } from '@angular/core';\n\nimport { IonicPage, NavController } from 'ionic-angular';\n\n@IonicPage({\n name: 'someName',\n segment: 'someSegmentBro',\n defaultHistory: ['page-one', 'page-two'],\n priority: 'high'\n})\n@Component({\n selector: 'page-home',\n template: `\n <ion-header>\n <ion-navbar>\n <ion-title>\n Ionic Blank\n </ion-title>\n </ion-navbar>\n </ion-header>\n\n <ion-content padding>\n The world is your oyster.\n <p>\n If you get lost, the <a href=\"http://ionicframework.com/docs/v2\">docs</a> will be your guide.\n </p>\n <button ion-button (click)=\"nextPage()\">Next Page</button>\n </ion-content>\n `\n})\nexport class HomePage {\n\n constructor(public navCtrl: NavController) {\n }\n\n nextPage() {\n this.navCtrl.push('PageOne');\n console.log()\n }\n}\n\n ";
  52. var knownPath = path_1.join(process.cwd(), 'some', 'fake', 'path');
  53. var sourceFile = tsUtils.getTypescriptSourceFile(knownPath, knownContent);
  54. var result = util.getDeepLinkDecoratorContentForSourceFile(sourceFile);
  55. expect(result.name).toEqual('someName');
  56. expect(result.segment).toEqual('someSegmentBro');
  57. expect(result.defaultHistory[0]).toEqual('page-one');
  58. expect(result.defaultHistory[1]).toEqual('page-two');
  59. expect(result.priority).toEqual('high');
  60. expect(knownContent.indexOf(result.rawString)).toBeGreaterThan(-1);
  61. });
  62. it('should default to using class name when name is missing', function () {
  63. var knownContent = "\nimport { Component } from '@angular/core';\n\nimport { IonicPage, NavController } from 'ionic-angular';\n\n@IonicPage({\n segment: 'someSegmentBro',\n defaultHistory: ['page-one', 'page-two'],\n priority: 'high'\n})\n@Component({\n selector: 'page-home',\n template: `\n <ion-header>\n <ion-navbar>\n <ion-title>\n Ionic Blank\n </ion-title>\n </ion-navbar>\n </ion-header>\n\n <ion-content padding>\n The world is your oyster.\n <p>\n If you get lost, the <a href=\"http://ionicframework.com/docs/v2\">docs</a> will be your guide.\n </p>\n <button ion-button (click)=\"nextPage()\">Next Page</button>\n </ion-content>\n `\n})\nexport class HomePage {\n\n constructor(public navCtrl: NavController) {\n }\n\n nextPage() {\n this.navCtrl.push('PageOne');\n console.log()\n }\n}\n\n ";
  64. var knownPath = path_1.join(process.cwd(), 'some', 'fake', 'path');
  65. var sourceFile = tsUtils.getTypescriptSourceFile(knownPath, knownContent);
  66. var result = util.getDeepLinkDecoratorContentForSourceFile(sourceFile);
  67. expect(result.name).toEqual('HomePage');
  68. expect(result.segment).toEqual('someSegmentBro');
  69. expect(result.defaultHistory[0]).toEqual('page-one');
  70. expect(result.defaultHistory[1]).toEqual('page-two');
  71. expect(result.priority).toEqual('high');
  72. expect(knownContent.indexOf(result.rawString)).toBeGreaterThan(-1);
  73. });
  74. it('should return null segment when not in decorator', function () {
  75. var knownContent = "\nimport { Component } from '@angular/core';\n\nimport { IonicPage, NavController } from 'ionic-angular';\n\n@IonicPage({\n defaultHistory: ['page-one', 'page-two'],\n priority: 'high'\n})\n@Component({\n selector: 'page-home',\n template: `\n <ion-header>\n <ion-navbar>\n <ion-title>\n Ionic Blank\n </ion-title>\n </ion-navbar>\n </ion-header>\n\n <ion-content padding>\n The world is your oyster.\n <p>\n If you get lost, the <a href=\"http://ionicframework.com/docs/v2\">docs</a> will be your guide.\n </p>\n <button ion-button (click)=\"nextPage()\">Next Page</button>\n </ion-content>\n `\n})\nexport class HomePage {\n\n constructor(public navCtrl: NavController) {\n }\n\n nextPage() {\n this.navCtrl.push('PageOne');\n console.log()\n }\n}\n\n ";
  76. var knownPath = path_1.join(process.cwd(), 'some', 'fake', 'path');
  77. var sourceFile = tsUtils.getTypescriptSourceFile(knownPath, knownContent);
  78. var result = util.getDeepLinkDecoratorContentForSourceFile(sourceFile);
  79. expect(result.name).toEqual('HomePage');
  80. expect(result.segment).toEqual('path');
  81. expect(result.defaultHistory[0]).toEqual('page-one');
  82. expect(result.defaultHistory[1]).toEqual('page-two');
  83. expect(result.priority).toEqual('high');
  84. expect(knownContent.indexOf(result.rawString)).toBeGreaterThan(-1);
  85. });
  86. it('should return empty array for defaultHistory when not in decorator', function () {
  87. var knownContent = "\nimport { Component } from '@angular/core';\n\nimport { IonicPage, NavController } from 'ionic-angular';\n\n@IonicPage({\n priority: 'high'\n})\n@Component({\n selector: 'page-home',\n template: `\n <ion-header>\n <ion-navbar>\n <ion-title>\n Ionic Blank\n </ion-title>\n </ion-navbar>\n </ion-header>\n\n <ion-content padding>\n The world is your oyster.\n <p>\n If you get lost, the <a href=\"http://ionicframework.com/docs/v2\">docs</a> will be your guide.\n </p>\n <button ion-button (click)=\"nextPage()\">Next Page</button>\n </ion-content>\n `\n})\nexport class HomePage {\n\n constructor(public navCtrl: NavController) {\n }\n\n nextPage() {\n this.navCtrl.push('PageOne');\n console.log()\n }\n}\n\n ";
  88. var knownPath = path_1.join(process.cwd(), 'myApp', 'src', 'pages', 'about.ts');
  89. var sourceFile = tsUtils.getTypescriptSourceFile(knownPath, knownContent);
  90. var result = util.getDeepLinkDecoratorContentForSourceFile(sourceFile);
  91. expect(result.name).toEqual('HomePage');
  92. expect(result.segment).toEqual('about');
  93. expect(result.defaultHistory).toBeTruthy();
  94. expect(result.defaultHistory.length).toEqual(0);
  95. expect(result.priority).toEqual('high');
  96. expect(knownContent.indexOf(result.rawString)).toBeGreaterThan(-1);
  97. });
  98. it('should return priority of low when not in decorator', function () {
  99. var knownContent = "\nimport { Component } from '@angular/core';\n\nimport { IonicPage, NavController } from 'ionic-angular';\n\n@IonicPage({\n})\n@Component({\n selector: 'page-home',\n template: `\n <ion-header>\n <ion-navbar>\n <ion-title>\n Ionic Blank\n </ion-title>\n </ion-navbar>\n </ion-header>\n\n <ion-content padding>\n The world is your oyster.\n <p>\n If you get lost, the <a href=\"http://ionicframework.com/docs/v2\">docs</a> will be your guide.\n </p>\n <button ion-button (click)=\"nextPage()\">Next Page</button>\n </ion-content>\n `\n})\nexport class HomePage {\n\n constructor(public navCtrl: NavController) {\n }\n\n nextPage() {\n this.navCtrl.push('PageOne');\n console.log()\n }\n}\n\n ";
  100. var knownPath = path_1.join(process.cwd(), 'some', 'fake', 'path');
  101. var sourceFile = tsUtils.getTypescriptSourceFile(knownPath, knownContent);
  102. var result = util.getDeepLinkDecoratorContentForSourceFile(sourceFile);
  103. expect(result.name).toEqual('HomePage');
  104. expect(result.segment).toEqual('path');
  105. expect(result.defaultHistory).toBeTruthy();
  106. expect(result.defaultHistory.length).toEqual(0);
  107. expect(result.priority).toEqual('low');
  108. expect(knownContent.indexOf(result.rawString)).toBeGreaterThan(-1);
  109. });
  110. it('should return correct defaults when no param passed to decorator', function () {
  111. var knownContent = "\nimport { Component } from '@angular/core';\n\nimport { IonicPage, NavController } from 'ionic-angular';\n\n@IonicPage()\n@Component({\n selector: 'page-home',\n template: `\n <ion-header>\n <ion-navbar>\n <ion-title>\n Ionic Blank\n </ion-title>\n </ion-navbar>\n </ion-header>\n\n <ion-content padding>\n The world is your oyster.\n <p>\n If you get lost, the <a href=\"http://ionicframework.com/docs/v2\">docs</a> will be your guide.\n </p>\n <button ion-button (click)=\"nextPage()\">Next Page</button>\n </ion-content>\n `\n})\nexport class HomePage {\n\n constructor(public navCtrl: NavController) {\n }\n\n nextPage() {\n this.navCtrl.push('PageOne');\n console.log()\n }\n}\n\n ";
  112. var knownPath = path_1.join(process.cwd(), 'some', 'fake', 'path.ts');
  113. var sourceFile = tsUtils.getTypescriptSourceFile(knownPath, knownContent);
  114. var result = util.getDeepLinkDecoratorContentForSourceFile(sourceFile);
  115. expect(result.name).toEqual('HomePage');
  116. expect(result.segment).toEqual('path');
  117. expect(result.defaultHistory).toBeTruthy();
  118. expect(result.defaultHistory.length).toEqual(0);
  119. expect(result.priority).toEqual('low');
  120. expect(knownContent.indexOf(result.rawString)).toBeGreaterThan(-1);
  121. });
  122. it('should throw an error when multiple deeplink decorators are found', function () {
  123. var knownContent = "\nimport { Component } from '@angular/core';\n\nimport { IonicPage, NavController } from 'ionic-angular';\n\n@IonicPage({\n})\n@IonicPage({\n})\n@Component({\n selector: 'page-home',\n template: `\n <ion-header>\n <ion-navbar>\n <ion-title>\n Ionic Blank\n </ion-title>\n </ion-navbar>\n </ion-header>\n\n <ion-content padding>\n The world is your oyster.\n <p>\n If you get lost, the <a href=\"http://ionicframework.com/docs/v2\">docs</a> will be your guide.\n </p>\n <button ion-button (click)=\"nextPage()\">Next Page</button>\n </ion-content>\n `\n})\nexport class HomePage {\n\n constructor(public navCtrl: NavController) {\n }\n\n nextPage() {\n this.navCtrl.push('PageOne');\n console.log()\n }\n}\n\n ";
  124. var knownPath = path_1.join(process.cwd(), 'some', 'fake', 'path');
  125. var sourceFile = tsUtils.getTypescriptSourceFile(knownPath, knownContent);
  126. var knownErrorMsg = 'Should never get here';
  127. try {
  128. util.getDeepLinkDecoratorContentForSourceFile(sourceFile);
  129. throw new Error(knownErrorMsg);
  130. }
  131. catch (ex) {
  132. expect(ex.message).not.toEqual(knownErrorMsg);
  133. }
  134. });
  135. it('should return null when no deeplink decorator is found', function () {
  136. var knownContent = "\nimport { Component } from '@angular/core';\n\nimport { IonicPage, NavController } from 'ionic-angular';\n\n@Component({\n selector: 'page-home',\n template: `\n <ion-header>\n <ion-navbar>\n <ion-title>\n Ionic Blank\n </ion-title>\n </ion-navbar>\n </ion-header>\n\n <ion-content padding>\n The world is your oyster.\n <p>\n If you get lost, the <a href=\"http://ionicframework.com/docs/v2\">docs</a> will be your guide.\n </p>\n <button ion-button (click)=\"nextPage()\">Next Page</button>\n </ion-content>\n `\n})\nexport class HomePage {\n\n constructor(public navCtrl: NavController) {\n }\n\n nextPage() {\n this.navCtrl.push('PageOne');\n console.log()\n }\n}\n\n ";
  137. var knownPath = path_1.join(process.cwd(), 'some', 'fake', 'path');
  138. var sourceFile = tsUtils.getTypescriptSourceFile(knownPath, knownContent);
  139. var result = util.getDeepLinkDecoratorContentForSourceFile(sourceFile);
  140. expect(result).toEqual(null);
  141. });
  142. it('should return null when there isn\'t a class declaration', function () {
  143. var knownContent = "\nimport {\n CallExpression,\n createSourceFile,\n Identifier,\n ImportClause,\n ImportDeclaration,\n ImportSpecifier,\n NamedImports,\n Node,\n ScriptTarget,\n SourceFile,\n StringLiteral,\n SyntaxKind\n} from 'typescript';\n\nimport { rangeReplace, stringSplice } from './helpers';\n\nexport function getTypescriptSourceFile(filePath: string, fileContent: string, languageVersion: ScriptTarget = ScriptTarget.Latest, setParentNodes: boolean = false): SourceFile {\n return createSourceFile(filePath, fileContent, languageVersion, setParentNodes);\n}\n\nexport function removeDecorators(fileName: string, source: string): string {\n const sourceFile = createSourceFile(fileName, source, ScriptTarget.Latest);\n const decorators = findNodes(sourceFile, sourceFile, SyntaxKind.Decorator, true);\n decorators.sort((a, b) => b.pos - a.pos);\n decorators.forEach(d => {\n source = source.slice(0, d.pos) + source.slice(d.end);\n });\n\n return source;\n}\n\n ";
  144. var knownPath = path_1.join(process.cwd(), 'some', 'fake', 'path');
  145. var sourceFile = tsUtils.getTypescriptSourceFile(knownPath, knownContent);
  146. var result = util.getDeepLinkDecoratorContentForSourceFile(sourceFile);
  147. expect(result).toEqual(null);
  148. });
  149. });
  150. describe('getNgModuleDataFromCorrespondingPage', function () {
  151. it('should call the file cache with the path to an ngmodule', function () {
  152. var basePath = path_1.join(process.cwd(), 'some', 'fake', 'path');
  153. var pagePath = path_1.join(basePath, 'my-page', 'my-page.ts');
  154. var ngModulePath = path_1.join(basePath, 'my-page', 'my-page.module.ts');
  155. spyOn(helpers, helpers.getStringPropertyValue.name).and.returnValue('.module.ts');
  156. var result = util.getNgModulePathFromCorrespondingPage(pagePath);
  157. expect(result).toEqual(ngModulePath);
  158. });
  159. });
  160. describe('getRelativePathToPageNgModuleFromAppNgModule', function () {
  161. it('should return the relative path', function () {
  162. var prefix = path_1.join(process.cwd(), 'myApp', 'src');
  163. var appNgModulePath = path_1.join(prefix, 'app', 'app.module.ts');
  164. var pageNgModulePath = path_1.join(prefix, 'pages', 'page-one', 'page-one.module.ts');
  165. var result = util.getRelativePathToPageNgModuleFromAppNgModule(appNgModulePath, pageNgModulePath);
  166. expect(result).toEqual(path_1.join('..', 'pages', 'page-one', 'page-one.module.ts'));
  167. });
  168. });
  169. describe('getNgModuleDataFromPage', function () {
  170. it('should throw when NgModule is not in cache and create default ngModule flag is off', function () {
  171. var prefix = path_1.join(process.cwd(), 'myApp', 'src');
  172. var appNgModulePath = path_1.join(prefix, 'app', 'app.module.ts');
  173. var pagePath = path_1.join(prefix, 'pages', 'page-one', 'page-one.ts');
  174. var knownClassName = 'PageOne';
  175. var fileCache = new file_cache_1.FileCache();
  176. spyOn(helpers, helpers.getStringPropertyValue.name).and.returnValue('.module.ts');
  177. var knownErrorMsg = 'Should never happen';
  178. try {
  179. util.getNgModuleDataFromPage(appNgModulePath, pagePath, knownClassName, fileCache, false);
  180. throw new Error(knownErrorMsg);
  181. }
  182. catch (ex) {
  183. expect(ex.message).not.toEqual(knownErrorMsg);
  184. }
  185. });
  186. it('should return non-aot adjusted paths when not in AoT', function () {
  187. var pageNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { IonicPageModule } from 'ionic-angular';\n\nimport { HomePage } from './home';\n\n@NgModule({\n declarations: [\n HomePage,\n ],\n imports: [\n IonicPageModule.forChild(HomePage),\n ]\n})\nexport class HomePageModule {}\n ";
  188. var prefix = path_1.join(process.cwd(), 'myApp', 'src');
  189. var appNgModulePath = path_1.join(prefix, 'app', 'app.module.ts');
  190. var pageNgModulePath = path_1.join(prefix, 'pages', 'page-one', 'page-one.module.ts');
  191. var pagePath = path_1.join(prefix, 'pages', 'page-one', 'page-one.ts');
  192. var knownClassName = 'PageOne';
  193. var fileCache = new file_cache_1.FileCache();
  194. fileCache.set(pageNgModulePath, { path: pageNgModulePath, content: pageNgModuleContent });
  195. spyOn(helpers, helpers.getStringPropertyValue.name).and.returnValue('.module.ts');
  196. var result = util.getNgModuleDataFromPage(appNgModulePath, pagePath, knownClassName, fileCache, false);
  197. expect(result.absolutePath).toEqual(pageNgModulePath);
  198. expect(result.userlandModulePath).toEqual('../pages/page-one/page-one.module');
  199. expect(result.className).toEqual('HomePageModule');
  200. });
  201. it('should return adjusted paths to account for AoT', function () {
  202. var pageNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { IonicPageModule } from 'ionic-angular';\n\nimport { HomePage } from './home';\n\n@NgModule({\n declarations: [\n HomePage,\n ],\n imports: [\n IonicPageModule.forChild(HomePage),\n ]\n})\nexport class HomePageModule {}\n ";
  203. var prefix = path_1.join(process.cwd(), 'myApp', 'src');
  204. var appNgModulePath = path_1.join(prefix, 'app', 'app.module.ts');
  205. var pageNgModulePath = path_1.join(prefix, 'pages', 'page-one', 'page-one.module.ts');
  206. var pagePath = path_1.join(prefix, 'pages', 'page-one', 'page-one.ts');
  207. var knownClassName = 'PageOne';
  208. var fileCache = new file_cache_1.FileCache();
  209. fileCache.set(pageNgModulePath, { path: pageNgModulePath, content: pageNgModuleContent });
  210. spyOn(helpers, helpers.getStringPropertyValue.name).and.returnValue('.module.ts');
  211. var result = util.getNgModuleDataFromPage(appNgModulePath, pagePath, knownClassName, fileCache, true);
  212. expect(result.absolutePath).toEqual(helpers.changeExtension(pageNgModulePath, '.ngfactory.js'));
  213. expect(result.userlandModulePath).toEqual('../pages/page-one/page-one.module.ngfactory');
  214. expect(result.className).toEqual('HomePageModuleNgFactory');
  215. });
  216. });
  217. describe('getDeepLinkData', function () {
  218. it('should return an empty list when no deep link decorators are found', function () {
  219. var pageOneContent = "\nimport { Component } from '@angular/core';\nimport { IonicPage, NavController } from 'ionic-angular';\n\n\n@Component({\n selector: 'page-page-one',\n templateUrl: './page-one.html'\n})\nexport class PageOne {\n\n constructor(public navCtrl: NavController) {}\n\n ionViewDidLoad() {\n }\n\n nextPage() {\n this.navCtrl.push('PageTwo');\n }\n\n previousPage() {\n this.navCtrl.pop();\n }\n\n}\n ";
  220. var pageOneNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { PageOne } from './page-one';\nimport { IonicPageModule } from 'ionic-angular';\n\n@NgModule({\n declarations: [\n PageOne,\n ],\n imports: [\n IonicPageModule.forChild(PageOne)\n ],\n entryComponents: [\n PageOne\n ]\n})\nexport class PageOneModule {}\n\n ";
  221. var pageTwoContent = "\nimport { Component } from '@angular/core';\nimport { LoadingController, ModalController, NavController, PopoverController } from 'ionic-angular';\n\n\n@Component({\n selector: 'page-page-two',\n templateUrl: './page-two.html'\n})\nexport class PageTwo {\n\n constructor(public loadingController: LoadingController, public modalController: ModalController, public navCtrl: NavController, public popoverCtrl: PopoverController) {}\n\n ionViewDidLoad() {\n }\n\n goBack() {\n this.navCtrl.pop();\n }\n\n showLoader() {\n const viewController = this.loadingController.create({\n duration: 2000\n });\n\n viewController.present();\n }\n\n openModal() {\n /*const viewController = this.modalController.create('PageThree');\n viewController.present();\n */\n\n const viewController = this.popoverCtrl.create('PageThree');\n viewController.present();\n\n\n //this.navCtrl.push('PageThree');\n }\n}\n\n ";
  222. var pageTwoNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { PageTwo } from './page-two';\nimport { IonicPageModule } from 'ionic-angular';\n\n@NgModule({\n declarations: [\n PageTwo,\n ],\n imports: [\n IonicPageModule.forChild(PageTwo)\n ]\n})\nexport class PageTwoModule {\n\n}\n ";
  223. var pageSettingsContent = "\nimport { Component } from '@angular/core';\nimport { IonicPage, NavController } from 'ionic-angular';\n\n/*\n Generated class for the PageTwo page.\n\n See http://ionicframework.com/docs/v2/components/#navigation for more info on\n Ionic pages and navigation.\n*/\n@Component({\n selector: 'page-three',\n templateUrl: './page-three.html'\n})\nexport class PageThree {\n\n constructor(public navCtrl: NavController) {}\n\n ionViewDidLoad() {\n }\n\n goBack() {\n this.navCtrl.pop();\n }\n\n}\n\n ";
  224. var pageSettingsNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { PageThree } from './page-three';\nimport { IonicPageModule } from 'ionic-angular';\n\n@NgModule({\n declarations: [\n PageThree,\n ],\n imports: [\n IonicPageModule.forChild(PageThree)\n ]\n})\nexport class PageThreeModule {\n\n}\n\n ";
  225. var prefix = path_1.join(process.cwd(), 'myApp', 'src');
  226. var appNgModulePath = path_1.join(prefix, 'app', 'app.module.ts');
  227. var pageOneNgModulePath = path_1.join(prefix, 'pages', 'page-one', 'page-one.module.ts');
  228. var pageOnePath = path_1.join(prefix, 'pages', 'page-one', 'page-one.ts');
  229. var pageTwoNgModulePath = path_1.join(prefix, 'pages', 'page-two', 'page-two.module.ts');
  230. var pageTwoPath = path_1.join(prefix, 'pages', 'page-two', 'page-two.ts');
  231. var pageSettingsNgModulePath = path_1.join(prefix, 'pages', 'settings-page', 'settings-page.module.ts');
  232. var pageSettingsPath = path_1.join(prefix, 'pages', 'settings-page', 'settings-page.ts');
  233. var fileCache = new file_cache_1.FileCache();
  234. fileCache.set(pageOnePath, { path: pageOnePath, content: pageOneContent });
  235. fileCache.set(pageOneNgModulePath, { path: pageOneNgModulePath, content: pageOneNgModuleContent });
  236. fileCache.set(pageTwoPath, { path: pageTwoPath, content: pageTwoContent });
  237. fileCache.set(pageTwoNgModulePath, { path: pageTwoNgModulePath, content: pageTwoNgModuleContent });
  238. fileCache.set(pageTwoPath, { path: pageTwoPath, content: pageTwoContent });
  239. fileCache.set(pageTwoNgModulePath, { path: pageTwoNgModulePath, content: pageTwoNgModuleContent });
  240. fileCache.set(pageSettingsPath, { path: pageSettingsPath, content: pageSettingsContent });
  241. fileCache.set(pageSettingsNgModulePath, { path: pageSettingsNgModulePath, content: pageSettingsNgModuleContent });
  242. spyOn(helpers, helpers.getStringPropertyValue.name).and.returnValue('.module.ts');
  243. var map = util.getDeepLinkData(appNgModulePath, fileCache, false);
  244. expect(map.size).toEqual(0);
  245. });
  246. it('should return an a list of deeplink configs from all pages that have them, and not include pages that dont', function () {
  247. var pageOneContent = "\nimport { Component } from '@angular/core';\nimport { IonicPage, NavController } from 'ionic-angular';\n\n\n@IonicPage({\n name: 'SomeOtherName'\n})\n@Component({\n selector: 'page-page-one',\n templateUrl: './page-one.html'\n})\nexport class PageOne {\n\n constructor(public navCtrl: NavController) {}\n\n ionViewDidLoad() {\n }\n\n nextPage() {\n this.navCtrl.push('PageTwo');\n }\n\n previousPage() {\n this.navCtrl.pop();\n }\n\n}\n ";
  248. var pageOneNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { PageOne } from './page-one';\nimport { IonicPageModule } from 'ionic-angular';\n\n@NgModule({\n declarations: [\n PageOne,\n ],\n imports: [\n IonicPageModule.forChild(PageOne)\n ],\n entryComponents: [\n PageOne\n ]\n})\nexport class PageOneModule {}\n\n ";
  249. var pageTwoContent = "\nimport { Component } from '@angular/core';\nimport { LoadingController, ModalController, NavController, PopoverController } from 'ionic-angular';\n\n\n@Component({\n selector: 'page-page-two',\n templateUrl: './page-two.html'\n})\nexport class PageTwo {\n\n constructor(public loadingController: LoadingController, public modalController: ModalController, public navCtrl: NavController, public popoverCtrl: PopoverController) {}\n\n ionViewDidLoad() {\n }\n\n goBack() {\n this.navCtrl.pop();\n }\n\n showLoader() {\n const viewController = this.loadingController.create({\n duration: 2000\n });\n\n viewController.present();\n }\n\n openModal() {\n /*const viewController = this.modalController.create('PageThree');\n viewController.present();\n */\n\n const viewController = this.popoverCtrl.create('PageThree');\n viewController.present();\n\n\n //this.navCtrl.push('PageThree');\n }\n}\n\n ";
  250. var pageTwoNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { PageTwo } from './page-two';\nimport { IonicPageModule } from 'ionic-angular';\n\n@NgModule({\n declarations: [\n PageTwo,\n ],\n imports: [\n IonicPageModule.forChild(PageTwo)\n ]\n})\nexport class PageTwoModule {\n\n}\n ";
  251. var pageSettingsContent = "\nimport { Component } from '@angular/core';\nimport { IonicPage, NavController } from 'ionic-angular';\n\n@IonicPage({\n segment: 'someSegmentBro',\n defaultHistory: ['page-one', 'page-two'],\n priority: 'high'\n})\n@Component({\n selector: 'page-three',\n templateUrl: './page-three.html'\n})\nexport class PageThree {\n\n constructor(public navCtrl: NavController) {}\n\n ionViewDidLoad() {\n }\n\n goBack() {\n this.navCtrl.pop();\n }\n\n}\n\n ";
  252. var pageSettingsNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { PageThree } from './page-three';\nimport { IonicPageModule } from 'ionic-angular';\n\n@NgModule({\n declarations: [\n PageThree,\n ],\n imports: [\n IonicPageModule.forChild(PageThree)\n ]\n})\nexport class PageThreeModule {\n\n}\n\n ";
  253. var srcDir = path_1.join(process.cwd(), 'myApp', 'src');
  254. var appNgModulePath = path_1.join(srcDir, 'app', 'app.module.ts');
  255. var pageOneNgModulePath = path_1.join(srcDir, 'pages', 'page-one', 'page-one.module.ts');
  256. var pageOnePath = path_1.join(srcDir, 'pages', 'page-one', 'page-one.ts');
  257. var pageTwoNgModulePath = path_1.join(srcDir, 'pages', 'page-two', 'page-two.module.ts');
  258. var pageTwoPath = path_1.join(srcDir, 'pages', 'page-two', 'page-two.ts');
  259. var pageSettingsNgModulePath = path_1.join(srcDir, 'pages', 'settings-page', 'settings-page.module.ts');
  260. var pageSettingsPath = path_1.join(srcDir, 'pages', 'settings-page', 'settings-page.ts');
  261. var fileCache = new file_cache_1.FileCache();
  262. fileCache.set(pageOnePath, { path: pageOnePath, content: pageOneContent });
  263. fileCache.set(pageOneNgModulePath, { path: pageOneNgModulePath, content: pageOneNgModuleContent });
  264. fileCache.set(pageTwoPath, { path: pageTwoPath, content: pageTwoContent });
  265. fileCache.set(pageTwoNgModulePath, { path: pageTwoNgModulePath, content: pageTwoNgModuleContent });
  266. fileCache.set(pageTwoPath, { path: pageTwoPath, content: pageTwoContent });
  267. fileCache.set(pageTwoNgModulePath, { path: pageTwoNgModulePath, content: pageTwoNgModuleContent });
  268. fileCache.set(pageSettingsPath, { path: pageSettingsPath, content: pageSettingsContent });
  269. fileCache.set(pageSettingsNgModulePath, { path: pageSettingsNgModulePath, content: pageSettingsNgModuleContent });
  270. spyOn(helpers, helpers.getStringPropertyValue.name).and.callFake(function (input) {
  271. if (input === Constants.ENV_VAR_DEEPLINKS_DIR) {
  272. return srcDir;
  273. }
  274. else {
  275. return '.module.ts';
  276. }
  277. });
  278. var map = util.getDeepLinkData(appNgModulePath, fileCache, false);
  279. expect(map.size).toEqual(2);
  280. });
  281. it('should return an a list of deeplink configs from all pages that have them', function () {
  282. var pageOneContent = "\nimport { Component } from '@angular/core';\nimport { IonicPage, NavController } from 'ionic-angular';\n\n\n@IonicPage({\n name: 'SomeOtherName'\n})\n@Component({\n selector: 'page-page-one',\n templateUrl: './page-one.html'\n})\nexport class PageOne {\n\n constructor(public navCtrl: NavController) {}\n\n ionViewDidLoad() {\n }\n\n nextPage() {\n this.navCtrl.push('PageTwo');\n }\n\n previousPage() {\n this.navCtrl.pop();\n }\n\n}\n ";
  283. var pageOneNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { PageOne } from './page-one';\nimport { IonicPageModule } from 'ionic-angular';\n\n@NgModule({\n declarations: [\n PageOne,\n ],\n imports: [\n IonicPageModule.forChild(PageOne)\n ],\n entryComponents: [\n PageOne\n ]\n})\nexport class PageOneModule {}\n\n ";
  284. var pageTwoContent = "\nimport { Component } from '@angular/core';\nimport { LoadingController, ModalController, NavController, PopoverController } from 'ionic-angular';\n\n\n\n@Component({\n selector: 'page-page-two',\n templateUrl: './page-two.html'\n})\n@IonicPage()\nexport class PageTwo {\n\n constructor(public loadingController: LoadingController, public modalController: ModalController, public navCtrl: NavController, public popoverCtrl: PopoverController) {}\n\n ionViewDidLoad() {\n }\n\n goBack() {\n this.navCtrl.pop();\n }\n\n showLoader() {\n const viewController = this.loadingController.create({\n duration: 2000\n });\n\n viewController.present();\n }\n\n openModal() {\n /*const viewController = this.modalController.create('PageThree');\n viewController.present();\n */\n\n const viewController = this.popoverCtrl.create('PageThree');\n viewController.present();\n\n\n //this.navCtrl.push('PageThree');\n }\n}\n\n ";
  285. var pageTwoNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { PageTwo } from './page-two';\nimport { IonicPageModule } from 'ionic-angular';\n\n@NgModule({\n declarations: [\n PageTwo,\n ],\n imports: [\n IonicPageModule.forChild(PageTwo)\n ]\n})\nexport class PageTwoModule {\n\n}\n ";
  286. var pageSettingsContent = "\nimport { Component } from '@angular/core';\nimport { IonicPage, NavController } from 'ionic-angular';\n\n@IonicPage({\n segment: 'someSegmentBro',\n defaultHistory: ['page-one', 'page-two'],\n priority: 'high'\n})\n@Component({\n selector: 'page-three',\n templateUrl: './page-three.html'\n})\nexport class PageThree {\n\n constructor(public navCtrl: NavController) {}\n\n ionViewDidLoad() {\n }\n\n goBack() {\n this.navCtrl.pop();\n }\n\n}\n\n ";
  287. var pageSettingsNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { PageThree } from './page-three';\nimport { IonicPageModule } from 'ionic-angular';\n\n@NgModule({\n declarations: [\n PageThree,\n ],\n imports: [\n IonicPageModule.forChild(PageThree)\n ]\n})\nexport class PageThreeModule {\n\n}\n\n ";
  288. var srcDir = path_1.join(process.cwd(), 'myApp', 'src');
  289. var appNgModulePath = path_1.join(srcDir, 'app', 'app.module.ts');
  290. var pageOneNgModulePath = path_1.join(srcDir, 'pages', 'page-one', 'page-one.module.ts');
  291. var pageOnePath = path_1.join(srcDir, 'pages', 'page-one', 'page-one.ts');
  292. var pageTwoNgModulePath = path_1.join(srcDir, 'pages', 'page-two', 'page-two.module.ts');
  293. var pageTwoPath = path_1.join(srcDir, 'pages', 'page-two', 'page-two.ts');
  294. var pageSettingsNgModulePath = path_1.join(srcDir, 'pages', 'settings-page', 'fake-dir', 'settings-page.module.ts');
  295. var pageSettingsPath = path_1.join(srcDir, 'pages', 'settings-page', 'fake-dir', 'settings-page.ts');
  296. var fileCache = new file_cache_1.FileCache();
  297. fileCache.set(pageOnePath, { path: pageOnePath, content: pageOneContent });
  298. fileCache.set(pageOneNgModulePath, { path: pageOneNgModulePath, content: pageOneNgModuleContent });
  299. fileCache.set(pageTwoPath, { path: pageTwoPath, content: pageTwoContent });
  300. fileCache.set(pageTwoNgModulePath, { path: pageTwoNgModulePath, content: pageTwoNgModuleContent });
  301. fileCache.set(pageTwoPath, { path: pageTwoPath, content: pageTwoContent });
  302. fileCache.set(pageTwoNgModulePath, { path: pageTwoNgModulePath, content: pageTwoNgModuleContent });
  303. fileCache.set(pageSettingsPath, { path: pageSettingsPath, content: pageSettingsContent });
  304. fileCache.set(pageSettingsNgModulePath, { path: pageSettingsNgModulePath, content: pageSettingsNgModuleContent });
  305. spyOn(helpers, helpers.getStringPropertyValue.name).and.callFake(function (input) {
  306. if (input === Constants.ENV_VAR_DEEPLINKS_DIR) {
  307. return srcDir;
  308. }
  309. else {
  310. return '.module.ts';
  311. }
  312. });
  313. var map = util.getDeepLinkData(appNgModulePath, fileCache, false);
  314. expect(map.size).toEqual(3);
  315. var entryOne = map.get('SomeOtherName');
  316. expect(entryOne.name).toEqual('SomeOtherName');
  317. expect(entryOne.segment).toEqual('page-one');
  318. expect(entryOne.priority).toEqual('low');
  319. expect(entryOne.defaultHistory.length).toEqual(0);
  320. expect(entryOne.absolutePath).toEqual(path_1.join(srcDir, 'pages', 'page-one', 'page-one.module.ts'));
  321. expect(entryOne.userlandModulePath).toEqual('../pages/page-one/page-one.module');
  322. expect(entryOne.className).toEqual('PageOneModule');
  323. var entryTwo = map.get('PageTwo');
  324. expect(entryTwo.name).toEqual('PageTwo');
  325. expect(entryTwo.segment).toEqual('page-two');
  326. expect(entryTwo.priority).toEqual('low');
  327. expect(entryTwo.defaultHistory.length).toEqual(0);
  328. expect(entryTwo.absolutePath).toEqual(path_1.join(srcDir, 'pages', 'page-two', 'page-two.module.ts'));
  329. expect(entryTwo.userlandModulePath).toEqual('../pages/page-two/page-two.module');
  330. expect(entryTwo.className).toEqual('PageTwoModule');
  331. var entryThree = map.get('PageThree');
  332. expect(entryThree.name).toEqual('PageThree');
  333. expect(entryThree.segment).toEqual('someSegmentBro');
  334. expect(entryThree.priority).toEqual('high');
  335. expect(entryThree.defaultHistory.length).toEqual(2);
  336. expect(entryThree.defaultHistory[0]).toEqual('page-one');
  337. expect(entryThree.defaultHistory[1]).toEqual('page-two');
  338. expect(entryThree.absolutePath).toEqual(path_1.join(srcDir, 'pages', 'settings-page', 'fake-dir', 'settings-page.module.ts'));
  339. expect(entryThree.userlandModulePath).toEqual('../pages/settings-page/fake-dir/settings-page.module');
  340. expect(entryThree.className).toEqual('PageThreeModule');
  341. });
  342. it('should throw when it cant find an NgModule as a peer to the page with a deep link config', function () {
  343. var pageOneContent = "\nimport { Component } from '@angular/core';\nimport { IonicPage, NavController } from 'ionic-angular';\n\n\n@IonicPage({\n name: 'SomeOtherName'\n})\n@Component({\n selector: 'page-page-one',\n templateUrl: './page-one.html'\n})\nexport class PageOne {\n\n constructor(public navCtrl: NavController) {}\n\n ionViewDidLoad() {\n }\n\n nextPage() {\n this.navCtrl.push('PageTwo');\n }\n\n previousPage() {\n this.navCtrl.pop();\n }\n\n}\n ";
  344. var pageOneNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { PageOne } from './page-one';\nimport { IonicPageModule } from 'ionic-angular';\n\n@NgModule({\n declarations: [\n PageOne,\n ],\n imports: [\n IonicPageModule.forChild(PageOne)\n ],\n entryComponents: [\n PageOne\n ]\n})\nexport class PageOneModule {}\n\n ";
  345. var pageTwoContent = "\nimport { Component } from '@angular/core';\nimport { LoadingController, ModalController, NavController, PopoverController } from 'ionic-angular';\n\n\n\n@Component({\n selector: 'page-page-two',\n templateUrl: './page-two.html'\n})\n@IonicPage()\nexport class PageTwo {\n\n constructor(public loadingController: LoadingController, public modalController: ModalController, public navCtrl: NavController, public popoverCtrl: PopoverController) {}\n\n ionViewDidLoad() {\n }\n\n goBack() {\n this.navCtrl.pop();\n }\n\n showLoader() {\n const viewController = this.loadingController.create({\n duration: 2000\n });\n\n viewController.present();\n }\n\n openModal() {\n /*const viewController = this.modalController.create('PageThree');\n viewController.present();\n */\n\n const viewController = this.popoverCtrl.create('PageThree');\n viewController.present();\n\n\n //this.navCtrl.push('PageThree');\n }\n}\n\n ";
  346. var pageTwoNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { PageTwo } from './page-two';\nimport { IonicPageModule } from 'ionic-angular';\n\n@NgModule({\n declarations: [\n PageTwo,\n ],\n imports: [\n IonicPageModule.forChild(PageTwo)\n ]\n})\nexport class PageTwoModule {\n\n}\n ";
  347. var pageSettingsContent = "\nimport { Component } from '@angular/core';\nimport { IonicPage, NavController } from 'ionic-angular';\n\n@IonicPage({\n segment: 'someSegmentBro',\n defaultHistory: ['page-one', 'page-two'],\n priority: 'high'\n})\n@Component({\n selector: 'page-three',\n templateUrl: './page-three.html'\n})\nexport class PageThree {\n\n constructor(public navCtrl: NavController) {}\n\n ionViewDidLoad() {\n }\n\n goBack() {\n this.navCtrl.pop();\n }\n\n}\n\n ";
  348. var pageSettingsNgModuleContent = "\nimport { NgModule } from '@angular/core';\nimport { PageThree } from './page-three';\nimport { IonicPageModule } from 'ionic-angular';\n\n@NgModule({\n declarations: [\n PageThree,\n ],\n imports: [\n IonicPageModule.forChild(PageThree)\n ]\n})\nexport class PageThreeModule {\n\n}\n\n ";
  349. var srcDir = path_1.join(process.cwd(), 'myApp', 'src');
  350. var appNgModulePath = path_1.join(srcDir, 'app', 'app.module.ts');
  351. var pageOneNgModulePath = path_1.join(srcDir, 'pages', 'page-one', 'page-one.not-module.ts');
  352. var pageOnePath = path_1.join(srcDir, 'pages', 'page-one', 'page-one.ts');
  353. var pageTwoNgModulePath = path_1.join(srcDir, 'pages', 'page-two', 'page-two.module.ts');
  354. var pageTwoPath = path_1.join(srcDir, 'pages', 'page-two', 'page-two.ts');
  355. var pageSettingsNgModulePath = path_1.join(srcDir, 'pages', 'settings-page', 'fake-dir', 'settings-page.module.ts');
  356. var pageSettingsPath = path_1.join(srcDir, 'pages', 'settings-page', 'fake-dir', 'settings-page.ts');
  357. var fileCache = new file_cache_1.FileCache();
  358. fileCache.set(pageOnePath, { path: pageOnePath, content: pageOneContent });
  359. fileCache.set(pageOneNgModulePath, { path: pageOneNgModulePath, content: pageOneNgModuleContent });
  360. fileCache.set(pageTwoPath, { path: pageTwoPath, content: pageTwoContent });
  361. fileCache.set(pageTwoNgModulePath, { path: pageTwoNgModulePath, content: pageTwoNgModuleContent });
  362. fileCache.set(pageTwoPath, { path: pageTwoPath, content: pageTwoContent });
  363. fileCache.set(pageTwoNgModulePath, { path: pageTwoNgModulePath, content: pageTwoNgModuleContent });
  364. fileCache.set(pageSettingsPath, { path: pageSettingsPath, content: pageSettingsContent });
  365. fileCache.set(pageSettingsNgModulePath, { path: pageSettingsNgModulePath, content: pageSettingsNgModuleContent });
  366. spyOn(helpers, helpers.getStringPropertyValue.name).and.callFake(function (input) {
  367. if (input === Constants.ENV_VAR_DEEPLINKS_DIR) {
  368. return srcDir;
  369. }
  370. else {
  371. return '.module.ts';
  372. }
  373. });
  374. var knownError = 'should never get here';
  375. try {
  376. util.getDeepLinkData(appNgModulePath, fileCache, false);
  377. throw new Error(knownError);
  378. }
  379. catch (ex) {
  380. expect(ex.message).not.toEqual(knownError);
  381. }
  382. });
  383. });
  384. describe('hasExistingDeepLinkConfig', function () {
  385. it('should return true when there is an existing deep link config', function () {
  386. var knownContent = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp, {}, {\n links: [\n { loadChildren: '../pages/page-one/page-one.module#PageOneModule', name: 'PageOne' },\n { loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo' },\n { loadChildren: '../pages/page-three/page-three.module#PageThreeModule', name: 'PageThree' }\n ]\n }),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n ";
  387. var knownPath = '/idk/yo/some/path';
  388. var result = util.hasExistingDeepLinkConfig(knownPath, knownContent);
  389. expect(result).toEqual(true);
  390. });
  391. it('should return false when there isnt a deeplink config', function () {
  392. var knownContent = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp, {}),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n ";
  393. var knownPath = path_1.join(process.cwd(), 'idk', 'some', 'fake', 'path');
  394. var result = util.hasExistingDeepLinkConfig(knownPath, knownContent);
  395. expect(result).toEqual(false);
  396. });
  397. it('should return false when null/undefined is passed in place on deeplink config', function () {
  398. var knownContent = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp, {}, null),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n ";
  399. var knownPath = path_1.join(process.cwd(), 'idk', 'some', 'fake', 'path');
  400. var result = util.hasExistingDeepLinkConfig(knownPath, knownContent);
  401. expect(result).toEqual(false);
  402. });
  403. it('should return true where there is an existing deep link config associated with a variable', function () {
  404. var knownContent = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\nconst deepLinkConfig = {\n links: [\n { loadChildren: '../pages/page-one/page-one.module#PageOneModule', name: 'PageOne' },\n { loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo' },\n { loadChildren: '../pages/page-three/page-three.module#PageThreeModule', name: 'PageThree' }\n ]\n};\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp, {}, deepLinkConfig),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n ";
  405. var knownPath = path_1.join(process.cwd(), 'idk', 'some', 'fake', 'path');
  406. var result = util.hasExistingDeepLinkConfig(knownPath, knownContent);
  407. expect(result).toEqual(true);
  408. });
  409. });
  410. describe('convertDeepLinkEntryToJsObjectString', function () {
  411. it('should convert to a flat string format', function () {
  412. var entry = {
  413. name: 'HomePage',
  414. segment: null,
  415. defaultHistory: [],
  416. priority: 'low',
  417. rawString: 'irrelevant for this test',
  418. absolutePath: path_1.join(process.cwd(), 'myApp', 'pages', 'home-page', 'home-page.module.ts'),
  419. userlandModulePath: '../pages/home-page/home-page.module',
  420. className: 'HomePageModule'
  421. };
  422. var result = util.convertDeepLinkEntryToJsObjectString(entry);
  423. expect(result).toEqual("{ loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: null, priority: 'low', defaultHistory: [] }");
  424. });
  425. it('should handle defaultHistory entries and segment', function () {
  426. var entry = {
  427. name: 'HomePage',
  428. segment: 'idkMan',
  429. defaultHistory: ['page-two', 'page-three', 'page-four'],
  430. priority: 'low',
  431. rawString: 'irrelevant for this test',
  432. absolutePath: path_1.join(process.cwd(), 'myApp', 'pages', 'home-page', 'home-page.module.ts'),
  433. userlandModulePath: '../pages/home-page/home-page.module',
  434. className: 'HomePageModule'
  435. };
  436. var result = util.convertDeepLinkEntryToJsObjectString(entry);
  437. expect(result).toEqual("{ loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: 'idkMan', priority: 'low', defaultHistory: ['page-two', 'page-three', 'page-four'] }");
  438. });
  439. });
  440. describe('convertDeepLinkConfigEntriesToString', function () {
  441. it('should convert list of decorator data to legacy ionic data structure as a string', function () {
  442. var map = new Map();
  443. map.set('HomePage', {
  444. name: 'HomePage',
  445. segment: 'idkMan',
  446. defaultHistory: ['page-two', 'page-three', 'page-four'],
  447. priority: 'low',
  448. rawString: 'irrelevant for this test',
  449. absolutePath: path_1.join(process.cwd(), 'myApp', 'pages', 'home-page', 'home-page.module.ts'),
  450. userlandModulePath: '../pages/home-page/home-page.module',
  451. className: 'HomePageModule'
  452. });
  453. map.set('PageTwo', {
  454. name: 'PageTwo',
  455. segment: null,
  456. defaultHistory: [],
  457. priority: 'low',
  458. rawString: 'irrelevant for this test',
  459. absolutePath: path_1.join(process.cwd(), 'myApp', 'pages', 'home-page', 'home-page.module.ts'),
  460. userlandModulePath: '../pages/page-two/page-two.module',
  461. className: 'PageTwoModule'
  462. });
  463. map.set('SettingsPage', {
  464. name: 'SettingsPage',
  465. segment: null,
  466. defaultHistory: [],
  467. priority: 'low',
  468. rawString: 'irrelevant for this test',
  469. absolutePath: path_1.join(process.cwd(), 'myApp', 'pages', 'home-page', 'home-page.module.ts'),
  470. userlandModulePath: '../pages/settings-page/setting-page.module',
  471. className: 'SettingsPageModule'
  472. });
  473. var result = util.convertDeepLinkConfigEntriesToString(map);
  474. expect(result.indexOf('links: [')).toBeGreaterThanOrEqual(0);
  475. expect(result.indexOf("{ loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: 'idkMan', priority: 'low', defaultHistory: ['page-two', 'page-three', 'page-four'] },")).toBeGreaterThanOrEqual(0);
  476. expect(result.indexOf("{ loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo', segment: null, priority: 'low', defaultHistory: [] },")).toBeGreaterThanOrEqual(0);
  477. expect(result.indexOf("{ loadChildren: '../pages/settings-page/setting-page.module#SettingsPageModule', name: 'SettingsPage', segment: null, priority: 'low', defaultHistory: [] }")).toBeGreaterThanOrEqual(0);
  478. });
  479. });
  480. describe('getUpdatedAppNgModuleContentWithDeepLinkConfig', function () {
  481. it('should add a default argument for the second param of forRoot, then add the deeplink config', function () {
  482. var knownStringToInject = "{\n links: [\n { loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: 'idkMan', priority: 'low', defaultHistory: ['page-two', 'page-three', 'page-four'] },\n { loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo', segment: null, priority: 'low', defaultHistory: [] },\n { loadChildren: '../pages/settings-page/setting-page.module#SettingsPageModule', name: 'SettingsPage', segment: null, priority: 'low', defaultHistory: [] }\n ]\n}\n";
  483. var knownContent = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n ";
  484. var expectedResult = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp, {}, {\n links: [\n { loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: 'idkMan', priority: 'low', defaultHistory: ['page-two', 'page-three', 'page-four'] },\n { loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo', segment: null, priority: 'low', defaultHistory: [] },\n { loadChildren: '../pages/settings-page/setting-page.module#SettingsPageModule', name: 'SettingsPage', segment: null, priority: 'low', defaultHistory: [] }\n ]\n}\n),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n ";
  485. var knownPath = path_1.join('some', 'fake', 'path');
  486. var result = util.getUpdatedAppNgModuleContentWithDeepLinkConfig(knownPath, knownContent, knownStringToInject);
  487. expect(result).toEqual(expectedResult);
  488. });
  489. it('should append the deeplink config as the third argument when second arg is null', function () {
  490. var knownStringToInject = "{\n links: [\n { loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: 'idkMan', priority: 'low', defaultHistory: ['page-two', 'page-three', 'page-four'] },\n { loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo', segment: null, priority: 'low', defaultHistory: [] },\n { loadChildren: '../pages/settings-page/setting-page.module#SettingsPageModule', name: 'SettingsPage', segment: null, priority: 'low', defaultHistory: [] }\n ]\n}\n";
  491. var knownContent = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp, null),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n ";
  492. var expectedResult = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp, null, {\n links: [\n { loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: 'idkMan', priority: 'low', defaultHistory: ['page-two', 'page-three', 'page-four'] },\n { loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo', segment: null, priority: 'low', defaultHistory: [] },\n { loadChildren: '../pages/settings-page/setting-page.module#SettingsPageModule', name: 'SettingsPage', segment: null, priority: 'low', defaultHistory: [] }\n ]\n}\n),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n ";
  493. var knownPath = path_1.join('some', 'fake', 'path');
  494. var result = util.getUpdatedAppNgModuleContentWithDeepLinkConfig(knownPath, knownContent, knownStringToInject);
  495. expect(result).toEqual(expectedResult);
  496. });
  497. it('should append the deeplink config as the third argument when second arg is object', function () {
  498. var knownStringToInject = "{\n links: [\n { loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: 'idkMan', priority: 'low', defaultHistory: ['page-two', 'page-three', 'page-four'] },\n { loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo', segment: null, priority: 'low', defaultHistory: [] },\n { loadChildren: '../pages/settings-page/setting-page.module#SettingsPageModule', name: 'SettingsPage', segment: null, priority: 'low', defaultHistory: [] }\n ]\n}\n";
  499. var knownContent = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp, {}),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n ";
  500. var expectedResult = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp, {}, {\n links: [\n { loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: 'idkMan', priority: 'low', defaultHistory: ['page-two', 'page-three', 'page-four'] },\n { loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo', segment: null, priority: 'low', defaultHistory: [] },\n { loadChildren: '../pages/settings-page/setting-page.module#SettingsPageModule', name: 'SettingsPage', segment: null, priority: 'low', defaultHistory: [] }\n ]\n}\n),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n ";
  501. var knownPath = path_1.join('some', 'fake', 'path');
  502. var result = util.getUpdatedAppNgModuleContentWithDeepLinkConfig(knownPath, knownContent, knownStringToInject);
  503. expect(result).toEqual(expectedResult);
  504. });
  505. it('should replace the third argument with deeplink config', function () {
  506. var knownStringToInject = "{\n links: [\n { loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: 'idkMan', priority: 'low', defaultHistory: ['page-two', 'page-three', 'page-four'] },\n { loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo', segment: null, priority: 'low', defaultHistory: [] },\n { loadChildren: '../pages/settings-page/setting-page.module#SettingsPageModule', name: 'SettingsPage', segment: null, priority: 'low', defaultHistory: [] }\n ]\n}\n";
  507. var knownContent = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp, {}, null),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n ";
  508. var expectedResult = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp, {}, {\n links: [\n { loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: 'idkMan', priority: 'low', defaultHistory: ['page-two', 'page-three', 'page-four'] },\n { loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo', segment: null, priority: 'low', defaultHistory: [] },\n { loadChildren: '../pages/settings-page/setting-page.module#SettingsPageModule', name: 'SettingsPage', segment: null, priority: 'low', defaultHistory: [] }\n ]\n}\n),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n ";
  509. var knownPath = path_1.join('some', 'fake', 'path');
  510. var result = util.getUpdatedAppNgModuleContentWithDeepLinkConfig(knownPath, knownContent, knownStringToInject);
  511. expect(result).toEqual(expectedResult);
  512. });
  513. });
  514. describe('generateDefaultDeepLinkNgModuleContent', function () {
  515. it('should generate a default NgModule for a DeepLinked component', function () {
  516. var knownFileContent = "\nimport { NgModule } from '@angular/core';\nimport { IonicPageModule } from 'ionic-angular';\nimport { PageOne } from './page-one';\n\n@NgModule({\n declarations: [\n PageOne,\n ],\n imports: [\n IonicPageModule.forChild(PageOne)\n ]\n})\nexport class PageOneModule {}\n\n";
  517. var knownFilePath = path_1.join(process.cwd(), 'myApp', 'src', 'pages', 'page-one', 'page-one.ts');
  518. var knownClassName = 'PageOne';
  519. var fileContent = util.generateDefaultDeepLinkNgModuleContent(knownFilePath, knownClassName);
  520. expect(fileContent).toEqual(knownFileContent);
  521. });
  522. });
  523. describe('updateAppNgModuleWithDeepLinkConfig', function () {
  524. it('should throw when app ng module is not in cache', function () {
  525. var fileCache = new file_cache_1.FileCache();
  526. var knownContext = {
  527. fileCache: fileCache
  528. };
  529. var knownDeepLinkString = "{\n links: [\n { loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: 'idkMan', priority: 'low', defaultHistory: ['page-two', 'page-three', 'page-four'] },\n { loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo', segment: null, priority: 'low', defaultHistory: [] },\n { loadChildren: '../pages/settings-page/setting-page.module#SettingsPageModule', name: 'SettingsPage', segment: null, priority: 'low', defaultHistory: [] }\n ]\n}\n";
  530. var knownAppNgModulePath = path_1.join(process.cwd(), 'myApp', 'src', 'app.module.ts');
  531. spyOn(helpers, helpers.getStringPropertyValue.name).and.returnValue(knownAppNgModulePath);
  532. spyOn(fileCache, 'get').and.callThrough();
  533. var knownErrorMsg = 'should never get here';
  534. try {
  535. util.updateAppNgModuleWithDeepLinkConfig(knownContext, knownDeepLinkString, null);
  536. throw new Error(knownErrorMsg);
  537. }
  538. catch (ex) {
  539. expect(ex.message).not.toEqual(knownErrorMsg);
  540. expect(fileCache.get).toHaveBeenCalledWith(knownAppNgModulePath);
  541. }
  542. });
  543. it('should update the cache with updated ts file', function () {
  544. var fileCache = new file_cache_1.FileCache();
  545. var knownContext = {
  546. fileCache: fileCache
  547. };
  548. var knownDeepLinkString = "{\n links: [\n { loadChildren: '../pages/home-page/home-page.module#HomePageModule', name: 'HomePage', segment: 'idkMan', priority: 'low', defaultHistory: ['page-two', 'page-three', 'page-four'] },\n { loadChildren: '../pages/page-two/page-two.module#PageTwoModule', name: 'PageTwo', segment: null, priority: 'low', defaultHistory: [] },\n { loadChildren: '../pages/settings-page/setting-page.module#SettingsPageModule', name: 'SettingsPage', segment: null, priority: 'low', defaultHistory: [] }\n ]\n}\n";
  549. var ngModuleContent = "\nimport { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { IonicApp, IonicModule } from 'ionic-angular';\nimport { MyApp } from './app.component';\n\nimport { HomePageModule } from '../pages/home/home.module';\n\n@NgModule({\n declarations: [\n MyApp,\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp, {}, null),\n HomePageModule,\n ],\n bootstrap: [IonicApp],\n providers: []\n})\nexport class AppModule {}\n";
  550. var knownAppNgModulePath = path_1.join(process.cwd(), 'myApp', 'src', 'app.module.ts');
  551. fileCache.set(knownAppNgModulePath, { path: knownAppNgModulePath, content: ngModuleContent });
  552. spyOn(helpers, helpers.getStringPropertyValue.name).and.returnValue(knownAppNgModulePath);
  553. var changedFiles = [];
  554. util.updateAppNgModuleWithDeepLinkConfig(knownContext, knownDeepLinkString, changedFiles);
  555. expect(fileCache.getAll().length).toEqual(1);
  556. expect(fileCache.get(knownAppNgModulePath).content.indexOf(knownDeepLinkString)).toBeGreaterThanOrEqual(0);
  557. expect(changedFiles.length).toEqual(1);
  558. expect(changedFiles[0].event).toEqual('change');
  559. expect(changedFiles[0].ext).toEqual('.ts');
  560. expect(changedFiles[0].filePath).toEqual(knownAppNgModulePath);
  561. });
  562. });
  563. describe('purgeDeepLinkDecorator', function () {
  564. it('should remove the IonicPage decorator from the ts source', function () {
  565. var input = "\nimport { Component } from '@angular/core';\n\nimport { IonicPage, PopoverController } from 'ionic-angular';\n\n@IonicPage()\n@Component({\n selector: 'page-about',\n templateUrl: 'about.html'\n})\nexport class AboutPage {\n conferenceDate = '2047-05-17';\n\n constructor(public popoverCtrl: PopoverController) { }\n\n presentPopover(event: Event) {\n let popover = this.popoverCtrl.create('PopoverPage');\n popover.present({ ev: event });\n }\n}\n";
  566. var expectedContent = "\nimport { Component } from '@angular/core';\n\nimport { PopoverController } from 'ionic-angular';\n\n\n@Component({\n selector: 'page-about',\n templateUrl: 'about.html'\n})\nexport class AboutPage {\n conferenceDate = '2047-05-17';\n\n constructor(public popoverCtrl: PopoverController) { }\n\n presentPopover(event: Event) {\n let popover = this.popoverCtrl.create('PopoverPage');\n popover.present({ ev: event });\n }\n}\n";
  567. var result = util.purgeDeepLinkDecorator(input);
  568. expect(result).toEqual(expectedContent);
  569. });
  570. });
  571. describe('purgeDeepLinkImport', function () {
  572. it('should remove the IonicPage decorator but preserve others', function () {
  573. var input = "\nimport { Component } from '@angular/core';\n\nimport { IonicPage, PopoverController } from 'ionic-angular';\n\n@IonicPage()\n@Component({\n selector: 'page-about',\n templateUrl: 'about.html'\n})\nexport class AboutPage {\n conferenceDate = '2047-05-17';\n\n constructor(public popoverCtrl: PopoverController) { }\n\n presentPopover(event: Event) {\n let popover = this.popoverCtrl.create('PopoverPage');\n popover.present({ ev: event });\n }\n}\n";
  574. var expectedText = "\nimport { Component } from '@angular/core';\n\nimport { PopoverController } from 'ionic-angular';\n\n@IonicPage()\n@Component({\n selector: 'page-about',\n templateUrl: 'about.html'\n})\nexport class AboutPage {\n conferenceDate = '2047-05-17';\n\n constructor(public popoverCtrl: PopoverController) { }\n\n presentPopover(event: Event) {\n let popover = this.popoverCtrl.create('PopoverPage');\n popover.present({ ev: event });\n }\n}\n";
  575. var result = util.purgeDeepLinkImport(input);
  576. expect(result).toEqual(expectedText);
  577. });
  578. it('should remove the entire import statement', function () {
  579. var input = "\nimport { Component } from '@angular/core';\n\nimport { IonicPage } from 'ionic-angular';\n\n@IonicPage()\n@Component({\n selector: 'page-about',\n templateUrl: 'about.html'\n})\nexport class AboutPage {\n conferenceDate = '2047-05-17';\n\n constructor(public popoverCtrl: PopoverController) { }\n\n presentPopover(event: Event) {\n let popover = this.popoverCtrl.create('PopoverPage');\n popover.present({ ev: event });\n }\n}\n";
  580. var expectedText = "\nimport { Component } from '@angular/core';\n\n\n\n@IonicPage()\n@Component({\n selector: 'page-about',\n templateUrl: 'about.html'\n})\nexport class AboutPage {\n conferenceDate = '2047-05-17';\n\n constructor(public popoverCtrl: PopoverController) { }\n\n presentPopover(event: Event) {\n let popover = this.popoverCtrl.create('PopoverPage');\n popover.present({ ev: event });\n }\n}\n";
  581. var result = util.purgeDeepLinkImport(input);
  582. expect(result).toEqual(expectedText);
  583. });
  584. });
  585. describe('purgeDeepLinkDecoratorTSTransform', function () {
  586. it('should do something', function () {
  587. var input = "\nimport { Component } from '@angular/core';\n\nimport { IonicPage } from 'ionic-angular';\n\n@IonicPage()\n@Component({\n selector: 'page-about',\n templateUrl: 'about.html'\n})\nexport class AboutPage {\n conferenceDate = '2047-05-17';\n\n constructor(public popoverCtrl: PopoverController) { }\n\n presentPopover(event: Event) {\n let popover = this.popoverCtrl.create('PopoverPage');\n popover.present({ ev: event });\n }\n}\n";
  588. var expected = "import { Component } from \"@angular/core\";\nimport { } from \"ionic-angular\";\n@Component({\n selector: \"page-about\",\n templateUrl: \"about.html\"\n})\nexport class AboutPage {\n conferenceDate = \"2047-05-17\";\n constructor(public popoverCtrl: PopoverController) { }\n presentPopover(event: Event) {\n let popover = this.popoverCtrl.create(\"PopoverPage\");\n popover.present({ ev: event });\n }\n}\n";
  589. var result = transformSourceFile(input, [util.purgeDeepLinkDecoratorTSTransformImpl]);
  590. expect(result).toEqual(expected);
  591. });
  592. });
  593. });
  594. function transformSourceFile(sourceText, transformers) {
  595. var transformed = ts.transform(ts.createSourceFile('source.ts', sourceText, ts.ScriptTarget.ES2015), transformers);
  596. var printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }, {
  597. onEmitNode: transformed.emitNodeWithNotification,
  598. substituteNode: transformed.substituteNode
  599. });
  600. var result = printer.printBundle(ts.createBundle(transformed.transformed));
  601. transformed.dispose();
  602. return result;
  603. }
  604. exports.transformSourceFile = transformSourceFile;