/** * Reading a registry record into the shape every package reads the same way: * what installs it, what it weighs, and every release it holds. */ import { beforeEach, describe, expect, it } from 'vitest'; import { account } from '../src/lib/git.js'; import { npmPackage, ociImage, ociPullRef } from '../src/lib/packages.js'; beforeEach(() => { account.did = 'did:plc:owner'; account.pds = 'https://pds.example.com'; account.handle = 'owner.example.com'; }); /** @param {string} version @param {number} tarball @param {number} manifest */ const version = (version_, tarball, manifest) => ({ version: version_, tarball: { size: tarball }, manifest: { size: manifest }, publishedAt: `2026-08-0${version_.slice(-1)}T00:00:00.000Z`, }); describe('npmPackage', () => { const record = { name: '@scope/lib', distTags: [ { tag: 'latest', version: '1.1.0' }, { tag: 'next', version: '2.0.0' }, ], versions: [version('1.0.0', 100, 20), version('1.1.0', 300, 20)], updatedAt: '2026-08-02T00:00:00.000Z', }; it('names the command that installs it from this account', () => { expect(npmPackage(record, '@scope/lib').install).toBe( 'npm install @scope/lib --registry https://pds.example.com/npm/', ); }); it('reads the latest dist-tag as the version that command installs', () => { expect(npmPackage(record, '@scope/lib').latest).toBe('1.1.0'); }); it('adds up the tarball and manifest blobs of every version', () => { expect(npmPackage(record, '@scope/lib').size).toBe(440); }); it('lists the versions newest first', () => { expect( npmPackage(record, '@scope/lib').releases.map((entry) => entry.name), ).toEqual(['1.1.0', '1.0.0']); }); it('reads a record with nothing published', () => { const empty = npmPackage({ name: 'lib' }, 'lib'); expect(empty.releases).toEqual([]); expect(empty.size).toBe(0); expect(empty.latest).toBe(''); }); }); describe('ociImage', () => { const record = { name: 'app/server', tags: [ { tag: 'latest', digest: 'sha256:aa' }, { tag: '1.2.0', digest: 'sha256:bb' }, ], manifests: [ { digest: 'sha256:aa', blob: { size: 500 } }, { digest: 'sha256:bb', blob: { size: 400 } }, ], layers: [{ blob: { size: 9000 } }], updatedAt: '2026-08-02T00:00:00.000Z', }; it('names the pull command, which reads the PDS host without a scheme', () => { expect(ociImage(record, 'app/server').install).toBe( 'docker pull pds.example.com/app/server:latest', ); expect(ociPullRef('app/server')).toBe('pds.example.com/app/server'); }); it('counts every manifest and layer once, since tags share layers', () => { expect(ociImage(record, 'app/server').size).toBe(9900); }); it('reads a tag as a release, sized by its own manifest', () => { expect(ociImage(record, 'app/server').releases).toEqual([ { name: 'latest', size: 500, digest: 'sha256:aa' }, { name: '1.2.0', size: 400, digest: 'sha256:bb' }, ]); }); it('pulls the first tag where the image has no latest', () => { const tagged = ociImage( { ...record, tags: [{ tag: '1.2.0', digest: 'sha256:bb' }] }, 'app/server', ); expect(tagged.install).toBe('docker pull pds.example.com/app/server:1.2.0'); }); it('reads an image with no tag at all', () => { const untagged = ociImage({ name: 'app/server' }, 'app/server'); expect(untagged.install).toBe('docker pull pds.example.com/app/server'); expect(untagged.latest).toBe(''); }); });