From 98f7e1cda284e0b44bc3285c3650931256c09710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Poul=20Purkh=C3=BAs?= Date: Wed, 24 Jul 2019 15:15:56 +0000 Subject: [PATCH 1/7] Respect NODE_PATH when resolving modules This allows the usage of NODE_PATH(https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders) when `bsb` is resolving modules --- jscomp/bsb/bsb_pkg.ml | 21 ++++++++++++-- .../.gitignore | 28 +++++++++++++++++++ .../README.md | 16 +++++++++++ .../bsconfig.json | 23 +++++++++++++++ .../examples/test.ml | 1 + .../input.js | 6 ++++ .../overridden_node_modules/liba/.gitignore | 25 +++++++++++++++++ .../overridden_node_modules/liba/README.md | 16 +++++++++++ .../liba/bsconfig.json | 17 +++++++++++ .../liba/examples/xx/test.ml | 1 + .../liba/examples/yy.ml | 1 + .../overridden_node_modules/liba/package.json | 16 +++++++++++ .../overridden_node_modules/liba/src/demo.ml | 3 ++ .../liba/src/hi/fib.ml | 1 + .../package.json | 16 +++++++++++ .../src/demo.ml | 3 ++ lib/4.02.3/bsb.ml | 21 ++++++++++++-- lib/4.02.3/unstable/bsb_native.ml | 21 ++++++++++++-- 18 files changed, 227 insertions(+), 9 deletions(-) create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/.gitignore create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/README.md create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/bsconfig.json create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/examples/test.ml create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/input.js create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/.gitignore create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/README.md create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/bsconfig.json create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/examples/xx/test.ml create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/examples/yy.ml create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/package.json create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/src/demo.ml create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/src/hi/fib.ml create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/package.json create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/src/demo.ml diff --git a/jscomp/bsb/bsb_pkg.ml b/jscomp/bsb/bsb_pkg.ml index 0051292252..a2de8a5b9d 100644 --- a/jscomp/bsb/bsb_pkg.ml +++ b/jscomp/bsb/bsb_pkg.ml @@ -39,18 +39,33 @@ let make_sub_path (x : t) : string = a failure *) let resolve_bs_package_aux ~cwd (pkg : t) = + (* First try to resolve recursively from the current working directory *) let sub_path = make_sub_path pkg in let rec aux cwd = let abs_marker = cwd // sub_path in - if Sys.file_exists abs_marker then abs_marker + if Sys.file_exists abs_marker then Some(abs_marker) else let another_cwd = Filename.dirname cwd in (* TODO: may non-terminating when see symlinks *) if String.length another_cwd < String.length cwd then aux another_cwd else (* To the end try other possiblilities *) - Bsb_exception.package_not_found ~pkg ~json:None + None in - aux cwd + match aux cwd with + | Some(package_dir) -> package_dir + (* If the package can not be resolved then check if NODE_PATH is set and if set then search there*) + | None -> + let node_path = + match Sys.getenv "NODE_PATH" with + | node_path -> + Str.split (Str.regexp ";") node_path + | exception Not_found -> + Bsb_exception.package_not_found ~pkg ~json:None + in + match List.find (fun dir -> Sys.file_exists (dir // Bsb_pkg_types.to_string pkg)) node_path with + | resolved_dir -> resolved_dir // Bsb_pkg_types.to_string pkg + | exception Not_found -> + Bsb_exception.package_not_found ~pkg ~json:None module Coll = Hashtbl_make.Make(struct type nonrec t = t diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/.gitignore b/jscomp/build_tests/bs_dependencies_node_path_override/.gitignore new file mode 100644 index 0000000000..55ca6f15e9 --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/.gitignore @@ -0,0 +1,28 @@ +*.exe +*.obj +*.out +*.compile +*.native +*.byte +*.cmo +*.annot +*.cmi +*.cmx +*.cmt +*.cmti +*.cma +*.a +*.cmxa +*.obj +*~ +*.annot +*.cmj +*.bak +lib/bs +*.mlast +*.mliast +.vscode +.merlin +**/*.js +!node_modules +!input.js \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/README.md b/jscomp/build_tests/bs_dependencies_node_path_override/README.md new file mode 100644 index 0000000000..1c02d2a072 --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/README.md @@ -0,0 +1,16 @@ + + +# Build +``` +npm run build +``` + +# Watch + +``` +npm run watch +``` + + +# Editor +If you use `vscode`, Press `Windows + Shift + B` it will build automatically \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/bsconfig.json b/jscomp/build_tests/bs_dependencies_node_path_override/bsconfig.json new file mode 100644 index 0000000000..9ba8ba4e0c --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/bsconfig.json @@ -0,0 +1,23 @@ +{ + "name": "dev", + "version": "0.1.0", + "sources": [ + { + "dir": "src", + "subdirs" : true + }, + { + "dir": "examples", + "type" : "dev", + "subdirs" : true + } + ], + "package-specs" : { + "module": "commonjs", + "in-source": true + }, + "namespace": true, + "bs-dependencies" : [ + "liba" + ] +} \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/examples/test.ml b/jscomp/build_tests/bs_dependencies_node_path_override/examples/test.ml new file mode 100644 index 0000000000..f5f8f9d8c1 --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/examples/test.ml @@ -0,0 +1 @@ +let v = Demo.name \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/input.js b/jscomp/build_tests/bs_dependencies_node_path_override/input.js new file mode 100644 index 0000000000..2f0981f7ef --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/input.js @@ -0,0 +1,6 @@ +//@ts-check +var assert = require('assert') +var path = require('path') +var p = require('child_process') +var node_path = path.join(__dirname, "overridden_node_modules") +p.execSync(`NODE_PATH=${node_path} node ./testcase.js`, {cwd:__dirname,shell:true,encoding:'utf8'}) \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/.gitignore b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/.gitignore new file mode 100644 index 0000000000..8f464d0527 --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/.gitignore @@ -0,0 +1,25 @@ +*.exe +*.obj +*.out +*.compile +*.native +*.byte +*.cmo +*.annot +*.cmi +*.cmx +*.cmt +*.cmti +*.cma +*.a +*.cmxa +*.obj +*~ +*.annot +*.cmj +*.bak +lib/bs +*.mlast +*.mliast +.vscode +.merlin \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/README.md b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/README.md new file mode 100644 index 0000000000..1c02d2a072 --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/README.md @@ -0,0 +1,16 @@ + + +# Build +``` +npm run build +``` + +# Watch + +``` +npm run watch +``` + + +# Editor +If you use `vscode`, Press `Windows + Shift + B` it will build automatically \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/bsconfig.json b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/bsconfig.json new file mode 100644 index 0000000000..f34d7ed09e --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/bsconfig.json @@ -0,0 +1,17 @@ +{ + "name": "liba", + "version": "0.1.0", + "sources": [ + { + "dir": "src", + "subdirs" : true + }, + { + "dir" : "examples", + "type": "dev", + "subdirs" : true + } + ], + "namespace": true + +} \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/examples/xx/test.ml b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/examples/xx/test.ml new file mode 100644 index 0000000000..af158a09e6 --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/examples/xx/test.ml @@ -0,0 +1 @@ +let name = __FILE__ + 3 \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/examples/yy.ml b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/examples/yy.ml new file mode 100644 index 0000000000..d32a6d0646 --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/examples/yy.ml @@ -0,0 +1 @@ +let name = __FILE__ \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/package.json b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/package.json new file mode 100644 index 0000000000..63c69448e0 --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/package.json @@ -0,0 +1,16 @@ +{ + "name": "liba", + "version": "0.1.0", + "scripts": { + "clean": "bsb -clean-world", + "build": "bsb -make-world", + "watch": "bsb -make-world -w" + }, + "keywords": [ + "BuckleScript" + ], + "license": "MIT", + "devDependencies": { + "bs-platform": "1.9.3" + } +} \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/src/demo.ml b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/src/demo.ml new file mode 100644 index 0000000000..ca8c589c96 --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/src/demo.ml @@ -0,0 +1,3 @@ + + +let name = __FILE__ \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/src/hi/fib.ml b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/src/hi/fib.ml new file mode 100644 index 0000000000..d32a6d0646 --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/overridden_node_modules/liba/src/hi/fib.ml @@ -0,0 +1 @@ +let name = __FILE__ \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/package.json b/jscomp/build_tests/bs_dependencies_node_path_override/package.json new file mode 100644 index 0000000000..a3a03aa1d2 --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/package.json @@ -0,0 +1,16 @@ +{ + "name": "dev", + "version": "0.1.0", + "scripts": { + "clean": "bsb -clean-world", + "build": "bsb -make-world", + "watch": "bsb -make-world -w" + }, + "keywords": [ + "BuckleScript" + ], + "license": "MIT", + "devDependencies": { + "bs-platform": "1.9.3" + } +} \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/src/demo.ml b/jscomp/build_tests/bs_dependencies_node_path_override/src/demo.ml new file mode 100644 index 0000000000..1b2a37152f --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/src/demo.ml @@ -0,0 +1,3 @@ + + +let name = __FILE__ ^ Liba.Demo.name \ No newline at end of file diff --git a/lib/4.02.3/bsb.ml b/lib/4.02.3/bsb.ml index df303a9f66..20a2df9f02 100644 --- a/lib/4.02.3/bsb.ml +++ b/lib/4.02.3/bsb.ml @@ -5244,18 +5244,33 @@ let make_sub_path (x : t) : string = a failure *) let resolve_bs_package_aux ~cwd (pkg : t) = + (* First try to resolve recursively from the current working directory *) let sub_path = make_sub_path pkg in let rec aux cwd = let abs_marker = cwd // sub_path in - if Sys.file_exists abs_marker then abs_marker + if Sys.file_exists abs_marker then Some(abs_marker) else let another_cwd = Filename.dirname cwd in (* TODO: may non-terminating when see symlinks *) if String.length another_cwd < String.length cwd then aux another_cwd else (* To the end try other possiblilities *) - Bsb_exception.package_not_found ~pkg ~json:None + None in - aux cwd + match aux cwd with + | Some(package_dir) -> package_dir + (* If the package can not be resolved then check if NODE_PATH is set and if set then search there*) + | None -> + let node_path = + match Sys.getenv "NODE_PATH" with + | node_path -> + Str.split (Str.regexp ";") node_path + | exception Not_found -> + Bsb_exception.package_not_found ~pkg ~json:None + in + match List.find (fun dir -> Sys.file_exists (dir // Bsb_pkg_types.to_string pkg)) node_path with + | resolved_dir -> resolved_dir // Bsb_pkg_types.to_string pkg + | exception Not_found -> + Bsb_exception.package_not_found ~pkg ~json:None module Coll = Hashtbl_make.Make(struct type nonrec t = t diff --git a/lib/4.02.3/unstable/bsb_native.ml b/lib/4.02.3/unstable/bsb_native.ml index f891e40851..06e5967bfa 100644 --- a/lib/4.02.3/unstable/bsb_native.ml +++ b/lib/4.02.3/unstable/bsb_native.ml @@ -5244,18 +5244,33 @@ let make_sub_path (x : t) : string = a failure *) let resolve_bs_package_aux ~cwd (pkg : t) = + (* First try to resolve recursively from the current working directory *) let sub_path = make_sub_path pkg in let rec aux cwd = let abs_marker = cwd // sub_path in - if Sys.file_exists abs_marker then abs_marker + if Sys.file_exists abs_marker then Some(abs_marker) else let another_cwd = Filename.dirname cwd in (* TODO: may non-terminating when see symlinks *) if String.length another_cwd < String.length cwd then aux another_cwd else (* To the end try other possiblilities *) - Bsb_exception.package_not_found ~pkg ~json:None + None in - aux cwd + match aux cwd with + | Some(package_dir) -> package_dir + (* If the package can not be resolved then check if NODE_PATH is set and if set then search there*) + | None -> + let node_path = + match Sys.getenv "NODE_PATH" with + | node_path -> + Str.split (Str.regexp ";") node_path + | exception Not_found -> + Bsb_exception.package_not_found ~pkg ~json:None + in + match List.find (fun dir -> Sys.file_exists (dir // Bsb_pkg_types.to_string pkg)) node_path with + | resolved_dir -> resolved_dir // Bsb_pkg_types.to_string pkg + | exception Not_found -> + Bsb_exception.package_not_found ~pkg ~json:None module Coll = Hashtbl_make.Make(struct type nonrec t = t From 3cdb58338de840893ec5697aa00dc66429af8c1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Poul=20Purkh=C3=BAs?= Date: Wed, 24 Jul 2019 15:49:38 +0000 Subject: [PATCH 2/7] Add missing file --- .../bs_dependencies_node_path_override/.gitignore | 3 ++- .../bs_dependencies_node_path_override/testcase.js | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 jscomp/build_tests/bs_dependencies_node_path_override/testcase.js diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/.gitignore b/jscomp/build_tests/bs_dependencies_node_path_override/.gitignore index 55ca6f15e9..71c60460d7 100644 --- a/jscomp/build_tests/bs_dependencies_node_path_override/.gitignore +++ b/jscomp/build_tests/bs_dependencies_node_path_override/.gitignore @@ -25,4 +25,5 @@ lib/bs .merlin **/*.js !node_modules -!input.js \ No newline at end of file +!input.js +!testcase.js \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/testcase.js b/jscomp/build_tests/bs_dependencies_node_path_override/testcase.js new file mode 100644 index 0000000000..05c614f7e9 --- /dev/null +++ b/jscomp/build_tests/bs_dependencies_node_path_override/testcase.js @@ -0,0 +1,7 @@ +//@ts-check +var assert = require('assert') +var path = require('path') +var p = require('child_process') +p.execSync(`bsb -make-world`, {cwd:__dirname,shell:true,encoding:'utf8'}) +var u = require("./examples/test.js") +assert.equal(path.basename(u.v),'demo.mldemo.ml') \ No newline at end of file From bbacd92b6567d8c4411025f69697a49c773bd7a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Poul=20Purkh=C3=BAs?= Date: Wed, 24 Jul 2019 16:20:24 +0000 Subject: [PATCH 3/7] Set bs-platform version --- .../build_tests/bs_dependencies_node_path_override/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/package.json b/jscomp/build_tests/bs_dependencies_node_path_override/package.json index a3a03aa1d2..ddf20950d8 100644 --- a/jscomp/build_tests/bs_dependencies_node_path_override/package.json +++ b/jscomp/build_tests/bs_dependencies_node_path_override/package.json @@ -11,6 +11,6 @@ ], "license": "MIT", "devDependencies": { - "bs-platform": "1.9.3" + "bs-platform": "^5.1.0-dev.3" } } \ No newline at end of file From 02286e4ba97b74d5f6706dd4061088ce148fc9e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Poul=20Purkh=C3=BAs?= Date: Fri, 26 Jul 2019 11:22:54 +0000 Subject: [PATCH 4/7] Removed `npm_config_prefix` option when resolving packages Fixes after review --- jscomp/bsb/bsb_pkg.ml | 27 +++++++++++++------ .../bsconfig.json | 2 +- .../input.js | 5 ++-- .../package.json | 2 +- .../testcase.js | 2 +- lib/4.02.3/bsb.ml | 27 +++++++++++++------ lib/4.02.3/unstable/bsb_native.ml | 27 +++++++++++++------ 7 files changed, 62 insertions(+), 30 deletions(-) diff --git a/jscomp/bsb/bsb_pkg.ml b/jscomp/bsb/bsb_pkg.ml index a2de8a5b9d..8ccb3eeea2 100644 --- a/jscomp/bsb/bsb_pkg.ml +++ b/jscomp/bsb/bsb_pkg.ml @@ -32,8 +32,13 @@ type t = Bsb_pkg_types.t when resolving [ppx-flags] *) let make_sub_path (x : t) : string = - Literals.node_modules // Bsb_pkg_types.to_string x - + Literals.node_modules // Bsb_pkg_types.to_string x + +let node_path_delimiter = + if Sys.os_type = "Win32" then + ';' + else + ':' (** It makes sense to have this function raise, when [bsb] could not resolve a package, it used to mean a failure @@ -42,7 +47,7 @@ let resolve_bs_package_aux ~cwd (pkg : t) = (* First try to resolve recursively from the current working directory *) let sub_path = make_sub_path pkg in let rec aux cwd = - let abs_marker = cwd // sub_path in + let abs_marker = cwd // sub_path in if Sys.file_exists abs_marker then Some(abs_marker) else let another_cwd = Filename.dirname cwd in (* TODO: may non-terminating when see symlinks *) @@ -58,14 +63,20 @@ let resolve_bs_package_aux ~cwd (pkg : t) = let node_path = match Sys.getenv "NODE_PATH" with | node_path -> - Str.split (Str.regexp ";") node_path + print_endline node_path; + print_endline (Char.escaped node_path_delimiter); + Ext_string.split node_path node_path_delimiter | exception Not_found -> Bsb_exception.package_not_found ~pkg ~json:None in - match List.find (fun dir -> Sys.file_exists (dir // Bsb_pkg_types.to_string pkg)) node_path with - | resolved_dir -> resolved_dir // Bsb_pkg_types.to_string pkg - | exception Not_found -> - Bsb_exception.package_not_found ~pkg ~json:None + let check_dir dir = + match Sys.file_exists dir with + | true -> Some(dir) + | false -> None + in + match Ext_list.find_opt node_path (fun dir -> check_dir (dir // Bsb_pkg_types.to_string pkg)) with + | Some(resolved_dir) -> resolved_dir + | None -> Bsb_exception.package_not_found ~pkg ~json:None module Coll = Hashtbl_make.Make(struct type nonrec t = t diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/bsconfig.json b/jscomp/build_tests/bs_dependencies_node_path_override/bsconfig.json index 9ba8ba4e0c..5eb6a09cf2 100644 --- a/jscomp/build_tests/bs_dependencies_node_path_override/bsconfig.json +++ b/jscomp/build_tests/bs_dependencies_node_path_override/bsconfig.json @@ -1,5 +1,5 @@ { - "name": "dev", + "name": "bs_dependencies_node_path_override", "version": "0.1.0", "sources": [ { diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/input.js b/jscomp/build_tests/bs_dependencies_node_path_override/input.js index 2f0981f7ef..863ab0f765 100644 --- a/jscomp/build_tests/bs_dependencies_node_path_override/input.js +++ b/jscomp/build_tests/bs_dependencies_node_path_override/input.js @@ -1,6 +1,5 @@ //@ts-check -var assert = require('assert') var path = require('path') var p = require('child_process') -var node_path = path.join(__dirname, "overridden_node_modules") -p.execSync(`NODE_PATH=${node_path} node ./testcase.js`, {cwd:__dirname,shell:true,encoding:'utf8'}) \ No newline at end of file +var node_path = path.join(__dirname, "nothing_exists_here") + ":" + path.join(__dirname, "overridden_node_modules") +p.execSync(`NODE_PATH=${node_path} node ./testcase.js`, {cwd:__dirname,shell:true,encoding:'utf8',stdio:"inherit"}) \ No newline at end of file diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/package.json b/jscomp/build_tests/bs_dependencies_node_path_override/package.json index ddf20950d8..8d24a775bb 100644 --- a/jscomp/build_tests/bs_dependencies_node_path_override/package.json +++ b/jscomp/build_tests/bs_dependencies_node_path_override/package.json @@ -1,5 +1,5 @@ { - "name": "dev", + "name": "bs_dependencies_node_path_override", "version": "0.1.0", "scripts": { "clean": "bsb -clean-world", diff --git a/jscomp/build_tests/bs_dependencies_node_path_override/testcase.js b/jscomp/build_tests/bs_dependencies_node_path_override/testcase.js index 05c614f7e9..fdf1c492a7 100644 --- a/jscomp/build_tests/bs_dependencies_node_path_override/testcase.js +++ b/jscomp/build_tests/bs_dependencies_node_path_override/testcase.js @@ -2,6 +2,6 @@ var assert = require('assert') var path = require('path') var p = require('child_process') -p.execSync(`bsb -make-world`, {cwd:__dirname,shell:true,encoding:'utf8'}) +p.execSync(`bsb -make-world`, {cwd:__dirname,shell:true,encoding:'utf8',stdio:"inherit"}) var u = require("./examples/test.js") assert.equal(path.basename(u.v),'demo.mldemo.ml') \ No newline at end of file diff --git a/lib/4.02.3/bsb.ml b/lib/4.02.3/bsb.ml index 20a2df9f02..e5438d1a25 100644 --- a/lib/4.02.3/bsb.ml +++ b/lib/4.02.3/bsb.ml @@ -5237,8 +5237,13 @@ type t = Bsb_pkg_types.t when resolving [ppx-flags] *) let make_sub_path (x : t) : string = - Literals.node_modules // Bsb_pkg_types.to_string x - + Literals.node_modules // Bsb_pkg_types.to_string x + +let node_path_delimiter = + if Sys.os_type = "Win32" then + ';' + else + ':' (** It makes sense to have this function raise, when [bsb] could not resolve a package, it used to mean a failure @@ -5247,7 +5252,7 @@ let resolve_bs_package_aux ~cwd (pkg : t) = (* First try to resolve recursively from the current working directory *) let sub_path = make_sub_path pkg in let rec aux cwd = - let abs_marker = cwd // sub_path in + let abs_marker = cwd // sub_path in if Sys.file_exists abs_marker then Some(abs_marker) else let another_cwd = Filename.dirname cwd in (* TODO: may non-terminating when see symlinks *) @@ -5263,14 +5268,20 @@ let resolve_bs_package_aux ~cwd (pkg : t) = let node_path = match Sys.getenv "NODE_PATH" with | node_path -> - Str.split (Str.regexp ";") node_path + print_endline node_path; + print_endline (Char.escaped node_path_delimiter); + Ext_string.split node_path node_path_delimiter | exception Not_found -> Bsb_exception.package_not_found ~pkg ~json:None in - match List.find (fun dir -> Sys.file_exists (dir // Bsb_pkg_types.to_string pkg)) node_path with - | resolved_dir -> resolved_dir // Bsb_pkg_types.to_string pkg - | exception Not_found -> - Bsb_exception.package_not_found ~pkg ~json:None + let check_dir dir = + match Sys.file_exists dir with + | true -> Some(dir) + | false -> None + in + match Ext_list.find_opt node_path (fun dir -> check_dir (dir // Bsb_pkg_types.to_string pkg)) with + | Some(resolved_dir) -> resolved_dir + | None -> Bsb_exception.package_not_found ~pkg ~json:None module Coll = Hashtbl_make.Make(struct type nonrec t = t diff --git a/lib/4.02.3/unstable/bsb_native.ml b/lib/4.02.3/unstable/bsb_native.ml index 06e5967bfa..09287136a7 100644 --- a/lib/4.02.3/unstable/bsb_native.ml +++ b/lib/4.02.3/unstable/bsb_native.ml @@ -5237,8 +5237,13 @@ type t = Bsb_pkg_types.t when resolving [ppx-flags] *) let make_sub_path (x : t) : string = - Literals.node_modules // Bsb_pkg_types.to_string x - + Literals.node_modules // Bsb_pkg_types.to_string x + +let node_path_delimiter = + if Sys.os_type = "Win32" then + ';' + else + ':' (** It makes sense to have this function raise, when [bsb] could not resolve a package, it used to mean a failure @@ -5247,7 +5252,7 @@ let resolve_bs_package_aux ~cwd (pkg : t) = (* First try to resolve recursively from the current working directory *) let sub_path = make_sub_path pkg in let rec aux cwd = - let abs_marker = cwd // sub_path in + let abs_marker = cwd // sub_path in if Sys.file_exists abs_marker then Some(abs_marker) else let another_cwd = Filename.dirname cwd in (* TODO: may non-terminating when see symlinks *) @@ -5263,14 +5268,20 @@ let resolve_bs_package_aux ~cwd (pkg : t) = let node_path = match Sys.getenv "NODE_PATH" with | node_path -> - Str.split (Str.regexp ";") node_path + print_endline node_path; + print_endline (Char.escaped node_path_delimiter); + Ext_string.split node_path node_path_delimiter | exception Not_found -> Bsb_exception.package_not_found ~pkg ~json:None in - match List.find (fun dir -> Sys.file_exists (dir // Bsb_pkg_types.to_string pkg)) node_path with - | resolved_dir -> resolved_dir // Bsb_pkg_types.to_string pkg - | exception Not_found -> - Bsb_exception.package_not_found ~pkg ~json:None + let check_dir dir = + match Sys.file_exists dir with + | true -> Some(dir) + | false -> None + in + match Ext_list.find_opt node_path (fun dir -> check_dir (dir // Bsb_pkg_types.to_string pkg)) with + | Some(resolved_dir) -> resolved_dir + | None -> Bsb_exception.package_not_found ~pkg ~json:None module Coll = Hashtbl_make.Make(struct type nonrec t = t From f936f69f66b000d5c482c52f1d816e07fbfce07a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Poul=20Purkh=C3=BAs?= Date: Fri, 26 Jul 2019 11:25:02 +0000 Subject: [PATCH 5/7] Removed unneccessary printing --- jscomp/bsb/bsb_pkg.ml | 2 -- 1 file changed, 2 deletions(-) diff --git a/jscomp/bsb/bsb_pkg.ml b/jscomp/bsb/bsb_pkg.ml index 8ccb3eeea2..c32080fcbd 100644 --- a/jscomp/bsb/bsb_pkg.ml +++ b/jscomp/bsb/bsb_pkg.ml @@ -63,8 +63,6 @@ let resolve_bs_package_aux ~cwd (pkg : t) = let node_path = match Sys.getenv "NODE_PATH" with | node_path -> - print_endline node_path; - print_endline (Char.escaped node_path_delimiter); Ext_string.split node_path node_path_delimiter | exception Not_found -> Bsb_exception.package_not_found ~pkg ~json:None From 0382b1a7cfafd1a14b1a4979b4320fd9d5657bca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Poul=20Purkh=C3=BAs?= Date: Sat, 27 Jul 2019 11:03:08 +0000 Subject: [PATCH 6/7] Use Sys.win32 --- jscomp/bsb/bsb_pkg.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jscomp/bsb/bsb_pkg.ml b/jscomp/bsb/bsb_pkg.ml index c32080fcbd..684892c860 100644 --- a/jscomp/bsb/bsb_pkg.ml +++ b/jscomp/bsb/bsb_pkg.ml @@ -35,7 +35,7 @@ let make_sub_path (x : t) : string = Literals.node_modules // Bsb_pkg_types.to_string x let node_path_delimiter = - if Sys.os_type = "Win32" then + if Sys.win32 then ';' else ':' From a3c4a578efbc03bc40ce85bec60007ebb66932a5 Mon Sep 17 00:00:00 2001 From: Hongbo Date: Mon, 29 Jul 2019 10:46:46 +0800 Subject: [PATCH 7/7] use lazy evaluation to reduce overhead --- jscomp/bsb/bsb_pkg.ml | 49 ++++++++++------------- jscomp/ounit_tests/ounit_string_tests.ml | 7 +++- lib/4.02.3/bsb.ml | 51 ++++++++++-------------- lib/4.02.3/unstable/all_ounit_tests.ml | 7 +++- lib/4.02.3/unstable/bsb_native.ml | 51 ++++++++++-------------- scripts/ciTest.js | 1 + 6 files changed, 76 insertions(+), 90 deletions(-) diff --git a/jscomp/bsb/bsb_pkg.ml b/jscomp/bsb/bsb_pkg.ml index 684892c860..4df0a3fa55 100644 --- a/jscomp/bsb/bsb_pkg.ml +++ b/jscomp/bsb/bsb_pkg.ml @@ -34,47 +34,40 @@ type t = Bsb_pkg_types.t let make_sub_path (x : t) : string = Literals.node_modules // Bsb_pkg_types.to_string x -let node_path_delimiter = - if Sys.win32 then - ';' - else - ':' - +let node_paths : string list Lazy.t = + lazy (try Ext_string.split (Sys.getenv "NODE_PATH") + (if Sys.win32 then ';' else ':') + with _ -> []) (** It makes sense to have this function raise, when [bsb] could not resolve a package, it used to mean a failure *) +let check_dir dir = + match Sys.file_exists dir with + | true -> Some(dir) + | false -> None + let resolve_bs_package_aux ~cwd (pkg : t) = (* First try to resolve recursively from the current working directory *) let sub_path = make_sub_path pkg in let rec aux cwd = let abs_marker = cwd // sub_path in - if Sys.file_exists abs_marker then Some(abs_marker) + if Sys.file_exists abs_marker then abs_marker else let another_cwd = Filename.dirname cwd in (* TODO: may non-terminating when see symlinks *) if String.length another_cwd < String.length cwd then aux another_cwd - else (* To the end try other possiblilities *) - None + else (* To the end try other possiblilities [NODE_PATH]*) + (match Ext_list.find_opt (Lazy.force node_paths) + (fun dir -> check_dir (dir // Bsb_pkg_types.to_string pkg)) with + | Some(resolved_dir) -> resolved_dir + | None -> Bsb_exception.package_not_found ~pkg ~json:None) in - match aux cwd with - | Some(package_dir) -> package_dir - (* If the package can not be resolved then check if NODE_PATH is set and if set then search there*) - | None -> - let node_path = - match Sys.getenv "NODE_PATH" with - | node_path -> - Ext_string.split node_path node_path_delimiter - | exception Not_found -> - Bsb_exception.package_not_found ~pkg ~json:None - in - let check_dir dir = - match Sys.file_exists dir with - | true -> Some(dir) - | false -> None - in - match Ext_list.find_opt node_path (fun dir -> check_dir (dir // Bsb_pkg_types.to_string pkg)) with - | Some(resolved_dir) -> resolved_dir - | None -> Bsb_exception.package_not_found ~pkg ~json:None + aux cwd + + + + + module Coll = Hashtbl_make.Make(struct type nonrec t = t diff --git a/jscomp/ounit_tests/ounit_string_tests.ml b/jscomp/ounit_tests/ounit_string_tests.ml index db1507dcc2..619bb2f4dc 100644 --- a/jscomp/ounit_tests/ounit_string_tests.ml +++ b/jscomp/ounit_tests/ounit_string_tests.ml @@ -1,7 +1,7 @@ let ((>::), (>:::)) = OUnit.((>::),(>:::)) -let (=~) = OUnit.assert_equal +let (=~) = OUnit.assert_equal ~printer:Ext_obj.dump let printer_string = fun x -> x @@ -495,6 +495,11 @@ let suites = string_eq (Ext_filename.module_name "a/b/.") "" ; + end; + __LOC__ >:: begin fun _ -> + Ext_string.split "" ':' =~ []; + Ext_string.split "a:b:" ':' =~ ["a";"b"]; + Ext_string.split "a:b:" ':' ~keep_empty:true =~ ["a";"b";""] end ] diff --git a/lib/4.02.3/bsb.ml b/lib/4.02.3/bsb.ml index e5438d1a25..d40a24b5c6 100644 --- a/lib/4.02.3/bsb.ml +++ b/lib/4.02.3/bsb.ml @@ -5239,49 +5239,40 @@ type t = Bsb_pkg_types.t let make_sub_path (x : t) : string = Literals.node_modules // Bsb_pkg_types.to_string x -let node_path_delimiter = - if Sys.os_type = "Win32" then - ';' - else - ':' - +let node_paths : string list Lazy.t = + lazy (try Ext_string.split (Sys.getenv "NODE_PATH") + (if Sys.win32 then ';' else ':') + with _ -> []) (** It makes sense to have this function raise, when [bsb] could not resolve a package, it used to mean a failure *) +let check_dir dir = + match Sys.file_exists dir with + | true -> Some(dir) + | false -> None + let resolve_bs_package_aux ~cwd (pkg : t) = (* First try to resolve recursively from the current working directory *) let sub_path = make_sub_path pkg in let rec aux cwd = let abs_marker = cwd // sub_path in - if Sys.file_exists abs_marker then Some(abs_marker) + if Sys.file_exists abs_marker then abs_marker else let another_cwd = Filename.dirname cwd in (* TODO: may non-terminating when see symlinks *) if String.length another_cwd < String.length cwd then aux another_cwd - else (* To the end try other possiblilities *) - None + else (* To the end try other possiblilities [NODE_PATH]*) + (match Ext_list.find_opt (Lazy.force node_paths) + (fun dir -> check_dir (dir // Bsb_pkg_types.to_string pkg)) with + | Some(resolved_dir) -> resolved_dir + | None -> Bsb_exception.package_not_found ~pkg ~json:None) in - match aux cwd with - | Some(package_dir) -> package_dir - (* If the package can not be resolved then check if NODE_PATH is set and if set then search there*) - | None -> - let node_path = - match Sys.getenv "NODE_PATH" with - | node_path -> - print_endline node_path; - print_endline (Char.escaped node_path_delimiter); - Ext_string.split node_path node_path_delimiter - | exception Not_found -> - Bsb_exception.package_not_found ~pkg ~json:None - in - let check_dir dir = - match Sys.file_exists dir with - | true -> Some(dir) - | false -> None - in - match Ext_list.find_opt node_path (fun dir -> check_dir (dir // Bsb_pkg_types.to_string pkg)) with - | Some(resolved_dir) -> resolved_dir - | None -> Bsb_exception.package_not_found ~pkg ~json:None + aux cwd + + + + + module Coll = Hashtbl_make.Make(struct type nonrec t = t diff --git a/lib/4.02.3/unstable/all_ounit_tests.ml b/lib/4.02.3/unstable/all_ounit_tests.ml index 18d6a09f62..32f03c256c 100644 --- a/lib/4.02.3/unstable/all_ounit_tests.ml +++ b/lib/4.02.3/unstable/all_ounit_tests.ml @@ -17047,7 +17047,7 @@ module Ounit_string_tests let ((>::), (>:::)) = OUnit.((>::),(>:::)) -let (=~) = OUnit.assert_equal +let (=~) = OUnit.assert_equal ~printer:Ext_obj.dump let printer_string = fun x -> x @@ -17541,6 +17541,11 @@ let suites = string_eq (Ext_filename.module_name "a/b/.") "" ; + end; + __LOC__ >:: begin fun _ -> + Ext_string.split "" ':' =~ []; + Ext_string.split "a:b:" ':' =~ ["a";"b"]; + Ext_string.split "a:b:" ':' ~keep_empty:true =~ ["a";"b";""] end ] diff --git a/lib/4.02.3/unstable/bsb_native.ml b/lib/4.02.3/unstable/bsb_native.ml index 09287136a7..1c23fcc9d9 100644 --- a/lib/4.02.3/unstable/bsb_native.ml +++ b/lib/4.02.3/unstable/bsb_native.ml @@ -5239,49 +5239,40 @@ type t = Bsb_pkg_types.t let make_sub_path (x : t) : string = Literals.node_modules // Bsb_pkg_types.to_string x -let node_path_delimiter = - if Sys.os_type = "Win32" then - ';' - else - ':' - +let node_paths : string list Lazy.t = + lazy (try Ext_string.split (Sys.getenv "NODE_PATH") + (if Sys.win32 then ';' else ':') + with _ -> []) (** It makes sense to have this function raise, when [bsb] could not resolve a package, it used to mean a failure *) +let check_dir dir = + match Sys.file_exists dir with + | true -> Some(dir) + | false -> None + let resolve_bs_package_aux ~cwd (pkg : t) = (* First try to resolve recursively from the current working directory *) let sub_path = make_sub_path pkg in let rec aux cwd = let abs_marker = cwd // sub_path in - if Sys.file_exists abs_marker then Some(abs_marker) + if Sys.file_exists abs_marker then abs_marker else let another_cwd = Filename.dirname cwd in (* TODO: may non-terminating when see symlinks *) if String.length another_cwd < String.length cwd then aux another_cwd - else (* To the end try other possiblilities *) - None + else (* To the end try other possiblilities [NODE_PATH]*) + (match Ext_list.find_opt (Lazy.force node_paths) + (fun dir -> check_dir (dir // Bsb_pkg_types.to_string pkg)) with + | Some(resolved_dir) -> resolved_dir + | None -> Bsb_exception.package_not_found ~pkg ~json:None) in - match aux cwd with - | Some(package_dir) -> package_dir - (* If the package can not be resolved then check if NODE_PATH is set and if set then search there*) - | None -> - let node_path = - match Sys.getenv "NODE_PATH" with - | node_path -> - print_endline node_path; - print_endline (Char.escaped node_path_delimiter); - Ext_string.split node_path node_path_delimiter - | exception Not_found -> - Bsb_exception.package_not_found ~pkg ~json:None - in - let check_dir dir = - match Sys.file_exists dir with - | true -> Some(dir) - | false -> None - in - match Ext_list.find_opt node_path (fun dir -> check_dir (dir // Bsb_pkg_types.to_string pkg)) with - | Some(resolved_dir) -> resolved_dir - | None -> Bsb_exception.package_not_found ~pkg ~json:None + aux cwd + + + + + module Coll = Hashtbl_make.Make(struct type nonrec t = t diff --git a/scripts/ciTest.js b/scripts/ciTest.js index 1933ba89e0..f7f9b6539d 100644 --- a/scripts/ciTest.js +++ b/scripts/ciTest.js @@ -114,6 +114,7 @@ function main() { console.log("BSBDIR:", bsbDir) if (themeTest) { + console.log('Doing theme tests') var themeOutput = cp.execSync(`bsb -themes`,{encoding : 'ascii'}) var themes = themeOutput.split('\n').slice(1).map(x=>x.trim()).filter(x=>x) var themesDir = path.join(__dirname,'..','themes')