There is a BUG and I don’t know how to fix it

App Versions

{
	"erpnext": "15.10.6",
	"erpnext_chinese": "15.0.13",
	"erpnext_oob": "15.0.15",
	"frappe": "15.11.0",
	"payments": "0.0.1",
	"print_designer": "1.0.0"
}

Route

Form/Website Theme/new-website-theme-goobhrzkrn

Traceback

Traceback (most recent call last):
  File "apps/frappe/frappe/app.py", line 110, in application
    response = frappe.api.handle(request)
  File "apps/frappe/frappe/api/__init__.py", line 49, in handle
    data = endpoint(**arguments)
  File "apps/frappe/frappe/api/v1.py", line 36, in handle_rpc_call
    return frappe.handler.handle()
  File "apps/frappe/frappe/handler.py", line 49, in handle
    data = execute_cmd(cmd)
  File "apps/frappe/frappe/handler.py", line 85, in execute_cmd
    return frappe.call(method, **frappe.form_dict)
  File "apps/frappe/frappe/__init__.py", line 1682, in call
    return fn(*args, **newargs)
  File "apps/frappe/frappe/utils/typing_validations.py", line 31, in wrapper
    return func(*args, **kwargs)
  File "apps/frappe/frappe/desk/form/save.py", line 39, in savedocs
    doc.save()
  File "apps/frappe/frappe/model/document.py", line 334, in save
    return self._save(*args, **kwargs)
  File "apps/frappe/frappe/model/document.py", line 356, in _save
    return self.insert()
  File "apps/frappe/frappe/model/document.py", line 286, in insert
    self.run_before_save_methods()
  File "apps/frappe/frappe/model/document.py", line 1085, in run_before_save_methods
    self.run_method("validate")
  File "apps/frappe/frappe/model/document.py", line 954, in run_method
    out = Document.hook(fn)(self, *args, **kwargs)
  File "apps/frappe/frappe/model/document.py", line 1320, in composer
    return composed(self, method, *args, **kwargs)
  File "apps/frappe/frappe/model/document.py", line 1302, in runner
    add_to_return_value(self, fn(self, *args, **kwargs))
  File "apps/frappe/frappe/model/document.py", line 951, in fn
    return method_object(*args, **kwargs)
  File "apps/frappe/frappe/website/doctype/website_theme/website_theme.py", line 50, in validate
    self.generate_bootstrap_theme()
  File "apps/frappe/frappe/website/doctype/website_theme/website_theme.py", line 113, in generate_bootstrap_theme
    process = Popen(command, cwd=frappe.get_app_source_path("frappe"), stdout=PIPE, stderr=PIPE)
  File "/usr/lib/python3.10/subprocess.py", line 971, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.10/subprocess.py", line 1863, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'node'

Request Data

{
	"type": "POST",
	"args": {
		"doc": "{\"docstatus\":0,\"doctype\":\"Website Theme\",\"name\":\"new-website-theme-goobhrzkrn\",\"__islocal\":1,\"__unsaved\":1,\"owner\":\"Administrator\",\"module\":\"Website\",\"custom\":1,\"font_properties\":\"wght@300;400;500;600;700;800\",\"button_rounded_corners\":1,\"button_shadows\":0,\"button_gradients\":0,\"ignored_apps\":[],\"idx\":0,\"theme\":\"qq\"}",
		"action": "Save"
	},
	"btn": {
		"jQuery3700189606022647891951": {
			"events": {
				"click": [
					{
						"type": "click",
						"origType": "click",
						"guid": 1863,
						"namespace": ""
					}
				]
			}
		}
	},
	"freeze": true,
	"headers": {},
	"error_handlers": {},
	"url": "/api/method/frappe.desk.form.save.savedocs",
	"request_id": null
}

Response Data

{
	"exception": "FileNotFoundError: [Errno 2] No such file or directory: 'node'",
	"exc_type": "FileNotFoundError"
}