From 391a390d2c27d4343763d9a5e109b9056302ce3d Mon Sep 17 00:00:00 2001 From: Nick Oliver Date: Wed, 27 Mar 2024 14:27:12 -0700 Subject: [PATCH] perf(one-app-server-bundler): serve-module read and write the module map once (#623) O(1) rather than O(n) --- .../__tests__/bin/serve-module.spec.js | 8 ++- .../bin/serve-module.js | 56 ++++++++++--------- 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/packages/one-app-server-bundler/__tests__/bin/serve-module.spec.js b/packages/one-app-server-bundler/__tests__/bin/serve-module.spec.js index cc37e5f1..a2e44c8d 100644 --- a/packages/one-app-server-bundler/__tests__/bin/serve-module.spec.js +++ b/packages/one-app-server-bundler/__tests__/bin/serve-module.spec.js @@ -23,7 +23,7 @@ const setup = (modulePath) => { jest.resetModules(); jest.clearAllMocks(); jest.doMock('node:util', () => ({ - parseArgs: jest.fn(() => ({ positionals: [modulePath] })), + parseArgs: jest.fn(() => ({ positionals: modulePath ? [modulePath] : [] })), })); fs = require('node:fs'); @@ -45,6 +45,12 @@ describe('serve-module', () => { setPlatform(originalPlatform); }); + it('should throw if no module path is provided', () => { + setup(); + fs._.setFiles({}); + expect(() => require('../../bin/serve-module')).toThrowErrorMatchingInlineSnapshot('"serve-module(s) requires at least one module path for one-app to serve"'); + }); + it('should throw if the module doesn\'t have a version', () => { fs._.setFiles({ '../my-module-name/package.json': JSON.stringify({ name: 'my-module-name' }), diff --git a/packages/one-app-server-bundler/bin/serve-module.js b/packages/one-app-server-bundler/bin/serve-module.js index 13152af2..c880a1a3 100755 --- a/packages/one-app-server-bundler/bin/serve-module.js +++ b/packages/one-app-server-bundler/bin/serve-module.js @@ -22,7 +22,21 @@ const symModulesPath = path.join(publicPath, 'modules'); fs.mkdirSync(symModulesPath, { recursive: true }); -util.parseArgs({ allowPositionals: true }).positionals.forEach((modulePath) => { +const modulePaths = util.parseArgs({ allowPositionals: true }).positionals; + +if (modulePaths.length === 0) { + throw new Error('serve-module(s) requires at least one module path for one-app to serve'); +} + +const moduleMapPath = path.join(publicPath, 'module-map.json'); +let moduleMap; +try { + moduleMap = JSON.parse(fs.readFileSync(moduleMapPath)); +} catch (e) { + moduleMap = { key: 'not-used-in-development', modules: {} }; +} + +modulePaths.forEach((modulePath) => { const pkg = JSON.parse(fs.readFileSync(path.join(modulePath, 'package.json'))); const absoluteModulePath = modulePath.startsWith('/') ? modulePath : path.join(process.cwd(), modulePath); @@ -58,28 +72,20 @@ util.parseArgs({ allowPositionals: true }).positionals.forEach((modulePath) => { fs.symlinkSync(sourceBundlePath, symBundlePath, type); } - const moduleMapPath = path.join(publicPath, 'module-map.json'); - try { - fs.accessSync(moduleMapPath); - } catch (e) { - fs.writeFileSync(moduleMapPath, JSON.stringify({ key: 'not-used-in-development', modules: {} }, null, 2)); - } finally { - const moduleMap = JSON.parse(fs.readFileSync(moduleMapPath)); - moduleMap.modules[moduleName] = { - browser: { - integrity: browserSri, - url: `[one-app-dev-cdn-url]/static/modules/${moduleName}/${version}/${moduleName}.browser.js`, - }, - node: { - integrity: nodeSri, - url: `[one-app-dev-cdn-url]/static/modules/${moduleName}/${version}/${moduleName}.node.js`, - }, - legacyBrowser: { - integrity: legacyBrowserSri || `[No legacy bundle generated for ${moduleName}. This will 404.]`, - url: `[one-app-dev-cdn-url]/static/modules/${moduleName}/${version}/${moduleName}.legacy.browser.js`, - }, - }; - - fs.writeFileSync(moduleMapPath, JSON.stringify(moduleMap, null, 2)); - } + moduleMap.modules[moduleName] = { + browser: { + integrity: browserSri, + url: `[one-app-dev-cdn-url]/static/modules/${moduleName}/${version}/${moduleName}.browser.js`, + }, + node: { + integrity: nodeSri, + url: `[one-app-dev-cdn-url]/static/modules/${moduleName}/${version}/${moduleName}.node.js`, + }, + legacyBrowser: { + integrity: legacyBrowserSri || `[No legacy bundle generated for ${moduleName}. This will 404.]`, + url: `[one-app-dev-cdn-url]/static/modules/${moduleName}/${version}/${moduleName}.legacy.browser.js`, + }, + }; }); + +fs.writeFileSync(moduleMapPath, JSON.stringify(moduleMap, null, 2));