Skip to content

Commit 02ff4c9

Browse files
authored
Made pinned dependencies transitive (#5722)
* Made pinned dependencies transitive. Moved extract_pinned_dependencies to bsb_build_util. Minor change to clean build script. Signed-Off-By: Logan Grier <[email protected]> * Eliminated 'npm install' in transitive_pinned_dependency tests. Signed-Off-By: Logan Grier <[email protected]> * Deleted transitive pinned dependency test package-lock.json files. Signed-Off-By: Logan Grier <[email protected]> * Added entry in changelog. Signed-Off-By: Logan Grier <[email protected]>
1 parent 3aedb24 commit 02ff4c9

37 files changed

+289
-40
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
- `rescript convert <reason files>`
2020
- Remove obsolete built-in project templates and the "rescript init" functionality. This will be replaced by the create-rescript-app project that is maintained separately.
2121

22+
#### :boom: Breaking Change
23+
24+
- Made pinned dependencies transitive: if *a* is a pinned dependency of *b* and *b* is a pinned dependency of *c*, then *a* is implicitly a pinned dependency of *c*.
25+
- This change is only breaking if your build process assumes non-transitivity. Few if any builds do. In the typical case where you build your monorepo by running `rescript build` on each package in your repo, you don't need to make any changes. There is no way of building with the old, non-transitive behavior.
26+
2227
# 10.1.0-rc.1
2328

2429
## :rocket: New Feature

CONTRIBUTING.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ Usually whenever there's some issues with missing files, incompatible interfaces
7676

7777
```sh
7878
./scripts/ninja.js clean # remove files not in version control
79+
npm install
7980
./scripts/ninja.js config
8081
./scripts/ninja.js build
8182
```

jscomp/bsb/bsb_build_util.ml

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ let ( |? ) m (key, cb) = m |> Ext_json.test key cb
130130

131131
type top = Expect_none | Expect_name of string
132132

133-
type package_context = { proj_dir : string; top : top }
133+
type package_context = { proj_dir : string; top : top; is_pinned: bool }
134134

135135
(**
136136
TODO: check duplicate package name
@@ -146,6 +146,13 @@ type package_context = { proj_dir : string; top : top }
146146
let pp_packages_rev ppf lst =
147147
Ext_list.rev_iter lst (fun s -> Format.fprintf ppf "%s " s)
148148

149+
let extract_pinned_dependencies (map : Ext_json_types.t Map_string.t) : Set_string.t =
150+
match Map_string.find_opt map Bsb_build_schemas.pinned_dependencies with
151+
| None -> Set_string.empty
152+
| Some (Arr { content }) ->
153+
Set_string.of_list (get_list_string content)
154+
| Some config -> Bsb_exception.config_error config "expect an array of string"
155+
149156
let rec walk_all_deps_aux (visited : string Hash_string.t) (paths : string list)
150157
~(top : top) (dir : string) (queue : _ Queue.t) ~pinned_dependencies =
151158
let bsconfig_json = dir // Literals.bsconfig_json in
@@ -174,9 +181,9 @@ let rec walk_all_deps_aux (visited : string Hash_string.t) (paths : string list)
174181
if Hash_string.mem visited cur_package_name then
175182
Bsb_log.info "@{<info>Visited before@} %s@." cur_package_name
176183
else
177-
let explore_deps (deps : string) =
184+
let explore_deps (deps : string) pinned_dependencies =
178185
map
179-
|? ( deps,
186+
|? ( deps,
180187
`Arr
181188
(fun (new_packages : Ext_json_types.t array) ->
182189
Ext_array.iter new_packages (fun js ->
@@ -194,13 +201,24 @@ let rec walk_all_deps_aux (visited : string Hash_string.t) (paths : string list)
194201
)
195202
|> ignore
196203
in
197-
explore_deps Bsb_build_schemas.bs_dependencies;
204+
let is_pinned = match top with
205+
| Expect_name n when Set_string.mem pinned_dependencies n -> true
206+
| _ -> false
207+
in
208+
let pinned_dependencies = match is_pinned with
209+
| true ->
210+
let transitive_pinned_dependencies = extract_pinned_dependencies map
211+
in
212+
Set_string.union transitive_pinned_dependencies pinned_dependencies
213+
| false -> pinned_dependencies
214+
in
215+
explore_deps Bsb_build_schemas.bs_dependencies pinned_dependencies;
198216
(match top with
199-
| Expect_none -> explore_deps Bsb_build_schemas.bs_dev_dependencies
200-
| Expect_name n when Set_string.mem pinned_dependencies n ->
201-
explore_deps Bsb_build_schemas.bs_dev_dependencies
217+
| Expect_none -> explore_deps Bsb_build_schemas.bs_dev_dependencies pinned_dependencies
218+
| Expect_name _ when is_pinned ->
219+
explore_deps Bsb_build_schemas.bs_dev_dependencies pinned_dependencies
202220
| Expect_name _ -> ());
203-
Queue.add { top; proj_dir = dir } queue;
221+
Queue.add { top; proj_dir = dir; is_pinned } queue;
204222
Hash_string.add visited cur_package_name dir
205223
| _ -> ()
206224

jscomp/bsb/bsb_build_util.mli

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ type result = { path : string; checked : bool }
8282
*)
8383
val resolve_bsb_magic_file : cwd:string -> desc:string -> string -> result
8484

85-
type package_context = { proj_dir : string; top : top }
85+
type package_context = { proj_dir : string; top : top; is_pinned: bool }
86+
87+
val extract_pinned_dependencies: Ext_json_types.t Map_string.t -> Set_string.t
8688

8789
val walk_all_deps :
8890
string -> pinned_dependencies:Set_string.t -> package_context Queue.t

jscomp/bsb/bsb_config_parse.ml

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,6 @@ let extract_ignored_dirs (map : json_map) : Set_string.t =
142142
Set_string.of_list (Bsb_build_util.get_list_string content)
143143
| Some config -> Bsb_exception.config_error config "expect an array of string"
144144

145-
let extract_pinned_dependencies (map : json_map) : Set_string.t =
146-
match map.?(Bsb_build_schemas.pinned_dependencies) with
147-
| None -> Set_string.empty
148-
| Some (Arr { content }) ->
149-
Set_string.of_list (Bsb_build_util.get_list_string content)
150-
| Some config -> Bsb_exception.config_error config "expect an array of string"
151-
152145
let extract_generators (map : json_map) =
153146
let generators = ref Map_string.empty in
154147
(match map.?(Bsb_build_schemas.generators) with
@@ -286,7 +279,7 @@ let interpret_json ~(package_kind : Bsb_package_kind.t) ~(per_proj_dir : string)
286279
Bsb_build_schemas.bs_dev_dependencies
287280
| Dependency _ -> []
288281
in
289-
let pinned_dependencies = extract_pinned_dependencies map in
282+
let pinned_dependencies = Bsb_build_util.extract_pinned_dependencies map in
290283
match map.?(Bsb_build_schemas.sources) with
291284
| Some sources ->
292285
let cut_generators =
@@ -357,5 +350,5 @@ let deps_from_bsconfig () =
357350
| Obj { map } ->
358351
( Bsb_package_specs.from_map ~cwd:Bsb_global_paths.cwd map,
359352
Bsb_jsx.from_map map,
360-
extract_pinned_dependencies map )
353+
Bsb_build_util.extract_pinned_dependencies map )
361354
| _ -> assert false

jscomp/bsb/bsb_world.ml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,10 @@ let make_world_deps cwd (config : Bsb_config_types.t option)
5656
);
5757
close_out oc ; *)
5858
queue
59-
|> Queue.iter (fun ({ top; proj_dir } : Bsb_build_util.package_context) ->
59+
|> Queue.iter (fun ({ top; proj_dir; is_pinned } : Bsb_build_util.package_context) ->
6060
match top with
6161
| Expect_none -> ()
6262
| Expect_name s ->
63-
let is_pinned = Set_string.mem pinned_dependencies s in
6463
if is_pinned then print_endline ("Dependency pinned on " ^ s)
6564
else print_endline ("Dependency on " ^ s);
6665
let lib_bs_dir = proj_dir // lib_artifacts_dir in
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
lib
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"name": "a",
3+
"namespace": true,
4+
"sources": [
5+
{
6+
"dir": "src"
7+
},
8+
{
9+
"dir": "tests",
10+
"type": "dev"
11+
}
12+
],
13+
"package-specs": {
14+
"module": "commonjs",
15+
"in-source": false
16+
},
17+
"warnings": {
18+
"error": true
19+
},
20+
"suffix": ".mjs",
21+
"bs-dependencies": [
22+
"b"
23+
],
24+
"pinned-dependencies": [
25+
"b"
26+
]
27+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"name": "a",
3+
"version": "1.0.0"
4+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Js.Console.log("src")
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Js.Console.log("test")
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//@ts-check
2+
var child_process = require("child_process");
3+
var assert = require("assert");
4+
var fs = require("fs")
5+
var rescript_exe = require("../../../scripts/bin_path").rescript_exe;
6+
7+
console.log(child_process.execSync(rescript_exe, { encoding: "utf8", cwd: "./a" }));
8+
9+
assert(fs.existsSync("./node_modules/c/lib/js/tests/test.mjs"), "dev files of module 'c' were not built by 'a' even though 'c' is a transitive pinned dependency of 'a' through 'b'")

jscomp/build_tests/transitive_pinned_dependency1/node_modules/b/bsconfig.json

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency1/node_modules/b/package.json

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency1/node_modules/b/src/src.res

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency1/node_modules/b/tests/test.res

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency1/node_modules/c/bsconfig.json

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency1/node_modules/c/package.json

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency1/node_modules/c/src/src.res

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency1/node_modules/c/tests/test.res

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"name": "top",
3+
"workspaces": [
4+
"a",
5+
"b",
6+
"c"
7+
]
8+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
lib
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "a",
3+
"namespace": true,
4+
"sources": [
5+
{
6+
"dir": "src"
7+
},
8+
{
9+
"dir": "tests",
10+
"type": "dev"
11+
}
12+
],
13+
"package-specs": {
14+
"module": "commonjs",
15+
"in-source": false
16+
},
17+
"warnings": {
18+
"error": true
19+
},
20+
"suffix": ".mjs",
21+
"bs-dependencies": [
22+
"b"
23+
]
24+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"name": "a",
3+
"version": "1.0.0"
4+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Js.Console.log("src")
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Js.Console.log("test")
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//@ts-check
2+
var child_process = require("child_process");
3+
var assert = require("assert");
4+
var fs = require("fs")
5+
var rescript_exe = require("../../../scripts/bin_path").rescript_exe;
6+
7+
console.log(child_process.execSync(rescript_exe, { encoding: "utf8", cwd: "./a" }));
8+
9+
assert(!fs.existsSync("./node_modules/c/lib/js/tests/test.mjs"), "dev files of module 'c' were built by 'a' even though 'c' is not a pinned dependency of 'a'")

jscomp/build_tests/transitive_pinned_dependency2/node_modules/b/bsconfig.json

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency2/node_modules/b/package.json

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency2/node_modules/b/src/src.res

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency2/node_modules/b/tests/test.res

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency2/node_modules/c/bsconfig.json

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency2/node_modules/c/package.json

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency2/node_modules/c/src/src.res

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/build_tests/transitive_pinned_dependency2/node_modules/c/tests/test.res

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)