@napi-rs/cli
Version:
Cli tools for napi-rs
70 lines (60 loc) • 2.23 kB
text/typescript
import { unlink, writeFile } from 'node:fs/promises'
import { tmpdir } from 'node:os'
import { dirname, join } from 'node:path'
import { fileURLToPath } from 'node:url'
import test from 'ava'
import { getNapiDeriveDependentCrates, parseMetadata } from '../metadata.js'
const FIXTURE_WORKSPACE = join(
dirname(fileURLToPath(import.meta.url)),
'__fixtures__',
'optional-napi-derive',
)
test('should surface child process startup errors', async (t) => {
const manifestPath = join(
tmpdir(),
`napi-rs-metadata-${process.pid}-${Date.now()}.toml`,
)
const originalPath = process.env.PATH
await writeFile(manifestPath, '[package]\nname = "test"\nversion = "0.0.0"\n')
process.env.PATH = ''
try {
const error = await t.throwsAsync(() => parseMetadata(manifestPath))
t.truthy(error)
t.is(error?.message, 'cargo metadata failed to run')
t.is((error?.cause as NodeJS.ErrnoException | undefined)?.code, 'ENOENT')
} finally {
process.env.PATH = originalPath
await unlink(manifestPath)
}
})
test('should exclude crates whose optional napi-derive dependency is disabled', async (t) => {
const metadata = await parseMetadata(
join(FIXTURE_WORKSPACE, 'main-crate', 'Cargo.toml'),
)
const dependentCrates = getNapiDeriveDependentCrates(metadata).map(
(crate) => crate.name,
)
t.deepEqual(dependentCrates, ['main-crate'])
})
test('should include crates whose optional napi-derive dependency is enabled via build features', async (t) => {
const metadata = await parseMetadata(
join(FIXTURE_WORKSPACE, 'with-optional-derive', 'Cargo.toml'),
{
features: ['node'],
},
)
const dependentCrates = getNapiDeriveDependentCrates(metadata).map(
(crate) => crate.name,
)
t.true(dependentCrates.includes('with-optional-derive'))
})
test('should fall back to declared dependencies when the resolve graph is unavailable', async (t) => {
const metadata = await parseMetadata(
join(FIXTURE_WORKSPACE, 'main-crate', 'Cargo.toml'),
)
metadata.resolve = null
const dependentCrates = getNapiDeriveDependentCrates(metadata)
.map((crate) => crate.name)
.sort()
t.deepEqual(dependentCrates, ['main-crate', 'with-optional-derive'])
})