Files
wehub-resource-sync 070959e133
landing-page-staging / Deploy landing page to staging (push) Has been skipped
landing-page-ci / Validate landing page (push) Failing after 4s
visual-baseline / Capture visual baselines (push) Has been cancelled
bake-plugin-previews / Bake plugin previews (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:00:47 +08:00

72 lines
2.3 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { mkdtemp, readFile, rm } from 'node:fs/promises';
import os from 'node:os';
import path from 'node:path';
import type { InstalledPluginRecord } from '@open-design/contracts';
import {
lockEntryFromInstalled,
readPluginLockfile,
upsertPluginLockfileEntry,
} from '../src/plugins/lockfile.js';
const plugin: InstalledPluginRecord = {
id: 'registry-starter',
title: 'Registry starter',
version: '0.1.0',
sourceKind: 'github',
source: 'github:nexu-io/open-design@main/plugins/community/registry-starter',
sourceMarketplaceId: 'community',
sourceMarketplaceEntryName: 'community/registry-starter',
sourceMarketplaceEntryVersion: '0.1.0',
marketplaceTrust: 'restricted',
resolvedSource: 'github:nexu-io/open-design@main/plugins/community/registry-starter',
resolvedRef: 'main',
manifestDigest: 'sha256:manifest',
archiveIntegrity: 'sha256:archive',
trust: 'restricted',
capabilitiesGranted: ['prompt:inject'],
manifest: {
specVersion: '1.0.0',
name: 'registry-starter',
version: '0.1.0',
title: 'Registry starter',
},
fsPath: '/tmp/registry-starter',
installedAt: 1,
updatedAt: 1,
};
describe('plugin lockfile', () => {
it('converts installed provenance into a reproducible lock entry', () => {
expect(lockEntryFromInstalled(plugin, 123)).toMatchObject({
name: 'community/registry-starter',
version: '0.1.0',
sourceMarketplaceId: 'community',
resolvedRef: 'main',
manifestDigest: 'sha256:manifest',
archiveIntegrity: 'sha256:archive',
lockedAt: 123,
});
});
it('writes stable .od/od-plugin-lock.json content', async () => {
const dir = await mkdtemp(path.join(os.tmpdir(), 'od-lock-'));
try {
const filePath = path.join(dir, '.od', 'od-plugin-lock.json');
await upsertPluginLockfileEntry(filePath, plugin, 123);
expect(await readPluginLockfile(filePath)).toMatchObject({
schemaVersion: 1,
plugins: {
'community/registry-starter': {
source: plugin.source,
archiveIntegrity: 'sha256:archive',
},
},
});
expect(await readFile(filePath, 'utf8')).toContain('"schemaVersion": 1');
} finally {
await rm(dir, { recursive: true, force: true });
}
});
});