Configuring a property on the process.env object and deleting it results in weird behaviour.
Documented in gist//60e654342532f80ae264128909e84198
curl -s https://gist.githubusercontent.com/iamogbz/60e654342532f80ae264128909e84198/raw/9329e2a1595b3b365d43ca5e59f242251df56f96/process.env.test.js | node
Seems like once a property has been configured with a getter setter, then the property can never be truly deleted from the process.env object
output on node v10.15
>>> plain object <<<
prop is not defined
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false
prop is declared as 1 with assignment (=)
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true
prop is deleted true
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false
prop is configured as 1 with value
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true
prop is deleted true
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false
prop is configured as 1 with getter|setter
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true
prop is deleted true
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false
prop is redeclared as 1 with assignment (=)
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true
prop is deleted true
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false
>>> process.env <<<
prop is not defined
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false
prop is declared as 1 with assignment (=)
value "1"
hasProperty undefinedProp true
ownProperty undefinedProp true
prop is deleted true
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false
prop is configured as 1 with value
value "1"
hasProperty undefinedProp true
ownProperty undefinedProp true
prop is deleted true
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false
prop is configured as 1 with getter|setter
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true
prop is deleted true
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true
prop is redeclared as 1 with assignment (=)
value "1"
hasProperty undefinedProp true
ownProperty undefinedProp true
prop is deleted true
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true
This seems to me to be correct. by default, values added using Object.defineProperty() are immutable.
edited: should not return true(delete env[prop]).
Fwiw, this is happening because the NamedPropertyHandlerConfiguration we use for process.env does not handle Object.defineProperty() (although we could add that), but we do handle delete and still actually attempt to delete the environment variable.
It鈥檚 not obvious to me what we should do when Object.defineProperty() with a getter/setter pair is used on process.env.
where is code related code? I couldn't find...馃槙
@Himself65 It's here:
I agree with @addaleax that it's because of the missing GenericNamedPropertyDefinerCallback. There's an overload of NamedPropertyHandlerConfiguration that accepts a definer callback.
That said, accessors or non-configurable/enumerable/writable properties aren't meaningful on process.env. I think the logical course of action is to throw an exception or add a note to the docs saying "don't do that" - or both.
yes, I think no one will add a changeable value on process.env.馃
but, I'm trying to add something to fix it
Most helpful comment
@Himself65 It's here:
https://github.com/nodejs/node/blob/aa8b820aaa4d36085baaf8beb1187b2b9955fffb/src/node_env_var.cc#L397-L399
I agree with @addaleax that it's because of the missing
GenericNamedPropertyDefinerCallback. There's an overload ofNamedPropertyHandlerConfigurationthat accepts a definer callback.That said, accessors or non-configurable/enumerable/writable properties aren't meaningful on
process.env. I think the logical course of action is to throw an exception or add a note to the docs saying "don't do that" - or both.