Skip to content

Commit

Permalink
Remove the fancy preload logic in index.js
Browse files Browse the repository at this point in the history
This is causing some friction for webpack users, and doesn't seem to  be
worth the trouble from a performance point of view in npm/cli.

Ditch it.

Fix #306
  • Loading branch information
isaacs committed Jan 31, 2020
1 parent 70d9fb3 commit 70593f7
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 126 deletions.
7 changes: 3 additions & 4 deletions README.md
Expand Up @@ -25,13 +25,12 @@ semver.valid(semver.coerce('v2')) // '2.0.0'
semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
```

This module uses getters to lazily load only the parts of the package that
are used. To use it with Webpack and other projects that need string
literals as the argument to `require()`, load it this way:
You can also just load the module for the function that you care about, if
you'd like to minimize your footprint.
```js
// load the whole API at once in a single object
const semver = require('semver/preload')
const semver = require('semver')
// or just load the bits you need
// all of them listed here, just pick and choose what you want
Expand Down
108 changes: 45 additions & 63 deletions index.js
@@ -1,64 +1,46 @@
const lrCache = {}
const lazyRequire = (path, subkey) => {
const module = lrCache[path] || (lrCache[path] = require(path))
return subkey ? module[subkey] : module
// just pre-load all the stuff that index.js lazily exports
const internalRe = require('./internal/re')
module.exports = {
re: internalRe.re,
src: internalRe.src,
tokens: internalRe.t,
SEMVER_SPEC_VERSION: require('./internal/constants').SEMVER_SPEC_VERSION,
SemVer: require('./classes/semver'),
compareIdentifiers: require('./internal/identifiers').compareIdentifiers,
rcompareIdentifiers: require('./internal/identifiers').rcompareIdentifiers,
parse: require('./functions/parse'),
valid: require('./functions/valid'),
clean: require('./functions/clean'),
inc: require('./functions/inc'),
diff: require('./functions/diff'),
major: require('./functions/major'),
minor: require('./functions/minor'),
patch: require('./functions/patch'),
prerelease: require('./functions/prerelease'),
compare: require('./functions/compare'),
rcompare: require('./functions/rcompare'),
compareLoose: require('./functions/compare-loose'),
compareBuild: require('./functions/compare-build'),
sort: require('./functions/sort'),
rsort: require('./functions/rsort'),
gt: require('./functions/gt'),
lt: require('./functions/lt'),
eq: require('./functions/eq'),
neq: require('./functions/neq'),
gte: require('./functions/gte'),
lte: require('./functions/lte'),
cmp: require('./functions/cmp'),
coerce: require('./functions/coerce'),
Comparator: require('./classes/comparator'),
Range: require('./classes/range'),
satisfies: require('./functions/satisfies'),
toComparators: require('./ranges/to-comparators'),
maxSatisfying: require('./ranges/max-satisfying'),
minSatisfying: require('./ranges/min-satisfying'),
minVersion: require('./ranges/min-version'),
validRange: require('./ranges/valid'),
outside: require('./ranges/outside'),
gtr: require('./ranges/gtr'),
ltr: require('./ranges/ltr'),
intersects: require('./ranges/intersects'),
}

const lazyExport = (key, path, subkey) => {
Object.defineProperty(exports, key, {
get: () => {
const res = lazyRequire(path, subkey)
Object.defineProperty(exports, key, {
value: res,
enumerable: true,
configurable: true
})
return res
},
configurable: true,
enumerable: true
})
}

lazyExport('re', './internal/re', 're')
lazyExport('src', './internal/re', 'src')
lazyExport('tokens', './internal/re', 't')
lazyExport('SEMVER_SPEC_VERSION', './internal/constants', 'SEMVER_SPEC_VERSION')
lazyExport('SemVer', './classes/semver')
lazyExport('compareIdentifiers', './internal/identifiers', 'compareIdentifiers')
lazyExport('rcompareIdentifiers', './internal/identifiers', 'rcompareIdentifiers')
lazyExport('parse', './functions/parse')
lazyExport('valid', './functions/valid')
lazyExport('clean', './functions/clean')
lazyExport('inc', './functions/inc')
lazyExport('diff', './functions/diff')
lazyExport('major', './functions/major')
lazyExport('minor', './functions/minor')
lazyExport('patch', './functions/patch')
lazyExport('prerelease', './functions/prerelease')
lazyExport('compare', './functions/compare')
lazyExport('rcompare', './functions/rcompare')
lazyExport('compareLoose', './functions/compare-loose')
lazyExport('compareBuild', './functions/compare-build')
lazyExport('sort', './functions/sort')
lazyExport('rsort', './functions/rsort')
lazyExport('gt', './functions/gt')
lazyExport('lt', './functions/lt')
lazyExport('eq', './functions/eq')
lazyExport('neq', './functions/neq')
lazyExport('gte', './functions/gte')
lazyExport('lte', './functions/lte')
lazyExport('cmp', './functions/cmp')
lazyExport('coerce', './functions/coerce')
lazyExport('Comparator', './classes/comparator')
lazyExport('Range', './classes/range')
lazyExport('satisfies', './functions/satisfies')
lazyExport('toComparators', './ranges/to-comparators')
lazyExport('maxSatisfying', './ranges/max-satisfying')
lazyExport('minSatisfying', './ranges/min-satisfying')
lazyExport('minVersion', './ranges/min-version')
lazyExport('validRange', './ranges/valid')
lazyExport('outside', './ranges/outside')
lazyExport('gtr', './ranges/gtr')
lazyExport('ltr', './ranges/ltr')
lazyExport('intersects', './ranges/intersects')
48 changes: 2 additions & 46 deletions preload.js
@@ -1,46 +1,2 @@
// just pre-load all the stuff that index.js lazily exports
const internalRe = require('./internal/re')
module.exports = {
re: internalRe.re,
src: internalRe.src,
tokens: internalRe.t,
SEMVER_SPEC_VERSION: require('./internal/constants').SEMVER_SPEC_VERSION,
SemVer: require('./classes/semver'),
compareIdentifiers: require('./internal/identifiers').compareIdentifiers,
rcompareIdentifiers: require('./internal/identifiers').rcompareIdentifiers,
parse: require('./functions/parse'),
valid: require('./functions/valid'),
clean: require('./functions/clean'),
inc: require('./functions/inc'),
diff: require('./functions/diff'),
major: require('./functions/major'),
minor: require('./functions/minor'),
patch: require('./functions/patch'),
prerelease: require('./functions/prerelease'),
compare: require('./functions/compare'),
rcompare: require('./functions/rcompare'),
compareLoose: require('./functions/compare-loose'),
compareBuild: require('./functions/compare-build'),
sort: require('./functions/sort'),
rsort: require('./functions/rsort'),
gt: require('./functions/gt'),
lt: require('./functions/lt'),
eq: require('./functions/eq'),
neq: require('./functions/neq'),
gte: require('./functions/gte'),
lte: require('./functions/lte'),
cmp: require('./functions/cmp'),
coerce: require('./functions/coerce'),
Comparator: require('./classes/comparator'),
Range: require('./classes/range'),
satisfies: require('./functions/satisfies'),
toComparators: require('./ranges/to-comparators'),
maxSatisfying: require('./ranges/max-satisfying'),
minSatisfying: require('./ranges/min-satisfying'),
minVersion: require('./ranges/min-version'),
validRange: require('./ranges/valid'),
outside: require('./ranges/outside'),
gtr: require('./ranges/gtr'),
ltr: require('./ranges/ltr'),
intersects: require('./ranges/intersects'),
}
// XXX remove in v8 or beyond
module.exports = require('./index.js')
14 changes: 2 additions & 12 deletions test/index.js
@@ -1,21 +1,11 @@
const t = require('tap')
const semver = require('../')

t.match(Object.getOwnPropertyDescriptor(semver, 'SEMVER_SPEC_VERSION'), {
get: Function,
set: undefined,
enumerable: true,
configurable: true
}, 'properties are getters')

const {SEMVER_SPEC_VERSION} = require('../internal/constants')
t.match(semver.SEMVER_SPEC_VERSION, SEMVER_SPEC_VERSION, 'getter returns expected value')

t.match(Object.getOwnPropertyDescriptor(semver, 'SEMVER_SPEC_VERSION'), {
get: undefined,
set: undefined,
value: SEMVER_SPEC_VERSION,
configurable: true,
enumerable: true
}, 'replaced with value prop after initial get')

t.match(semver.parse, require('../functions/parse'), 'getter that does not have a subkey')
}, 'just a normal value property')
2 changes: 1 addition & 1 deletion test/preload.js
@@ -1,4 +1,4 @@
const t = require('tap')
const preload = require('../preload.js')
const index = require('../index.js')
t.strictSame(preload, index, 'preload and index match')
t.equal(preload, index, 'preload and index match')

0 comments on commit 70593f7

Please sign in to comment.