testing.FakeModel.nodes ​Contract 2.0.0 · package sha256
a857eca95b35921109faf997094bb4192f12527d9d0fcd4be7e97f06425bad6e· generated fromtesting.d.tsbyservices/onsite-scripter/scripts/build-contract-docs.mjs; edit the source, not this file.
Property of testing.FakeModel · stable · since 2.0.0
nodes: ReadonlyArray<{
name: string;
id?: string;
parent?: string | null;
mesh?: boolean;
tags?: string[];
slot?: string;
joint?: boolean;
bounds?: {
min: {
x: number;
y: number;
z: number;
};
max: {
x: number;
y: number;
z: number;
};
};
doubleSided?: boolean;
uvChannels?: number[];
material?: Pick<MaterialSpec, 'baseColor' | 'metallic' | 'roughness' | 'alpha' | 'alphaMode' | 'alphaCutoff' | 'side' | 'emissive' | 'emissiveStrength'>;
}>;
Declared node tree of a GLB (names, ids, tags, slots, joints, local bounds). parent is
another entry's id, else its name. List a connector plane here too, as a mesh entry named as its
connector (the GLB holds it as a mesh), when a test reads it as a part: the fake then hides
it, never picks it and marks it a connector, as the runtime does. connectors alone drives
assembly (attach, candidates, connectors) and adds no part, so find() doesn't see it.
A mesh entry's material declares its GLB material's own values, which Part.material reads.
Imports: values (has, validate, the Holo*Error classes, the pure helpers) from @holostep-configurators/runtime-client, types from @holostep-configurators/runtime-client/contract, /math and /testing names from those entries; boot from the runtime module the root's loadRuntimeAtFloor resolves to. A type your page defines is your app's: declare it there, never import it from the package.
Compiled under the contract's strict settings (examples/declaration/24-FakeModel.nodes.ts):
import { createFakeSession } from '@holostep-configurators/runtime-client/testing';
import type { IModelNode, Session } from '@holostep-configurators/runtime-client/contract';
import type { FakeModel } from '@holostep-configurators/runtime-client/testing';
declare const session: Session;
declare const signal: AbortSignal;
declare const cabinet: IModelNode; // glbUrl 'cabinet.glb'
const model: FakeModel = {
nodes: [{ name: 'Body', mesh: true, slot: 'Oak', material: { baseColor: '#ceb390', metallic: 0, roughness: 0.7 } }],
};
export const fake = createFakeSession({ models: { 'cabinet.glb': model }, root: [cabinet] });
// once the root has loaded: { baseColor: '#ceb390', metallic: 0, roughness: 0.7 }, as the runtime reads the GLB
export const glbLook = () => fake.find({ name: 'Body' }).first()?.material?.spec;
| Rule | Result |
|---|---|
| 1. Neutral name | pass: nodes names no product |
| 2. A precedent | not recorded: no ledger row (coverage.json) names this member or its owner |
| 3. Two apps, or labs | not recorded: no ledger row names this member or its owner |
| 4. The cheaper fix first | not recorded per member (Appendix B decides it per need) |