summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock4
-rw-r--r--cli/Cargo.toml2
-rw-r--r--cli/args/mod.rs2
-rw-r--r--cli/lsp/config.rs2
-rw-r--r--cli/npm/managed/mod.rs2
-rw-r--r--cli/resolver.rs23
-rw-r--r--cli/schemas/config-file.v1.json7
-rw-r--r--cli/standalone/mod.rs5
-rw-r--r--cli/tools/lint/rules/no_sloppy_imports.rs28
-rw-r--r--cli/tools/registry/unfurl.rs5
-rw-r--r--tests/specs/compile/patch/__test__.jsonc22
-rw-r--r--tests/specs/compile/patch/add/deno.json4
-rw-r--r--tests/specs/compile/patch/add/mod.ts3
-rw-r--r--tests/specs/compile/patch/main.out1
-rw-r--r--tests/specs/compile/patch/main/deno.json5
-rw-r--r--tests/specs/compile/patch/main/main.ts3
-rw-r--r--tests/specs/mod.rs11
-rw-r--r--tests/specs/run/patch/__test__.jsonc25
-rw-r--r--tests/specs/run/patch/add/deno.json5
-rw-r--r--tests/specs/run/patch/add/mod.test.ts9
-rw-r--r--tests/specs/run/patch/add/mod.ts4
-rw-r--r--tests/specs/run/patch/modify_version.ts3
-rw-r--r--tests/specs/run/patch/my-pkg/deno.json11
-rw-r--r--tests/specs/run/patch/my-pkg/mod.test.ts7
-rw-r--r--tests/specs/run/patch/my-pkg/mod.ts2
-rw-r--r--tests/specs/run/patch/not_matching_version.out11
-rw-r--r--tests/specs/run/patch/test.out10
-rw-r--r--tests/specs/run/workspaces/member_not_match_constraint/__test__.jsonc4
-rw-r--r--tests/specs/run/workspaces/member_not_match_constraint/add/deno.json5
-rw-r--r--tests/specs/run/workspaces/member_not_match_constraint/add/mod.ts4
-rw-r--r--tests/specs/run/workspaces/member_not_match_constraint/deno.json3
-rw-r--r--tests/specs/run/workspaces/member_not_match_constraint/deno.lock23
-rw-r--r--tests/specs/run/workspaces/member_not_match_constraint/subtract/deno.json8
-rw-r--r--tests/specs/run/workspaces/member_not_match_constraint/subtract/mod.test.ts7
-rw-r--r--tests/specs/run/workspaces/member_not_match_constraint/subtract/mod.ts5
-rw-r--r--tests/specs/run/workspaces/member_not_match_constraint/test.out11
-rw-r--r--tests/specs/workspaces/patch/__test__.jsonc13
-rw-r--r--tests/specs/workspaces/patch/add/deno.json5
-rw-r--r--tests/specs/workspaces/patch/add/mod.test.ts9
-rw-r--r--tests/specs/workspaces/patch/add/mod.ts4
-rw-r--r--tests/specs/workspaces/patch/test.out10
-rw-r--r--tests/specs/workspaces/patch/workspace/deno.json6
-rw-r--r--tests/specs/workspaces/patch/workspace/my-pkg/deno.json8
-rw-r--r--tests/specs/workspaces/patch/workspace/my-pkg/mod.test.ts7
-rw-r--r--tests/specs/workspaces/patch/workspace/my-pkg/mod.ts1
45 files changed, 323 insertions, 26 deletions
diff --git a/Cargo.lock b/Cargo.lock
index d2202a7e7..debd091e8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1360,9 +1360,9 @@ dependencies = [
[[package]]
name = "deno_config"
-version = "0.29.0"
+version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bc5aa53d1c3a3d0b9fd218e3f30f1080312f811b60e1866b88ec9f665447c4e"
+checksum = "e287a8ab3552cf3ef8fc41b2bd7cc041c5e8e1a76de3aeb26e804b570bab37d7"
dependencies = [
"anyhow",
"deno_package_json",
diff --git a/cli/Cargo.toml b/cli/Cargo.toml
index acda2292c..920f0d795 100644
--- a/cli/Cargo.toml
+++ b/cli/Cargo.toml
@@ -65,7 +65,7 @@ winres.workspace = true
[dependencies]
deno_ast = { workspace = true, features = ["bundler", "cjs", "codegen", "proposal", "react", "sourcemap", "transforms", "typescript", "view", "visit"] }
deno_cache_dir = { workspace = true }
-deno_config = { version = "=0.29.0", features = ["workspace", "sync"] }
+deno_config = { version = "=0.30.0", features = ["workspace", "sync"] }
deno_core = { workspace = true, features = ["include_js_files_for_snapshotting"] }
deno_doc = { version = "0.146.0", features = ["html", "syntect"] }
deno_emit = "=0.44.0"
diff --git a/cli/args/mod.rs b/cli/args/mod.rs
index 68cf916b2..056dcb2af 100644
--- a/cli/args/mod.rs
+++ b/cli/args/mod.rs
@@ -1085,7 +1085,7 @@ impl CliOptions {
};
Ok(
self
- .start_dir
+ .workspace()
.create_resolver(
CreateResolverOptions {
pkg_json_dep_resolution,
diff --git a/cli/lsp/config.rs b/cli/lsp/config.rs
index 1d6601933..e32303baa 100644
--- a/cli/lsp/config.rs
+++ b/cli/lsp/config.rs
@@ -1491,7 +1491,7 @@ impl ConfigData {
}
};
let resolver = deno_core::unsync::spawn({
- let workspace = member_dir.clone();
+ let workspace = member_dir.workspace.clone();
let file_fetcher = file_fetcher.cloned();
async move {
workspace
diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs
index 1561d3969..8f82ddea2 100644
--- a/cli/npm/managed/mod.rs
+++ b/cli/npm/managed/mod.rs
@@ -324,7 +324,7 @@ impl ManagedCliNpmResolver {
Ok(path)
}
- /// Resolves the package nv from the provided specifier.
+ /// Resolves the package id from the provided specifier.
pub fn resolve_pkg_id_from_specifier(
&self,
specifier: &ModuleSpecifier,
diff --git a/cli/resolver.rs b/cli/resolver.rs
index b72fcd322..a62828b6e 100644
--- a/cli/resolver.rs
+++ b/cli/resolver.rs
@@ -5,6 +5,7 @@ use dashmap::DashMap;
use dashmap::DashSet;
use deno_ast::MediaType;
use deno_config::workspace::MappedResolution;
+use deno_config::workspace::MappedResolutionDiagnostic;
use deno_config::workspace::MappedResolutionError;
use deno_config::workspace::WorkspaceResolver;
use deno_core::anyhow::anyhow;
@@ -21,6 +22,7 @@ use deno_graph::NpmLoadError;
use deno_graph::NpmResolvePkgReqsResult;
use deno_npm::resolution::NpmResolutionError;
use deno_package_json::PackageJsonDepValue;
+use deno_runtime::colors;
use deno_runtime::deno_fs;
use deno_runtime::deno_fs::FileSystem;
use deno_runtime::deno_node::is_builtin_node_module;
@@ -434,6 +436,7 @@ pub struct CliGraphResolver {
maybe_vendor_specifier: Option<ModuleSpecifier>,
found_package_json_dep_flag: AtomicFlag,
bare_node_builtins_enabled: bool,
+ warned_pkgs: DashSet<PackageReq>,
}
pub struct CliGraphResolverOptions<'a> {
@@ -469,6 +472,7 @@ impl CliGraphResolver {
.and_then(|v| ModuleSpecifier::from_directory_path(v).ok()),
found_package_json_dep_flag: Default::default(),
bare_node_builtins_enabled: options.bare_node_builtins_enabled,
+ warned_pkgs: Default::default(),
}
}
@@ -541,8 +545,23 @@ impl Resolver for CliGraphResolver {
});
let result = match result {
Ok(resolution) => match resolution {
- MappedResolution::Normal(specifier)
- | MappedResolution::ImportMap(specifier) => {
+ MappedResolution::Normal {
+ specifier,
+ maybe_diagnostic,
+ }
+ | MappedResolution::ImportMap {
+ specifier,
+ maybe_diagnostic,
+ } => {
+ if let Some(diagnostic) = maybe_diagnostic {
+ match &*diagnostic {
+ MappedResolutionDiagnostic::ConstraintNotMatchedLocalVersion { reference, .. } => {
+ if self.warned_pkgs.insert(reference.req().clone()) {
+ log::warn!("{} {}\n at {}", colors::yellow("Warning"), diagnostic, referrer_range);
+ }
+ }
+ }
+ }
// do sloppy imports resolution if enabled
if let Some(sloppy_imports_resolver) = &self.sloppy_imports_resolver {
Ok(
diff --git a/cli/schemas/config-file.v1.json b/cli/schemas/config-file.v1.json
index e74df9f2f..adfe3b0c2 100644
--- a/cli/schemas/config-file.v1.json
+++ b/cli/schemas/config-file.v1.json
@@ -608,6 +608,13 @@
}
]
},
+ "patch": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "UNSTABLE: List of relative paths to folders containing JSR packages to use local versions of."
+ },
"workspace": {
"oneOf": [
{
diff --git a/cli/standalone/mod.rs b/cli/standalone/mod.rs
index 020561ece..68e133476 100644
--- a/cli/standalone/mod.rs
+++ b/cli/standalone/mod.rs
@@ -227,8 +227,8 @@ impl ModuleLoader for EmbeddedModuleLoader {
)
}
},
- Ok(MappedResolution::Normal(specifier))
- | Ok(MappedResolution::ImportMap(specifier)) => {
+ Ok(MappedResolution::Normal { specifier, .. })
+ | Ok(MappedResolution::ImportMap { specifier, .. }) => {
if let Ok(reference) =
NpmPackageReqReference::from_specifier(&specifier)
{
@@ -622,6 +622,7 @@ pub async fn run(
.jsr_pkgs
.iter()
.map(|pkg| ResolverWorkspaceJsrPackage {
+ is_patch: false, // only used for enhancing the diagnostic, which isn't shown in deno compile
base: root_dir_url.join(&pkg.relative_base).unwrap(),
name: pkg.name.clone(),
version: pkg.version.clone(),
diff --git a/cli/tools/lint/rules/no_sloppy_imports.rs b/cli/tools/lint/rules/no_sloppy_imports.rs
index 1ae792e08..4180be5be 100644
--- a/cli/tools/lint/rules/no_sloppy_imports.rs
+++ b/cli/tools/lint/rules/no_sloppy_imports.rs
@@ -189,20 +189,22 @@ impl<'a> deno_graph::source::Resolver for SloppyImportCaptureResolver<'a> {
.map_err(|err| ResolveError::Other(err.into()))?;
match resolution {
- deno_config::workspace::MappedResolution::Normal(specifier)
- | deno_config::workspace::MappedResolution::ImportMap(specifier) => {
- match self.sloppy_imports_resolver.resolve(&specifier, mode) {
- Some(res) => {
- self
- .captures
- .borrow_mut()
- .entry(referrer_range.clone())
- .or_insert_with(|| res.clone());
- Ok(res.into_specifier())
- }
- None => Ok(specifier),
- }
+ deno_config::workspace::MappedResolution::Normal {
+ specifier, ..
}
+ | deno_config::workspace::MappedResolution::ImportMap {
+ specifier, ..
+ } => match self.sloppy_imports_resolver.resolve(&specifier, mode) {
+ Some(res) => {
+ self
+ .captures
+ .borrow_mut()
+ .entry(referrer_range.clone())
+ .or_insert_with(|| res.clone());
+ Ok(res.into_specifier())
+ }
+ None => Ok(specifier),
+ },
deno_config::workspace::MappedResolution::WorkspaceJsrPackage {
..
}
diff --git a/cli/tools/registry/unfurl.rs b/cli/tools/registry/unfurl.rs
index 489c9a1be..2babedb36 100644
--- a/cli/tools/registry/unfurl.rs
+++ b/cli/tools/registry/unfurl.rs
@@ -73,8 +73,8 @@ impl SpecifierUnfurler {
self.workspace_resolver.resolve(specifier, referrer)
{
match resolved {
- MappedResolution::Normal(specifier)
- | MappedResolution::ImportMap(specifier) => Some(specifier),
+ MappedResolution::Normal { specifier, .. }
+ | MappedResolution::ImportMap { specifier, .. } => Some(specifier),
MappedResolution::WorkspaceJsrPackage { pkg_req_ref, .. } => {
Some(ModuleSpecifier::parse(&pkg_req_ref.to_string()).unwrap())
}
@@ -443,6 +443,7 @@ mod tests {
Arc::new(ModuleSpecifier::from_directory_path(&cwd).unwrap()),
Some(import_map),
vec![ResolverWorkspaceJsrPackage {
+ is_patch: false,
base: ModuleSpecifier::from_directory_path(cwd.join("jsr-package"))
.unwrap(),
name: "@denotest/example".to_string(),
diff --git a/tests/specs/compile/patch/__test__.jsonc b/tests/specs/compile/patch/__test__.jsonc
new file mode 100644
index 000000000..87abf82a7
--- /dev/null
+++ b/tests/specs/compile/patch/__test__.jsonc
@@ -0,0 +1,22 @@
+{
+ "tempDir": true,
+ "steps": [{
+ "if": "unix",
+ "args": "compile --output my-app main/main.ts",
+ "output": "[WILDCARD]"
+ }, {
+ "if": "unix",
+ "commandName": "./my-app",
+ "args": [],
+ "output": "main.out"
+ }, {
+ "if": "windows",
+ "args": "compile --output my-app.exe main/main.ts",
+ "output": "[WILDCARD]"
+ }, {
+ "if": "windows",
+ "commandName": "./my-app.exe",
+ "args": [],
+ "output": "main.out"
+ }]
+}
diff --git a/tests/specs/compile/patch/add/deno.json b/tests/specs/compile/patch/add/deno.json
new file mode 100644
index 000000000..40e417993
--- /dev/null
+++ b/tests/specs/compile/patch/add/deno.json
@@ -0,0 +1,4 @@
+{
+ "name": "@denotest/add",
+ "exports": "./mod.ts"
+}
diff --git a/tests/specs/compile/patch/add/mod.ts b/tests/specs/compile/patch/add/mod.ts
new file mode 100644
index 000000000..7e841b3bf
--- /dev/null
+++ b/tests/specs/compile/patch/add/mod.ts
@@ -0,0 +1,3 @@
+export function add(a: number, b: number): number {
+ return (a + b) * 2; // it adds wrong
+}
diff --git a/tests/specs/compile/patch/main.out b/tests/specs/compile/patch/main.out
new file mode 100644
index 000000000..1e8b31496
--- /dev/null
+++ b/tests/specs/compile/patch/main.out
@@ -0,0 +1 @@
+6
diff --git a/tests/specs/compile/patch/main/deno.json b/tests/specs/compile/patch/main/deno.json
new file mode 100644
index 000000000..5d341f168
--- /dev/null
+++ b/tests/specs/compile/patch/main/deno.json
@@ -0,0 +1,5 @@
+{
+ "patch": [
+ "../add"
+ ]
+}
diff --git a/tests/specs/compile/patch/main/main.ts b/tests/specs/compile/patch/main/main.ts
new file mode 100644
index 000000000..8fb44d2ed
--- /dev/null
+++ b/tests/specs/compile/patch/main/main.ts
@@ -0,0 +1,3 @@
+import { add } from "jsr:@denotest/add";
+
+console.log(add(1, 2));
diff --git a/tests/specs/mod.rs b/tests/specs/mod.rs
index c46969f4e..7a3572a94 100644
--- a/tests/specs/mod.rs
+++ b/tests/specs/mod.rs
@@ -53,6 +53,8 @@ struct MultiTestMetaData {
#[serde(default)]
pub envs: HashMap<String, String>,
#[serde(default)]
+ pub cwd: Option<String>,
+ #[serde(default)]
pub tests: BTreeMap<String, JsonMap>,
}
@@ -73,6 +75,10 @@ impl MultiTestMetaData {
if multi_test_meta_data.temp_dir && !value.contains_key("tempDir") {
value.insert("tempDir".to_string(), true.into());
}
+ if multi_test_meta_data.cwd.is_some() && !value.contains_key("cwd") {
+ value
+ .insert("cwd".to_string(), multi_test_meta_data.cwd.clone().into());
+ }
if !multi_test_meta_data.envs.is_empty() {
if !value.contains_key("envs") {
value.insert("envs".to_string(), JsonMap::default().into());
@@ -112,6 +118,8 @@ struct MultiStepMetaData {
#[serde(default)]
pub base: Option<String>,
#[serde(default)]
+ pub cwd: Option<String>,
+ #[serde(default)]
pub envs: HashMap<String, String>,
#[serde(default)]
pub repeat: Option<usize>,
@@ -136,6 +144,7 @@ impl SingleTestMetaData {
pub fn into_multi(self) -> MultiStepMetaData {
MultiStepMetaData {
base: self.base,
+ cwd: None,
temp_dir: self.temp_dir,
repeat: self.repeat,
envs: Default::default(),
@@ -371,7 +380,7 @@ fn run_step(
VecOrString::Vec(args) => command.args_vec(args),
VecOrString::String(text) => command.args(text),
};
- let command = match &step.cwd {
+ let command = match step.cwd.as_ref().or(metadata.cwd.as_ref()) {
Some(cwd) => command.current_dir(cwd),
None => command,
};
diff --git a/tests/specs/run/patch/__test__.jsonc b/tests/specs/run/patch/__test__.jsonc
new file mode 100644
index 000000000..00ae3baac
--- /dev/null
+++ b/tests/specs/run/patch/__test__.jsonc
@@ -0,0 +1,25 @@
+{
+ "tempDir": true,
+ "tests": {
+ "matching_version": {
+ "cwd": "./my-pkg",
+ "steps": [{
+ "args": "test",
+ "output": "test.out"
+ }, {
+ "args": "lint",
+ "output": "Checked 2 files\n"
+ }]
+ },
+ "not_matching_version": {
+ "steps": [{
+ "args": "run --allow-read=. --allow-write=. modify_version.ts",
+ "output": "[WILDCARD]"
+ }, {
+ "cwd": "./my-pkg",
+ "args": "test",
+ "output": "not_matching_version.out"
+ }]
+ }
+ }
+}
diff --git a/tests/specs/run/patch/add/deno.json b/tests/specs/run/patch/add/deno.json
new file mode 100644
index 000000000..05d24d7b5
--- /dev/null
+++ b/tests/specs/run/patch/add/deno.json
@@ -0,0 +1,5 @@
+{
+ "name": "@denotest/add",
+ "version": "1.0.0",
+ "exports": "./mod.ts"
+}
diff --git a/tests/specs/run/patch/add/mod.test.ts b/tests/specs/run/patch/add/mod.test.ts
new file mode 100644
index 000000000..3d3804e07
--- /dev/null
+++ b/tests/specs/run/patch/add/mod.test.ts
@@ -0,0 +1,9 @@
+import { add } from "./mod.ts";
+
+// this test should not be run or linted
+Deno.test("add", () => {
+ let unusedVar = 5; // purposefully causing a lint error to ensure it's not linted
+ if (add(1, 2) !== 3) {
+ throw new Error("fail");
+ }
+});
diff --git a/tests/specs/run/patch/add/mod.ts b/tests/specs/run/patch/add/mod.ts
new file mode 100644
index 000000000..97a779a44
--- /dev/null
+++ b/tests/specs/run/patch/add/mod.ts
@@ -0,0 +1,4 @@
+export function add(a: number, b: number): number {
+ console.log("adding", a, "and", b);
+ return a + b;
+}
diff --git a/tests/specs/run/patch/modify_version.ts b/tests/specs/run/patch/modify_version.ts
new file mode 100644
index 000000000..3d59aa1b9
--- /dev/null
+++ b/tests/specs/run/patch/modify_version.ts
@@ -0,0 +1,3 @@
+const data = JSON.parse(Deno.readTextFileSync("./add/deno.json"));
+data.version = "2.0.0";
+Deno.writeTextFileSync("./add/deno.json", JSON.stringify(data, null, 2));
diff --git a/tests/specs/run/patch/my-pkg/deno.json b/tests/specs/run/patch/my-pkg/deno.json
new file mode 100644
index 000000000..0303c9974
--- /dev/null
+++ b/tests/specs/run/patch/my-pkg/deno.json
@@ -0,0 +1,11 @@
+{
+ "name": "@scope/my-pkg",
+ "version": "1.0.0",
+ "exports": "./mod.ts",
+ "imports": {
+ "@denotest/add": "jsr:@denotest/add@1"
+ },
+ "patch": [
+ "../add"
+ ]
+}
diff --git a/tests/specs/run/patch/my-pkg/mod.test.ts b/tests/specs/run/patch/my-pkg/mod.test.ts
new file mode 100644
index 000000000..1c694298c
--- /dev/null
+++ b/tests/specs/run/patch/my-pkg/mod.test.ts
@@ -0,0 +1,7 @@
+import { add } from "./mod.ts";
+
+Deno.test("add", () => {
+ if (add(1, 2) !== 3) {
+ throw new Error("fail");
+ }
+});
diff --git a/tests/specs/run/patch/my-pkg/mod.ts b/tests/specs/run/patch/my-pkg/mod.ts
new file mode 100644
index 000000000..41389ed65
--- /dev/null
+++ b/tests/specs/run/patch/my-pkg/mod.ts
@@ -0,0 +1,2 @@
+export { add } from "@denotest/add";
+import "@denotest/add"; // ensure it only warns once
diff --git a/tests/specs/run/patch/not_matching_version.out b/tests/specs/run/patch/not_matching_version.out
new file mode 100644
index 000000000..7a9ee6f39
--- /dev/null
+++ b/tests/specs/run/patch/not_matching_version.out
@@ -0,0 +1,11 @@
+Warning Patch '@denotest/add@2.0.0' was not used because it did not match '@denotest/add@1'
+ at file:///[WILDLINE]/my-pkg/mod.ts:1:21
+Download http://127.0.0.1:4250/@denotest/add/meta.json
+Download http://127.0.0.1:4250/@denotest/add/1.0.0_meta.json
+Download http://127.0.0.1:4250/@denotest/add/1.0.0/mod.ts
+Check file:///[WILDLINE]/mod.test.ts
+running 1 test from ./mod.test.ts
+add ... ok ([WILDLINE])
+
+ok | 1 passed | 0 failed ([WILDLINE])
+
diff --git a/tests/specs/run/patch/test.out b/tests/specs/run/patch/test.out
new file mode 100644
index 000000000..4eb9f3383
--- /dev/null
+++ b/tests/specs/run/patch/test.out
@@ -0,0 +1,10 @@
+Check file:///[WILDLINE]/mod.test.ts
+running 1 test from ./mod.test.ts
+add ...
+------- output -------
+adding 1 and 2
+----- output end -----
+add ... ok ([WILDLINE])
+
+ok | 1 passed | 0 failed ([WILDLINE])
+
diff --git a/tests/specs/run/workspaces/member_not_match_constraint/__test__.jsonc b/tests/specs/run/workspaces/member_not_match_constraint/__test__.jsonc
new file mode 100644
index 000000000..532705939
--- /dev/null
+++ b/tests/specs/run/workspaces/member_not_match_constraint/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "test",
+ "output": "test.out"
+}
diff --git a/tests/specs/run/workspaces/member_not_match_constraint/add/deno.json b/tests/specs/run/workspaces/member_not_match_constraint/add/deno.json
new file mode 100644
index 000000000..ff1abb9fe
--- /dev/null
+++ b/tests/specs/run/workspaces/member_not_match_constraint/add/deno.json
@@ -0,0 +1,5 @@
+{
+ "name": "@denotest/add",
+ "version": "2.0.0",
+ "exports": "./mod.ts"
+}
diff --git a/tests/specs/run/workspaces/member_not_match_constraint/add/mod.ts b/tests/specs/run/workspaces/member_not_match_constraint/add/mod.ts
new file mode 100644
index 000000000..2c8d7ef7a
--- /dev/null
+++ b/tests/specs/run/workspaces/member_not_match_constraint/add/mod.ts
@@ -0,0 +1,4 @@
+export function add(a: number, b: number): number {
+ console.log("local");
+ return a + b;
+}
diff --git a/tests/specs/run/workspaces/member_not_match_constraint/deno.json b/tests/specs/run/workspaces/member_not_match_constraint/deno.json
new file mode 100644
index 000000000..ec5dc2bdf
--- /dev/null
+++ b/tests/specs/run/workspaces/member_not_match_constraint/deno.json
@@ -0,0 +1,3 @@
+{
+ "workspace": ["./add", "./subtract"]
+}
diff --git a/tests/specs/run/workspaces/member_not_match_constraint/deno.lock b/tests/specs/run/workspaces/member_not_match_constraint/deno.lock
new file mode 100644
index 000000000..373359d72
--- /dev/null
+++ b/tests/specs/run/workspaces/member_not_match_constraint/deno.lock
@@ -0,0 +1,23 @@
+{
+ "version": "3",
+ "packages": {
+ "specifiers": {
+ "jsr:@denotest/add@1": "jsr:@denotest/add@1.0.0"
+ },
+ "jsr": {
+ "@denotest/add@1.0.0": {
+ "integrity": "3b2e675c1ad7fba2a45bc251992e01aff08a3c974ac09079b11e6a5b95d4bfcb"
+ }
+ }
+ },
+ "remote": {},
+ "workspace": {
+ "members": {
+ "subtract": {
+ "dependencies": [
+ "jsr:@denotest/add@1"
+ ]
+ }
+ }
+ }
+}
diff --git a/tests/specs/run/workspaces/member_not_match_constraint/subtract/deno.json b/tests/specs/run/workspaces/member_not_match_constraint/subtract/deno.json
new file mode 100644
index 000000000..e585197c0
--- /dev/null
+++ b/tests/specs/run/workspaces/member_not_match_constraint/subtract/deno.json
@@ -0,0 +1,8 @@
+{
+ "name": "@denotest/subtract",
+ "version": "1.0.0",
+ "exports": "./mod.ts",
+ "imports": {
+ "@denotest/add": "jsr:@denotest/add@1"
+ }
+}
diff --git a/tests/specs/run/workspaces/member_not_match_constraint/subtract/mod.test.ts b/tests/specs/run/workspaces/member_not_match_constraint/subtract/mod.test.ts
new file mode 100644
index 000000000..7d699d4d7
--- /dev/null
+++ b/tests/specs/run/workspaces/member_not_match_constraint/subtract/mod.test.ts
@@ -0,0 +1,7 @@
+import { subtract } from "./mod.ts";
+
+Deno.test("subtract", () => {
+ if (subtract(3, 2) !== 1) {
+ throw new Error("fail");
+ }
+});
diff --git a/tests/specs/run/workspaces/member_not_match_constraint/subtract/mod.ts b/tests/specs/run/workspaces/member_not_match_constraint/subtract/mod.ts
new file mode 100644
index 000000000..6e301511b
--- /dev/null
+++ b/tests/specs/run/workspaces/member_not_match_constraint/subtract/mod.ts
@@ -0,0 +1,5 @@
+import { add } from "@denotest/add";
+
+export function subtract(a: number, b: number): number {
+ return add(a, -b);
+}
diff --git a/tests/specs/run/workspaces/member_not_match_constraint/test.out b/tests/specs/run/workspaces/member_not_match_constraint/test.out
new file mode 100644
index 000000000..0e16426c6
--- /dev/null
+++ b/tests/specs/run/workspaces/member_not_match_constraint/test.out
@@ -0,0 +1,11 @@
+Warning Workspace member '@denotest/add@2.0.0' was not used because it did not match '@denotest/add@1'
+ at file:///[WILDLINE]/mod.ts:1:21
+Download http://127.0.0.1:4250/@denotest/add/meta.json
+Download http://127.0.0.1:4250/@denotest/add/1.0.0_meta.json
+Download http://127.0.0.1:4250/@denotest/add/1.0.0/mod.ts
+Check file:///[WILDLINE]/mod.test.ts
+running 1 test from ./subtract/mod.test.ts
+subtract ... ok ([WILDLINE])
+
+ok | 1 passed | 0 failed ([WILDLINE])
+
diff --git a/tests/specs/workspaces/patch/__test__.jsonc b/tests/specs/workspaces/patch/__test__.jsonc
new file mode 100644
index 000000000..90a54086e
--- /dev/null
+++ b/tests/specs/workspaces/patch/__test__.jsonc
@@ -0,0 +1,13 @@
+{
+ "cwd": "./workspace",
+ "tests": {
+ "lint": {
+ "args": "lint",
+ "output": "Checked 2 files\n"
+ },
+ "test": {
+ "args": "test",
+ "output": "test.out"
+ }
+ }
+}
diff --git a/tests/specs/workspaces/patch/add/deno.json b/tests/specs/workspaces/patch/add/deno.json
new file mode 100644
index 000000000..05d24d7b5
--- /dev/null
+++ b/tests/specs/workspaces/patch/add/deno.json
@@ -0,0 +1,5 @@
+{
+ "name": "@denotest/add",
+ "version": "1.0.0",
+ "exports": "./mod.ts"
+}
diff --git a/tests/specs/workspaces/patch/add/mod.test.ts b/tests/specs/workspaces/patch/add/mod.test.ts
new file mode 100644
index 000000000..3d3804e07
--- /dev/null
+++ b/tests/specs/workspaces/patch/add/mod.test.ts
@@ -0,0 +1,9 @@
+import { add } from "./mod.ts";
+
+// this test should not be run or linted
+Deno.test("add", () => {
+ let unusedVar = 5; // purposefully causing a lint error to ensure it's not linted
+ if (add(1, 2) !== 3) {
+ throw new Error("fail");
+ }
+});
diff --git a/tests/specs/workspaces/patch/add/mod.ts b/tests/specs/workspaces/patch/add/mod.ts
new file mode 100644
index 000000000..97a779a44
--- /dev/null
+++ b/tests/specs/workspaces/patch/add/mod.ts
@@ -0,0 +1,4 @@
+export function add(a: number, b: number): number {
+ console.log("adding", a, "and", b);
+ return a + b;
+}
diff --git a/tests/specs/workspaces/patch/test.out b/tests/specs/workspaces/patch/test.out
new file mode 100644
index 000000000..c35ac0e45
--- /dev/null
+++ b/tests/specs/workspaces/patch/test.out
@@ -0,0 +1,10 @@
+Check file:///[WILDLINE]/my-pkg/mod.test.ts
+running 1 test from ./my-pkg/mod.test.ts
+add ...
+------- output -------
+adding 1 and 2
+----- output end -----
+add ... ok ([WILDLINE])
+
+ok | 1 passed | 0 failed ([WILDLINE])
+
diff --git a/tests/specs/workspaces/patch/workspace/deno.json b/tests/specs/workspaces/patch/workspace/deno.json
new file mode 100644
index 000000000..510351c44
--- /dev/null
+++ b/tests/specs/workspaces/patch/workspace/deno.json
@@ -0,0 +1,6 @@
+{
+ "workspace": ["./my-pkg"],
+ "patch": [
+ "../add"
+ ]
+}
diff --git a/tests/specs/workspaces/patch/workspace/my-pkg/deno.json b/tests/specs/workspaces/patch/workspace/my-pkg/deno.json
new file mode 100644
index 000000000..8b2e887e7
--- /dev/null
+++ b/tests/specs/workspaces/patch/workspace/my-pkg/deno.json
@@ -0,0 +1,8 @@
+{
+ "name": "@scope/my-pkg",
+ "version": "1.0.0",
+ "exports": "./mod.ts",
+ "imports": {
+ "@denotest/add": "jsr:@denotest/add@1"
+ }
+}
diff --git a/tests/specs/workspaces/patch/workspace/my-pkg/mod.test.ts b/tests/specs/workspaces/patch/workspace/my-pkg/mod.test.ts
new file mode 100644
index 000000000..1c694298c
--- /dev/null
+++ b/tests/specs/workspaces/patch/workspace/my-pkg/mod.test.ts
@@ -0,0 +1,7 @@
+import { add } from "./mod.ts";
+
+Deno.test("add", () => {
+ if (add(1, 2) !== 3) {
+ throw new Error("fail");
+ }
+});
diff --git a/tests/specs/workspaces/patch/workspace/my-pkg/mod.ts b/tests/specs/workspaces/patch/workspace/my-pkg/mod.ts
new file mode 100644
index 000000000..11501ab39
--- /dev/null
+++ b/tests/specs/workspaces/patch/workspace/my-pkg/mod.ts
@@ -0,0 +1 @@
+export { add } from "@denotest/add";