一、问题(本轮实测)
`draw-ui` 与 `oil-motion` 目录里**各自带一个内嵌 `.git`** ⇒ 上一次提交把它们记成了 **gitlink(子模块指针)**
⇒ 仓库里只存了一个不属于任何远端的 commit id,**别人克隆下来这两份是空的** ✗(`git status` 显示 ` m draw-ui` / ` m oil-motion` = 子模块内容有改动)。
二、处置(可回退)
· 把两处的 `.git` **挪走**(⛔ 不是删除)⇒ `归档/内嵌git-20261008/{draw-ui,oil-motion}.git`;
· `git rm --cached` 掉那两个 gitlink,再 `git add` 两个目录 ⇒ **按正常文件入库**(内容才真的进仓库)。
三、副作用(如实记)
挪走 `.git` 后,这两个技能**不能再原地 `git pull` 取上游更新**(要更新得重新拉一份覆盖);
如需恢复其本地仓库,把 `归档/内嵌git-20261008/` 里的 `.git` 挪回原处即可。
28 lines
1.7 KiB
TypeScript
28 lines
1.7 KiB
TypeScript
import { readFile } from 'node:fs/promises';
|
|
import path from 'node:path';
|
|
import { loadManifest, object, PublicError, validateManifest, type Manifest } from './config.ts';
|
|
|
|
export type PageUI = { title?: string; label?: string; saveLabel?: string };
|
|
export function validatePageUI(ui: unknown): PageUI {
|
|
if (!object(ui) || Object.entries(ui).some(([key, value]) =>
|
|
!['title', 'label', 'saveLabel'].includes(key) || typeof value !== 'string' || !value.trim() || value.length > 120))
|
|
throw new PublicError('页面文案配置不合法。');
|
|
return ui as PageUI;
|
|
}
|
|
export function validateFields(fields: Manifest[]): Manifest[] {
|
|
if (!Array.isArray(fields) || fields.length < 1 || fields.length > 16) throw new PublicError('每页需要 1 至 16 项凭据声明。');
|
|
fields.forEach(validateManifest);
|
|
if (new Set(fields.map(field => field.credential)).size !== fields.length) throw new PublicError('同一页不能重复引用相同凭据。');
|
|
return fields;
|
|
}
|
|
export async function loadPage(file: string) {
|
|
let value: unknown;
|
|
try { value = JSON.parse(await readFile(file, 'utf8')); } catch { throw new PublicError('无法读取页面配置。'); }
|
|
if (!object(value) || value.version !== 1 || Object.keys(value).some(key => !['version', 'manifests', 'ui'].includes(key))
|
|
|| !Array.isArray(value.manifests) || !value.manifests.length || value.manifests.length > 16
|
|
|| value.manifests.some(item => typeof item !== 'string' || !item.trim())) throw new PublicError('页面配置不合法。');
|
|
const ui = validatePageUI(value.ui ?? {});
|
|
const manifests = validateFields(await Promise.all(value.manifests.map(item => loadManifest(path.resolve(path.dirname(file), item)))));
|
|
return { manifests, ui };
|
|
}
|