Skip to content

Commit

Permalink
Merge pull request #153 from iambumblehead/make-esmock-slightly-smaller
Browse files Browse the repository at this point in the history
Make esmock slightly smaller
  • Loading branch information
iambumblehead committed Sep 19, 2022
2 parents 01cdbfe + 2a35d0e commit fddefc7
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 46 deletions.
15 changes: 5 additions & 10 deletions src/esmock.js
Original file line number Diff line number Diff line change
@@ -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])
Expand All @@ -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))
Expand All @@ -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
Expand Down
61 changes: 25 additions & 36 deletions src/esmockModule.js
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -92,14 +90,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('&')

Expand All @@ -108,39 +106,31 @@ 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, id) => {
ids = ids || Object.keys(defs)
id = ids[0] // eslint-disable-line prefer-destructuring
mocks = mocks || []

if (!keys.length)
return mocks

let mockedPathFull = resolvewith(keys[0], parent)
if (!mockedPathFull && opt.isModuleNotFoundError === false) {
mockedPathFull = 'file:///' + keys[0]
opt = Object.assign({ isfound: false }, opt)
}
if (!id) return mocks

if (!mockedPathFull)
throw esmockModuleIdNotFoundError(keys[0], parent)
const mockedPathFull = resolvewith(id, parent)
if (!mockedPathFull && opt.isModuleNotFoundError !== false)
throw esmockModuleIdNotFoundError(id, parent)

mocks.push(await esmockModuleCreate(
esmockKey, keys[0], mockedPathFull, defs[keys[0]], opt))
mocks.push(await esmockModuleCreate(key, id, mockedPathFull, defs[id], 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)
if (!moduleFileURL)
throw esmockModuleIdNotFoundError(moduleId, parent)

const esmockKeyLong = moduleFileURL + '?' +
Expand All @@ -154,8 +144,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
})

0 comments on commit fddefc7

Please sign in to comment.