From 15e9328841ef4304aea34e3024e748d284a6f4f5 Mon Sep 17 00:00:00 2001 From: Braden Napier Date: Fri, 16 Nov 2018 03:52:08 -0800 Subject: [PATCH 1/6] commit resolve_alias feature add tests for resolve_alias --- src/commands/commandUtils.ml | 1 + src/commands/config/flowConfig.ml | 12 +++++ src/commands/config/flowConfig.mli | 1 + src/common/files.ml | 27 ++++++++-- src/common/files.mli | 3 ++ src/services/inference/module/module_js.ml | 24 ++++++--- .../.flowconfig | 3 ++ ...fig_module_system_node_resolve_dirname.exp | 53 +++++++++++++++++++ .../custom_resolve_dir/testproj/index.js | 3 ++ .../custom_resolve_dir/testproj2/index.js | 3 ++ .../node_modules/testproj/index.js | 3 ++ .../node_modules/testproj2/index.js | 3 ++ .../custom_resolve_dir/testproj2/index.js | 3 ++ .../subdir/sublevel.js | 7 +++ .../toplevel.js | 6 +++ 15 files changed, 141 insertions(+), 11 deletions(-) create mode 100644 tests/config_module_system_node_resolve_alias/.flowconfig create mode 100644 tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_dirname.exp create mode 100644 tests/config_module_system_node_resolve_alias/custom_resolve_dir/testproj/index.js create mode 100644 tests/config_module_system_node_resolve_alias/custom_resolve_dir/testproj2/index.js create mode 100644 tests/config_module_system_node_resolve_alias/node_modules/testproj/index.js create mode 100644 tests/config_module_system_node_resolve_alias/node_modules/testproj2/index.js create mode 100644 tests/config_module_system_node_resolve_alias/subdir/custom_resolve_dir/testproj2/index.js create mode 100644 tests/config_module_system_node_resolve_alias/subdir/sublevel.js create mode 100644 tests/config_module_system_node_resolve_alias/toplevel.js diff --git a/src/commands/commandUtils.ml b/src/commands/commandUtils.ml index b37a5b5a3ed..529ac344a11 100644 --- a/src/commands/commandUtils.ml +++ b/src/commands/commandUtils.ml @@ -564,6 +564,7 @@ let file_options = module_file_exts = FlowConfig.module_file_exts flowconfig; module_resource_exts = FlowConfig.module_resource_exts flowconfig; node_resolver_dirnames = FlowConfig.node_resolver_dirnames flowconfig; + node_resolver_aliases = FlowConfig.node_resolver_aliases flowconfig } let ignore_flag prev = CommandSpec.ArgSpec.( diff --git a/src/commands/config/flowConfig.ml b/src/commands/config/flowConfig.ml index 5e87f0be255..6a41f135039 100644 --- a/src/commands/config/flowConfig.ml +++ b/src/commands/config/flowConfig.ml @@ -69,6 +69,7 @@ module Opts = struct munge_underscores: bool; no_flowlib: bool; node_resolver_dirnames: string list; + node_resolver_aliases: string list; root_name: string option; saved_state_fetcher: Options.saved_state_fetcher; shm_dep_table_pow: int; @@ -155,6 +156,7 @@ module Opts = struct munge_underscores = false; no_flowlib = false; node_resolver_dirnames = ["node_modules"]; + node_resolver_aliases = []; root_name = None; saved_state_fetcher = Options.Dummy_fetcher; shm_dep_table_pow = 17; @@ -486,6 +488,15 @@ module Opts = struct let node_resolver_dirnames = v :: opts.node_resolver_dirnames in Ok {opts with node_resolver_dirnames;} ); + + "module.system.node.resolve_alias", + string + ~init: (fun opts -> { opts with node_resolver_aliases = [] }) + ~multiple: true + (fun opts v -> + let node_resolver_aliases = v :: opts.node_resolver_aliases in + Ok {opts with node_resolver_aliases;} + ); "module.use_strict", boolean (fun opts v -> Ok { opts with modules_are_use_strict = v }); @@ -991,6 +1002,7 @@ let modules_are_use_strict c = c.options.Opts.modules_are_use_strict let munge_underscores c = c.options.Opts.munge_underscores let no_flowlib c = c.options.Opts.no_flowlib let node_resolver_dirnames c = c.options.Opts.node_resolver_dirnames +let node_resolver_aliases c = c.options.Opts.node_resolver_aliases let root_name c = c.options.Opts.root_name let saved_state_fetcher c = c.options.Opts.saved_state_fetcher let shm_dep_table_pow c = c.options.Opts.shm_dep_table_pow diff --git a/src/commands/config/flowConfig.mli b/src/commands/config/flowConfig.mli index 4de1d362abf..33838da2530 100644 --- a/src/commands/config/flowConfig.mli +++ b/src/commands/config/flowConfig.mli @@ -75,6 +75,7 @@ val modules_are_use_strict: config -> bool val munge_underscores: config -> bool val no_flowlib: config -> bool val node_resolver_dirnames: config -> string list +val node_resolver_aliases: config -> string list val required_version: config -> string option val root_name: config -> string option val saved_state_fetcher: config -> Options.saved_state_fetcher diff --git a/src/common/files.ml b/src/common/files.ml index 2574a8e45d5..4c747e20bf0 100644 --- a/src/common/files.ml +++ b/src/common/files.ml @@ -17,6 +17,7 @@ type options = { module_file_exts: SSet.t; module_resource_exts: SSet.t; node_resolver_dirnames: string list; + node_resolver_aliases: string list; } let default_lib_dir options = options.default_lib_dir @@ -28,6 +29,7 @@ let lib_paths options = options.lib_paths let module_file_exts options = options.module_file_exts let module_resource_exts options = options.module_resource_exts let node_resolver_dirnames options = options.node_resolver_dirnames +let node_resolver_aliases options = options.node_resolver_aliases let node_modules_containers = ref SSet.empty @@ -104,6 +106,9 @@ let is_valid_path = let is_node_module options path = List.mem (Filename.basename path) options.node_resolver_dirnames +let is_module_alias options path = + List.mem (Filename.basename path) options.node_resolver_aliases + let is_flow_file ~options = let is_valid_path = is_valid_path ~options in fun path -> is_valid_path path && not (is_directory path) @@ -177,7 +182,7 @@ let max_files = 1000 If kind_of_path fails, then we only emit a warning if error_filter passes *) let make_next_files_and_symlinks - ~node_module_filter ~path_filter ~realpath_filter ~error_filter paths = + ~node_module_filter ~module_alias_filter ~path_filter ~realpath_filter ~error_filter paths = let prefix_checkers = Core_list.map ~f:is_prefix paths in let rec process sz (acc, symlinks) files dir stack = if sz >= max_files then @@ -193,7 +198,7 @@ let make_next_files_and_symlinks then process (sz+1) (real :: acc, symlinks) files dir stack else process sz (acc, symlinks) files dir stack | Dir (path, is_symlink) -> - if node_module_filter file + if node_module_filter file || module_alias_filter file then node_modules_containers := SSet.add (Filename.dirname file) !node_modules_containers; let dirfiles = Array.to_list @@ try_readdir path in let symlinks = @@ -229,13 +234,14 @@ let make_next_files_and_symlinks of `paths`. *) let make_next_files_following_symlinks ~node_module_filter + ~module_alias_filter ~path_filter ~realpath_filter ~error_filter paths = let paths = Core_list.map ~f:Path.to_string paths in let cb = ref (make_next_files_and_symlinks - ~node_module_filter ~path_filter ~realpath_filter ~error_filter paths + ~node_module_filter ~module_alias_filter ~path_filter ~realpath_filter ~error_filter paths ) in let symlinks = ref SSet.empty in let seen_symlinks = ref SSet.empty in @@ -254,7 +260,7 @@ let make_next_files_following_symlinks symlinks := SSet.empty; (* since we're following a symlink, use realpath_filter for both *) cb := make_next_files_and_symlinks - ~node_module_filter ~path_filter:realpath_filter ~realpath_filter ~error_filter paths; + ~node_module_filter ~module_alias_filter ~path_filter:realpath_filter ~realpath_filter ~error_filter paths; rec_cb () end in @@ -273,6 +279,7 @@ let get_all = let init ?(flowlibs_only=false) (options: options) = let node_module_filter = is_node_module options in + let module_alias_filter = is_module_alias options in let libs = if flowlibs_only then [] else options.lib_paths in let libs, filter = match options.default_lib_dir with | None -> libs, is_valid_path ~options @@ -291,6 +298,7 @@ let init ?(flowlibs_only=false) (options: options) = let filter' path = path = lib_str || filter path in make_next_files_following_symlinks ~node_module_filter + ~module_alias_filter ~path_filter:filter' ~realpath_filter:filter' ~error_filter:(fun _ -> true) @@ -364,6 +372,7 @@ let watched_paths options = *) let make_next_files ~root ~all ~subdir ~options ~libs = let node_module_filter = is_node_module options in + let module_alias_filter = is_module_alias options in let filter = if all then fun _ -> true else wanted ~options libs in (* The directories from which we start our search *) @@ -399,7 +408,7 @@ let make_next_files ~root ~all ~subdir ~options ~libs = ) in make_next_files_following_symlinks - ~node_module_filter ~path_filter ~realpath_filter ~error_filter:filter starting_points + ~node_module_filter ~module_alias_filter ~path_filter ~realpath_filter ~error_filter:filter starting_points let is_windows_root root = Sys.win32 && @@ -527,6 +536,14 @@ let is_within_node_modules ~root ~options path = let node_resolver_dirnames = node_resolver_dirnames options |> SSet.of_list in not (SSet.inter directories node_resolver_dirnames |> SSet.is_empty) +(* Given a path, we want to know if it's a resolve alias. *) +let is_within_alias_directory ~root ~options path = + (* We use paths that are relative to the root, so that we ignore ancestor directories *) + let path = relative_path (Path.to_string root) path in + let directories = Str.split dir_sep path |> SSet.of_list in + let node_resolver_aliases = node_resolver_aliases options |> SSet.of_list in + not (SSet.inter directories node_resolver_aliases |> SSet.is_empty) + (* realpath doesn't work for non-existent paths. So let's find the longest existent prefix, run * realpath on that, and then append the rest to it *) diff --git a/src/common/files.mli b/src/common/files.mli index 9f25e7d2f0f..a99cbd1b147 100644 --- a/src/common/files.mli +++ b/src/common/files.mli @@ -17,6 +17,7 @@ type options = { module_file_exts: SSet.t; module_resource_exts: SSet.t; node_resolver_dirnames: string list; + node_resolver_aliases: string list; } val default_lib_dir: options -> Path.t option @@ -28,6 +29,7 @@ val lib_paths: options -> Path.t list val module_file_exts: options -> SSet.t val module_resource_exts: options -> SSet.t val node_resolver_dirnames: options -> string list +val node_resolver_aliases: options -> string list val node_modules_containers: SSet.t ref @@ -106,6 +108,7 @@ val filename_from_string: options: options -> string -> File_key.t val mkdirp: string -> Unix.file_perm -> unit val is_within_node_modules: root:Path.t -> options: options -> string -> bool +val is_within_alias_directory: root:Path.t -> options: options -> string -> bool val imaginary_realpath: string -> string val canonicalize_filenames: diff --git a/src/services/inference/module/module_js.ml b/src/services/inference/module/module_js.ml index 74768112696..42ba25e4879 100644 --- a/src/services/inference/module/module_js.ml +++ b/src/services/inference/module/module_js.ml @@ -407,12 +407,24 @@ module Node = struct lazy_seq [ lazy ( if SSet.mem dir node_modules_containers then - lazy_seq (Files.node_resolver_dirnames file_options |> Core_list.map ~f:(fun dirname -> - lazy (resolve_relative - ~options ~reader - loc ?resolution_acc dir (spf "%s%s%s" dirname Filename.dir_sep r) - ) - )) + lazy_seq([ + lazy ( + lazy_seq (Files.node_resolver_aliases file_options |> Core_list.map ~f:(fun dirname -> + lazy (resolve_relative + ~options + loc ?resolution_acc dir (spf "%s%s%s" dirname Filename.dir_sep r) + ) + )) + ); + lazy ( + lazy_seq (Files.node_resolver_dirnames file_options |> Core_list.map ~f:(fun dirname -> + lazy (resolve_relative + ~options ~reader + loc ?resolution_acc dir (spf "%s%s%s" dirname Filename.dir_sep r) + ) + )) + ); + ]) else None ); diff --git a/tests/config_module_system_node_resolve_alias/.flowconfig b/tests/config_module_system_node_resolve_alias/.flowconfig new file mode 100644 index 00000000000..20da9977f24 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/.flowconfig @@ -0,0 +1,3 @@ +[options] +module.system.node.resolve_dirname=node_modules +module.system.node.resolve_alias=custom_resolve_dir diff --git a/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_dirname.exp b/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_dirname.exp new file mode 100644 index 00000000000..3b04ff95125 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_dirname.exp @@ -0,0 +1,53 @@ +Error ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ subdir/sublevel.js:6:2 + +Cannot cast name to string literal custom_resolve_dir/testproj2 because string +literal subdir/custom_resolve_dir/testproj2 [1] is incompatible with string literal +custom_resolve_dir/testproj2 [2]. + + subdir/sublevel.js + 3│ import {name} from "testproj2"; + 4│ + 5│ (name: "subdir/custom_resolve_dir/testproj2"); + [2] 6│ (name: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + 7│ (name: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + 8│ + + subdir/custom_resolve_dir/testproj2/index.js + [1] 3│ export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; + + +Error ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ subdir/sublevel.js:7:2 + +Cannot cast name to string literal node_modules/testproj2 because string literal +subdir/custom_resolve_dir/testproj2 [1] is incompatible with string literal +node_modules/testproj2 [2]. + + subdir/sublevel.js + 4│ + 5│ (name: "subdir/custom_resolve_dir/testproj2"); + 6│ (name: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + [2] 7│ (name: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + 8│ + + subdir/custom_resolve_dir/testproj2/index.js + [1] 3│ export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; + + +Error ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ toplevel.js:6:2 + +Cannot cast name to string literal node_modules/testproj because string literal +custom_resolve_dir/testproj [1] is incompatible with string literal +node_modules/testproj [2]. + + toplevel.js + 3│ import {name} from "testproj"; + 4│ + 5│ (name: "custom_resolve_dir/testproj"); + [2] 6│ (name: "node_modules/testproj"); // Error: Resolve from resolve_alias first! + + custom_resolve_dir/testproj/index.js + [1] 3│ export var name: "custom_resolve_dir/testproj" = "custom_resolve_dir/testproj"; + + + +Found 3 errors \ No newline at end of file diff --git a/tests/config_module_system_node_resolve_alias/custom_resolve_dir/testproj/index.js b/tests/config_module_system_node_resolve_alias/custom_resolve_dir/testproj/index.js new file mode 100644 index 00000000000..124474deaaf --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/custom_resolve_dir/testproj/index.js @@ -0,0 +1,3 @@ +// @flow + +export var name: "custom_resolve_dir/testproj" = "custom_resolve_dir/testproj"; diff --git a/tests/config_module_system_node_resolve_alias/custom_resolve_dir/testproj2/index.js b/tests/config_module_system_node_resolve_alias/custom_resolve_dir/testproj2/index.js new file mode 100644 index 00000000000..620347ab2f1 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/custom_resolve_dir/testproj2/index.js @@ -0,0 +1,3 @@ +// @flow + +export var name: "custom_resolve_dir/testproj2" = "custom_resolve_dir/testproj2"; diff --git a/tests/config_module_system_node_resolve_alias/node_modules/testproj/index.js b/tests/config_module_system_node_resolve_alias/node_modules/testproj/index.js new file mode 100644 index 00000000000..04064ab9e18 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/node_modules/testproj/index.js @@ -0,0 +1,3 @@ +// @flow + +export var name: "node_modules/testproj" = "node_modules/testproj"; diff --git a/tests/config_module_system_node_resolve_alias/node_modules/testproj2/index.js b/tests/config_module_system_node_resolve_alias/node_modules/testproj2/index.js new file mode 100644 index 00000000000..592604c3880 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/node_modules/testproj2/index.js @@ -0,0 +1,3 @@ +// @flow + +export var name: "node_modules/testproj2" = "node_modules/testproj2"; diff --git a/tests/config_module_system_node_resolve_alias/subdir/custom_resolve_dir/testproj2/index.js b/tests/config_module_system_node_resolve_alias/subdir/custom_resolve_dir/testproj2/index.js new file mode 100644 index 00000000000..af4294a36c2 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/subdir/custom_resolve_dir/testproj2/index.js @@ -0,0 +1,3 @@ +// @flow + +export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; diff --git a/tests/config_module_system_node_resolve_alias/subdir/sublevel.js b/tests/config_module_system_node_resolve_alias/subdir/sublevel.js new file mode 100644 index 00000000000..19bc2d993c7 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/subdir/sublevel.js @@ -0,0 +1,7 @@ +// @flow + +import {name} from "testproj2"; + +(name: "subdir/custom_resolve_dir/testproj2"); +(name: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! +(name: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! diff --git a/tests/config_module_system_node_resolve_alias/toplevel.js b/tests/config_module_system_node_resolve_alias/toplevel.js new file mode 100644 index 00000000000..03ee0aae2fa --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/toplevel.js @@ -0,0 +1,6 @@ +// @flow + +import {name} from "testproj"; + +(name: "custom_resolve_dir/testproj"); +(name: "node_modules/testproj"); // Error: Resolve from resolve_alias first! \ No newline at end of file From e4a8696b5bcc2c54d846fdaad59c980f7873bb40 Mon Sep 17 00:00:00 2001 From: Braden Napier Date: Mon, 4 Feb 2019 22:13:44 -0800 Subject: [PATCH 2/6] provide ~reader to alias lazy_seq --- src/services/inference/module/module_js.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/inference/module/module_js.ml b/src/services/inference/module/module_js.ml index 42ba25e4879..e9ff8e60479 100644 --- a/src/services/inference/module/module_js.ml +++ b/src/services/inference/module/module_js.ml @@ -411,7 +411,7 @@ module Node = struct lazy ( lazy_seq (Files.node_resolver_aliases file_options |> Core_list.map ~f:(fun dirname -> lazy (resolve_relative - ~options + ~options ~reader loc ?resolution_acc dir (spf "%s%s%s" dirname Filename.dir_sep r) ) )) From 1a56b873f0c4224c0fa2f39455b60fe63321251e Mon Sep 17 00:00:00 2001 From: Braden Napier Date: Mon, 4 Feb 2019 22:34:07 -0800 Subject: [PATCH 3/6] update tests to new styling of messages --- ...onfig_module_system_node_resolve_alias.exp | 56 +++++++++++++++++++ ...fig_module_system_node_resolve_dirname.exp | 53 ------------------ 2 files changed, 56 insertions(+), 53 deletions(-) create mode 100644 tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_alias.exp delete mode 100644 tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_dirname.exp diff --git a/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_alias.exp b/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_alias.exp new file mode 100644 index 00000000000..73b65ea9c04 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_alias.exp @@ -0,0 +1,56 @@ +Error ------------------------------------------------------------------------------------------- subdir/sublevel.js:6:2 + +Cannot cast `name` to string literal `custom_resolve_dir/testproj2` because string literal +`subdir/custom_resolve_dir/testproj2` [1] is incompatible with string literal `custom_resolve_dir/testproj2` [2]. + + subdir/sublevel.js:6:2 + 6| (name: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + ^^^^ + +References: + subdir/custom_resolve_dir/testproj2/index.js:3:18 + 3| export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1] + subdir/sublevel.js:6:8 + 6| (name: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [2] + + +Error ------------------------------------------------------------------------------------------- subdir/sublevel.js:7:2 + +Cannot cast `name` to string literal `node_modules/testproj2` because string literal +`subdir/custom_resolve_dir/testproj2` [1] is incompatible with string literal `node_modules/testproj2` [2]. + + subdir/sublevel.js:7:2 + 7| (name: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + ^^^^ + +References: + subdir/custom_resolve_dir/testproj2/index.js:3:18 + 3| export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1] + subdir/sublevel.js:7:8 + 7| (name: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + ^^^^^^^^^^^^^^^^^^^^^^^^ [2] + + +Error -------------------------------------------------------------------------------------------------- toplevel.js:6:2 + +Cannot cast `name` to string literal `node_modules/testproj` because string literal `custom_resolve_dir/testproj` [1] is +incompatible with string literal `node_modules/testproj` [2]. + + toplevel.js:6:2 + 6| (name: "node_modules/testproj"); // Error: Resolve from resolve_alias first! + ^^^^ + +References: + custom_resolve_dir/testproj/index.js:3:18 + 3| export var name: "custom_resolve_dir/testproj" = "custom_resolve_dir/testproj"; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1] + toplevel.js:6:8 + 6| (name: "node_modules/testproj"); // Error: Resolve from resolve_alias first! + ^^^^^^^^^^^^^^^^^^^^^^^ [2] + + + +Found 3 errors diff --git a/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_dirname.exp b/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_dirname.exp deleted file mode 100644 index 3b04ff95125..00000000000 --- a/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_dirname.exp +++ /dev/null @@ -1,53 +0,0 @@ -Error ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ subdir/sublevel.js:6:2 - -Cannot cast name to string literal custom_resolve_dir/testproj2 because string -literal subdir/custom_resolve_dir/testproj2 [1] is incompatible with string literal -custom_resolve_dir/testproj2 [2]. - - subdir/sublevel.js - 3│ import {name} from "testproj2"; - 4│ - 5│ (name: "subdir/custom_resolve_dir/testproj2"); - [2] 6│ (name: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! - 7│ (name: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! - 8│ - - subdir/custom_resolve_dir/testproj2/index.js - [1] 3│ export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; - - -Error ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ subdir/sublevel.js:7:2 - -Cannot cast name to string literal node_modules/testproj2 because string literal -subdir/custom_resolve_dir/testproj2 [1] is incompatible with string literal -node_modules/testproj2 [2]. - - subdir/sublevel.js - 4│ - 5│ (name: "subdir/custom_resolve_dir/testproj2"); - 6│ (name: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! - [2] 7│ (name: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! - 8│ - - subdir/custom_resolve_dir/testproj2/index.js - [1] 3│ export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; - - -Error ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ toplevel.js:6:2 - -Cannot cast name to string literal node_modules/testproj because string literal -custom_resolve_dir/testproj [1] is incompatible with string literal -node_modules/testproj [2]. - - toplevel.js - 3│ import {name} from "testproj"; - 4│ - 5│ (name: "custom_resolve_dir/testproj"); - [2] 6│ (name: "node_modules/testproj"); // Error: Resolve from resolve_alias first! - - custom_resolve_dir/testproj/index.js - [1] 3│ export var name: "custom_resolve_dir/testproj" = "custom_resolve_dir/testproj"; - - - -Found 3 errors \ No newline at end of file From eba9109c8602871c8c6fda846664e4e9fa81febd Mon Sep 17 00:00:00 2001 From: Braden Napier Date: Mon, 4 Feb 2019 22:43:44 -0800 Subject: [PATCH 4/6] resolve_alias extra tests to handle more cases --- .../.flowconfig | 1 + ...onfig_module_system_node_resolve_alias.exp | 52 +++++++++---------- .../custom_node_modules/testproj4/index.js | 4 ++ .../node_modules/testproj3/index.js | 3 ++ .../subdir/sublevel.js | 18 +++++-- .../toplevel.js | 12 +++-- 6 files changed, 57 insertions(+), 33 deletions(-) create mode 100644 tests/config_module_system_node_resolve_alias/custom_node_modules/testproj4/index.js create mode 100644 tests/config_module_system_node_resolve_alias/node_modules/testproj3/index.js diff --git a/tests/config_module_system_node_resolve_alias/.flowconfig b/tests/config_module_system_node_resolve_alias/.flowconfig index 20da9977f24..def20c40880 100644 --- a/tests/config_module_system_node_resolve_alias/.flowconfig +++ b/tests/config_module_system_node_resolve_alias/.flowconfig @@ -1,3 +1,4 @@ [options] module.system.node.resolve_dirname=node_modules +module.system.node.resolve_dirname=custom_node_modules module.system.node.resolve_alias=custom_resolve_dir diff --git a/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_alias.exp b/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_alias.exp index 73b65ea9c04..16ee4887fd2 100644 --- a/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_alias.exp +++ b/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_alias.exp @@ -1,55 +1,55 @@ -Error ------------------------------------------------------------------------------------------- subdir/sublevel.js:6:2 +Error ------------------------------------------------------------------------------------------ subdir/sublevel.js:10:2 -Cannot cast `name` to string literal `custom_resolve_dir/testproj2` because string literal +Cannot cast `two` to string literal `custom_resolve_dir/testproj2` because string literal `subdir/custom_resolve_dir/testproj2` [1] is incompatible with string literal `custom_resolve_dir/testproj2` [2]. - subdir/sublevel.js:6:2 - 6| (name: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! - ^^^^ + subdir/sublevel.js:10:2 + 10| (two: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + ^^^ References: subdir/custom_resolve_dir/testproj2/index.js:3:18 - 3| export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1] - subdir/sublevel.js:6:8 - 6| (name: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + 3| export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1] + subdir/sublevel.js:10:7 + 10| (two: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [2] -Error ------------------------------------------------------------------------------------------- subdir/sublevel.js:7:2 +Error ------------------------------------------------------------------------------------------ subdir/sublevel.js:11:2 -Cannot cast `name` to string literal `node_modules/testproj2` because string literal +Cannot cast `two` to string literal `node_modules/testproj2` because string literal `subdir/custom_resolve_dir/testproj2` [1] is incompatible with string literal `node_modules/testproj2` [2]. - subdir/sublevel.js:7:2 - 7| (name: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! - ^^^^ + subdir/sublevel.js:11:2 + 11| (two: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + ^^^ References: subdir/custom_resolve_dir/testproj2/index.js:3:18 - 3| export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1] - subdir/sublevel.js:7:8 - 7| (name: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + 3| export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1] + subdir/sublevel.js:11:7 + 11| (two: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! ^^^^^^^^^^^^^^^^^^^^^^^^ [2] -Error -------------------------------------------------------------------------------------------------- toplevel.js:6:2 +Error -------------------------------------------------------------------------------------------------- toplevel.js:7:2 -Cannot cast `name` to string literal `node_modules/testproj` because string literal `custom_resolve_dir/testproj` [1] is +Cannot cast `one` to string literal `node_modules/testproj` because string literal `custom_resolve_dir/testproj` [1] is incompatible with string literal `node_modules/testproj` [2]. - toplevel.js:6:2 - 6| (name: "node_modules/testproj"); // Error: Resolve from resolve_alias first! - ^^^^ + toplevel.js:7:2 + 7| (one: "node_modules/testproj"); // Error: Resolve from resolve_alias first! + ^^^ References: custom_resolve_dir/testproj/index.js:3:18 3| export var name: "custom_resolve_dir/testproj" = "custom_resolve_dir/testproj"; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1] - toplevel.js:6:8 - 6| (name: "node_modules/testproj"); // Error: Resolve from resolve_alias first! - ^^^^^^^^^^^^^^^^^^^^^^^ [2] + toplevel.js:7:7 + 7| (one: "node_modules/testproj"); // Error: Resolve from resolve_alias first! + ^^^^^^^^^^^^^^^^^^^^^^^ [2] diff --git a/tests/config_module_system_node_resolve_alias/custom_node_modules/testproj4/index.js b/tests/config_module_system_node_resolve_alias/custom_node_modules/testproj4/index.js new file mode 100644 index 00000000000..bc4d5706e49 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/custom_node_modules/testproj4/index.js @@ -0,0 +1,4 @@ +// @flow + +export var name: "custom_node_modules/testproj4" = + "custom_node_modules/testproj4"; diff --git a/tests/config_module_system_node_resolve_alias/node_modules/testproj3/index.js b/tests/config_module_system_node_resolve_alias/node_modules/testproj3/index.js new file mode 100644 index 00000000000..5c439a350d5 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/node_modules/testproj3/index.js @@ -0,0 +1,3 @@ +// @flow + +export var name: "node_modules/testproj3" = "node_modules/testproj3"; diff --git a/tests/config_module_system_node_resolve_alias/subdir/sublevel.js b/tests/config_module_system_node_resolve_alias/subdir/sublevel.js index 19bc2d993c7..ec08d74a359 100644 --- a/tests/config_module_system_node_resolve_alias/subdir/sublevel.js +++ b/tests/config_module_system_node_resolve_alias/subdir/sublevel.js @@ -1,7 +1,17 @@ // @flow +import { name as one } from "testproj"; +import { name as two } from "testproj2"; +import { name as three } from "testproj3"; +import { name as four } from "testproj4"; -import {name} from "testproj2"; +(one: "custom_resolve_dir/testproj"); -(name: "subdir/custom_resolve_dir/testproj2"); -(name: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! -(name: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! +(two: "subdir/custom_resolve_dir/testproj2"); +(two: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! +(two: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + +// should still resolve node_modules +(three: "node_modules/testproj3"); + +// should still resolve custom_node_modules +(four: "custom_node_modules/testproj4"); diff --git a/tests/config_module_system_node_resolve_alias/toplevel.js b/tests/config_module_system_node_resolve_alias/toplevel.js index 03ee0aae2fa..668b94a560f 100644 --- a/tests/config_module_system_node_resolve_alias/toplevel.js +++ b/tests/config_module_system_node_resolve_alias/toplevel.js @@ -1,6 +1,12 @@ // @flow -import {name} from "testproj"; +import { name as one } from "testproj"; +import { name as two } from "testproj2"; -(name: "custom_resolve_dir/testproj"); -(name: "node_modules/testproj"); // Error: Resolve from resolve_alias first! \ No newline at end of file +(one: "custom_resolve_dir/testproj"); +(one: "node_modules/testproj"); // Error: Resolve from resolve_alias first! + +// at base level we resolve local testproj2 +// as opposed to the local custom_resolve_dir +// in the subdir test +(two: "custom_resolve_dir/testproj2"); From 3ab5ba935da68d9f792c079b1c1d2f1cdbcd0e05 Mon Sep 17 00:00:00 2001 From: Braden Napier Date: Mon, 4 Feb 2019 22:54:29 -0800 Subject: [PATCH 5/6] resolve_alias another example edge case for resolution tree merging behavior --- ...onfig_module_system_node_resolve_alias.exp | 20 ++++++++-------- .../node_modules/testproj2/subfile.js | 3 +++ .../subdir/sublevel.js | 24 +++++++++++++++---- 3 files changed, 33 insertions(+), 14 deletions(-) create mode 100644 tests/config_module_system_node_resolve_alias/node_modules/testproj2/subfile.js diff --git a/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_alias.exp b/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_alias.exp index 16ee4887fd2..c306d601960 100644 --- a/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_alias.exp +++ b/tests/config_module_system_node_resolve_alias/config_module_system_node_resolve_alias.exp @@ -1,36 +1,36 @@ -Error ------------------------------------------------------------------------------------------ subdir/sublevel.js:10:2 +Error ------------------------------------------------------------------------------------------ subdir/sublevel.js:12:2 Cannot cast `two` to string literal `custom_resolve_dir/testproj2` because string literal `subdir/custom_resolve_dir/testproj2` [1] is incompatible with string literal `custom_resolve_dir/testproj2` [2]. - subdir/sublevel.js:10:2 - 10| (two: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + subdir/sublevel.js:12:2 + 12| (two: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! ^^^ References: subdir/custom_resolve_dir/testproj2/index.js:3:18 3| export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1] - subdir/sublevel.js:10:7 - 10| (two: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + subdir/sublevel.js:12:7 + 12| (two: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [2] -Error ------------------------------------------------------------------------------------------ subdir/sublevel.js:11:2 +Error ------------------------------------------------------------------------------------------ subdir/sublevel.js:13:2 Cannot cast `two` to string literal `node_modules/testproj2` because string literal `subdir/custom_resolve_dir/testproj2` [1] is incompatible with string literal `node_modules/testproj2` [2]. - subdir/sublevel.js:11:2 - 11| (two: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + subdir/sublevel.js:13:2 + 13| (two: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! ^^^ References: subdir/custom_resolve_dir/testproj2/index.js:3:18 3| export var name: "subdir/custom_resolve_dir/testproj2" = "subdir/custom_resolve_dir/testproj2"; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1] - subdir/sublevel.js:11:7 - 11| (two: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! + subdir/sublevel.js:13:7 + 13| (two: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! ^^^^^^^^^^^^^^^^^^^^^^^^ [2] diff --git a/tests/config_module_system_node_resolve_alias/node_modules/testproj2/subfile.js b/tests/config_module_system_node_resolve_alias/node_modules/testproj2/subfile.js new file mode 100644 index 00000000000..86e2965c7ac --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/node_modules/testproj2/subfile.js @@ -0,0 +1,3 @@ +// @flow +export var name: "node_modules/testproj2/subfile" = + "node_modules/testproj2/subfile"; diff --git a/tests/config_module_system_node_resolve_alias/subdir/sublevel.js b/tests/config_module_system_node_resolve_alias/subdir/sublevel.js index ec08d74a359..b5bc787cac5 100644 --- a/tests/config_module_system_node_resolve_alias/subdir/sublevel.js +++ b/tests/config_module_system_node_resolve_alias/subdir/sublevel.js @@ -1,8 +1,10 @@ // @flow import { name as one } from "testproj"; import { name as two } from "testproj2"; -import { name as three } from "testproj3"; -import { name as four } from "testproj4"; +import { name as three } from "testproj2/subfile"; + +import { name as four } from "testproj3"; +import { name as five } from "testproj4"; (one: "custom_resolve_dir/testproj"); @@ -10,8 +12,22 @@ import { name as four } from "testproj4"; (two: "custom_resolve_dir/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! (two: "node_modules/testproj2"); // Error: Resolve from sibling 'custom_resolve_dir' first! +// if we fail to resolve in custom_resolve_dir +// then we should still resolve node_modules if +// possible. +// +// this tends to bring up the possibility of +// confusing bugs but it is consistent with +// the behavior of the webpack/babel features +// they are based upon. +// +// personally can see a flow lint warning +// as an option here if a conflict of folders +// is detected between aliases and/or node_modules +(three: "node_modules/testproj2/subfile"); + // should still resolve node_modules -(three: "node_modules/testproj3"); +(four: "node_modules/testproj3"); // should still resolve custom_node_modules -(four: "custom_node_modules/testproj4"); +(five: "custom_node_modules/testproj4"); From 961d65533d91766dc299f2fb54cd9df5319ddb69 Mon Sep 17 00:00:00 2001 From: Braden Napier Date: Tue, 5 Feb 2019 00:07:37 -0800 Subject: [PATCH 6/6] highlight fail case --- tests/config_module_system_node_resolve_alias/.flowconfig | 3 +++ .../config_module_system_node_resolve_alias/jsconfig.json | 8 ++++++++ .../root_resolve_dir/testproj6/index.js | 3 +++ .../subdir/custom_resolve_dir/testproj5/index.js | 4 ++++ .../subdir/root_resolve_dir/testproj6/index.js | 4 ++++ .../subdir/sublevel.js | 6 ++++++ 6 files changed, 28 insertions(+) create mode 100644 tests/config_module_system_node_resolve_alias/jsconfig.json create mode 100644 tests/config_module_system_node_resolve_alias/root_resolve_dir/testproj6/index.js create mode 100644 tests/config_module_system_node_resolve_alias/subdir/custom_resolve_dir/testproj5/index.js create mode 100644 tests/config_module_system_node_resolve_alias/subdir/root_resolve_dir/testproj6/index.js diff --git a/tests/config_module_system_node_resolve_alias/.flowconfig b/tests/config_module_system_node_resolve_alias/.flowconfig index def20c40880..bb04c96a24e 100644 --- a/tests/config_module_system_node_resolve_alias/.flowconfig +++ b/tests/config_module_system_node_resolve_alias/.flowconfig @@ -2,3 +2,6 @@ module.system.node.resolve_dirname=node_modules module.system.node.resolve_dirname=custom_node_modules module.system.node.resolve_alias=custom_resolve_dir +; should also be able to specify as +; /root_resolve_dir +module.system.node.resolve_alias=./root_resolve_dir diff --git a/tests/config_module_system_node_resolve_alias/jsconfig.json b/tests/config_module_system_node_resolve_alias/jsconfig.json new file mode 100644 index 00000000000..c3729654cc3 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "*": ["./src/*"] + } + } +} diff --git a/tests/config_module_system_node_resolve_alias/root_resolve_dir/testproj6/index.js b/tests/config_module_system_node_resolve_alias/root_resolve_dir/testproj6/index.js new file mode 100644 index 00000000000..7499d5fcf0a --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/root_resolve_dir/testproj6/index.js @@ -0,0 +1,3 @@ +// @flow + +export var name: "root_resolve_dir/testproj6" = "root_resolve_dir/testproj6"; diff --git a/tests/config_module_system_node_resolve_alias/subdir/custom_resolve_dir/testproj5/index.js b/tests/config_module_system_node_resolve_alias/subdir/custom_resolve_dir/testproj5/index.js new file mode 100644 index 00000000000..40e5d9afa37 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/subdir/custom_resolve_dir/testproj5/index.js @@ -0,0 +1,4 @@ +// @flow + +export var name: "subdir/custom_resolve_dir/testproj5" = + "subdir/custom_resolve_dir/testproj5"; diff --git a/tests/config_module_system_node_resolve_alias/subdir/root_resolve_dir/testproj6/index.js b/tests/config_module_system_node_resolve_alias/subdir/root_resolve_dir/testproj6/index.js new file mode 100644 index 00000000000..e666bbcd3e8 --- /dev/null +++ b/tests/config_module_system_node_resolve_alias/subdir/root_resolve_dir/testproj6/index.js @@ -0,0 +1,4 @@ +// @flow + +export var name: "subdir/root_resolve_dir/testproj6" = + "subdir/root_resolve_dir/testproj6"; diff --git a/tests/config_module_system_node_resolve_alias/subdir/sublevel.js b/tests/config_module_system_node_resolve_alias/subdir/sublevel.js index b5bc787cac5..41daab004d4 100644 --- a/tests/config_module_system_node_resolve_alias/subdir/sublevel.js +++ b/tests/config_module_system_node_resolve_alias/subdir/sublevel.js @@ -6,6 +6,10 @@ import { name as three } from "testproj2/subfile"; import { name as four } from "testproj3"; import { name as five } from "testproj4"; +import { name as six } from "testproj5"; + +import { name as seven } from "testproj6"; + (one: "custom_resolve_dir/testproj"); (two: "subdir/custom_resolve_dir/testproj2"); @@ -31,3 +35,5 @@ import { name as five } from "testproj4"; // should still resolve custom_node_modules (five: "custom_node_modules/testproj4"); + +(seven: "root_resolve_dir/testproj6/");