import type { ResourceContextVersion } from '../context.js'; import type { KNOWN_RESOURCE_TYPE_ID, ResourceOf, ResourceRevisionOf } from '../known-resource-types.js'; import { ResourcePermission } from '../permission.js'; /** 通用迁移过程 */ export function preMigrate(type: T, resource: ResourceOf): void { if (resource == null || typeof resource != 'object') { throw new TypeError(`Invalid ${type} object`); } const revision = resource?.revision; if (revision == null || typeof revision !== 'object') { throw new TypeError(`Invalid ${type} revision object`); } const revVersion = revision.version ?? 1; if (typeof revVersion != 'number' || !Number.isFinite(revVersion)) { throw new TypeError(`Invalid ${type} revision version: ${JSON.stringify(revVersion)}`); } // 初始化缺失字段 resource.name ??= ''; resource.description ??= ''; resource.tags ??= []; resource.keywords ??= []; resource.context ??= { version: 4 as ResourceContextVersion }; resource.context.version ??= 4 as ResourceContextVersion; resource.permissions ??= { moderator: ResourcePermission.EMPTY, member: ResourcePermission.EMPTY, everyone: ResourcePermission.EMPTY, }; revision.version = revVersion; revision.author ??= ''; revision.message ??= ''; revision.documentation ??= ''; } /** revision 迁移 */ export async function migrateRevision( type: T, revision: ResourceRevisionOf, migrator: (resource: ResourceOf) => Promise, ): Promise { const resource = { revision, context: { version: revision.version as number as ResourceContextVersion }, } as ResourceOf; await migrator(resource); }