From 9180d0873997040afb5bb600a238d1a291072b43 Mon Sep 17 00:00:00 2001
From: Matthew Weymar <tech@weymar.com>
Date: Sun, 22 Feb 2026 13:33:10 -0800
Subject: [PATCH] ob: add customize types for language default header args

---
 lisp/ob-js.el    |  9 +++++++--
 lisp/ob-shell.el | 20 ++++++++++++++++----
 lisp/ob-sql.el   |  8 +++++++-
 3 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/lisp/ob-js.el b/lisp/ob-js.el
index d025886fb..3464eb3a8 100644
--- a/lisp/ob-js.el
+++ b/lisp/ob-js.el
@@ -51,8 +51,13 @@
 (declare-function indium-run-node "ext:indium-nodejs" (command))
 (declare-function indium-eval "ext:indium-interaction" (string &optional callback))
 
-(defvar org-babel-default-header-args:js '()
-  "Default header arguments for js code blocks.")
+(defcustom org-babel-default-header-args:js '()
+  "Default header arguments for js code blocks."
+  :group 'org-babel
+  :type '(repeat
+          (cons
+           (symbol :tag "Header argument")
+           (sexp :tag "Value"))))
 
 (defvar org-babel-js-eoe "org-babel-js-eoe"
   "String to indicate that evaluation has completed.")
diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el
index e3767ac06..3b6461718 100644
--- a/lisp/ob-shell.el
+++ b/lisp/ob-shell.el
@@ -44,7 +44,17 @@
 		  t)
 (declare-function orgtbl-to-generic "org-table" (table params))
 
-(defvar org-babel-default-header-args:shell '())
+(defconst org-babel-shell-header-args-custom-type
+  '(repeat
+    (cons
+     (symbol :tag "Header argument")
+     (sexp :tag "Value")))
+  "Customize type for shell default Babel header arguments.")
+
+(defcustom org-babel-default-header-args:shell '()
+  "Default arguments for evaluating a shell source block."
+  :group 'org-babel
+  :type org-babel-shell-header-args-custom-type)
 
 (defconst org-babel-header-args:shell
   '((async               . ((yes no))))
@@ -111,9 +121,11 @@ is modified outside the Customize interface."
       (format "Return list of %s statements assigning to the block's \
 variables."
 	      name))
-    (funcall (if (fboundp 'defvar-1) #'defvar-1 #'set) ;Emacs-29
-             (intern (concat "org-babel-default-header-args:" name))
-             org-babel-default-header-args:shell)
+    (let ((default-headers (intern (concat "org-babel-default-header-args:" name))))
+      (funcall (if (fboundp 'defvar-1) #'defvar-1 #'set) ;Emacs-29
+               default-headers org-babel-default-header-args:shell)
+      (put default-headers 'standard-value '(org-babel-default-header-args:shell))
+      (put default-headers 'custom-type org-babel-shell-header-args-custom-type))
     (funcall (if (fboundp 'defvar-1) #'defvar-1 #'set) ;Emacs-29
              (intern (concat "org-babel-header-args:" name))
              org-babel-header-args:shell)))
diff --git a/lisp/ob-sql.el b/lisp/ob-sql.el
index 1d8234835..baa0644ef 100644
--- a/lisp/ob-sql.el
+++ b/lisp/ob-sql.el
@@ -83,7 +83,13 @@
 (declare-function sql-set-product "sql" (product))
 
 (defvar sql-connection-alist)
-(defvar org-babel-default-header-args:sql '())
+(defcustom org-babel-default-header-args:sql '()
+  "Default arguments for evaluating a sql source block."
+  :group 'org-babel
+  :type '(repeat
+          (cons
+           (symbol :tag "Header argument")
+           (sexp :tag "Value"))))
 
 (defconst org-babel-header-args:sql
   '((engine	       . :any)
-- 
2.52.0

