{"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":"exception","errorClass":"NodeTypeError","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/89f33cbef296a2b287f323d42de54c871fa69c77/ext/node/polyfills/_process/process.ts#L164-L200","documentation":"The defineProperty trap of the process.env Proxy rejects accessor descriptors: any attributes object containing get or set throws ERR_INVALID_OBJECT_DEFINE_PROPERTY with the 'does not accept an accessor(getter/setter) descriptor' message. process.env is backed by real OS environment strings, so per-variable getter/setter semantics cannot be represented.","triggerScenarios":"Object.defineProperty(process.env, 'K', { get() {...}, set(v) {...} }); test spies/stubs that redefine env properties via defineProperty; frameworks trying to make env reads observable or reactive.","commonSituations":"Test tooling stubbing env vars (sinon-style); reactive-config libraries wrapping env in accessors; porting browser-style observable patterns onto process.env.","solutions":["Use plain assignment instead: process.env.K = 'v'","Wrap env access in your own config object if you need getters/computed values","In tests, save the old value, assign, and restore afterwards rather than redefining","Delete with delete process.env.K during cleanup"],"exampleFix":"// before\nObject.defineProperty(process.env, 'NODE_ENV', {\n  get: () => 'test',\n  configurable: true,\n}); // throws\n\n// after\nprocess.env.NODE_ENV = 'test';","handlingStrategy":"validation","validationCode":"function isAccessorDescriptor(attrs) {\n  return !!attrs && ('get' in attrs || 'set' in attrs);\n}\nif (isAccessorDescriptor(desc)) {\n  process.env[key] = String(desc.value ?? ''); // use assignment instead\n} else {\n  Object.defineProperty(process.env, key, desc);\n}","typeGuard":null,"tryCatchPattern":"try {\n  Object.defineProperty(process.env, k, desc);\n} catch (e) {\n  if (e.code === 'ERR_INVALID_OBJECT_DEFINE_PROPERTY') {\n    process.env[k] = String(desc.value);\n  } else throw e;\n}","preventionTips":["Treat process.env as a plain string map, not an object to instrument","Build a typed config layer over env instead of getters on env itself","In tests, use save/assign/restore helpers instead of defineProperty stubs"],"tags":["process","env","define-property","node-compat"],"backgroundTag":null,"analyzedSha":"89f33cbef296a2b287f323d42de54c871fa69c77","analyzedAt":"2026-08-16T07:54:21.310Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}