@jsenv/import-map
Version:
Helpers to implement importmaps.
149 lines (112 loc) • 3.9 kB
Markdown
# import-map
Helpers to implement importmaps.
[](https://github.com/jsenv/jsenv-import-map/packages)
[](https://www.npmjs.com/package/@jsenv/import-map)
[](https://github.com/jsenv/jsenv-import-map/actions?workflow=ci)
[](https://codecov.io/gh/jsenv/jsenv-import-map)
# Table of contents
- [Presentation](#Presentation)
- [Installation](#installation)
- [composeTwoImportMaps](#composetwoimportmaps)
- [normalizeImportMap](#normalizeimportmap)
- [resolveImport](#resolveimport)
- [moveImportMap](#moveImportMap)
# Presentation
`@jsenv/import-map` can be used to implement the behaviour of importmap as described in the [WICG specification](https://github.com/WICG/import-maps). It is written using ES modules and compatible with browsers and Node.js. Amongst other things, this repository is used to provide [importmap in ESLint](https://github.com/jsenv/jsenv-importmap-eslint-resolver).
# Installation
```console
npm install @jsenv/import-map
```
# composeTwoImportMaps
`composeTwoImportMaps` takes two `importMap` and return a single `importMap` being the composition of the two.
```js
import { composeTwoImportMaps } from "@jsenv/import-map"
const importMap = composeTwoImportMaps(
{
imports: {
foo: "bar",
},
},
{
imports: {
foo: "whatever",
},
},
)
console.log(JSON.stringify(importMap, null, " "))
```
```console
{
"imports": {
"foo": "whatever"
}
}
```
— source code at [src/composeTwoImportMaps.js](./src/composeTwoImportMaps.js).
# normalizeImportMap
`normalizeImportMap` returns an `importMap` resolved against an `url` and sorted.
```js
import { normalizeImportMap } from "@jsenv/import-map"
const importMap = normalizeImportMap(
{
imports: {
foo: "./bar",
"./ding.js": "./dong.js"
},
},
"http://your-domain.com",
)
console.log(JSON.stringify(importMap, null, ' ')
```
```console
{
"imports": {
"foo": "http://your-domain.com/bar",
"http://your-domain.com/ding.js": "http://your-domain.com/dong.js"
}
}
```
— source code at [src/normalizeImportMap.js](./src/normalizeImportMap.js).
# resolveImport
`resolveImport` returns an import `url` applying an `importMap` to `specifier` and `importer`. The provided `importMap` must be resolved and sorted to work as expected. You can use [normalizeImportMap](#normalizeimportmap) to do that.
```js
import { resolveImport } from "@jsenv/import-map"
const importUrl = resolveImport({
specifier: "../index.js",
importer: "http://domain.com/folder/file.js",
importMap: {
imports: {
"http://domain.com/index.js": "http://domain.com/main.js",
},
},
})
console.log(importUrl)
```
```console
http://domain.com/main.js
```
— source code at [src/resolveImport.js](./src/resolveImport.js).
# moveImportMap
`moveImportMap` receives `importMap`, `fromUrl`, `toUrl` and return an importmap where all relative urls and specifiers becomes relative to `toUrl` instead of `fromUrl`.
This function exists in case you need to move an importmap file somewhere else in the filesystem. This is not a common use case but might happen.
```js
import { moveImportMap } from "@jsenv/import-map"
const importMapMoved = moveImportMap(
{
imports: {
foo: "./foo.js",
},
},
"file:///project/project.importmap",
"file:///project/dir/project.importmap",
)
console.log(JSON.stringify(importMap, null, ' ')
```
```console
{
"imports": {
"foo": "../foo.js",
}
}
```
— source code at [src/moveImportMap.js](./src/moveImportMap.js).