diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 9403fcf..5416b03 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -33,8 +33,7 @@ jobs: target: x86_64-pc-windows-msvc - host: ubuntu-latest target: x86_64-unknown-linux-gnu - docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian - build: apt-get install -y libxdo-dev && yarn build --target x86_64-unknown-linux-gnu + build: sudo apt-get install -y libxdo-dev && yarn build --target x86_64-unknown-linux-gnu - host: macos-latest target: aarch64-apple-darwin build: yarn build --target aarch64-apple-darwin diff --git a/__test__/index.spec.mjs b/__test__/index.spec.mjs index 1ade4ca..ea411f9 100644 --- a/__test__/index.spec.mjs +++ b/__test__/index.spec.mjs @@ -1,7 +1,7 @@ import test from 'ava' -import { sum } from '../index.js' +import { getSelectedText } from '../index.js' test('sum from native', (t) => { - t.is(sum(1, 2), 3) + t.is(getSelectedText(), '') }) diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..7f986dd --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +/* tslint:disable */ +/* eslint-disable */ + +/* auto-generated by NAPI-RS */ + +export function getSelectedText(): string diff --git a/index.js b/index.js new file mode 100644 index 0000000..342cc9f --- /dev/null +++ b/index.js @@ -0,0 +1,315 @@ +/* tslint:disable */ +/* eslint-disable */ +/* prettier-ignore */ + +/* auto-generated by NAPI-RS */ + +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, 'node-get-selected-text.android-arm64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.android-arm64.node') + } else { + nativeBinding = require('node-get-selected-text-android-arm64') + } + } catch (e) { + loadError = e + } + break + case 'arm': + localFileExisted = existsSync(join(__dirname, 'node-get-selected-text.android-arm-eabi.node')) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.android-arm-eabi.node') + } else { + nativeBinding = require('node-get-selected-text-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, 'node-get-selected-text.win32-x64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.win32-x64-msvc.node') + } else { + nativeBinding = require('node-get-selected-text-win32-x64-msvc') + } + } catch (e) { + loadError = e + } + break + case 'ia32': + localFileExisted = existsSync( + join(__dirname, 'node-get-selected-text.win32-ia32-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.win32-ia32-msvc.node') + } else { + nativeBinding = require('node-get-selected-text-win32-ia32-msvc') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'node-get-selected-text.win32-arm64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.win32-arm64-msvc.node') + } else { + nativeBinding = require('node-get-selected-text-win32-arm64-msvc') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Windows: ${arch}`) + } + break + case 'darwin': + localFileExisted = existsSync(join(__dirname, 'node-get-selected-text.darwin-universal.node')) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.darwin-universal.node') + } else { + nativeBinding = require('node-get-selected-text-darwin-universal') + } + break + } catch {} + switch (arch) { + case 'x64': + localFileExisted = existsSync(join(__dirname, 'node-get-selected-text.darwin-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.darwin-x64.node') + } else { + nativeBinding = require('node-get-selected-text-darwin-x64') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'node-get-selected-text.darwin-arm64.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.darwin-arm64.node') + } else { + nativeBinding = require('node-get-selected-text-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, 'node-get-selected-text.freebsd-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.freebsd-x64.node') + } else { + nativeBinding = require('node-get-selected-text-freebsd-x64') + } + } catch (e) { + loadError = e + } + break + case 'linux': + switch (arch) { + case 'x64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'node-get-selected-text.linux-x64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.linux-x64-musl.node') + } else { + nativeBinding = require('node-get-selected-text-linux-x64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'node-get-selected-text.linux-x64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.linux-x64-gnu.node') + } else { + nativeBinding = require('node-get-selected-text-linux-x64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'node-get-selected-text.linux-arm64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.linux-arm64-musl.node') + } else { + nativeBinding = require('node-get-selected-text-linux-arm64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'node-get-selected-text.linux-arm64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.linux-arm64-gnu.node') + } else { + nativeBinding = require('node-get-selected-text-linux-arm64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'node-get-selected-text.linux-arm-musleabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.linux-arm-musleabihf.node') + } else { + nativeBinding = require('node-get-selected-text-linux-arm-musleabihf') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'node-get-selected-text.linux-arm-gnueabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.linux-arm-gnueabihf.node') + } else { + nativeBinding = require('node-get-selected-text-linux-arm-gnueabihf') + } + } catch (e) { + loadError = e + } + } + break + case 'riscv64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'node-get-selected-text.linux-riscv64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.linux-riscv64-musl.node') + } else { + nativeBinding = require('node-get-selected-text-linux-riscv64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'node-get-selected-text.linux-riscv64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.linux-riscv64-gnu.node') + } else { + nativeBinding = require('node-get-selected-text-linux-riscv64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 's390x': + localFileExisted = existsSync( + join(__dirname, 'node-get-selected-text.linux-s390x-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./node-get-selected-text.linux-s390x-gnu.node') + } else { + nativeBinding = require('node-get-selected-text-linux-s390x-gnu') + } + } 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 { getSelectedText } = nativeBinding + +module.exports.getSelectedText = getSelectedText