Skip to content

Commit

Permalink
Rollback parseCJSModuleExports to v68 (close #277, #279)
Browse files Browse the repository at this point in the history
  • Loading branch information
ije committed Mar 18, 2022
1 parent 012686c commit 9339d9e
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 57 deletions.
46 changes: 14 additions & 32 deletions packages/esm-node-services/cjs-lexer.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const fs = require('fs')
const { join, dirname } = require('path')
const { dirname } = require('path')
const { promisify } = require('util')
const { parse } = require('esm-cjs-lexer')
const enhancedResolve = require('enhanced-resolve')
Expand Down Expand Up @@ -79,7 +79,6 @@ const builtInNodeModules = new Set([
"zlib",
])
const requireModeAllowList = [
'graceful-fs',
'domhandler',
'he',
'lz-string',
Expand Down Expand Up @@ -109,32 +108,24 @@ function verifyExports(names) {
}

exports.parseCjsExports = async input => {
const { buildDir, pkgName, importPath, nodeEnv = 'production' } = input
const { buildDir, importPath, nodeEnv = 'production' } = input
const entry = await resolve(buildDir, importPath)
const exports = []

let entry
try {
entry = await resolve(buildDir, join(pkgName, importPath))
} catch (error) {
if (importPath.endsWith(".js") || importPath.endsWith(".cjs") || importPath.endsWith(".json")) {
entry = join(buildDir, "node_modules", pkgName, importPath)
} else {
throw error
}
}

/* workaround for edge cases that can't be parsed by cjsLexer correctly */
if (requireModeAllowList.includes(pkgName)) {
process.env.NODE_ENV = nodeEnv
const mod = require(entry)
if (isObject(mod) || typeof mod === 'function') {
for (const key of Object.keys(mod)) {
if (typeof key === 'string' && key !== '') {
exports.push(key)
for (const name of requireModeAllowList) {
if (importPath === name || importPath.startsWith(name + '/')) {
process.env.NODE_ENV = nodeEnv
const mod = require(entry)
if (isObject(mod) || typeof mod === 'function') {
for (const key of Object.keys(mod)) {
if (typeof key === 'string' && key !== '') {
exports.push(key)
}
}
}
return verifyExports(exports)
}
return verifyExports(exports)
}

if (entry.endsWith('.json')) {
Expand All @@ -161,16 +152,7 @@ exports.parseCjsExports = async input => {
const mod = require(reexport)
exports.push(...Object.keys(mod))
} else {
let path
try {
path = await resolve(buildDir, join(pkgName, dirname(importPath), reexport))
} catch (error) {
if (reexport.endsWith(".js") || reexport.endsWith(".cjs") || reexport.endsWith(".json")) {
path = join(dirname(req.path), reexport)
} else {
throw error
}
}
const path = await resolve(dirname(req.path), reexport)
if (path.endsWith('.json')) {
exports.push(...getJSONKeys(path))
} else {
Expand Down
2 changes: 1 addition & 1 deletion packages/esm-node-services/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "esm-node-services",
"version": "0.6.10",
"version": "0.6.11",
"description": "Node services for esm.sh",
"main": "index.js",
"scripts": {
Expand Down
20 changes: 3 additions & 17 deletions packages/esm-node-services/test.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,9 @@
const ns = require('.')

ns.parseCjsExports({ buildDir: __dirname, pkgName: "tapable", importPath: './lib/index.js' }).then(ret => {
ns.parseCjsExports({ buildDir: __dirname, importPath: '.' }).then(ret => {
const { exports } = ret
if (exports.join(',') !== [
'__esModule',
'SyncHook',
'SyncBailHook',
'SyncWaterfallHook',
'SyncLoopHook',
'AsyncParallelHook',
'AsyncParallelBailHook',
'AsyncSeriesHook',
'AsyncSeriesBailHook',
'AsyncSeriesLoopHook',
'AsyncSeriesWaterfallHook',
'HookMap',
'MultiHook',
].join(',')) {
console.error('unexpected exports:', exports)
if (exports.join(',') !== 'parseCjsExports') {
console.error('unexpected exports of index.js:', exports)
process.exit(1)
}
console.log('Done')
Expand Down
6 changes: 1 addition & 5 deletions server/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,11 +180,7 @@ func initModule(wd string, pkg Pkg, target string, isDev bool) (esm *Module, err
}
for i := 0; i < 3; i++ {
var ret cjsExportsResult
importPath := pkg.Submodule
if esm.Main != "" {
importPath = esm.Main
}
ret, err = parseCJSModuleExports(wd, pkg.Name, importPath, nodeEnv)
ret, err = parseCJSModuleExports(wd, pkg.ImportPath(), nodeEnv)
if err != nil {
return
}
Expand Down
3 changes: 1 addition & 2 deletions server/node_services.go
Original file line number Diff line number Diff line change
Expand Up @@ -223,10 +223,9 @@ type cjsExportsResult struct {
Error string `json:"error"`
}

func parseCJSModuleExports(buildDir string, pkgName, importPath string, nodeEnv string) (ret cjsExportsResult, err error) {
func parseCJSModuleExports(buildDir string, importPath string, nodeEnv string) (ret cjsExportsResult, err error) {
data := invokeNodeService("parseCjsExports", map[string]interface{}{
"buildDir": buildDir,
"pkgName": pkgName,
"importPath": importPath,
"nodeEnv": nodeEnv,
})
Expand Down

0 comments on commit 9339d9e

Please sign in to comment.