{"record":{"id":"d505df9a8781df1c","repo":"emberjs/ember.js","slug":"you-attempted-to-set-string-prop-on-a-factor","errorCode":null,"errorMessage":"You attempted to set \"${String(prop)}\" on a factory manager created by container#factoryFor. A factory manager is a read-only construct.","messagePattern":"You attempted to set \"(.+?)\" on a factory manager created by container#factoryFor\\. A factory manager is a read-only construct\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/@ember/-internals/container/lib/container.ts","lineNumber":248,"sourceCode":"\n    return factoryFor(this, normalizedName, fullName);\n  }\n}\n\nif (DEBUG) {\n  Container._leakTracking = leakTracking!;\n}\n\n/*\n * Wrap a factory manager in a proxy which will not permit properties to be\n * set on the manager.\n */\nfunction wrapManagerInDeprecationProxy<T extends object, C extends object | FactoryClass>(\n  manager: InternalFactoryManager<T, C>\n): InternalFactoryManager<T, C> {\n  let validator = {\n    set(_obj: T, prop: keyof T) {\n      throw new Error(\n        `You attempted to set \"${String(\n          prop\n        )}\" on a factory manager created by container#factoryFor. A factory manager is a read-only construct.`\n      );\n    },\n  };\n\n  // Note:\n  // We have to proxy access to the manager here so that private property\n  // access doesn't cause the above errors to occur.\n  let m = manager;\n  let proxiedManager = {\n    class: m.class,\n    create(props?: Partial<T>) {\n      return m.create(props);\n    },\n  };\n","sourceCodeStart":230,"sourceCodeEnd":266,"githubUrl":"https://github.com/emberjs/ember.js/blob/26f97246a8bf2e28edf26ac3093da2e86c04ffc5/packages/@ember/-internals/container/lib/container.ts#L230-L266","documentation":"The object returned by factoryFor is wrapped in a read-only deprecation proxy; assigning any property on it throws. Factory managers expose .class/.create and are not mutable extension points.","triggerScenarios":"Writing to a property on the result of factoryFor, e.g. factoryFor('service:x').class.someProp = 1, or doing Object.assign on the manager.","commonSituations":"Attempting monkey-patching of a factory/class via the manager (a pattern from old Ember.Factory usage); accidental assignment instead of comparison (= vs ==) in code touching the manager.","solutions":["Stop mutating the factory; register a subclass or use an initializer with register() instead","If you need configured instances, pass options to manager.create(props)","Fix accidental '=' assignment intended as comparison"],"exampleFix":"// before\nlet factory = owner.factoryFor('service:store');\nfactory.someFlag = true;\n// after\nowner.register('service:store', MyConfiguredStore);","handlingStrategy":"type-guard","validationCode":"let mgr = owner.factoryFor('service:foo'); console.assert(Object.isFrozen(mgr) || mgr instanceof Object); // treat as read-only","typeGuard":"function isFactoryManager(v) { return v && typeof v.create === 'function' && 'class' in v; }","tryCatchPattern":"try { mgr[prop] = value; } catch (e) { if (String(e.message).includes('read-only construct')) { /* register subclass instead */ } else throw e; }","preventionTips":["Never mutate factory managers or their .class","Use owner.register() to swap implementations","Pass config via create(props)","Watch for accidental '=' assignments"],"tags":["ember","container","read-only","factory-manager"],"backgroundTag":"read-only-object-assignment","analyzedSha":"26f97246a8bf2e28edf26ac3093da2e86c04ffc5","analyzedAt":"2026-09-01T05:01:28.182Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}