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/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 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 = { 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", ] },