move validate doc update to go through couch_eval
diff --git a/src/couch/src/couch_doc.erl b/src/couch/src/couch_doc.erl
index 124d14c..2771e14 100644
--- a/src/couch/src/couch_doc.erl
+++ b/src/couch/src/couch_doc.erl
@@ -27,7 +27,6 @@
 
 -include_lib("couch/include/couch_db.hrl").
 
-
 -spec to_path(#doc{}) -> path().
 to_path(#doc{revs = {Start, RevIds}} = Doc) ->
     [Branch] = to_branch(Doc, lists:reverse(RevIds)),
@@ -431,7 +430,7 @@
             nil;
         _Else ->
             fun(EditDoc, DiskDoc, Ctx, SecObj) ->
-                couch_query_servers:validate_doc_update(DDoc, EditDoc, DiskDoc, Ctx, SecObj)
+                couch_eval:validate_doc_update(DDoc, EditDoc, DiskDoc, Ctx, SecObj)
             end
     end.
 
diff --git a/src/couch_eval/src/couch_eval.erl b/src/couch_eval/src/couch_eval.erl
index affcf71..cdaf8ce 100644
--- a/src/couch_eval/src/couch_eval.erl
+++ b/src/couch_eval/src/couch_eval.erl
@@ -17,7 +17,8 @@
     release_map_context/1,
     map_docs/2,
     with_context/2,
-    try_compile/4
+    try_compile/4,
+    validate_doc_update/5
 ]).
 
 -include_lib("couch/include/couch_db.hrl").
@@ -37,6 +38,7 @@
 -type function_name() :: binary().
 -type function_src() :: binary().
 -type error(_Error) :: no_return().
+-type user_context() :: any().
 
 -type context_opts() :: #{
     db_name := db_name(),
@@ -58,6 +60,8 @@
 -callback acquire_context() -> {ok, any()} | {error, any()}.
 -callback release_context(context()) -> ok | {error, any()}.
 -callback try_compile(context(), function_type(), function_name(), function_src()) -> ok.
+-callback validate_doc_update(ddoc(), doc(), doc(), user_context(), sec_obj()) ->
+    ok | {error, any()}.
 
 -spec acquire_map_context(
     db_name(),
@@ -116,6 +120,11 @@
 try_compile({ApiMod, Ctx}, FuncType, FuncName, FuncSrc) ->
     ApiMod:try_compile(Ctx, FuncType, FuncName, FuncSrc).
 
+validate_doc_update(#doc{body = {Props}} = DDoc, EditDoc, DiskDoc, Ctx, SecObj) ->
+    Language = couch_util:get_value(<<"language">>, Props, <<"javascript">>),
+    ApiMod = get_api_mod(Language),
+    ApiMod:validate_doc_update(DDoc, EditDoc, DiskDoc, Ctx, SecObj).
+
 acquire_context(Language) ->
     ApiMod = get_api_mod(Language),
     {ok, Ctx} = ApiMod:acquire_context(),
diff --git a/src/couch_js/src/couch_js.erl b/src/couch_js/src/couch_js.erl
index 3a80a99..739aa1b 100644
--- a/src/couch_js/src/couch_js.erl
+++ b/src/couch_js/src/couch_js.erl
@@ -19,7 +19,8 @@
     map_docs/2,
     acquire_context/0,
     release_context/1,
-    try_compile/4
+    try_compile/4,
+    validate_doc_update/5
 ]).
 
 -include_lib("couch/include/couch_db.hrl").
@@ -62,3 +63,6 @@
 
 try_compile(Proc, FunctionType, FunName, FunSrc) ->
     couch_query_servers:try_compile(Proc, FunctionType, FunName, FunSrc).
+
+validate_doc_update(DDoc, EditDoc, DiskDoc, Ctx, SecObj) ->
+    couch_query_servers:validate_doc_update(DDoc, EditDoc, DiskDoc, Ctx, SecObj).