- tools/install.sh: standalone installer/upgrader, curl-pipe safe (main() wrapper, process.argv instead of stdin, mkdir -p prefix) - packages/mosaic/src/runtime/update-checker.ts: version check module with 1h cache at ~/.cache/mosaic/update-check.json - CLI startup: non-blocking background update check on every invocation - 'mosaic update' command: explicit check + install (--check for CI) - session-start.sh: warns agents when CLI is outdated - Proper semver comparison including pre-release precedence - eslint: allow __tests__ in packages/mosaic for projectService
53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { semverLt, formatUpdateNotice } from '../src/runtime/update-checker.js';
|
|
import type { UpdateCheckResult } from '../src/runtime/update-checker.js';
|
|
|
|
describe('semverLt', () => {
|
|
it('returns true when a < b', () => {
|
|
expect(semverLt('0.0.1', '0.0.2')).toBe(true);
|
|
expect(semverLt('0.1.0', '0.2.0')).toBe(true);
|
|
expect(semverLt('1.0.0', '2.0.0')).toBe(true);
|
|
expect(semverLt('0.0.1-alpha.1', '0.0.1-alpha.2')).toBe(true);
|
|
expect(semverLt('0.0.1-alpha.1', '0.0.1')).toBe(true);
|
|
});
|
|
|
|
it('returns false when a >= b', () => {
|
|
expect(semverLt('0.0.2', '0.0.1')).toBe(false);
|
|
expect(semverLt('1.0.0', '1.0.0')).toBe(false);
|
|
expect(semverLt('2.0.0', '1.0.0')).toBe(false);
|
|
});
|
|
|
|
it('returns false for empty strings', () => {
|
|
expect(semverLt('', '1.0.0')).toBe(false);
|
|
expect(semverLt('1.0.0', '')).toBe(false);
|
|
expect(semverLt('', '')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('formatUpdateNotice', () => {
|
|
it('returns empty string when up to date', () => {
|
|
const result: UpdateCheckResult = {
|
|
current: '1.0.0',
|
|
latest: '1.0.0',
|
|
updateAvailable: false,
|
|
checkedAt: new Date().toISOString(),
|
|
registry: 'https://example.com',
|
|
};
|
|
expect(formatUpdateNotice(result)).toBe('');
|
|
});
|
|
|
|
it('returns a notice when update is available', () => {
|
|
const result: UpdateCheckResult = {
|
|
current: '0.0.1',
|
|
latest: '0.1.0',
|
|
updateAvailable: true,
|
|
checkedAt: new Date().toISOString(),
|
|
registry: 'https://example.com',
|
|
};
|
|
const notice = formatUpdateNotice(result);
|
|
expect(notice).toContain('0.0.1');
|
|
expect(notice).toContain('0.1.0');
|
|
expect(notice).toContain('Update available');
|
|
});
|
|
});
|