From 9534e6e1131542653c4e266f712c4067af2c8ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Fri, 17 Nov 2023 02:28:38 +0100 Subject: feat(unstable): Workspaces support (#20410) This commit adds unstable workspace support. This is extremely bare-bones and minimal first-pass at this. With this change `deno.json` supports specifying `workspaces` key, that accepts a list of subdirectories. Each workspace can have its own import map. It's required to specify a `"name"` and `"version"` properties in the configuration file for the workspace: ```jsonc // deno.json { "workspaces": [ "a", "b" }, "imports": { "express": "npm:express@5" } } ``` ``` jsonc // a/deno.json { "name": "a", "version": "1.0.2", "imports": { "kleur": "npm:kleur" } } ``` ```jsonc // b/deno.json { "name": "b", "version": "0.51.0", "imports": { "chalk": "npm:chalk" } } ``` `--unstable-workspaces` flag is required to use this feature: ``` $ deno run --unstable-workspaces mod.ts ``` --------- Co-authored-by: David Sherret --- cli/tests/integration/run_tests.rs | 29 ++++++++++++++++++++++ .../testdata/run/workspaces/basic/bar/deno.json | 8 ++++++ .../testdata/run/workspaces/basic/bar/fizz/buzz.ts | 1 + cli/tests/testdata/run/workspaces/basic/bar/mod.ts | 5 ++++ .../run/workspaces/basic/bar/some_mod/hello.ts | 1 + cli/tests/testdata/run/workspaces/basic/deno.json | 9 +++++++ .../testdata/run/workspaces/basic/foo/bar/hello.ts | 1 + .../testdata/run/workspaces/basic/foo/deno.json | 8 ++++++ .../testdata/run/workspaces/basic/foo/fizz/buzz.ts | 1 + cli/tests/testdata/run/workspaces/basic/foo/mod.ts | 5 ++++ cli/tests/testdata/run/workspaces/basic/main.out | 21 ++++++++++++++++ cli/tests/testdata/run/workspaces/basic/main.ts | 5 ++++ .../workspaces/member_outside_root_dir/deno.json | 9 +++++++ .../member_outside_root_dir/foo/bar/hello.ts | 1 + .../member_outside_root_dir/foo/deno.json | 8 ++++++ .../member_outside_root_dir/foo/fizz/buzz.ts | 1 + .../workspaces/member_outside_root_dir/foo/mod.ts | 5 ++++ .../workspaces/member_outside_root_dir/main.out | 1 + .../run/workspaces/member_outside_root_dir/main.ts | 4 +++ .../run/workspaces/nested_member/bar/deno.json | 8 ++++++ .../run/workspaces/nested_member/bar/fizz/buzz.ts | 1 + .../run/workspaces/nested_member/bar/mod.ts | 5 ++++ .../workspaces/nested_member/bar/some_mod/hello.ts | 1 + .../run/workspaces/nested_member/deno.json | 6 +++++ .../run/workspaces/nested_member/foo/bar/deno.json | 7 ++++++ .../run/workspaces/nested_member/foo/bar/hello.ts | 3 +++ .../run/workspaces/nested_member/foo/deno.json | 7 ++++++ .../run/workspaces/nested_member/foo/fizz/buzz.ts | 1 + .../run/workspaces/nested_member/foo/mod.ts | 3 +++ .../testdata/run/workspaces/nested_member/main.out | 1 + .../testdata/run/workspaces/nested_member/main.ts | 4 +++ 31 files changed, 170 insertions(+) create mode 100644 cli/tests/testdata/run/workspaces/basic/bar/deno.json create mode 100644 cli/tests/testdata/run/workspaces/basic/bar/fizz/buzz.ts create mode 100644 cli/tests/testdata/run/workspaces/basic/bar/mod.ts create mode 100644 cli/tests/testdata/run/workspaces/basic/bar/some_mod/hello.ts create mode 100644 cli/tests/testdata/run/workspaces/basic/deno.json create mode 100644 cli/tests/testdata/run/workspaces/basic/foo/bar/hello.ts create mode 100644 cli/tests/testdata/run/workspaces/basic/foo/deno.json create mode 100644 cli/tests/testdata/run/workspaces/basic/foo/fizz/buzz.ts create mode 100644 cli/tests/testdata/run/workspaces/basic/foo/mod.ts create mode 100644 cli/tests/testdata/run/workspaces/basic/main.out create mode 100644 cli/tests/testdata/run/workspaces/basic/main.ts create mode 100644 cli/tests/testdata/run/workspaces/member_outside_root_dir/deno.json create mode 100644 cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/bar/hello.ts create mode 100644 cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/deno.json create mode 100644 cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/fizz/buzz.ts create mode 100644 cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/mod.ts create mode 100644 cli/tests/testdata/run/workspaces/member_outside_root_dir/main.out create mode 100644 cli/tests/testdata/run/workspaces/member_outside_root_dir/main.ts create mode 100644 cli/tests/testdata/run/workspaces/nested_member/bar/deno.json create mode 100644 cli/tests/testdata/run/workspaces/nested_member/bar/fizz/buzz.ts create mode 100644 cli/tests/testdata/run/workspaces/nested_member/bar/mod.ts create mode 100644 cli/tests/testdata/run/workspaces/nested_member/bar/some_mod/hello.ts create mode 100644 cli/tests/testdata/run/workspaces/nested_member/deno.json create mode 100644 cli/tests/testdata/run/workspaces/nested_member/foo/bar/deno.json create mode 100644 cli/tests/testdata/run/workspaces/nested_member/foo/bar/hello.ts create mode 100644 cli/tests/testdata/run/workspaces/nested_member/foo/deno.json create mode 100644 cli/tests/testdata/run/workspaces/nested_member/foo/fizz/buzz.ts create mode 100644 cli/tests/testdata/run/workspaces/nested_member/foo/mod.ts create mode 100644 cli/tests/testdata/run/workspaces/nested_member/main.out create mode 100644 cli/tests/testdata/run/workspaces/nested_member/main.ts (limited to 'cli/tests') diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index c24464eba..306d4df67 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -4759,3 +4759,32 @@ itest!(explicit_resource_management { args: "run --quiet --check run/explicit_resource_management/main.ts", output: "run/explicit_resource_management/main.out", }); + +itest!(workspaces_basic { + args: "run -L debug -A --unstable-workspaces main.ts", + output: "run/workspaces/basic/main.out", + cwd: Some("run/workspaces/basic/"), + copy_temp_dir: Some("run/workspaces/basic/"), + envs: env_vars_for_npm_tests(), + http_server: true, +}); + +itest!(workspaces_member_outside_root_dir { + args: "run -A --unstable-workspaces main.ts", + output: "run/workspaces/member_outside_root_dir/main.out", + cwd: Some("run/workspaces/member_outside_root_dir/"), + copy_temp_dir: Some("run/workspaces/member_outside_root_dir/"), + envs: env_vars_for_npm_tests(), + http_server: true, + exit_code: 1, +}); + +itest!(workspaces_nested_member { + args: "run -A --unstable-workspaces main.ts", + output: "run/workspaces/nested_member/main.out", + cwd: Some("run/workspaces/nested_member/"), + copy_temp_dir: Some("run/workspaces/nested_member/"), + envs: env_vars_for_npm_tests(), + http_server: true, + exit_code: 1, +}); diff --git a/cli/tests/testdata/run/workspaces/basic/bar/deno.json b/cli/tests/testdata/run/workspaces/basic/bar/deno.json new file mode 100644 index 000000000..ef3bfc37a --- /dev/null +++ b/cli/tests/testdata/run/workspaces/basic/bar/deno.json @@ -0,0 +1,8 @@ +{ + "name": "asdfasdfasdf", + "version": "0.0.0", + "imports": { + "@/": "./", + "secret_mod/": "./some_mod/" + } +} diff --git a/cli/tests/testdata/run/workspaces/basic/bar/fizz/buzz.ts b/cli/tests/testdata/run/workspaces/basic/bar/fizz/buzz.ts new file mode 100644 index 000000000..f88d62fcc --- /dev/null +++ b/cli/tests/testdata/run/workspaces/basic/bar/fizz/buzz.ts @@ -0,0 +1 @@ +export const buzz = "buzz from bar"; diff --git a/cli/tests/testdata/run/workspaces/basic/bar/mod.ts b/cli/tests/testdata/run/workspaces/basic/bar/mod.ts new file mode 100644 index 000000000..6f898e389 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/basic/bar/mod.ts @@ -0,0 +1,5 @@ +import { hello } from "secret_mod/hello.ts"; +import { buzz } from "@/fizz/buzz.ts"; + +console.log(hello); +console.log(buzz); diff --git a/cli/tests/testdata/run/workspaces/basic/bar/some_mod/hello.ts b/cli/tests/testdata/run/workspaces/basic/bar/some_mod/hello.ts new file mode 100644 index 000000000..1013de8d2 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/basic/bar/some_mod/hello.ts @@ -0,0 +1 @@ +export const hello = "hello from bar"; diff --git a/cli/tests/testdata/run/workspaces/basic/deno.json b/cli/tests/testdata/run/workspaces/basic/deno.json new file mode 100644 index 000000000..b971c4f3d --- /dev/null +++ b/cli/tests/testdata/run/workspaces/basic/deno.json @@ -0,0 +1,9 @@ +{ + "workspaces": [ + "foo", + "bar" + ], + "imports": { + "chalk": "npm:chalk" + } +} diff --git a/cli/tests/testdata/run/workspaces/basic/foo/bar/hello.ts b/cli/tests/testdata/run/workspaces/basic/foo/bar/hello.ts new file mode 100644 index 000000000..c8a7e57c4 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/basic/foo/bar/hello.ts @@ -0,0 +1 @@ +export const hello = "hello from foo"; diff --git a/cli/tests/testdata/run/workspaces/basic/foo/deno.json b/cli/tests/testdata/run/workspaces/basic/foo/deno.json new file mode 100644 index 000000000..46d84f06f --- /dev/null +++ b/cli/tests/testdata/run/workspaces/basic/foo/deno.json @@ -0,0 +1,8 @@ +{ + "name": "qwerqwer", + "version": "0.0.0", + "imports": { + "~/": "./", + "foo/": "./bar/" + } +} diff --git a/cli/tests/testdata/run/workspaces/basic/foo/fizz/buzz.ts b/cli/tests/testdata/run/workspaces/basic/foo/fizz/buzz.ts new file mode 100644 index 000000000..4e03777d1 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/basic/foo/fizz/buzz.ts @@ -0,0 +1 @@ +export const buzz = "buzz from foo"; diff --git a/cli/tests/testdata/run/workspaces/basic/foo/mod.ts b/cli/tests/testdata/run/workspaces/basic/foo/mod.ts new file mode 100644 index 000000000..d7b16dcc0 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/basic/foo/mod.ts @@ -0,0 +1,5 @@ +import { hello } from "foo/hello.ts"; +import { buzz } from "~/fizz/buzz.ts"; + +console.log(hello); +console.log(buzz); diff --git a/cli/tests/testdata/run/workspaces/basic/main.out b/cli/tests/testdata/run/workspaces/basic/main.out new file mode 100644 index 000000000..77e0de4d1 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/basic/main.out @@ -0,0 +1,21 @@ +[WILDCARD]Workspace config generated this import map { + "imports": { + "chalk": "npm:chalk" + }, + "scopes": { + "./foo/": { + "~/": "./foo/", + "foo/": "./foo/bar/" + }, + "./bar/": { + "@/": "./bar/", + "secret_mod/": "./bar/some_mod/" + } + } +} +[WILDCARD] +hello from foo +buzz from foo +hello from bar +buzz from bar +[Function: chalk][WILDCARD] \ No newline at end of file diff --git a/cli/tests/testdata/run/workspaces/basic/main.ts b/cli/tests/testdata/run/workspaces/basic/main.ts new file mode 100644 index 000000000..380c97619 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/basic/main.ts @@ -0,0 +1,5 @@ +import chalk from "chalk"; +import "./foo/mod.ts"; +import "./bar/mod.ts"; + +console.log(chalk); diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/deno.json b/cli/tests/testdata/run/workspaces/member_outside_root_dir/deno.json new file mode 100644 index 000000000..25feefad8 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/member_outside_root_dir/deno.json @@ -0,0 +1,9 @@ +{ + "workspaces": [ + "foo", + "../other_folder" + ], + "imports": { + "chalk": "npm:chalk" + } +} diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/bar/hello.ts b/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/bar/hello.ts new file mode 100644 index 000000000..c8a7e57c4 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/bar/hello.ts @@ -0,0 +1 @@ +export const hello = "hello from foo"; diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/deno.json b/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/deno.json new file mode 100644 index 000000000..46d84f06f --- /dev/null +++ b/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/deno.json @@ -0,0 +1,8 @@ +{ + "name": "qwerqwer", + "version": "0.0.0", + "imports": { + "~/": "./", + "foo/": "./bar/" + } +} diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/fizz/buzz.ts b/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/fizz/buzz.ts new file mode 100644 index 000000000..4e03777d1 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/fizz/buzz.ts @@ -0,0 +1 @@ +export const buzz = "buzz from foo"; diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/mod.ts b/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/mod.ts new file mode 100644 index 000000000..d7b16dcc0 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/mod.ts @@ -0,0 +1,5 @@ +import { hello } from "foo/hello.ts"; +import { buzz } from "~/fizz/buzz.ts"; + +console.log(hello); +console.log(buzz); diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/main.out b/cli/tests/testdata/run/workspaces/member_outside_root_dir/main.out new file mode 100644 index 000000000..205d95aea --- /dev/null +++ b/cli/tests/testdata/run/workspaces/member_outside_root_dir/main.out @@ -0,0 +1 @@ +error: Workspace member '../other_folder' is outside root configuration directory[WILDCARD] \ No newline at end of file diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/main.ts b/cli/tests/testdata/run/workspaces/member_outside_root_dir/main.ts new file mode 100644 index 000000000..182fd8517 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/member_outside_root_dir/main.ts @@ -0,0 +1,4 @@ +import chalk from "chalk"; +import "./foo/mod.ts"; + +console.log(chalk); diff --git a/cli/tests/testdata/run/workspaces/nested_member/bar/deno.json b/cli/tests/testdata/run/workspaces/nested_member/bar/deno.json new file mode 100644 index 000000000..ef3bfc37a --- /dev/null +++ b/cli/tests/testdata/run/workspaces/nested_member/bar/deno.json @@ -0,0 +1,8 @@ +{ + "name": "asdfasdfasdf", + "version": "0.0.0", + "imports": { + "@/": "./", + "secret_mod/": "./some_mod/" + } +} diff --git a/cli/tests/testdata/run/workspaces/nested_member/bar/fizz/buzz.ts b/cli/tests/testdata/run/workspaces/nested_member/bar/fizz/buzz.ts new file mode 100644 index 000000000..f88d62fcc --- /dev/null +++ b/cli/tests/testdata/run/workspaces/nested_member/bar/fizz/buzz.ts @@ -0,0 +1 @@ +export const buzz = "buzz from bar"; diff --git a/cli/tests/testdata/run/workspaces/nested_member/bar/mod.ts b/cli/tests/testdata/run/workspaces/nested_member/bar/mod.ts new file mode 100644 index 000000000..6f898e389 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/nested_member/bar/mod.ts @@ -0,0 +1,5 @@ +import { hello } from "secret_mod/hello.ts"; +import { buzz } from "@/fizz/buzz.ts"; + +console.log(hello); +console.log(buzz); diff --git a/cli/tests/testdata/run/workspaces/nested_member/bar/some_mod/hello.ts b/cli/tests/testdata/run/workspaces/nested_member/bar/some_mod/hello.ts new file mode 100644 index 000000000..1013de8d2 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/nested_member/bar/some_mod/hello.ts @@ -0,0 +1 @@ +export const hello = "hello from bar"; diff --git a/cli/tests/testdata/run/workspaces/nested_member/deno.json b/cli/tests/testdata/run/workspaces/nested_member/deno.json new file mode 100644 index 000000000..6d9c09d4d --- /dev/null +++ b/cli/tests/testdata/run/workspaces/nested_member/deno.json @@ -0,0 +1,6 @@ +{ + "workspaces": [ + "foo", + "foo/bar" + ] +} diff --git a/cli/tests/testdata/run/workspaces/nested_member/foo/bar/deno.json b/cli/tests/testdata/run/workspaces/nested_member/foo/bar/deno.json new file mode 100644 index 000000000..d40328b36 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/nested_member/foo/bar/deno.json @@ -0,0 +1,7 @@ +{ + "name": "bar", + "version": "0.0.0", + "imports": { + "chalk": "npm:chalk" + } +} diff --git a/cli/tests/testdata/run/workspaces/nested_member/foo/bar/hello.ts b/cli/tests/testdata/run/workspaces/nested_member/foo/bar/hello.ts new file mode 100644 index 000000000..9c1023153 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/nested_member/foo/bar/hello.ts @@ -0,0 +1,3 @@ +import chalk from "chalk"; + +export default chalk; diff --git a/cli/tests/testdata/run/workspaces/nested_member/foo/deno.json b/cli/tests/testdata/run/workspaces/nested_member/foo/deno.json new file mode 100644 index 000000000..68e053b02 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/nested_member/foo/deno.json @@ -0,0 +1,7 @@ +{ + "name": "qwerqwer", + "version": "0.0.0", + "imports": { + "~/": "./" + } +} diff --git a/cli/tests/testdata/run/workspaces/nested_member/foo/fizz/buzz.ts b/cli/tests/testdata/run/workspaces/nested_member/foo/fizz/buzz.ts new file mode 100644 index 000000000..4e03777d1 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/nested_member/foo/fizz/buzz.ts @@ -0,0 +1 @@ +export const buzz = "buzz from foo"; diff --git a/cli/tests/testdata/run/workspaces/nested_member/foo/mod.ts b/cli/tests/testdata/run/workspaces/nested_member/foo/mod.ts new file mode 100644 index 000000000..b9d4d3c04 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/nested_member/foo/mod.ts @@ -0,0 +1,3 @@ +import { buzz } from "~/fizz/buzz.ts"; + +console.log(buzz); diff --git a/cli/tests/testdata/run/workspaces/nested_member/main.out b/cli/tests/testdata/run/workspaces/nested_member/main.out new file mode 100644 index 000000000..98598a306 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/nested_member/main.out @@ -0,0 +1 @@ +error: Workspace member 'foo/bar' is nested within other workspace member 'foo' diff --git a/cli/tests/testdata/run/workspaces/nested_member/main.ts b/cli/tests/testdata/run/workspaces/nested_member/main.ts new file mode 100644 index 000000000..2bf53f7c2 --- /dev/null +++ b/cli/tests/testdata/run/workspaces/nested_member/main.ts @@ -0,0 +1,4 @@ +import "./foo/mod.ts"; +import chalk from "./foo/bar/hello.ts"; + +console.log(chalk); -- cgit v1.2.3