Warning
This project is still in early development. Expect inconveniences and breaking changes.
Molt is a Deno module to bump semvers in import specifiers, focused on consistency and maintainability. It uses deno_graph for dependency resolution, which enables us to avoid implementing custom logic or regex for each module registry.
- No regex to detect dependencies - Import specifiers of dependencies are discovered by the same parser as Deno runtime.
- No custom logic for each registry - Latest versions of dependencies are obtained by redirects of fetch requests by module registries.
- Module-first - The core logic is provided as versatile functions in a Deno module, which enables you to write the best scripts for your use cases.
- Git-friendly - The operations can be easily divided into logical groups for subsequent git commits. A submodule and CLI for git operations are also provided.
- mod.ts - Main module
- git/mod.ts - Sub-module for Git operations
- lib/uri.ts - Library for handling URIs
import {
DependencyUpdate,
FileUpdate,
} from "https://deno.land/x/molt@{VERSION}/mod.ts";
const updates = await DependencyUpdate.collect("./mod.ts", {
importMap: "./deno.json",
});
const results = FileUpdate.collect(updates);
FileUpdate.writeAll(results);
import { DependencyUpdate } from "https://deno.land/x/molt@{VERSION}/mod.ts";
import { commitAll } from "https://deno.land/x/molt@{VERSION}/git/mod.ts";
const updates = await DependencyUpdate.collect("./mod.ts");
commitAll(updates, {
groupBy: (dependency) => dependency.name,
composeCommitMessage: ({ group, version }) =>
`build(deps): bump ${group} to ${version!.to}`,
});
Although it is recommended to write your own scripts with the module, a
pre-built CLI is also provided as cli.ts
for convenience, which is supposed to
cover most of the use cases.
The molt CLI can be installed globally with the following command:
deno install --allow-env --allow-read --allow-net --allow-write --allow-run=git\
--name=molt https://deno.land/x/molt/cli.ts
However, it is recommended to run the remote script directly through deno task
for more precise control on permissions. Here's an example deno.json
:
{
"tasks": {
"run": "deno run --allow-env --allow-read --allow-net",
"update": "deno task run --allow-write=. https://deno.land/x/molt/cli.ts update",
"update:check": "deno task run https://deno.land/x/molt/cli.ts check",
"update:commit": "deno task run --allow-write=. --allow-run=git https://deno.land/x/molt/cli.ts update --commit",
},
}
Of course, you may use --allow-all
instead at your own risk.
The most interactive interface is provided as check
sub-command of cli.ts
.
deno run --allow-env --allow-read --allow-net --allow-write=. --allow-run=git\
https://deno.land/x/molt/cli.ts check --import-map <file> <...entrypoints>
Note
Molt CLI automatically uses import maps defined in deno.json
or deno.jsonc
if available.
You can't, however, use import maps as an entrypoint.
> deno run --allow-env --allow-net --allow-read\
https://deno.land/x/molt/cli.ts check src/fixtures/mod.ts
π Checking for updates...
π‘ Found updates:
π¦ node-emoji 1.0.0 => 2.1.0
src/fixtures/mod.ts 1.0.0
π¦ deno.land/x/deno_graph 0.50.0 => 0.55.0
src/fixtures/mod.ts 0.50.0
π¦ deno.land/std 0.200.0 => 0.202.0
src/fixtures/mod.ts 0.200.0
src/fixtures/lib.ts 0.200.0
? Choose an action βΊ Abort
>
> deno run --allow-env --allow-net --allow-read --allow-write=.\
https://deno.land/x/molt/cli.ts check src/fixtures/mod.ts
π Checking for updates...
π‘ Found updates:
...
? Choose an action βΊ Write changes to local files
Writing changes...
πΎ src/fixtures/mod.ts
πΎ src/fixtures/lib.ts
>
> deno run --allow-env --allow-net --allow-read --allow-write=. --allow-run=git\
https://deno.land/x/molt/cli.ts check src/fixtures/mod.ts
π Checking for updates...
π‘ Found updates:
...
? Choose an action βΊ Commit changes to git
? Tasks to run before each commit (comma separated) βΊ lock, test
? Tasks to run after each commit (comma separated) βΊ
Committing changes...
π build(deps): update deno.land/std from 0.200.0 to 0.202.0
π build(deps): update deno.land/x/deno_graph from 0.50.0 to 0.55.0
π build(deps): update node-emoji from 1.0.0 to 2.1.0
>
The update
sub-command of cli.ts
is designed to be used in non-interactive
environments, such as CI/CD pipelines.
deno run --allow-env --allow-read --allow-net --allow-write=.\
https://deno.land/x/molt/cli.ts update <...entrypoints>
deno run --allow-env --allow-read --allow-net --allow-write=. --allow-run=git\
https://deno.land/x/molt/cli.ts update --commit <...entrypoints>
The following limitations are imposed by the design of Molt:
- Dependencies are always updated to the latest version. No version constraints are supported.
- Dependencies in import specifiers are only targeted.
See issues for other known limitations.
Molt is inspired by prior works such as
and of full respect to the authors of these works.