Skip to content

virtualstate/impack

Repository files navigation

@virtualstate/impack

ESM Tree Importer

Support

Node.js supported

Usage

The below command will re-write all import & export urls so that they are fully resolved.

npx @virtualstate/impack esnext

This command will take

import { run } from "./path/to";

If ./path/to exists, the import is kept as is

If ./path/to.js exists, the import will be re-written as:

import { run } from "./path/to.js";

If ./path/to/index.js exists, the import will be re-written as:

import { run } from "./path/to/index.js";

The below command will output an import map with all files in the folder & dependencies

# 
npx @virtualstate/impack import-map.json esnext

For example giving the import map of:

{
  "imports": {
    "@virtualstate/promise": "./node_modules/@virtualstate/promise/esnext/index.js"
  }
}

Along with re-writing all import urls, you will get the output:

{
  "imports": {
    "@virtualstate/promise": "esnext/@virtualstate/promise/esnext/index.js",
    "esnext/path/to/inner.js": "esnext/path/to/inner.js",
    "esnext/path/to/index.js": "esnext/path/to/index.js"
  }
}

The below command will output an import map with only the dependent files of this entrypoint file

# 
npx @virtualstate/impack import-map.json esnext/tests/index.js

Any dependency urls that are not provided in the initial import map, are not replaced.

If you were to have an import that used a node subpath pattern, starting with #, if a replacement is not found in the provided import map, the closest package.json with a matching pattern will be used.

For example if your package.json

{
  "imports": {
    "#internal/*.js": "./src/internal/*.js"
  }
}

And used the import:

import Users from "#internal/users";
import Storage from "#internal/storage";

You would get the output:

{
  "imports": {
    "src/index.js": "src/index.js",
    "src/internal/users.js": "src/internal/users.js",
    "src/internal/storage.js": "src/internal/storage.js"
  }
}

The below command will output modules ready to use in a capnp file

npx @virtualstate/impack import-map.json esnext --capnp

For Example:

modules = [
  (name = "esnext/@virtualstate/promise/esnext/index.js", esModule = embed "esnext/@virtualstate/promise/esnext/index.js"),
  (name = "esnext/path/to/inner.js", esModule = embed "esnext/path/to/inner.js"),
  (name = "esnext/path/to/index.js", esModule = embed "esnext/path/to/index.js")
]
# Will replace the modules of workers in a capnp template file
npx @virtualstate/impack import-map.json esnext --capnp=workerd-template.capnp

For example the below template:

const test :Workerd.Worker = (
   modules = [],
   compatibilityDate = "2022-09-16",
);

Will output as:

const test :Workerd.Worker = (
   modules = [
      (name = "esnext/@virtualstate/promise/esnext/index.js", esModule = embed "esnext/@virtualstate/promise/esnext/index.js"),
      (name = "esnext/path/to/inner.js", esModule = embed "esnext/path/to/inner.js"),
      (name = "esnext/path/to/index.js", esModule = embed "esnext/path/to/index.js")
   ],
   compatibilityDate = "2022-09-16",
);

About

No description, website, or topics provided.

Resources

License

Code of conduct

Security policy

Stars

Watchers

Forks

Releases

No releases published

Sponsor this project

 

Packages