{"record":{"id":"03341b073cf2c131","repo":"mrdoob/three.js","slug":"no-primitive-name","errorCode":null,"errorMessage":"no primitive ${name}","messagePattern":"no primitive (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"manual/resources/threejs-primitives.js","lineNumber":880,"sourceCode":"\n\t\tparent.appendChild( elem );\n\t\treturn elem;\n\n\t}\n\n\tfunction addDiv( parent, className ) {\n\n\t\treturn addElem( parent, 'div', className );\n\n\t}\n\n\tfunction createPrimitiveDOM( base ) {\n\n\t\tconst name = base.dataset.primitive;\n\t\tconst info = diagrams[ name ];\n\t\tif ( ! info ) {\n\n\t\t\tthrow new Error( `no primitive ${name}` );\n\n\t\t}\n\n\t\tconst text = base.innerHTML;\n\t\tbase.innerHTML = '';\n\n\t\tconst pair = addDiv( base, 'pair' );\n\t\tconst elem = addDiv( pair, 'shape' );\n\n\t\tconst right = addDiv( pair, 'desc' );\n\t\taddDeepLink( right, '#', `#${base.id}` );\n\t\taddLink( right, name );\n\t\taddDiv( right, '.note' ).innerHTML = text;\n\n\t\t// I get that this is super brittle. I think I'd have to\n\t\t// work through a bunch more examples to come up with a better\n\t\t// structure. Also, I don't want to generate actual code and\n\t\t// use eval. (maybe a bad striction)","sourceCodeStart":862,"sourceCodeEnd":898,"githubUrl":"https://github.com/mrdoob/three.js/blob/da05705fa31f02710c19772a2aa70c7454807f0c/manual/resources/threejs-primitives.js#L862-L898","documentation":"Thrown by threejs-primitives.js createPrimitiveDOM() when an element carries data-primitive=\"X\" but the file's diagrams object has no key X. Despite the message saying 'no primitive', the lookup is into the shared diagrams map keyed by the data-primitive value. The primitive page uses data-primitive (not data-diagram) for these parameterized geometry demos.","triggerScenarios":"Adding <div data-primitive=\"BoxGeometry\"> to the primitives lesson without a diagrams.BoxGeometry entry. A typo or case mismatch in the data-primitive value (the lookup is case-sensitive).","commonSituations":"Authoring a new primitive demo in the manual: you write the HTML block with data-primitive but forget to register the primitive factory in the diagrams map. Renaming a primitive builder key but not the HTML attribute.","solutions":["For every data-primitive=\"X\" in the page, ensure diagrams.X is defined (it should expose create() and, for interactive params, a ui map).","Check for case sensitivity / typos: the attribute value must exactly equal the diagrams key.","Remove the data-primitive attribute if the element is not a primitive demo."],"exampleFix":"// HTML: <div data-primitive=\"LatheGeometry\"></div>\n// before — diagrams lacks 'LatheGeometry'\nconst diagrams = {\n  CylinderGeometry: { create: makeCylinder, ui: { /*...*/ } },\n};\n\n// after\nconst diagrams = {\n  CylinderGeometry: { create: makeCylinder, ui: { /*...*/ } },\n  LatheGeometry: { create: makeLathe, ui: { /*...*/ } },\n};","handlingStrategy":"validation","validationCode":"function assertPrimitivesRegistered( diagrams ) {\n  const missing = [ ...document.querySelectorAll( '[data-primitive]' ) ]\n    .map( el => el.dataset.primitive )\n    .filter( name => ! diagrams[ name ] );\n  if ( missing.length ) throw new Error( `Unregistered primitives: ${missing.join( ', ' )}` );\n}","typeGuard":"function isPrimitiveInfo( v ) {\n  return v !== null && typeof v === 'object' && typeof v.create === 'function';\n}","tryCatchPattern":"document.querySelectorAll( '[data-primitive]' ).forEach( base => {\n  const info = diagrams[ base.dataset.primitive ];\n  if ( ! info ) { console.warn( 'skip unknown primitive:', base.dataset.primitive ); return; }\n  try { createPrimitiveDOM( base ); } catch ( e ) { console.error( base.dataset.primitive, e ); }\n} );","preventionTips":["data-primitive values are case-sensitive and must equal the diagrams key exactly.","Register every primitive's create() (and ui map if interactive) before adding the HTML block.","Use data-primitive for parameterized demos and data-diagram for static ones."],"tags":["manual","primitives","lesson","dom-driven"],"backgroundTag":null,"analyzedSha":"da05705fa31f02710c19772a2aa70c7454807f0c","analyzedAt":"2026-08-12T22:51:37.160Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}