π¦ Molt
[!WARNING]
Molt is still being developed actively. The API is not stable yet and may change frequently.
Molt is a Deno module to bump versions in import specifiers, like udd, but with some unique concepts:
The Deno way - Molt finds dependencies and checks their latest versions in the same way as the Deno runtime does.
Module-first - The core logic is provided as 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.
Usage
Deno Module
API Reference
Examples
Update all dependencies in a module and write the changes to local files
import { collect, writeAll } from "https://deno.land/x/molt@{VERSION}/mod.ts";
const updates = await collect("./mod.ts");
await writeAll(updates);
Update all dependencies in a module and commit the changes to git
import { collect, commitAll } from "https://deno.land/x/molt@{VERSION}/mod.ts";
const updates = await collect("./mod.ts");
await commitAll(updates, {
groupBy: (dependency) => dependency.name,
composeCommitMessage: ({ group, version }) =>
`build(deps): bump <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mi>g</mi><mi>r</mi><mi>o</mi><mi>u</mi><mi>p</mi></mrow><mi>t</mi><mi>o</mi></mrow><annotation encoding="application/x-tex">{group} to </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8095em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">ro</span><span class="mord mathnormal">u</span><span class="mord mathnormal">p</span></span><span class="mord mathnormal">t</span><span class="mord mathnormal">o</span></span></span></span>{version!.to}`,
});
CLI
Although it is encouraged to write your own scripts, a pre-built CLI tool is
also provided as cli.ts
for convenience or a reference implementation, which
is supposed to cover most of the use cases.
Installation (optional)
The molt CLI can be installed globally with the following command, for example:
deno install --allow-env --allow-read --allow-write --allow-net --allow-run=git,deno\
--name molt https://deno.land/x/molt@{VERSION}/cli.ts
Alternatively, you may prefer to run the remote script directly through
deno task
for better security or reproducibility:
{
"tasks": {
"update": "deno run --allow-env --allow-read --allow-write=. --allow-run=git,deno --allow-net=deno.land https://deno.land/x/molt@{VERSION}/cli.ts ./**/*.ts",
"update:commit": "deno task -q update --commit --pre-commit=fmt"
}
}
Usage
> molt --help
Usage: molt <modules...>
Description:
Check updates to dependencies in Deno modules and configuration files
Options:
-h, --help - Show this help.
-v, --version - Print version info.
--import-map <file> - Specify import map file
--ignore <deps> - Ignore dependencies
--only <deps> - Check specified dependencies
-w, --write - Write changes to local files (Conflicts: --commit)
-c, --commit - Commit changes to local git repository (Conflicts: --write)
--pre-commit <tasks> - Run tasks before each commit (Depends: --commit)
--post-commit <tasks> - Run tasks after each commit (Depends: --commit)
--prefix <prefix> - Prefix for commit messages (Depends: --commit)
--summary <file> - Write a summary of changes to file
--report <file> - Write a report of changes to file
Examples:
Check import maps in a config: molt deno.json
Check imports in a module: molt deps.ts
Include multiple modules: molt mod.ts lib.ts
Target all .ts files: molt ./**/*.ts
Specify an import map: molt mod.ts --import-map deno.json
Ignore specified dependencies: molt deps.ts --ignore=deno_graph,node_emoji
Check deno_std only: molt deps.ts --only deno.land/std
[!Note]
Molt CLI automatically findsdeno.json
ordeno.jsonc
in the current working directory or its parent directories and uses import maps defined in the file if available.
Examples
Check for updates
> molt deno.json
π¦ @luca/flag 1.0.0 => 123.456.789
π¦ deno.land/std 0.200.0 => 123.456.789
π¦ deno.land/x/deno_graph 0.50.0 => 123.456.789
π¦ node-emoji 1.0.0 => 123.456.789
Write changes to files
> molt deno.json --write
...
πΎ deno.json
Commit changes to git
> molt deno.json --commit --prefix :package:
...
π :package: bump @luca/flag from 1.0.0 to 123.456.789
π :package: bump deno.land/std from 0.200.0 to 123.456.789
π :package: bump deno.land/x/deno_graph from 0.50.0 to 123.456.789
π :package: bump node-emoji from 2.0.0 to 123.456.789
Compatibility with registries
We check compatibility with various registries in an integration test.
Denoβs official registries
Molt offers first-class support for the following registries, which means that we may implement registry-specific routines for them:
- deno.land/std
- deno.land/x
- jsr (via
jsr:
specifier) - npm (via
npm:
specifier)
[!NOTE]
Version constraints like~1.2.3
and^1.2.3
innpm:
andjrs:
specifiers are not updated.
Third-party registries
Molt also works with the following third-party registries:
The following registries are not compatible with Molt:
- cdn.jsdelivr.net
- cdn.skypack.dev
- esm.run
- denopkg.com
- ga.jspm.io
- pax.deno.dev
- raw.githubusercontent.com
- x.nest.land
How it works
TBW
Limitations
The following limitations are imposed by the design of Molt:
- Dependencies are always updated to the latest versions. Version constraints are not handled.
- Dependencies in import specifiers are only targeted.
See issues for other known limitations.
References
Molt is inspired by prior works such as
and of full respect to the authors.