Skip to content

Commit

Permalink
Improve cjs module transform
Browse files Browse the repository at this point in the history
  • Loading branch information
ije committed Mar 14, 2022
1 parent d948bc6 commit 5ae0819
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 25 deletions.
24 changes: 11 additions & 13 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 } = require('path')
const { join, dirname } = require('path')
const { promisify } = require('util')
const { parse } = require('esm-cjs-lexer')
const enhancedResolve = require('enhanced-resolve')
Expand Down Expand Up @@ -110,23 +110,21 @@ function verifyExports(names) {

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

/* workaround for edge cases that can't be parsed by cjsLexer correctly */
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)
}
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)
}
}
return verifyExports(exports)
}
return verifyExports(exports)
}

if (entry.endsWith('.json')) {
Expand All @@ -153,7 +151,7 @@ exports.parseCjsExports = async input => {
const mod = require(reexport)
exports.push(...Object.keys(mod))
} else {
const path = await resolve(buildDir, reexport)
const path = await resolve(buildDir, join(pkgName, dirname(importPath), 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.4",
"version": "0.6.7",
"description": "Node services for esm.sh",
"main": "index.js",
"scripts": {
Expand Down
11 changes: 6 additions & 5 deletions server/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -161,12 +161,13 @@ func initModule(wd string, pkg Pkg, target string, isDev bool) (esm *Module, err

if esm.Module != "" {
resolved, exportDefault, err := checkESM(wd, esm.Name, esm.Module)
if err != nil {
log.Warnf("fake module from '%s' of '%s': %v", esm.Module, esm.Name, err)
esm.Module = ""
} else {
if err == nil {
esm.Module = resolved
esm.ExportDefault = exportDefault
} else {
log.Warnf("fake module from '%s' of '%s': %v", esm.Module, esm.Name, err)
esm.Main = esm.Module
esm.Module = ""
}
}

Expand All @@ -177,7 +178,7 @@ func initModule(wd string, pkg Pkg, target string, isDev bool) (esm *Module, err
}
for i := 0; i < 3; i++ {
var ret cjsExportsResult
ret, err = parseCJSModuleExports(wd, pkg.ImportPath(), nodeEnv)
ret, err = parseCJSModuleExports(wd, pkg.Name, esm.Main, nodeEnv)
if err != nil {
return
}
Expand Down
3 changes: 2 additions & 1 deletion server/node_services.go
Original file line number Diff line number Diff line change
Expand Up @@ -223,9 +223,10 @@ type cjsExportsResult struct {
Error string `json:"error"`
}

func parseCJSModuleExports(buildDir string, importPath string, nodeEnv string) (ret cjsExportsResult, err error) {
func parseCJSModuleExports(buildDir string, pkgName, importPath string, nodeEnv string) (ret cjsExportsResult, err error) {
data := invokeNodeService("parseCjsExports", map[string]interface{}{
"buildDir": buildDir,
"pkgName": pkgName,
"importPath": importPath,
"nodeEnv": nodeEnv,
})
Expand Down
10 changes: 5 additions & 5 deletions server/nodejs.go
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ func getNodejsVersion() (version string, major int, err error) {
func resolvePackageExports(p *NpmPackage, exports interface{}, target string, isDev bool) {
s, ok := exports.(string)
if ok {
if p.Type == "module" || p.Module != "" {
if p.Type == "module" {
p.Module = s
} else {
p.Main = s
Expand All @@ -407,15 +407,15 @@ func resolvePackageExports(p *NpmPackage, exports interface{}, target string, is

m, ok := exports.(map[string]interface{})
if ok {
names := []string{"import", "module"}
names := []string{"import", "module", "browser", "worker"}
if target == "deno" {
names = []string{"deno", "import", "module"}
names = []string{"deno", "import", "module", "browser", "worker"}
}
if p.Type == "module" {
if isDev {
names = append(names, "development", "browser", "default")
names = append(names, "development", "default")
} else {
names = append(names, "production", "browser", "default")
names = append(names, "production", "default")
}
}
for _, name := range names {
Expand Down

0 comments on commit 5ae0819

Please sign in to comment.