UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

64 lines (53 loc) • 2.15 kB
import { existsSync, readFileSync } from 'node:fs' import { createRequire } from 'node:module' import { fileURLToPath, URL } from 'node:url' import { describe, expect, test } from 'vitest' const packageDirectory = fileURLToPath(new URL('../', import.meta.url)) function collectExportTargets(value: unknown): string[] { if (typeof value === 'string') { return value.includes('*') ? [] : [value] } if (!value || typeof value !== 'object' || Array.isArray(value)) { return [] } return Object.values(value).flatMap(collectExportTargets) } describe('package exports', () => { test('all concrete targets exist in the built package', () => { const packageJson: unknown = JSON.parse( readFileSync(`${packageDirectory}/package.json`, 'utf8') ) if (!packageJson || typeof packageJson !== 'object' || !('exports' in packageJson)) { throw new Error('one package.json must define exports') } const missing = collectExportTargets(packageJson.exports).filter( (target) => !existsSync(`${packageDirectory}/${target}`) ) expect(missing).toEqual([]) }) }) describe('workspace package entry points', () => { test.each(['emitter', 'vite-native-hmr', 'test-package', 'url-parse'])( '%s exports built files and existing declarations', (name) => { const directory = fileURLToPath(new URL(`../../${name}/`, import.meta.url)) const pkg = JSON.parse(readFileSync(`${directory}/package.json`, 'utf8')) const missing = collectExportTargets(pkg.exports).filter( (target) => !existsSync(`${directory}/${target}`) ) expect(missing).toEqual([]) } ) test('the CommonJS emitter delivers values and removes listeners', () => { const require = createRequire(import.meta.url) const { createEmitter } = require('@vxrn/emitter') const emitter = createEmitter('initial') const values: string[] = [] const dispose = emitter.listen((value: string) => values.push(value)) emitter.emit('next') dispose() emitter.emit('after disposal') expect(values).toEqual(['next']) expect(emitter.value).toBe('after disposal') }) })