From bf8ab2dc9c2f75d7f67f25e9ffb6880598a1012b Mon Sep 17 00:00:00 2001 From: sis0k0 Date: Mon, 17 Dec 2018 17:37:29 +0200 Subject: [PATCH 1/3] refactor: export safeGet from projectHelpers --- projectHelpers.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/projectHelpers.js b/projectHelpers.js index 0f61b76c..ed1ffbf4 100644 --- a/projectHelpers.js +++ b/projectHelpers.js @@ -110,5 +110,6 @@ module.exports = { isTypeScript, writePackageJson, convertSlashesInPath, - getIndentationCharacter + getIndentationCharacter, + safeGet, }; \ No newline at end of file From 8623875b0b6af535026ff96ece34588fe195047b Mon Sep 17 00:00:00 2001 From: sis0k0 Date: Mon, 17 Dec 2018 17:43:27 +0200 Subject: [PATCH 2/3] test: add unit tests for safeGet --- projectHelpers.spec.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/projectHelpers.spec.js b/projectHelpers.spec.js index c8a83b88..36425925 100644 --- a/projectHelpers.spec.js +++ b/projectHelpers.spec.js @@ -1,4 +1,4 @@ -const { getIndentationCharacter, writePackageJson } = require("./projectHelpers"); +const { getIndentationCharacter, writePackageJson, safeGet } = require("./projectHelpers"); const fs = require("fs"); describe('projectHelpers', () => { @@ -57,6 +57,28 @@ describe('projectHelpers', () => { }); }); + describe('safeGet', () => { + it('should return the correct value of existing properties', () => { + const obj = { a: 15 }; + expect(safeGet(obj, 'a')).toBe(15); + }); + + it('should return undefined for unexisting properties', () => { + const obj = { a: 15 }; + expect(safeGet(obj, 'random')).toBeUndefined(); + }); + + it('should return undefined when the first argument is undefined', () => { + let obj; + expect(safeGet(obj, 'random')).toBeUndefined(); + }); + + it('should return undefined when the first argument is not an object and does not have inherited property with the queried name', () => { + const num = 15; + expect(safeGet(num, 'random')).toBeUndefined(); + }); + }); + describe('writePackageJson', () => { const mockFileSystemApi = () => { const data = { From 95ec9ff0664346afb0d0d5fb92a27f86b751b9a1 Mon Sep 17 00:00:00 2001 From: sis0k0 Date: Mon, 17 Dec 2018 17:43:37 +0200 Subject: [PATCH 3/3] fix(Angular): add hot loader for lazy loaded NgModules --- lazy-ngmodule-hot-loader.js | 17 +++++++++++++++++ templates/webpack.angular.js | 1 + 2 files changed, 18 insertions(+) create mode 100644 lazy-ngmodule-hot-loader.js diff --git a/lazy-ngmodule-hot-loader.js b/lazy-ngmodule-hot-loader.js new file mode 100644 index 00000000..1f168c6a --- /dev/null +++ b/lazy-ngmodule-hot-loader.js @@ -0,0 +1,17 @@ +const { safeGet } = require("./projectHelpers"); + +const LAZY_RESOURCE_CONTEXT = "$$_lazy_route_resource"; +const HOT_SELF_ACCEPT = "module.hot && module.hot.accept()"; + +const isLazyLoadedNgModule = resource => { + const issuer = safeGet(resource, "issuer"); + const issuerContext = safeGet(issuer, "context"); + + return issuerContext && issuerContext.endsWith(LAZY_RESOURCE_CONTEXT); +}; + +module.exports = function (source) { + return isLazyLoadedNgModule(this._module) ? + `${source};${HOT_SELF_ACCEPT}`: + source; +}; diff --git a/templates/webpack.angular.js b/templates/webpack.angular.js index 0bd787b3..60b51071 100644 --- a/templates/webpack.angular.js +++ b/templates/webpack.angular.js @@ -192,6 +192,7 @@ module.exports = env => { test: /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/, use: [ "nativescript-dev-webpack/moduleid-compat-loader", + "nativescript-dev-webpack/lazy-ngmodule-hot-loader", "@ngtools/webpack", ] },