Files
ArtPlayer/refactor/scripts/factory-assignability.test.mjs

35 lines
2.1 KiB
JavaScript

import assert from 'node:assert/strict'
// eslint-disable-next-line test/no-import-node-test -- Node compatibility runner.
import test from 'node:test'
import ts from 'typescript'
import compat from 'typescript-compat'
import { consumer, declaration, diagnostics, evaluateFactoryProposals, packages } from './factory-assignability.mjs'
test('Factory compatibility proposals retain exact published controls and expose conflicting CommonJS shapes', async () => {
const records = await evaluateFactoryProposals()
assert.equal(records.length, 72)
for (const item of records) {
const expected = {
'published-1.0.0': { 'factory-replacement': [], 'require-call': [], 'require-default': [2339] },
'published-1.1.0': { 'factory-replacement': [], 'require-call': [2349], 'require-default': [] },
'required-default': { 'factory-replacement': [2741], 'require-call': [], 'require-default': [] },
'optional-default': { 'factory-replacement': [], 'require-call': [], 'require-default': [2722] },
'latest-default': { 'factory-replacement': [], 'require-call': [2349], 'require-default': [] },
'callable-export-equals': { 'factory-replacement': [], 'require-call': [], 'require-default': [2339] },
}[item.shape][item.usage]
assert.deepEqual(item.diagnostics.map(diagnostic => diagnostic.code), expected, `${item.name} ${item.compiler} ${item.shape} ${item.usage}`)
}
})
test('Adding an optional overload breaks replacement factories even without a default property', () => {
const pkg = packages[1]
const optionalOverload = declaration(pkg, 'latest-default').replace(
'declare const plugin: Callable;',
'interface RuntimeCallable { (option?: Option): (art: Artplayer) => Result; (option: Option): (art: Artplayer) => Result } declare const plugin: RuntimeCallable;',
)
for (const compiler of [ts, compat]) {
assert.deepEqual(diagnostics(compiler, consumer(pkg, 'factory-replacement'), declaration(pkg, 'latest-default')), [])
assert.deepEqual(diagnostics(compiler, consumer(pkg, 'factory-replacement'), optionalOverload).map(item => item.code), [2322])
}
})