@@ -28,6 +28,7 @@ using v8::Nothing;
2828using v8::Object;
2929using v8::ObjectTemplate;
3030using v8::PropertyCallbackInfo;
31+ using v8::PropertyDescriptor;
3132using v8::PropertyHandlerFlags;
3233using v8::ReadOnly;
3334using v8::String;
@@ -396,11 +397,39 @@ static void EnvEnumerator(const PropertyCallbackInfo<Array>& info) {
396397 env->env_vars ()->Enumerate (env->isolate ()));
397398}
398399
400+ static void EnvDefiner (Local<Name> property,
401+ const PropertyDescriptor& desc,
402+ const PropertyCallbackInfo<Value>& info) {
403+ Environment* env = Environment::GetCurrent (info);
404+ if (desc.has_value () && !desc.configurable () && !desc.enumerable () &&
405+ !desc.writable ()) {
406+ THROW_ERR_INVALID_OBJECT_DEFINE_PROPERTY (env,
407+ " Must set all attributes with true to 'value'"
408+ " in 'process.env'" );
409+ } else if (desc.has_get () || desc.has_set () ||
410+ (desc.has_configurable () && !desc.configurable ()) ||
411+ (desc.has_enumerable () && !desc.enumerable ()) ||
412+ (desc.has_writable () && !desc.writable ())) {
413+ THROW_ERR_INVALID_OBJECT_DEFINE_PROPERTY (env,
414+ " Cannot set attributes other than 'value'"
415+ " for properties in 'process.env'" );
416+ } else {
417+ EnvSetter (property, desc.value (), info);
418+ }
419+ }
420+
399421MaybeLocal<Object> CreateEnvVarProxy (Local<Context> context, Isolate* isolate) {
400422 EscapableHandleScope scope (isolate);
401423 Local<ObjectTemplate> env_proxy_template = ObjectTemplate::New (isolate);
402424 env_proxy_template->SetHandler (NamedPropertyHandlerConfiguration (
403- EnvGetter, EnvSetter, EnvQuery, EnvDeleter, EnvEnumerator, Local<Value>(),
425+ EnvGetter,
426+ EnvSetter,
427+ EnvQuery,
428+ EnvDeleter,
429+ EnvEnumerator,
430+ EnvDefiner,
431+ nullptr ,
432+ Local<Value>(),
404433 PropertyHandlerFlags::kHasNoSideEffect ));
405434 return scope.EscapeMaybe (env_proxy_template->NewInstance (context));
406435}
@@ -411,6 +440,7 @@ void RegisterEnvVarExternalReferences(ExternalReferenceRegistry* registry) {
411440 registry->Register (EnvQuery);
412441 registry->Register (EnvDeleter);
413442 registry->Register (EnvEnumerator);
443+ registry->Register (EnvDefiner);
414444}
415445} // namespace node
416446
0 commit comments