This is an automated email from the ASF dual-hosted git repository.

xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new 8fe3f360d fix(nodejs): esmodule and commonjs support (#6266)
8fe3f360d is described below

commit 8fe3f360d62e311e015eaccbc523247f0384154f
Author: Kingsword <kingswor...@gmail.com>
AuthorDate: Mon Jun 9 16:08:22 2025 +0800

    fix(nodejs): esmodule and commonjs support (#6266)
    
    * fix(nodejs): esmodule and commonjs support
    
    * fix(nodejs): theme package build and update prettier config
    
    * fix(nodejs): ci
    
    * fix(nodejs): vitest test
    
    * docs(nodejs): add nextjs usage
---
 bindings/nodejs/.prettierignore                   |  1 +
 bindings/nodejs/README.md                         | 13 ++++++++++++
 bindings/nodejs/{index.js => index.cjs}           |  4 ++--
 bindings/nodejs/{index.js => index.mjs}           |  9 +++++---
 bindings/nodejs/package.json                      | 26 +++++++++++++++++------
 bindings/nodejs/scripts/{header.js => header.mjs} |  0
 bindings/nodejs/tests/suites/index.mjs            |  2 +-
 bindings/nodejs/tests/suites/sync.suite.mjs       |  1 -
 bindings/nodejs/theme/package.json                |  3 +++
 9 files changed, 46 insertions(+), 13 deletions(-)

diff --git a/bindings/nodejs/.prettierignore b/bindings/nodejs/.prettierignore
index 5bac3c572..435244ca4 100644
--- a/bindings/nodejs/.prettierignore
+++ b/bindings/nodejs/.prettierignore
@@ -6,3 +6,4 @@ pnpm-lock.yaml
 .devbox
 devbox.json
 devbox.lock
+theme/dist/index.js
diff --git a/bindings/nodejs/README.md b/bindings/nodejs/README.md
index c46d005b0..2f2545c8c 100644
--- a/bindings/nodejs/README.md
+++ b/bindings/nodejs/README.md
@@ -65,6 +65,19 @@ async function main() {
 main();
 ```
 
+## Usage with Next.js
+
+Config automatically be bundled by 
[Next.js](https://nextjs.org/docs/app/api-reference/config/next-config-js/serverExternalPackages).
+
+```javascript
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+  serverExternalPackages: ["opendal"],
+};
+
+module.exports = nextConfig;
+```
+
 ## Contributing
 
 - Start with [Contributing Guide](CONTRIBUTING.md).
diff --git a/bindings/nodejs/index.js b/bindings/nodejs/index.cjs
similarity index 95%
copy from bindings/nodejs/index.js
copy to bindings/nodejs/index.cjs
index 1ec1e675d..9b17b4685 100644
--- a/bindings/nodejs/index.js
+++ b/bindings/nodejs/index.cjs
@@ -19,7 +19,7 @@
 
 /// <reference types="node" />
 
-import { Writable, Readable } from 'node:stream'
+const { Writable, Readable } = require('stream')
 
 class ReadStream extends Readable {
   constructor(reader, options) {
@@ -119,7 +119,7 @@ class BlockingWriteStream extends Writable {
   }
 }
 
-import { Operator, RetryLayer, BlockingReader, Reader, BlockingWriter, Writer 
} from './generated.js'
+const { Operator, RetryLayer, BlockingReader, Reader, BlockingWriter, Writer } 
= require('./generated.js')
 
 BlockingReader.prototype.createReadStream = function (options) {
   return new BlockingReadStream(this, options)
diff --git a/bindings/nodejs/index.js b/bindings/nodejs/index.mjs
similarity index 93%
rename from bindings/nodejs/index.js
rename to bindings/nodejs/index.mjs
index 1ec1e675d..ccafda569 100644
--- a/bindings/nodejs/index.js
+++ b/bindings/nodejs/index.mjs
@@ -119,7 +119,8 @@ class BlockingWriteStream extends Writable {
   }
 }
 
-import { Operator, RetryLayer, BlockingReader, Reader, BlockingWriter, Writer 
} from './generated.js'
+import * as generated from './generated.js'
+const { Operator, RetryLayer, BlockingReader, Reader, BlockingWriter, Writer } 
= generated
 
 BlockingReader.prototype.createReadStream = function (options) {
   return new BlockingReadStream(this, options)
@@ -137,7 +138,9 @@ Writer.prototype.createWriteStream = function (options) {
   return new WriteStream(this, options)
 }
 
-module.exports.Operator = Operator
-module.exports.layers = {
+export const layers = {
   RetryLayer,
 }
+
+export * from './generated.js'
+export default generated
diff --git a/bindings/nodejs/package.json b/bindings/nodejs/package.json
index cae783b20..27a333aa8 100644
--- a/bindings/nodejs/package.json
+++ b/bindings/nodejs/package.json
@@ -3,8 +3,8 @@
   "author": "Apache OpenDAL <d...@opendal.apache.org>",
   "version": "0.48.3",
   "license": "Apache-2.0",
-  "type": "module",
-  "main": "index.js",
+  "main": "index.cjs",
+  "module": "index.mjs",
   "types": "index.d.ts",
   "description": "Apache OpenDAL: Access data freely",
   "repository": "g...@github.com/apache/opendal.git",
@@ -41,12 +41,26 @@
   ],
   "files": [
     "index.d.ts",
-    "index.js",
+    "index.cjs",
+    "index.mjs",
     "generated.d.ts",
     "generated.js",
     "LICENSE",
     "NOTICE"
   ],
+  "exports": {
+    ".": {
+      "import": {
+        "types": "./index.d.ts",
+        "default": "./index.mjs"
+      },
+      "require": {
+        "types": "./index.d.ts",
+        "default": "./index.cjs"
+      }
+    },
+    "./package.json": "./package.json"
+  },
   "devDependencies": {
     "@aws-sdk/client-s3": "^3.468.0",
     "@napi-rs/cli": "^2.18.3",
@@ -65,8 +79,8 @@
     "node": ">= 10"
   },
   "scripts": {
-    "build": "napi build --platform --features \"${NAPI_FEATURES:-}\" --target 
\"${NAPI_TARGET:-}\" --release --js generated.js --dts generated.d.ts && node 
./scripts/header.js",
-    "build:debug": "napi build --platform --features \"${NAPI_FEATURES:-}\" 
--target \"${NAPI_TARGET:-}\" --js generated.js --dts generated.d.ts && node 
./scripts/header.js",
+    "build": "napi build --platform --features \"${NAPI_FEATURES:-}\" --target 
\"${NAPI_TARGET:-}\" --release --js generated.js --dts generated.d.ts && node 
./scripts/header.mjs",
+    "build:debug": "napi build --platform --features \"${NAPI_FEATURES:-}\" 
--target \"${NAPI_TARGET:-}\" --js generated.js --dts generated.d.ts && node 
./scripts/header.mjs",
     "build:theme": "tsc -p ./tsconfig.theme.json",
     "docs": "typedoc",
     "format": "prettier --write .",
@@ -78,7 +92,7 @@
   "prettier": {
     "overrides": [
       {
-        "files": "./**/*.{js,ts,mjs,jsx,tsx}",
+        "files": "./**/*.{js,cjs,ts,mjs,jsx,tsx}",
         "options": {
           "arrowParens": "always",
           "parser": "typescript",
diff --git a/bindings/nodejs/scripts/header.js 
b/bindings/nodejs/scripts/header.mjs
similarity index 100%
rename from bindings/nodejs/scripts/header.js
rename to bindings/nodejs/scripts/header.mjs
diff --git a/bindings/nodejs/tests/suites/index.mjs 
b/bindings/nodejs/tests/suites/index.mjs
index e9f706f8a..920f816cf 100644
--- a/bindings/nodejs/tests/suites/index.mjs
+++ b/bindings/nodejs/tests/suites/index.mjs
@@ -18,7 +18,7 @@
  */
 
 import { describe } from 'vitest'
-import { Operator, layers } from '../../index.js'
+import { Operator, layers } from '../../index.mjs'
 import { checkRandomRootEnabled, generateRandomRoot, loadConfigFromEnv } from 
'../utils.mjs'
 
 import { run as AsyncIOTestRun } from './async.suite.mjs'
diff --git a/bindings/nodejs/tests/suites/sync.suite.mjs 
b/bindings/nodejs/tests/suites/sync.suite.mjs
index 37781ed7b..8215bcfb0 100644
--- a/bindings/nodejs/tests/suites/sync.suite.mjs
+++ b/bindings/nodejs/tests/suites/sync.suite.mjs
@@ -19,7 +19,6 @@
 
 import { randomUUID } from 'node:crypto'
 import { test } from 'vitest'
-import { WriteStream, ReadStream } from '../../index.js'
 import { generateFixedBytes } from '../utils.mjs'
 import { Readable } from 'node:stream'
 
diff --git a/bindings/nodejs/theme/package.json 
b/bindings/nodejs/theme/package.json
new file mode 100644
index 000000000..3dbc1ca59
--- /dev/null
+++ b/bindings/nodejs/theme/package.json
@@ -0,0 +1,3 @@
+{
+  "type": "module"
+}

Reply via email to