fix: identity-check name resolutions across the pasted closure; exclude the catalog from i18n pairing
Review findings on the config catalog: The transitive-paste closure deduplicated by bare name, so two DIFFERENT package-local declarations sharing a name would silently collapse to the first one pasted — and a reference satisfied by the wrong declaration is a wrong catalog, not just a thin one. Every resolution is now identity-checked by source pointer: reaching the same declaration again is benign, while a name that resolves to two distinct declarations, to conflicting imports, or to a declaration in one file and an import in another is a violation — a verbatim fence has a single flat namespace, so the fix is a rename at the source. A spec case pins the two-declarations collision. docs/config-catalog.md also joins the translation-pairing exclusions: it is a generated English-only doc, and without the entry the gate would accept a hand-added .zh.md twin it must reject.
This commit is contained in:
@@ -196,6 +196,26 @@ export function apply(ctx: Context, config: Config): void {}
|
||||
`,
|
||||
}))).toThrow(/config type 'Config' is imported from '@fix\/dep'/)
|
||||
})
|
||||
|
||||
it('hard-errors when one name resolves to two different declarations across the closure', () => {
|
||||
expect(() => collectConfigCatalog(make({
|
||||
'src/index.ts': `import type { Context } from 'cordis'
|
||||
import type { A } from './a.ts'
|
||||
import type { B } from './b.ts'
|
||||
/** Fixture config. */
|
||||
export interface Config {
|
||||
/** A. */
|
||||
a?: A
|
||||
/** B. */
|
||||
b?: B
|
||||
}
|
||||
/** Load. */
|
||||
export function apply(ctx: Context, config: Config): void {}
|
||||
`,
|
||||
'src/a.ts': '/** First Option. */\nexport interface Option {\n /** X. */\n x?: string\n}\n/** A. */\nexport interface A {\n /** O. */\n o?: Option\n}\n',
|
||||
'src/b.ts': '/** Second Option. */\nexport interface Option {\n /** Y. */\n y?: string\n}\n/** B. */\nexport interface B {\n /** O. */\n o?: Option\n}\n',
|
||||
}))).toThrow(/type name 'Option' resolves to two different declarations/)
|
||||
})
|
||||
})
|
||||
|
||||
describe('gen-config-catalog schema cross-check', () => {
|
||||
|
||||
Reference in New Issue
Block a user