summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYoshiya Hinosawa <stibium121@gmail.com>2022-11-19 20:32:39 +0900
committerGitHub <noreply@github.com>2022-11-19 20:32:39 +0900
commit7ab08130a06850f7d30bca8088799926f03e2a84 (patch)
tree40f35c4aac0d5d0ad1333889306d371784e30c2d
parent763d492ed69c3a22310dd5c758995fbbbf3e06b8 (diff)
fix(ext/node): handle URL in createRequire (#16682)
-rw-r--r--cli/tests/integration/npm_tests.rs8
-rw-r--r--cli/tests/testdata/npm/create_require/main.out6
-rw-r--r--cli/tests/testdata/npm/create_require/main.ts1
-rw-r--r--cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/index.js19
-rw-r--r--cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/package.json6
-rw-r--r--ext/node/02_require.js23
6 files changed, 61 insertions, 2 deletions
diff --git a/cli/tests/integration/npm_tests.rs b/cli/tests/integration/npm_tests.rs
index e29c1452e..fb79a1cb0 100644
--- a/cli/tests/integration/npm_tests.rs
+++ b/cli/tests/integration/npm_tests.rs
@@ -1470,6 +1470,14 @@ itest!(info_peer_deps_json {
http_server: true,
});
+itest!(create_require {
+ args: "run --reload npm/create_require/main.ts",
+ output: "npm/create_require/main.out",
+ exit_code: 0,
+ envs: env_vars(),
+ http_server: true,
+});
+
fn env_vars_no_sync_download() -> Vec<(String, String)> {
vec![
("DENO_NODE_COMPAT_URL".to_string(), util::std_file_url()),
diff --git a/cli/tests/testdata/npm/create_require/main.out b/cli/tests/testdata/npm/create_require/main.out
new file mode 100644
index 000000000..ebd96c120
--- /dev/null
+++ b/cli/tests/testdata/npm/create_require/main.out
@@ -0,0 +1,6 @@
+[WILDCARD]
+function
+function
+The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received https://example.com/
+The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received https://example.com/
+The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received 1
diff --git a/cli/tests/testdata/npm/create_require/main.ts b/cli/tests/testdata/npm/create_require/main.ts
new file mode 100644
index 000000000..625c734aa
--- /dev/null
+++ b/cli/tests/testdata/npm/create_require/main.ts
@@ -0,0 +1 @@
+import "npm:@denotest/create-require@1.0.0";
diff --git a/cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/index.js b/cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/index.js
new file mode 100644
index 000000000..eaa3e5afd
--- /dev/null
+++ b/cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/index.js
@@ -0,0 +1,19 @@
+import { createRequire } from "module";
+
+console.log(typeof createRequire(import.meta.url));
+console.log(typeof createRequire(new URL(import.meta.url)));
+try {
+ createRequire("https://example.com/");
+} catch (e) {
+ console.log(e.message);
+}
+try {
+ createRequire(new URL("https://example.com/"));
+} catch (e) {
+ console.log(e.message);
+}
+try {
+ createRequire(1);
+} catch (e) {
+ console.log(e.message);
+}
diff --git a/cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/package.json b/cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/package.json
new file mode 100644
index 000000000..00539643e
--- /dev/null
+++ b/cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "@denotest/create-require",
+ "version": "1.0.0",
+ "type": "module",
+ "main": "index.js"
+}
diff --git a/ext/node/02_require.js b/ext/node/02_require.js
index ac34a5fca..372cc8471 100644
--- a/ext/node/02_require.js
+++ b/ext/node/02_require.js
@@ -819,8 +819,27 @@
}
function createRequire(filenameOrUrl) {
- // FIXME: handle URLs and validation
- const filename = core.ops.op_require_as_file_path(filenameOrUrl);
+ let fileUrlStr;
+ if (filenameOrUrl instanceof URL) {
+ if (filenameOrUrl.protocol !== "file:") {
+ throw new Error(
+ `The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received ${filenameOrUrl}`,
+ );
+ }
+ fileUrlStr = filenameOrUrl.toString();
+ } else if (typeof filenameOrUrl === "string") {
+ if (!filenameOrUrl.startsWith("file:")) {
+ throw new Error(
+ `The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received ${filenameOrUrl}`,
+ );
+ }
+ fileUrlStr = filenameOrUrl;
+ } else {
+ throw new Error(
+ `The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received ${filenameOrUrl}`,
+ );
+ }
+ const filename = core.ops.op_require_as_file_path(fileUrlStr);
return createRequireFromPath(filename);
}