fix(core): preserve level child id types

This commit is contained in:
Aymeric Rabot
2026-07-23 12:22:03 +02:00
parent 3126b0b430
commit 08d1bbf017
2 changed files with 56 additions and 6 deletions
+4 -4
View File
@@ -50,10 +50,10 @@ describe('LevelNode', () => {
})
test('accepts level child IDs minted by plugins', () => {
expect(
LevelNode.parse({
const children = LevelNode.parse({
children: ['tree_plugin-child', 'flower_plugin-child', 'grass_plugin-child'],
}).children,
).toEqual(['tree_plugin-child', 'flower_plugin-child', 'grass_plugin-child'])
}).children as string[]
expect(children).toEqual(['tree_plugin-child', 'flower_plugin-child', 'grass_plugin-child'])
})
})
+51 -1
View File
@@ -1,13 +1,63 @@
import dedent from 'dedent'
import { z } from 'zod'
import { BaseNode, nodeType, objectId } from '../base'
import type { CeilingNode } from './ceiling'
import type { ColumnNode } from './column'
import type { DuctFittingNode } from './duct-fitting'
import type { DuctSegmentNode } from './duct-segment'
import type { DuctTerminalNode } from './duct-terminal'
import type { FenceNode } from './fence'
import type { GuideNode } from './guide'
import type { HvacEquipmentNode } from './hvac-equipment'
import type { ItemNode } from './item'
import type { LinesetNode } from './lineset'
import type { LiquidLineNode } from './liquid-line'
import type { MeasurementNode } from './measurement'
import type { PipeFittingNode } from './pipe-fitting'
import type { PipeSegmentNode } from './pipe-segment'
import type { PipeTrapNode } from './pipe-trap'
import type { RoofNode } from './roof'
import type { ScanNode } from './scan'
import type { ShelfNode } from './shelf'
import type { SlabNode } from './slab'
import type { SpawnNode } from './spawn'
import type { StairNode } from './stair'
import type { WallNode } from './wall'
import type { ZoneNode } from './zone'
type CoreLevelChildId =
| WallNode['id']
| FenceNode['id']
| ColumnNode['id']
| ItemNode['id']
| ZoneNode['id']
| SlabNode['id']
| CeilingNode['id']
| RoofNode['id']
| StairNode['id']
| ScanNode['id']
| GuideNode['id']
| MeasurementNode['id']
| SpawnNode['id']
| ShelfNode['id']
| DuctSegmentNode['id']
| DuctFittingNode['id']
| DuctTerminalNode['id']
| HvacEquipmentNode['id']
| LinesetNode['id']
| LiquidLineNode['id']
| PipeSegmentNode['id']
| PipeFittingNode['id']
| PipeTrapNode['id']
const LevelChildId = z.string().transform((id) => id as CoreLevelChildId)
export const LevelNode = BaseNode.extend({
id: objectId('level'),
type: nodeType('level'),
// The node registry owns child-kind validity. Persisted level relationships
// must also admit IDs minted by plugins that core cannot enumerate.
children: z.array(z.string()).default([]),
children: z.array(LevelChildId).default([]),
// Specific props
level: z.number().default(0),
}).describe(