2026-07-17 13:50:30 +08:00
|
|
|
import assert from 'node:assert/strict'
|
|
|
|
|
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'
|
|
|
|
|
import { tmpdir } from 'node:os'
|
|
|
|
|
import path from 'node:path'
|
|
|
|
|
import test from 'node:test'
|
|
|
|
|
import { resolveVersionedModules, validateConfig } from './xuqm-config.mjs'
|
|
|
|
|
|
|
|
|
|
function fixture() {
|
|
|
|
|
const root = mkdtempSync(path.join(tmpdir(), 'xuqm-config-'))
|
|
|
|
|
writeFileSync(path.join(root, 'package.json'), JSON.stringify({ version: '7.2.14' }))
|
|
|
|
|
writeFileSync(path.join(root, 'common.ts'), '')
|
|
|
|
|
writeFileSync(path.join(root, 'app.ts'), '')
|
2026-07-18 08:59:40 +08:00
|
|
|
writeFileSync(path.join(root, 'metro.config.js'), 'module.exports = {}\n')
|
2026-07-17 13:50:30 +08:00
|
|
|
return root
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
test('plugins start at the configured plugin version independently from the app version', () => {
|
|
|
|
|
const root = fixture()
|
|
|
|
|
try {
|
|
|
|
|
const config = {
|
|
|
|
|
appId: 'example',
|
|
|
|
|
mainModuleName: 'Example',
|
|
|
|
|
pluginVersion: '1.0.0',
|
|
|
|
|
appVersionRange: '>=7.2.14 <8.0.0',
|
2026-07-18 08:59:40 +08:00
|
|
|
metroConfig: './metro.config.js',
|
2026-07-17 13:50:30 +08:00
|
|
|
modules: [
|
|
|
|
|
{ id: 'common', type: 'common', entry: './common.ts' },
|
|
|
|
|
{ id: 'app', type: 'app', entry: './app.ts' },
|
|
|
|
|
],
|
|
|
|
|
}
|
|
|
|
|
assert.deepEqual(validateConfig(config, root), [])
|
|
|
|
|
const resolved = resolveVersionedModules(config, root)
|
|
|
|
|
assert.equal(resolved.appVersion, '7.2.14')
|
|
|
|
|
assert.equal(resolved.modules[0].moduleVersion, '1.0.0')
|
|
|
|
|
assert.equal(resolved.modules[1].moduleVersion, '1.0.0')
|
|
|
|
|
assert.equal(resolved.modules[1].commonVersionRange, '>=1.0.0 <2.0.0')
|
|
|
|
|
assert.equal(resolved.modules[1].minNativeApiLevel, 1)
|
|
|
|
|
} finally {
|
|
|
|
|
rmSync(root, { recursive: true, force: true })
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
test('an explicitly independently released module keeps its own version', () => {
|
|
|
|
|
const root = fixture()
|
|
|
|
|
try {
|
|
|
|
|
const resolved = resolveVersionedModules(
|
|
|
|
|
{
|
|
|
|
|
pluginVersion: '1.0.0',
|
|
|
|
|
appVersionRange: '>=8.0.0 <9.0.0',
|
|
|
|
|
modules: [
|
|
|
|
|
{ id: 'common', type: 'common', moduleVersion: '3.0.0' },
|
|
|
|
|
{ id: 'feature', type: 'buz', moduleVersion: '4.1.0' },
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
root,
|
|
|
|
|
'8.0.0',
|
|
|
|
|
)
|
|
|
|
|
assert.equal(resolved.appVersion, '8.0.0')
|
|
|
|
|
assert.equal(resolved.modules[0].moduleVersion, '3.0.0')
|
|
|
|
|
assert.equal(resolved.modules[1].moduleVersion, '4.1.0')
|
|
|
|
|
assert.equal(resolved.modules[1].commonVersionRange, '>=3.0.0 <4.0.0')
|
|
|
|
|
} finally {
|
|
|
|
|
rmSync(root, { recursive: true, force: true })
|
|
|
|
|
}
|
|
|
|
|
})
|