1import test from 'node:test';2import assert from 'node:assert/strict';3import { createPackLibrary, DEFAULT_PACK_LIBRARY_KEY, PACK_LIBRARY_SCHEMA } from '../src/pack-library.js';4import { createCatalog } from '../src/catalog.js';56const level = id => ({ id, title: id, width: 1, height: 1, objects: [] });7const pack = (id, levelId = 'intro') => ({8 manifest: { id, name: id, version: '1.0.0' },9 levels: [level(levelId)],10});1112function storage(initial = null) {13 let value = initial;14 return {15 getItem() { return value; },16 setItem(key, next) { assert.equal(key, DEFAULT_PACK_LIBRARY_KEY); value = next; },17 removeItem() { value = null; },18 dump() { return value; },19 };20}2122test('explicit installs persist authored data and hydrate in order without evaluating source', () => {23 const saved = storage();24 const catalog = createCatalog({ coreLevels: [level('core')] });25 catalog.register(pack('bundled'), { origin: 'bundled' });26 const first = createPackLibrary({ catalog, storage: saved });27 first.installPack(pack('alpha'));28 first.installPack(pack('beta'));29 assert.deepEqual(first.getPacks().map(item => item.id), ['core', 'bundled', 'alpha', 'beta']);30 const encoded = saved.dump();31 const normalized = id => ({ ...pack(id), manifest: { ...pack(id).manifest, rules: 1 } });32 assert.deepEqual(JSON.parse(encoded), {33 schema: PACK_LIBRARY_SCHEMA,34 packs: [normalized('alpha'), normalized('beta')],35 });3637 const reloaded = createPackLibrary({ catalog: createCatalog({ coreLevels: [level('core')] }), storage: saved });38 assert.deepEqual(reloaded.getPacks().map(item => item.id), ['core', 'alpha', 'beta']);39 assert.equal(reloaded.getPack('alpha').manifest.name, 'alpha');40});4142test('replace, fork-style install, and remove each update one ordered snapshot', () => {43 const saved = storage();44 const library = createPackLibrary({ catalog: createCatalog({ coreLevels: [level('core')] }), storage: saved });45 library.installPack(pack('alpha', 'old'));46 library.installPack(pack('beta'));47 library.installPack(pack('alpha', 'new'), { replace: true });48 assert.deepEqual(library.getPacks().map(item => item.id), ['core', 'alpha', 'beta']);49 assert.equal(library.getPack('alpha').levels[0].id, 'new');50 library.installPack(pack('alpha', 'forked'), { keepBoth: true });51 library.removePack('alpha');52 assert.deepEqual(library.getPacks().map(item => item.id), ['core', 'beta', 'alpha-2']);53 const reloaded = createPackLibrary({ catalog: createCatalog({ coreLevels: [level('core')] }), storage: saved });54 assert.deepEqual(reloaded.getPacks().map(item => item.id), ['core', 'beta', 'alpha-2']);55 assert.equal(reloaded.getPack('alpha-2').manifest.forkOf, 'alpha');56});5758test('blocked storage falls back to memory without losing the active catalog', () => {59 const blocked = {60 getItem() { throw new Error('storage blocked'); },61 setItem() { throw new Error('quota exceeded'); },62 };63 const library = createPackLibrary({ catalog: createCatalog({ coreLevels: [level('core')] }), storage: blocked });64 library.installPack(pack('offline'));65 assert.equal(library.persistence.mode, 'memory');66 assert.match(library.persistence.error, /quota|blocked/);67 assert.deepEqual(library.getPacks().map(item => item.id), ['core', 'offline']);68 assert.deepEqual(library.persistedPacks.map(item => item.manifest.id), ['offline']);69});7071test('malformed stored entries are rejected without evaluating code or poisoning later packs', () => {72 const saved = storage(JSON.stringify({ schema: PACK_LIBRARY_SCHEMA, packs: [73 { manifest: { id: 'bad', name: 'Bad', version: '1.0.0' }, levels: 'not-an-array' },74 pack('good'),75 ] }));76 const library = createPackLibrary({ catalog: createCatalog({ coreLevels: [level('core')] }), storage: saved });77 assert.deepEqual(library.getPacks().map(item => item.id), ['core', 'good']);78 assert.equal(library.hydrate().errors.length, 0);79});8081test('saved library rejects forged bundled origin and oversized stored snapshots', () => {82 const saved = storage('x'.repeat(2 * 1024 * 1024 + 1));83 const library = createPackLibrary({ catalog: createCatalog({ coreLevels: [level('core')] }), storage: saved });84 assert.deepEqual(library.getPacks().map(item => item.id), ['core']);85 assert.throws(() => library.installPack(pack('fake'), { origin: 'bundled' }), /local file or a shared link/);86 assert.equal(library.getPack('fake'), undefined);87});