diff --git a/.github/workflows/bindings_nodejs.yml b/.github/workflows/bindings_nodejs.yml index 09e395881f0..78f5f3a8816 100644 --- a/.github/workflows/bindings_nodejs.yml +++ b/.github/workflows/bindings_nodejs.yml @@ -51,6 +51,8 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Setup Rust toolchain + uses: ./.github/actions/setup - name: Setup node uses: actions/setup-node@v3 with: @@ -132,10 +134,7 @@ jobs: - uses: actions/upload-artifact@v3 with: name: bindings-windows - path: | - bindings/nodejs/*.node - bindings/nodejs/index.d.ts - bindings/nodejs/generated*.* + path: bindings/nodejs/*.node - name: Test bindings run: yarn test @@ -211,7 +210,7 @@ jobs: - name: Publish run: | echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - npm publish --access public + npm publish env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/bindings/nodejs/.gitignore b/bindings/nodejs/.gitignore index c3b1f289a8e..12017c53952 100644 --- a/bindings/nodejs/.gitignore +++ b/bindings/nodejs/.gitignore @@ -191,5 +191,3 @@ Cargo.lock !.yarn/patches *.node docs/ - -generated*.* diff --git a/bindings/nodejs/generated.js b/bindings/nodejs/generated.js new file mode 100644 index 00000000000..c3c427b3f83 --- /dev/null +++ b/bindings/nodejs/generated.js @@ -0,0 +1,274 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const { existsSync, readFileSync } = require('fs') +const { join } = require('path') + +const { platform, arch } = process + +let nativeBinding = null +let localFileExisted = false +let loadError = null + +function isMusl() { + // For Node 10 + if (!process.report || typeof process.report.getReport !== 'function') { + try { + const lddPath = require('child_process').execSync('which ldd').toString().trim(); + return readFileSync(lddPath, 'utf8').includes('musl') + } catch (e) { + return true + } + } else { + const { glibcVersionRuntime } = process.report.getReport().header + return !glibcVersionRuntime + } +} + +switch (platform) { + case 'android': + switch (arch) { + case 'arm64': + localFileExisted = existsSync(join(__dirname, 'opendal.android-arm64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.android-arm64.node') + } else { + nativeBinding = require('@opendal/lib-android-arm64') + } + } catch (e) { + loadError = e + } + break + case 'arm': + localFileExisted = existsSync(join(__dirname, 'opendal.android-arm-eabi.node')) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.android-arm-eabi.node') + } else { + nativeBinding = require('@opendal/lib-android-arm-eabi') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Android ${arch}`) + } + break + case 'win32': + switch (arch) { + case 'x64': + localFileExisted = existsSync( + join(__dirname, 'opendal.win32-x64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.win32-x64-msvc.node') + } else { + nativeBinding = require('@opendal/lib-win32-x64-msvc') + } + } catch (e) { + loadError = e + } + break + case 'ia32': + localFileExisted = existsSync( + join(__dirname, 'opendal.win32-ia32-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.win32-ia32-msvc.node') + } else { + nativeBinding = require('@opendal/lib-win32-ia32-msvc') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'opendal.win32-arm64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.win32-arm64-msvc.node') + } else { + nativeBinding = require('@opendal/lib-win32-arm64-msvc') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Windows: ${arch}`) + } + break + case 'darwin': + localFileExisted = existsSync(join(__dirname, 'opendal.darwin-universal.node')) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.darwin-universal.node') + } else { + nativeBinding = require('@opendal/lib-darwin-universal') + } + break + } catch {} + switch (arch) { + case 'x64': + localFileExisted = existsSync(join(__dirname, 'opendal.darwin-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.darwin-x64.node') + } else { + nativeBinding = require('@opendal/lib-darwin-x64') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'opendal.darwin-arm64.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.darwin-arm64.node') + } else { + nativeBinding = require('@opendal/lib-darwin-arm64') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on macOS: ${arch}`) + } + break + case 'freebsd': + if (arch !== 'x64') { + throw new Error(`Unsupported architecture on FreeBSD: ${arch}`) + } + localFileExisted = existsSync(join(__dirname, 'opendal.freebsd-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.freebsd-x64.node') + } else { + nativeBinding = require('@opendal/lib-freebsd-x64') + } + } catch (e) { + loadError = e + } + break + case 'linux': + switch (arch) { + case 'x64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'opendal.linux-x64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.linux-x64-musl.node') + } else { + nativeBinding = require('@opendal/lib-linux-x64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'opendal.linux-x64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.linux-x64-gnu.node') + } else { + nativeBinding = require('@opendal/lib-linux-x64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'opendal.linux-arm64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.linux-arm64-musl.node') + } else { + nativeBinding = require('@opendal/lib-linux-arm64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'opendal.linux-arm64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.linux-arm64-gnu.node') + } else { + nativeBinding = require('@opendal/lib-linux-arm64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm': + localFileExisted = existsSync( + join(__dirname, 'opendal.linux-arm-gnueabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./opendal.linux-arm-gnueabihf.node') + } else { + nativeBinding = require('@opendal/lib-linux-arm-gnueabihf') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Linux: ${arch}`) + } + break + default: + throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`) +} + +if (!nativeBinding) { + if (loadError) { + throw loadError + } + throw new Error(`Failed to load native binding`) +} + +const { Operator, Entry, Metadata, Lister, BlockingLister } = nativeBinding + +module.exports.Operator = Operator +module.exports.Entry = Entry +module.exports.Metadata = Metadata +module.exports.Lister = Lister +module.exports.BlockingLister = BlockingLister diff --git a/bindings/nodejs/package.json b/bindings/nodejs/package.json index 43ddba389ea..675c6b809e6 100644 --- a/bindings/nodejs/package.json +++ b/bindings/nodejs/package.json @@ -8,7 +8,10 @@ "description": "Open Data Access Layer: Access data freely, painlessly, and efficiently", "repository": "git@github.com/apache/incubator-opendal.git", "napi": { - "name": "opendal" + "name": "opendal", + "package": { + "name": "@opendal/lib" + } }, "keywords": [ "api", @@ -46,8 +49,8 @@ }, "scripts": { "artifacts": "napi artifacts", - "build": "napi build --platform --release --js generated.js --js-package-name @opendal/lib", - "build:debug": "napi build --platform --js generated.js --js-package-name @opendal/lib", + "build": "napi build --platform --release --js generated.js", + "build:debug": "napi build --platform --js generated.js", "docs": "typedoc", "format": "prettier --write .", "prepublishOnly": "napi prepublish -t npm", @@ -69,6 +72,10 @@ } ] }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, "packageManager": "yarn@3.4.1+sha224.cca891d4a8671d4898aba3426674bb734dbbf88cef82dd4dacd71c9f", "resolutions": { "@napi-rs/cli@^2.14.8": "patch:@napi-rs/cli@npm%3A2.14.8#./.yarn/patches/@napi-rs-cli-npm-2.14.8-71492d0ade.patch" diff --git a/licenserc.toml b/licenserc.toml index 2428610ff4d..bbd10e576b9 100644 --- a/licenserc.toml +++ b/licenserc.toml @@ -25,9 +25,6 @@ excludes = [ # Python binding related files "**/venv/**", - # Nodejs binding related files - "bindings/nodejs/generated*.*", - # Website generated files "website/build", "website/.docusaurus",