napi-rs 0.1.1

A minimal library for building compiled Node add-ons in Rust
#!/usr/bin/env node

const parseArgs = require('minimist')
const cp = require('child_process')
const path = require('path')
const os = require('os')
const parsedNodeVersion = process.versions.node.match(/^(\d+)\.(\d+)\.(\d+)$/)
const nodeMajorVersion = parseInt(parsedNodeVersion[1])
const nodeMinorVersion = parseInt(parsedNodeVersion[2])

if (nodeMajorVersion < 8 || (nodeMajorVersion === 8 && nodeMinorVersion < 9)) {
  console.error('This build script should be run on Node 8.9 or greater')
  process.exit(1)
}

const argv = parseArgs(process.argv.slice(2), {
  boolean: ['release'],
})

const subcommand = argv._[0] || 'build'

const nodeIncludePath = path.join(
  process.argv[0],
  '..',
  '..',
  'include',
  'node',
)

const moduleName = path.basename(process.cwd()).replace('-', '_')
process.env.NODE_INCLUDE_PATH = nodeIncludePath
process.env.NODE_MAJOR_VERSION = nodeMajorVersion > 8 ? 'stable' : 8

const platform = os.platform()
let libExt, platformArgs

// Platform based massaging for build commands
switch (platform) {
  case 'darwin':
    libExt = '.dylib'
    platformArgs = '-undefined dynamic_lookup -export_dynamic'
    break
  case 'win32':
    libExt = '.dll'
    platformArgs = '-undefined dynamic_lookup -export_dynamic'
    break
  case 'linux':
    libExt = '.so'
    platformArgs = '-undefined=dynamic_lookup -export_dynamic'
    break
  default:
    console.error(
      'Operating system not currently supported or recognized by the build script',
    )
    process.exit(1)
}

switch (subcommand) {
  case 'build':
    const releaseFlag = argv.release ? '--release' : ''
    const targetDir = argv.release ? 'release' : 'debug'
    cp.execSync(
      `cargo rustc ${releaseFlag} -- -Clink-args=\"${platformArgs}\"`,
      { stdio: 'inherit' },
    )
    cp.execSync(`mkdir -p target/${targetDir}`)
    cp.execSync(
      `cp ${path.join(
        process.cwd(),
        'target',
        targetDir,
        'lib' + moduleName + libExt,
      )}  target/${targetDir}/${moduleName}.node`,
      { stdio: 'inherit' },
    )
    break
  case 'check':
    cp.execSync(`cargo check`, { stdio: 'inherit' })
  case 'doc':
    cp.execSync(`cargo doc`, { stdio: 'inherit' })
}