const test = require('node:test'); const assert = require('node:assert/strict'); const fs = require('node:fs'); const vm = require('node:vm'); function fixture(failure) { const events = [], errors = [], modules = {}, cache = {}; for (const name of ['./pack', '../level-resources/pack', '../level-resources/validation']) { cache[name] = { stale: true }; modules[name] = { pack(dest) { assert.equal(dest, 'output'); events.push(name); if (name === failure) throw new Error('pack failed: ' + name); return { publishDir: name }; } }; } const requireModule = name => { assert.equal(cache[name], undefined, 'postprocessor must be reloaded'); return modules[name]; }; requireModule.cache = cache; requireModule.resolve = name => name; let handler; const Editor = { log() {}, error: error => errors.push(error), Builder: { on(event, fn) { assert.equal(event, 'build-finished'); assert.equal(handler, undefined); handler = fn; }, removeListener(event, fn) { assert.equal(event, 'build-finished'); assert.equal(fn, handler); handler = undefined; }, } }; const module = { exports: {} }; vm.runInNewContext(fs.readFileSync('packages/activity-bundles/main.js', 'utf8'), { module, require: requireModule, Editor }); module.exports.load(); const legacy = { exports: {} }; vm.runInNewContext(fs.readFileSync('packages/level-resources/main.js', 'utf8'), { module: legacy, Editor }); legacy.exports.load(); // Must not install a second writer. return { events, errors, extension: module.exports, run(options) { const calls = []; handler(options, error => calls.push(error)); return calls; } }; } for (const options of [{ platform: 'wechatgame' }, { platform: 'mini-game', actualPlatform: 'wechatgame' }]) test(`WeChat build runs both postprocessors in order (${JSON.stringify(options)})`, () => { const f = fixture(); assert.deepEqual(f.run({ ...options, dest: 'output' }), [undefined]); assert.deepEqual(f.events, ['./pack', '../level-resources/pack']); assert.deepEqual(f.errors, []); f.extension.unload(); }); test('other platforms do not run WeChat postprocessing', () => { const f = fixture(); assert.deepEqual(f.run({ platform: 'mini-game', actualPlatform: 'bytedance' }), [undefined]); assert.deepEqual(f.events, []); }); for (const failure of ['./pack', '../level-resources/pack']) test(`failure in ${failure} rejects the build exactly once`, () => { const f = fixture(failure), calls = f.run({ platform: 'wechatgame', dest: 'output' }); assert.equal(calls.length, 1); assert.match(calls[0].message, /pack failed/); assert.equal(f.errors[0], calls[0]); assert.deepEqual(f.events, failure === './pack' ? ['./pack'] : ['./pack', '../level-resources/pack']); });