From 2694d826054fddca032c7986634471fa696a9a0f Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 18 Sep 2022 14:03:57 -0700 Subject: [PATCH 1/8] use default export for esmockModule.js --- src/esmock.js | 15 +++++---------- src/esmockModule.js | 39 ++++++++++++++++++--------------------- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/src/esmock.js b/src/esmock.js index a1b50d0a..0a7100b2 100644 --- a/src/esmock.js +++ b/src/esmock.js @@ -1,13 +1,8 @@ import esmockIsLoader from './esmockIsLoader.js' +import esmockModule from './esmockModule.js' import esmockCache from './esmockCache.js' import esmockArgs from './esmockArgs.js' -import { - esmockModuleMock, - esmockModuleImportedPurge, - esmockModuleImportedSanitize -} from './esmockModule.js' - const esmock = async (...args) => { const [modulePath, mockDefs, globalDefs, opt = {}, err] = esmockArgs(args) const calleePath = (opt.parent || (err || new Error).stack.split('\n')[2]) @@ -19,15 +14,15 @@ const esmock = async (...args) => { if (!esmockIsLoader()) throw new Error('process must be started with --loader=esmock') - const modulePathKey = await esmockModuleMock( + const modulePathKey = await esmockModule( calleePath, modulePath, mockDefs || {}, globalDefs || {}, opt) const importedModule = await import(modulePathKey) if (opt.purge !== false) - esmockModuleImportedPurge(modulePathKey) + esmockModule.purge(modulePathKey) - return esmockModuleImportedSanitize(importedModule, modulePathKey) + return esmockModule.sanitize(importedModule, modulePathKey) } esmock.p = async (...args) => esmock( ...esmockArgs(args, { purge: false }, new Error)) @@ -42,7 +37,7 @@ Object.assign(esmock, { strict }) esmock.purge = mockModule => { if (mockModule && /object|function/.test(typeof mockModule) && 'esmockKey' in mockModule) - esmockModuleImportedPurge(mockModule.esmockKey) + esmockModule.purge(mockModule.esmockKey) } esmock.esmockCache = esmockCache diff --git a/src/esmockModule.js b/src/esmockModule.js index e5331ee3..22c295db 100644 --- a/src/esmockModule.js +++ b/src/esmockModule.js @@ -108,37 +108,35 @@ const esmockModuleCreate = async (esmockKey, key, fileURL, defMock, opt) => { return mockModuleKey } -// eslint-disable-next-line max-len -const esmockModulesCreate = async (parent, moduleFileURL, esmockKey, defs, keys, mocks, opt) => { - keys = keys || Object.keys(defs) +const esmockModuleId = async (parent, key, defs, ids, mocks, opt) => { + ids = ids || Object.ids(defs) mocks = mocks || [] - if (!keys.length) + if (!ids.length) return mocks - let mockedPathFull = resolvewith(keys[0], parent) + let mockedPathFull = resolvewith(ids[0], parent) if (!mockedPathFull && opt.isModuleNotFoundError === false) { - mockedPathFull = 'file:///' + keys[0] + mockedPathFull = 'file:///' + ids[0] opt = Object.assign({ isfound: false }, opt) } - if (!mockedPathFull) - throw esmockModuleIdNotFoundError(keys[0], parent) + if (mockedPathFull === null) + throw esmockModuleIdNotFoundError(ids[0], parent) mocks.push(await esmockModuleCreate( - esmockKey, keys[0], mockedPathFull, defs[keys[0]], opt)) + key, ids[0], mockedPathFull, defs[ids[0]], opt)) - return esmockModulesCreate( - parent, moduleFileURL, esmockKey, defs, keys.slice(1), mocks, opt) + return esmockModuleId(parent, key, defs, ids.slice(1), mocks, opt) } -const esmockModuleMock = async (parent, moduleId, defs, gdefs, opt) => { +const esmockModule = async (parent, moduleId, defs, gdefs, opt) => { const moduleFileURL = resolvewith(moduleId, parent) const esmockKey = typeof opt.key === 'number' ? opt.key : esmockNextKey() - const esmockModuleKeys = await esmockModulesCreate( - parent, moduleFileURL, esmockKey, defs, Object.keys(defs), 0, opt) - const esmockGlobalKeys = await esmockModulesCreate( - parent, moduleFileURL, esmockKey, gdefs, Object.keys(gdefs), 0, opt) + const esmockModuleKeys = await esmockModuleId( + parent, esmockKey, defs, Object.keys(defs), 0, opt) + const esmockGlobalKeys = await esmockModuleId( + parent, esmockKey, gdefs, Object.keys(gdefs), 0, opt) if (moduleFileURL === null) throw esmockModuleIdNotFoundError(moduleId, parent) @@ -154,8 +152,7 @@ const esmockModuleMock = async (parent, moduleId, defs, gdefs, opt) => { return moduleFileURL + `?esmk=${esmockKey}` } -export { - esmockModuleMock, - esmockModuleImportedPurge, - esmockModuleImportedSanitize -} +export default Object.assign(esmockModule, { + purge: esmockModuleImportedPurge, + sanitize: esmockModuleImportedSanitize +}) From f51ac8e326d8d1a01b4cce7950b58d01623a9ae9 Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 18 Sep 2022 14:05:19 -0700 Subject: [PATCH 2/8] fix type --- src/esmockModule.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/esmockModule.js b/src/esmockModule.js index 22c295db..ad947fdc 100644 --- a/src/esmockModule.js +++ b/src/esmockModule.js @@ -109,7 +109,7 @@ const esmockModuleCreate = async (esmockKey, key, fileURL, defMock, opt) => { } const esmockModuleId = async (parent, key, defs, ids, mocks, opt) => { - ids = ids || Object.ids(defs) + ids = ids || Object.keys(defs) mocks = mocks || [] if (!ids.length) From 415ea490a766ea2a6af456140f37628886a88e5c Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 18 Sep 2022 14:10:52 -0700 Subject: [PATCH 3/8] define id = ids[0] --- src/esmockModule.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/esmockModule.js b/src/esmockModule.js index ad947fdc..ce767fad 100644 --- a/src/esmockModule.js +++ b/src/esmockModule.js @@ -108,24 +108,24 @@ const esmockModuleCreate = async (esmockKey, key, fileURL, defMock, opt) => { return mockModuleKey } -const esmockModuleId = async (parent, key, defs, ids, mocks, opt) => { +const esmockModuleId = async (parent, key, defs, ids, mocks, opt, id) => { ids = ids || Object.keys(defs) + id = ids[0] // eslint-disable-line prefer-destructuring mocks = mocks || [] if (!ids.length) return mocks - let mockedPathFull = resolvewith(ids[0], parent) + let mockedPathFull = resolvewith(id, parent) if (!mockedPathFull && opt.isModuleNotFoundError === false) { - mockedPathFull = 'file:///' + ids[0] + mockedPathFull = 'file:///' + id opt = Object.assign({ isfound: false }, opt) } if (mockedPathFull === null) - throw esmockModuleIdNotFoundError(ids[0], parent) + throw esmockModuleIdNotFoundError(id, parent) - mocks.push(await esmockModuleCreate( - key, ids[0], mockedPathFull, defs[ids[0]], opt)) + mocks.push(await esmockModuleCreate(key, id, mockedPathFull, defs[id], opt)) return esmockModuleId(parent, key, defs, ids.slice(1), mocks, opt) } From 7517ba442e611a297dc4fb83e700a69405da1d4a Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 18 Sep 2022 14:13:01 -0700 Subject: [PATCH 4/8] use string concat rather than template string --- src/esmockModule.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/esmockModule.js b/src/esmockModule.js index ce767fad..f075d921 100644 --- a/src/esmockModule.js +++ b/src/esmockModule.js @@ -95,7 +95,7 @@ const esmockModuleCreate = async (esmockKey, key, fileURL, defMock, opt) => { const defLive = opt.strict || opt.isfound === false || await import(fileURL) const def = esmockModuleApply(defLive, defMock, fileURL) const mockExportNames = Object.keys(def).sort().join() - const mockModuleKey = `${fileURL}?` + [ + const mockModuleKey = fileURL + '?' + [ 'esmockKey=' + esmockKey, 'esmockModuleKey=' + key, 'isesm=' + isesm, From 9270e2a701dc2e2144543d927a4610c611d55193 Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 18 Sep 2022 14:16:45 -0700 Subject: [PATCH 5/8] use smaller falsy check rather than strict equality check for detecting null path --- src/esmockModule.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/esmockModule.js b/src/esmockModule.js index f075d921..08988a07 100644 --- a/src/esmockModule.js +++ b/src/esmockModule.js @@ -113,8 +113,7 @@ const esmockModuleId = async (parent, key, defs, ids, mocks, opt, id) => { id = ids[0] // eslint-disable-line prefer-destructuring mocks = mocks || [] - if (!ids.length) - return mocks + if (!id) return mocks let mockedPathFull = resolvewith(id, parent) if (!mockedPathFull && opt.isModuleNotFoundError === false) { @@ -122,7 +121,7 @@ const esmockModuleId = async (parent, key, defs, ids, mocks, opt, id) => { opt = Object.assign({ isfound: false }, opt) } - if (mockedPathFull === null) + if (!mockedPathFull) throw esmockModuleIdNotFoundError(id, parent) mocks.push(await esmockModuleCreate(key, id, mockedPathFull, defs[id], opt)) @@ -138,7 +137,7 @@ const esmockModule = async (parent, moduleId, defs, gdefs, opt) => { const esmockGlobalKeys = await esmockModuleId( parent, esmockKey, gdefs, Object.keys(gdefs), 0, opt) - if (moduleFileURL === null) + if (!moduleFileURL) throw esmockModuleIdNotFoundError(moduleId, parent) const esmockKeyLong = moduleFileURL + '?' + From cc36aeefde641c57936584bb2c518369b020441a Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 18 Sep 2022 14:29:53 -0700 Subject: [PATCH 6/8] auto-detect not-found module --- src/esmockModule.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/esmockModule.js b/src/esmockModule.js index 08988a07..006cc019 100644 --- a/src/esmockModule.js +++ b/src/esmockModule.js @@ -92,14 +92,14 @@ const esmockNextKey = ((key = 0) => () => ++key)() const esmockModuleCreate = async (esmockKey, key, fileURL, defMock, opt) => { const isesm = esmockModuleIsESM(fileURL) - const defLive = opt.strict || opt.isfound === false || await import(fileURL) + const defLive = opt.strict || !fileURL || await import(fileURL) const def = esmockModuleApply(defLive, defMock, fileURL) const mockExportNames = Object.keys(def).sort().join() - const mockModuleKey = fileURL + '?' + [ + const mockModuleKey = (fileURL || 'file:///' + key) + '?' + [ 'esmockKey=' + esmockKey, 'esmockModuleKey=' + key, 'isesm=' + isesm, - opt.isfound === false ? 'notfound=' + key : 'found', + fileURL ? 'found' : 'notfound=' + key, mockExportNames ? 'exportNames=' + mockExportNames : 'exportNone' ].join('&') @@ -116,12 +116,7 @@ const esmockModuleId = async (parent, key, defs, ids, mocks, opt, id) => { if (!id) return mocks let mockedPathFull = resolvewith(id, parent) - if (!mockedPathFull && opt.isModuleNotFoundError === false) { - mockedPathFull = 'file:///' + id - opt = Object.assign({ isfound: false }, opt) - } - - if (!mockedPathFull) + if (!mockedPathFull && opt.isModuleNotFoundError !== false) throw esmockModuleIdNotFoundError(id, parent) mocks.push(await esmockModuleCreate(key, id, mockedPathFull, defs[id], opt)) From 8efa2dbc0c835f86aab556501279d709d0c42097 Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 18 Sep 2022 14:39:56 -0700 Subject: [PATCH 7/8] make error-throwing function smaller --- src/esmockModule.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/esmockModule.js b/src/esmockModule.js index 006cc019..d7a88b04 100644 --- a/src/esmockModule.js +++ b/src/esmockModule.js @@ -14,11 +14,9 @@ const isDefaultDefined = o => isObj(o) && 'default' in o const isDirPathRe = /^\.?\.?([a-zA-Z]:)?(\/|\\)/ const esmockModuleIdNotFoundError = (moduleId, parent) => new Error( - `invalid moduleId: "${moduleId}" (used by :moduleParent)` - .replace(/:moduleParent/, parent - .replace(/^\/\//, '') - .replace(process.cwd(), '.') - .replace(process.env.HOME, '~'))) + `invalid moduleId: "${moduleId}" (used by ${parent})` + .replace(process.cwd(), '.') + .replace(process.env.HOME, '~')) const esmockModuleMergeDefault = (defaultLive, defaultMock) => ( (isObj(defaultLive) && isObj(defaultMock)) From 2a35d0e692c57a282cc9a21e5f81e45c374c4caa Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 19 Sep 2022 08:29:06 -0700 Subject: [PATCH 8/8] change let to const --- src/esmockModule.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/esmockModule.js b/src/esmockModule.js index d7a88b04..13df194b 100644 --- a/src/esmockModule.js +++ b/src/esmockModule.js @@ -113,7 +113,7 @@ const esmockModuleId = async (parent, key, defs, ids, mocks, opt, id) => { if (!id) return mocks - let mockedPathFull = resolvewith(id, parent) + const mockedPathFull = resolvewith(id, parent) if (!mockedPathFull && opt.isModuleNotFoundError !== false) throw esmockModuleIdNotFoundError(id, parent)