校验 AGC 发布媒体前缀与 Rust 常量一致
- check-game-distribution-dto-parity 增加发布媒体 objectKey 前缀的逐字比对 - 前缀漂移会让 UI 把沿用键当本地路径(或反之),此前无门禁覆盖
This commit is contained in:
@@ -26,6 +26,10 @@ const CREATOR_RUST_FILE = 'server-rs/crates/shared-contracts/src/creator.rs';
|
||||
const CREATOR_TS_FILE = 'packages/shared/src/contracts/creator.ts';
|
||||
const API_MODULE_FILE =
|
||||
'server-rs/crates/api-server/src/modules/game_distribution.rs';
|
||||
// AGC 手写的发布媒体前缀常量:Rust 的 `GAME_DISTRIBUTION_MEDIA_PREFIX` 是唯一真源,这里顺带比对,
|
||||
// 因为两边都靠这段前缀区分「沿用线上 objectKey」与「项目内本地路径」。
|
||||
const AGC_PUBLISH_TS_FILE =
|
||||
'apps/ai-game-creator-shell/src/services/gameDistributionPublish.ts';
|
||||
|
||||
// ts-rs 生成的类型:结构一致性由 `check:generated-bindings` 逐字节保证,
|
||||
// 本脚本不逐字段复核,只在「Rust 类型都登记过」的清单里显式跳过。
|
||||
@@ -633,6 +637,31 @@ const failures = [];
|
||||
const mappedRust = new Set(PAIRS.map(([rustName]) => rustName));
|
||||
const mappedTs = new Set(PAIRS.map(([, tsName]) => tsName));
|
||||
|
||||
// 发布媒体前缀不是 DTO 字段,容易在改名 / 搬迁时两边漂移,单独钉一条逐字一致的断言。
|
||||
{
|
||||
const rustPrefix =
|
||||
/pub const GAME_DISTRIBUTION_MEDIA_PREFIX: &str =\s*"([^"]+)";/.exec(
|
||||
fs.readFileSync(RUST_FILE, 'utf8'),
|
||||
)?.[1];
|
||||
const agcPrefix =
|
||||
/GAME_DISTRIBUTION_MEDIA_OBJECT_KEY_PREFIX\s*=\s*'([^']+)'/.exec(
|
||||
fs.readFileSync(AGC_PUBLISH_TS_FILE, 'utf8'),
|
||||
)?.[1];
|
||||
if (!rustPrefix) {
|
||||
failures.push(
|
||||
'未能在 shared-contracts 解析出 GAME_DISTRIBUTION_MEDIA_PREFIX',
|
||||
);
|
||||
} else if (!agcPrefix) {
|
||||
failures.push(
|
||||
`未能在 ${AGC_PUBLISH_TS_FILE} 解析出 GAME_DISTRIBUTION_MEDIA_OBJECT_KEY_PREFIX`,
|
||||
);
|
||||
} else if (rustPrefix !== agcPrefix) {
|
||||
failures.push(
|
||||
`发布媒体 objectKey 前缀不一致:Rust=${rustPrefix} / AGC=${agcPrefix}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
for (const [rustName, tsName] of PAIRS) {
|
||||
const rustDefinition = rust.get(rustName);
|
||||
const tsDefinition = ts.get(tsName);
|
||||
|
||||
Reference in New Issue
Block a user