{"record":{"id":"3a0a529053d177c6","repo":"denoland/deno","slug":"err-invalid-object-define-property","errorCode":"ERR_INVALID_OBJECT_DEFINE_PROPERTY","errorMessage":"'process.env' does not accept an accessor(getter/setter) descriptor","messagePattern":"'process\\.env' does not accept an accessor\\(getter/setter\\) descriptor","errorType":"error_code","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"ext/node/polyfills/_process/process.ts","lineNumber":182,"sourceCode":"      }\n\n      return typeof denoEnvGet(prop) === \"string\";\n    },\n    deleteProperty(target, key) {\n      if (typeof key === \"symbol\") {\n        delete target[key];\n        return true;\n      }\n\n      Deno.env.delete(String(key));\n      return true;\n    },\n    defineProperty(target, property, attributes) {\n      if (\n        ObjectHasOwn(attributes, \"get\") ||\n        ObjectHasOwn(attributes, \"set\")\n      ) {\n        throw new ERR_INVALID_OBJECT_DEFINE_PROPERTY(\n          \"'process.env' does not accept an \" +\n            \"accessor(getter/setter) descriptor\",\n        );\n      }\n\n      if (\n        !attributes?.configurable || !attributes?.enumerable ||\n        !attributes?.writable\n      ) {\n        throw new ERR_INVALID_OBJECT_DEFINE_PROPERTY(\n          \"'process.env' only accepts a \" +\n            \"configurable, writable,\" +\n            \" and enumerable data descriptor\",\n        );\n      }\n\n      if (typeof property === \"symbol\") {\n        ReflectDefineProperty(target, property, {","sourceCodeStart":164,"sourceCodeEnd":200,"githubUrl":"https://github.com/denoland/deno/blob/9ad36f7a2cce60488e6ec52283efb32efddaf93a/ext/node/polyfills/_process/process.ts#L164-L200","documentation":"ERR_INVALID_OBJECT_DEFINE_PROPERTY from process.env's defineProperty trap: environment entries are plain string data properties, so accessor descriptors cannot be honored. Any defineProperty call whose attributes include a get or set key (even alongside value) throws \"'process.env' does not accept an accessor(getter/setter) descriptor\" immediately.","triggerScenarios":"Object.defineProperty(process.env, 'FOO', { get: () => 'x', configurable: true }); — typical of mocking libraries or code trying to make env reads reactive.","commonSituations":"Test helpers stubbing env with getters; proxying process.env onto another object while preserving descriptors; DI containers registering env as a dynamic property.","solutions":["Use a plain data descriptor with value and all flags true","Stub by assignment: save the old value, assign, and restore in a finally block","Mock configuration at a higher level (inject a config object) instead of redefining process.env"],"exampleFix":"// before\nObject.defineProperty(process.env, 'NODE_ENV', { get: () => 'test', configurable: true }); // throws\n\n// after\nconst prev = process.env.NODE_ENV;\nprocess.env.NODE_ENV = 'test';\ntry { runTests(); } finally { process.env.NODE_ENV = prev; }","handlingStrategy":"validation","validationCode":"function defineEnv(name, value) {\n  Object.defineProperty(process.env, name, {\n    value: String(value),\n    writable: true,\n    enumerable: true,\n    configurable: true,\n  });\n}","typeGuard":"const isDataDescriptor = (d) => !('get' in d) && !('set' in d);","tryCatchPattern":null,"preventionTips":["Treat process.env as a string bag: only assignment and deletion","Wrap env stubbing in one test helper that uses save/assign/restore"],"tags":["process","env","define-property","testing","node-compat"],"backgroundTag":"invalid-property-descriptor","analyzedSha":"9ad36f7a2cce60488e6ec52283efb32efddaf93a","analyzedAt":"2026-08-20T13:07:44.778Z","contentChangedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}