diff --git a/__tests__/server/utils/watchLocalModules.spec.js b/__tests__/server/utils/watchLocalModules.spec.js index bcb3fe037..50c8ddf55 100644 --- a/__tests__/server/utils/watchLocalModules.spec.js +++ b/__tests__/server/utils/watchLocalModules.spec.js @@ -23,8 +23,12 @@ import { getModules, resetModuleRegistry, } from 'holocron/moduleRegistry'; +import { address } from 'ip'; import watchLocalModules from '../../../src/server/utils/watchLocalModules'; +const ip = address(); + + jest.mock('chokidar', () => { const listeners = {}; const watcher = () => null; @@ -64,6 +68,13 @@ jest.mock('fs', () => { describe('watchLocalModules', () => { beforeEach(() => jest.clearAllMocks()); + let origOneAppDevCDNPort; + beforeAll(() => { + origOneAppDevCDNPort = process.env.HTTP_ONE_APP_DEV_CDN_PORT; + }); + afterAll(() => { + process.env.HTTP_ONE_APP_DEV_CDN_PORT = origOneAppDevCDNPort; + }); it('should watch the modules directory', () => { watchLocalModules(); @@ -129,4 +140,67 @@ describe('watchLocalModules', () => { await changeListener(changedPath); expect(loadModule).not.toHaveBeenCalled(); }); + + it('should replace [one-app-dev-cdn-url] with correct ip and port', async () => { + const moduleName = 'some-module'; + const moduleVersion = '1.0.1'; + process.env.HTTP_ONE_APP_DEV_CDN_PORT = 3002; + const moduleMapSample = { + key: '123', + modules: { + [moduleName]: { + node: { + integrity: '133', + url: `[one-app-dev-cdn-url]/cdn/${moduleName}/${moduleVersion}/${moduleName}-node.js`, + }, + browser: { + integrity: '234', + url: `[one-app-dev-cdn-url]/cdn/${moduleName}/${moduleVersion}/${moduleName}-browser.js`, + }, + legacyBrowser: { + integrity: '134633', + url: `[one-app-dev-cdn-url]/cdn/${moduleName}/${moduleVersion}/${moduleName}-legacy.browser.js`, + }, + }, + }, + }; + const oneAppDevCdnAddress = `http://${ip}:${process.env.HTTP_ONE_APP_DEV_CDN_PORT || 3001}`; + const updatedModuleMapSample = { + key: '123', + modules: { + [moduleName]: { + node: { + integrity: '133', + url: `${oneAppDevCdnAddress}/cdn/${moduleName}/${moduleVersion}/${moduleName}-node.js`, + }, + browser: { + integrity: '234', + url: `${oneAppDevCdnAddress}/cdn/${moduleName}/${moduleVersion}/${moduleName}-browser.js`, + }, + legacyBrowser: { + integrity: '134633', + url: `${oneAppDevCdnAddress}/cdn/${moduleName}/${moduleVersion}/${moduleName}-legacy.browser.js`, + }, + }, + }, + }; + fs.readFileSync.mockImplementationOnce(() => JSON.stringify(moduleMapSample)); + const modulePath = path.resolve(__dirname, `../../../static/modules/${moduleName}/${moduleVersion}/${moduleName}.node.js`); + const originalModule = () => null; + const updatedModule = () => null; + const modules = fromJS({ [moduleName]: originalModule }); + const moduleMap = fromJS(moduleMapSample); + resetModuleRegistry(modules, moduleMap); + watchLocalModules(); + const changeListener = chokidar.getListeners().change; + expect(getModules().get(moduleName)).toBe(originalModule); + loadModule.mockReturnValueOnce(Promise.resolve(updatedModule)); + await changeListener(modulePath); + expect(loadModule).toHaveBeenCalledWith( + moduleName, + updatedModuleMapSample.modules[moduleName], + require('../../../src/server/utils/onModuleLoad').default + ); + expect(getModules().get(moduleName)).toBe(updatedModule); + }); }); diff --git a/src/server/utils/watchLocalModules.js b/src/server/utils/watchLocalModules.js index e59126f9c..6b8eb1a0d 100644 --- a/src/server/utils/watchLocalModules.js +++ b/src/server/utils/watchLocalModules.js @@ -26,8 +26,11 @@ import { getModuleMap, resetModuleRegistry, } from 'holocron/moduleRegistry'; +import { address } from 'ip'; import onModuleLoad from './onModuleLoad'; +const ip = address(); + export default function watchLocalModules() { const staticsDirectoryPath = path.resolve(__dirname, '../../../static'); const moduleDirectory = path.resolve(staticsDirectoryPath, 'modules'); @@ -44,9 +47,16 @@ export default function watchLocalModules() { const moduleMap = JSON.parse(fs.readFileSync(moduleMapPath, 'utf8')); + const moduleData = moduleMap.modules[moduleNameChangeDetectedIn]; + const oneAppDevCdnAddress = `http://${ip}:${process.env.HTTP_ONE_APP_DEV_CDN_PORT || 3001}`; + + moduleData.browser.url = moduleData.browser.url.replace('[one-app-dev-cdn-url]', oneAppDevCdnAddress); + moduleData.legacyBrowser.url = moduleData.legacyBrowser.url.replace('[one-app-dev-cdn-url]', oneAppDevCdnAddress); + moduleData.node.url = moduleData.node.url.replace('[one-app-dev-cdn-url]', oneAppDevCdnAddress); + const module = await loadModule( moduleNameChangeDetectedIn, - moduleMap.modules[moduleNameChangeDetectedIn], + moduleData, onModuleLoad );