From 9339d9e361a06fc5bafec314d4baa2563bd06e42 Mon Sep 17 00:00:00 2001 From: X Date: Sat, 19 Mar 2022 00:34:27 +0800 Subject: [PATCH] Rollback `parseCJSModuleExports` to v68 (close #277, #279) --- packages/esm-node-services/cjs-lexer.js | 46 ++++++++----------------- packages/esm-node-services/package.json | 2 +- packages/esm-node-services/test.js | 20 ++--------- server/module.go | 6 +--- server/node_services.go | 3 +- 5 files changed, 20 insertions(+), 57 deletions(-) diff --git a/packages/esm-node-services/cjs-lexer.js b/packages/esm-node-services/cjs-lexer.js index fb88d4dc9..766e30101 100644 --- a/packages/esm-node-services/cjs-lexer.js +++ b/packages/esm-node-services/cjs-lexer.js @@ -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') @@ -79,7 +79,6 @@ const builtInNodeModules = new Set([ "zlib", ]) const requireModeAllowList = [ - 'graceful-fs', 'domhandler', 'he', 'lz-string', @@ -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')) { @@ -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 { diff --git a/packages/esm-node-services/package.json b/packages/esm-node-services/package.json index 7e0d5f220..85e793174 100644 --- a/packages/esm-node-services/package.json +++ b/packages/esm-node-services/package.json @@ -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": { diff --git a/packages/esm-node-services/test.js b/packages/esm-node-services/test.js index 907a9ea79..782c52c2b 100644 --- a/packages/esm-node-services/test.js +++ b/packages/esm-node-services/test.js @@ -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') diff --git a/server/module.go b/server/module.go index 86b75f719..661a1712f 100644 --- a/server/module.go +++ b/server/module.go @@ -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 } diff --git a/server/node_services.go b/server/node_services.go index ce56faf42..b0df8d46b 100644 --- a/server/node_services.go +++ b/server/node_services.go @@ -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, })