diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2022-07-18 20:05:26 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-18 20:05:26 +0200 |
commit | 999cbfb52bc42c58467e3592d5fead9c4ee8a2c1 (patch) | |
tree | 5f5336420b675e15cfaa44cf205171623a3f4ab1 /cli | |
parent | 0d73eb3dd91b5b34bb6c38a25a4e6aac411d38f3 (diff) |
feat: import.meta.resolve() (#15074)
This commit adds new "import.meta.resolve()" API which
allows to resolve specifiers relative to the module the API
is called in. This API supports resolving using import maps.
Diffstat (limited to 'cli')
-rw-r--r-- | cli/dts/lib.deno.ns.d.ts | 10 | ||||
-rw-r--r-- | cli/tests/integration/run_tests.rs | 2 | ||||
-rw-r--r-- | cli/tests/testdata/import_meta.importmap.json | 11 | ||||
-rw-r--r-- | cli/tests/testdata/import_meta.ts | 31 | ||||
-rw-r--r-- | cli/tests/testdata/import_meta.ts.out | 7 |
5 files changed, 60 insertions, 1 deletions
diff --git a/cli/dts/lib.deno.ns.d.ts b/cli/dts/lib.deno.ns.d.ts index b13acc238..e5499c93e 100644 --- a/cli/dts/lib.deno.ns.d.ts +++ b/cli/dts/lib.deno.ns.d.ts @@ -21,6 +21,16 @@ declare interface ImportMeta { * ``` */ main: boolean; + + /** A function that returns resolved specifier as if it would be imported + * using `import(specifier)`. + * + * ```ts + * console.log(import.meta.resolve("./foo.js")); + * // file:///dev/foo.js + * ``` + */ + resolve(specifier: string): string; } /** Deno supports user timing Level 3 (see: https://w3c.github.io/user-timing) diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index bb46fe1b5..6ed1d5964 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -952,7 +952,7 @@ itest!(if_main { }); itest!(import_meta { - args: "run --quiet --reload import_meta.ts", + args: "run --quiet --reload --import-map=import_meta.importmap.json import_meta.ts", output: "import_meta.ts.out", }); diff --git a/cli/tests/testdata/import_meta.importmap.json b/cli/tests/testdata/import_meta.importmap.json new file mode 100644 index 000000000..f8c056afd --- /dev/null +++ b/cli/tests/testdata/import_meta.importmap.json @@ -0,0 +1,11 @@ +{ + "imports": { + "bare": "https://example.com/", + "https://example.com/rewrite": "https://example.com/rewritten", + + "1": "https://example.com/PASS-1", + "null": "https://example.com/PASS-null", + "undefined": "https://example.com/PASS-undefined", + "[object Object]": "https://example.com/PASS-object" + } +} diff --git a/cli/tests/testdata/import_meta.ts b/cli/tests/testdata/import_meta.ts index d111059ea..37af69020 100644 --- a/cli/tests/testdata/import_meta.ts +++ b/cli/tests/testdata/import_meta.ts @@ -1,3 +1,34 @@ +import { assertThrows } from "../../../test_util/std/testing/asserts.ts"; + console.log("import_meta", import.meta.url, import.meta.main); import "./import_meta2.ts"; + +console.log("Resolving ./foo.js", import.meta.resolve("./foo.js")); +console.log("Resolving bare from import map", import.meta.resolve("bare")); +console.log( + "Resolving https://example.com/rewrite from import map", + import.meta.resolve("https://example.com/rewrite"), +); +console.log( + "Resolving without a value from import map", + import.meta.resolve(), +); +console.log( + "Resolving 1 from import map", + import.meta.resolve(1), +); +console.log( + "Resolving null from import map", + import.meta.resolve(null), +); +console.log( + "Resolving object from import map", + import.meta.resolve({}), +); +assertThrows(() => { + import.meta.resolve("too", "many", "arguments"); +}, TypeError); +assertThrows(() => { + import.meta.resolve("://malformed/url?asdf"); +}, TypeError); diff --git a/cli/tests/testdata/import_meta.ts.out b/cli/tests/testdata/import_meta.ts.out index f38aa98ea..a431f61df 100644 --- a/cli/tests/testdata/import_meta.ts.out +++ b/cli/tests/testdata/import_meta.ts.out @@ -1,2 +1,9 @@ import_meta2 [WILDCARD]import_meta2.ts false import_meta [WILDCARD]import_meta.ts true +Resolving ./foo.js file:///[WILDCARD]/foo.js +Resolving bare from import map https://example.com/ +Resolving https://example.com/rewrite from import map https://example.com/rewritten +Resolving without a value from import map https://example.com/PASS-undefined +Resolving 1 from import map https://example.com/PASS-1 +Resolving null from import map https://example.com/PASS-null +Resolving object from import map https://example.com/PASS-object |