From 4fc5cd32d022fbc898052bbc5beda2e618137aa4 Mon Sep 17 00:00:00 2001 From: "Avi Halachmi (:avih)" Date: Sat, 14 Dec 2019 19:34:58 +0200 Subject: js: require: allow custom module search paths via mp.module_paths --- DOCS/man/javascript.rst | 8 ++++++++ player/javascript/defaults.js | 14 ++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/DOCS/man/javascript.rst b/DOCS/man/javascript.rst index 0c29affcdf..c0c4dbad8c 100644 --- a/DOCS/man/javascript.rst +++ b/DOCS/man/javascript.rst @@ -240,6 +240,9 @@ Note: ``read_file`` and ``write_file`` throw on errors, allow text content only. anything from the filesystem), and returns it as a function. Very similar to a ``Function`` constructor, but shows at stack traces as ``fname``. +``mp.module_paths`` + Global modules search paths array for the ``require`` function (see below). + Timers (global) --------------- @@ -301,6 +304,11 @@ or ``~/x``. Otherwise, it's considered a global module id and searched at ``require("x")`` is searched as file ``x.js`` at those dirs, and id ``foo/x`` is searched as file ``x.js`` inside dir ``foo`` at those dirs. +Search paths for global module id's are at the array ``mp.module_paths``, which +is searched in order. Initially it contains one item: ``~~/scripts/modules.js`` +such that it behaves as described above. Modifying it will affect future +``require`` calls with global module id's which are not already loaded/cached. + No ``global`` variable, but a module's ``this`` at its top lexical scope is the global object - also in strict mode. If you have a module which needs ``global`` as the global object, you could do ``this.global = this;`` before ``require``. diff --git a/player/javascript/defaults.js b/player/javascript/defaults.js index 4c2720201a..d85653bd3f 100644 --- a/player/javascript/defaults.js +++ b/player/javascript/defaults.js @@ -375,6 +375,8 @@ function process_timers() { - Module id supports mpv path enhancements, e.g. ~/foo, ~~/bar, ~~desktop/baz *********************************************************************/ +mp.module_paths = ["~~/scripts/modules.js"]; // global modules search paths + // Internal meta top-dirs. Users should not rely on these names. var MODULES_META = "~~modules", SCRIPTDIR_META = "~~scriptdir", // relative script path -> meta absolute id @@ -389,10 +391,14 @@ function resolve_module_file(id) { return mp.utils.join_path(main_script[0], rest); if (base == MODULES_META) { - var path = mp.find_config_file("scripts/modules.js/" + rest); - if (!path) - throw(Error("Cannot find module file '" + rest + "'")); - return path; + for (var i = 0; i < mp.module_paths.length; i++) { + try { + var f = mp.utils.join_path(mp.module_paths[i], rest); + mp.utils.read_file(f, 1); // throws on any error + return f; + } catch (e) {} + } + throw(Error("Cannot find module file '" + rest + "'")); } return id + ".js"; -- cgit v1.2.3