Skip to content

Commit 20c55de

Browse files
committed
add wpt tests
1 parent cfaf0fd commit 20c55de

26 files changed

+1940
-185
lines changed

README.md

+18-47
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,27 @@
11
# ImportMap
22

3-
Resolve specifiers with [import maps](https://github.com/WICG/import-maps).
3+
Implementation of [import maps](https://github.com/WICG/import-maps).
44

5-
## Examples
5+
## Example
66

7-
### Imports
87
```ts
9-
import { resolve } from "https://deno.land/x/importmap/mod.ts"
8+
import {
9+
resolveImportMap,
10+
resolveModuleSpecifier,
11+
} from "https://deno.land/x/importmap/mod.ts";
1012

11-
const specifier = "foo/mod.ts"
12-
const importMap = {
13+
const importMap: ImportMap = {
1314
imports: {
14-
"foo/": "bar/"
15-
}
16-
}
17-
resolve(specifier, importMap) // returns "bar/mod.ts"
18-
```
19-
20-
### URLs
21-
```ts
22-
import { resolve } from "https://deno.land/x/importmap/mod.ts"
23-
24-
const specifier = "path/mod.ts"
25-
const importMap = {
26-
imports: {
27-
"path/": "https://deno.land/std/path/"
28-
}
29-
}
30-
resolve(specifier, importMap) // returns "https://deno.land/std/path/mod.ts"
31-
```
32-
33-
### Scopes
34-
35-
```ts
36-
import { resolve } from "https://deno.land/x/importmap/mod.ts"
37-
38-
const specifier = "path/mod.ts"
39-
const importMap = {
40-
imports: {
41-
"a": "/a-1.ts",
42-
"b": "/b-1.ts"
15+
"./foo/": "./bar/",
4316
},
44-
scopes: {
45-
"/scope2/": {
46-
"a": "/a-2.ts"
47-
}
48-
}
49-
}
50-
resolve("a", importMap, "/scope1/foo.ts") // returns "/a-1.ts"
51-
resolve("b", importMap, "/scope1/foo.ts") // returns "/b-1.ts"
52-
53-
resolve("a", importMap, "/scope2/foo.ts") // returns "/a-2.ts"
54-
resolve("b", importMap, "/scope2/foo.ts") // returns "/b-1.ts"
17+
};
18+
const importMapBaseURL = new URL(import.meta.url);
19+
const moduleSpecifier = "./foo/test.js";
20+
const baseURL = new URL(import.meta.url);
21+
const resolvedImportMap = resolveImportMap(importMap, importMapBaseURL); // { imports: { "file:///project/dir/foo/": "file:///project/dir/bar/" }, scopes: {} }
22+
const resolvedeModuleSpecifier = resolveModuleSpecifier(
23+
moduleSpecifier,
24+
resolvedImportMap,
25+
baseURL,
26+
); // file:///project/dir/bar/test.js
5527
```
56-

_util.ts

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
export interface SpecifierMap {
2+
[url: string]: string | null;
3+
}
4+
export interface Scopes {
5+
[url: string]: SpecifierMap;
6+
}
7+
export interface ImportMap {
8+
imports?: SpecifierMap;
9+
scopes?: Scopes;
10+
}
11+
12+
export function isObject(object: unknown): object is Record<string, unknown> {
13+
return typeof object == "object" && object !== null &&
14+
object.constructor === Object;
15+
}
16+
export function sortObject(
17+
normalized: Record<string, unknown>,
18+
): Record<string, unknown> {
19+
const sorted: Record<string, unknown> = {};
20+
const sortedKeys = Object.keys(normalized)
21+
.sort((a, b) => b.length - a.length);
22+
for (const key of sortedKeys) {
23+
sorted[key] = normalized[key];
24+
}
25+
return sorted;
26+
}
27+
export function isImportMap(importMap: unknown): importMap is ImportMap {
28+
return isObject(importMap) &&
29+
(importMap.imports !== undefined ? isImports(importMap.imports) : true) &&
30+
(importMap.scopes !== undefined ? isScopes(importMap.scopes) : true);
31+
}
32+
export function isImports(
33+
importsMap: unknown,
34+
): importsMap is ImportMap {
35+
return isObject(importsMap);
36+
}
37+
export function isScopes(
38+
scopes: unknown,
39+
): scopes is Scopes {
40+
return isObject(scopes) &&
41+
Object.values(scopes).every((value) => isSpecifierMap(value));
42+
}
43+
export function isSpecifierMap(
44+
specifierMap: unknown,
45+
): specifierMap is SpecifierMap {
46+
return isObject(specifierMap);
47+
}
48+
export function isURL(url: unknown): boolean {
49+
try {
50+
new URL(url as string);
51+
return true;
52+
} catch {
53+
return false;
54+
}
55+
}

0 commit comments

Comments
 (0)