{"record":{"id":"7196653275ea08a6","repo":"BabylonJS/Babylon.js","slug":"required-extension-name-is-disabled","errorCode":null,"errorMessage":"Required extension ${name} is disabled","messagePattern":"Required extension (.+?) is disabled","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/dev/loaders/src/glTF/2.0/glTFLoader.pure.ts","lineNumber":734,"sourceCode":"\r\n                        this._parent.onExtensionLoadedObservable.notifyObservers(extension);\r\n                        return extension;\r\n                    })()\r\n                );\r\n            }\r\n        });\r\n\r\n        this._extensions.push(...(await Promise.all(extensionPromises)));\r\n\r\n        this._extensions.sort((a, b) => (a.order || Number.MAX_VALUE) - (b.order || Number.MAX_VALUE));\r\n        this._parent.onExtensionLoadedObservable.clear();\r\n\r\n        if (this._gltf.extensionsRequired) {\r\n            for (const name of this._gltf.extensionsRequired) {\r\n                const available = this._extensions.some((extension) => extension.name === name && extension.enabled);\r\n                if (!available) {\r\n                    if (this.parent.extensionOptions[name]?.enabled === false) {\r\n                        throw new Error(`Required extension ${name} is disabled`);\r\n                    }\r\n                    throw new Error(`Required extension ${name} is not available`);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    private _createRootNode(): INode {\r\n        if (this._parent.customRootNode !== undefined) {\r\n            this._rootBabylonMesh = this._parent.customRootNode;\r\n            return {\r\n                _babylonTransformNode: this._rootBabylonMesh === null ? undefined : this._rootBabylonMesh,\r\n                index: -1,\r\n            };\r\n        }\r\n        this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n        const rootMesh = new Mesh(\"__root__\", this._babylonScene);\r\n        this._rootBabylonMesh = rootMesh;\r","sourceCodeStart":716,"sourceCodeEnd":752,"githubUrl":"https://github.com/BabylonJS/Babylon.js/blob/0592b347b8a4ee0236089ea86a749cacfdb266d8/packages/dev/loaders/src/glTF/2.0/glTFLoader.pure.ts#L716-L752","documentation":"The glTF asset declares an extension in its 'extensionsRequired' list, and an extension with that name is registered and enabled, but the user explicitly disabled it via loader extensionOptions. Because the asset cannot be correctly loaded without a required extension, the loader refuses to proceed.","triggerScenarios":"loader.extensionOptions['KHR_draco_mesh_compression'].enabled = false (or similar) combined with loading a .glb/.gltf whose extensionsRequired includes that extension.","commonSituations":"Disabling extensions to test fallbacks or reduce bundle size; copy-pasted loader configuration from another project; a shared loader factory that disables certain extensions by default.","solutions":["Remove the enabled:false override for the required extension in extensionOptions","Register the needed extension plugin (e.g. GLTFLoaderDracoCompression) and ensure it is enabled","Re-export the glTF asset without the required extension if you cannot support it","Check this._gltf.extensionsRequired in the asset to see which extensions must be enabled"],"exampleFix":"// before\nconst loader = new GLTFLoader();\nloader.extensionOptions[\"KHR_draco_mesh_compression\"] = { enabled: false };\n// after\nconst loader = new GLTFLoader();\n// do not disable an extension that the asset lists in extensionsRequired\nloader.extensionOptions[\"KHR_draco_mesh_compression\"] = { enabled: true };","handlingStrategy":"validation","validationCode":"// Check required extensions against your loader config before loading\nconst required = gltf.extensionsRequired ?? [];\nfor (const name of required) {\n  if (loader.extensionOptions[name]?.enabled === false) {\n    throw new Error(`Re-enable ${name}: asset requires it`);\n  }\n}","typeGuard":"function isExtensionEnabled(loader, name) {\n  return loader.extensionOptions[name]?.enabled !== false;\n}","tryCatchPattern":"try {\n  await loader.loadAsync(url);\n} catch (e) {\n  if (/is disabled$/.test(e.message)) {\n    const ext = e.message.match(/Required extension (\\S+) is disabled/)?.[1];\n    console.warn(`Enable extensionOptions[${ext}] to load this asset`);\n  } else throw e;\n}","preventionTips":["Never set enabled:false on extensions your assets declare in extensionsRequired","Audit loader configuration after copy-pasting from other projects"],"tags":["gltf","extensions","configuration"],"backgroundTag":"required-gltf-extension-missing","analyzedSha":"0592b347b8a4ee0236089ea86a749cacfdb266d8","analyzedAt":"2026-08-30T15:11:20.442Z","schemaVersion":2},"datasetVersion":"2026-08-30T18:17:15.746Z"}