π¦ 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 version strings in import specifiers, like udd, but with some unique concepts:
The Deno way - Molt finds dependencies and checks their latest versions in a consistent way as the Deno runtime, with deno_graph and import_map crates, etc.
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.
Features
Molt can check updates to dependencies written in different formats and bump
their versions. URL imports, npm:
and jsr:
specifiers are all supported:
[!NOTE]
Molt does NOT bump version ragnges like1
,1.x
,~1.2.3
and^1.2.3
innpm:
andjrs:
specifiers, but only updates a lockfile.
Import specifiers in ES modules
- import { assert } from "https://deno.land/std@0.200.0/assert/mod.ts";
+ import { assert } from "https://deno.land/std@0.218.2/assert/mod.ts";
...
Import maps
{
"imports": {
"@core/match": "jsr:@core/match@0.1.x",
- "@std/assert": "jsr:@std/assert@0.200.0",
- "node-emoji": "npm:node-emoji@2.0.0"
+ "@std/assert": "jsr:@std/assert@0.218.2",
+ "node-emoji": "npm:node-emoji@2.1.3"
}
}
Lock files
[!WARNING]
This is still an experimental feature and may not work as expected. Requires Deno v1.41.0 or later.
{
"version": "3",
"packages": {
"specifiers": {
- "jsr:@core/match@0.1.x": "jsr:@core/match@0.1.0",
+ "jsr:@core/match@0.1.x": "jsr:@core/match@0.1.9",
"npm:ts-toolbelt@9.6.0": "npm:ts-toolbelt@9.6.0"
},
"jsr": {
- "@core/match@0.1.0": {
- "integrity": "6f1edfca5215735a12aa2dbd920ead331a501eb5e3ad70cba3b9787610c7bfaf",
+ "@core/match@0.1.9": {
+ "integrity": "ceff06cf40212bb720925972a4405bef373efe768690b344ac4fd7ca7189f746",
"dependencies": [
"npm:ts-toolbelt@9.6.0"
...
Usage
Deno Module
API Reference
Examples
Update all dependencies in a module and write the changes to local files
import { collect, write } from "https://deno.land/x/molt@{VERSION}/mod.ts";
const result = await collect("./mod.ts");
await write(result);
Update all dependencies in a module and commit the changes to git
import { collect, commit } from "https://deno.land/x/molt@{VERSION}/mod.ts";
const result = await collect("./mod.ts");
await commit(result, {
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)
--prefix-lock <prefix> - Prefix for commit messages of updating a lock file (Depends: --commit, --unstable-lock)
--summary <file> - Write a summary of changes to file
--report <file> - Write a report of changes to file
--unstable-lock [file] - Enable unstable updating of a lock file
[!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 => 1.1.0
π¦ deno.land/std 0.200.0 => 0.218.2
π¦ deno.land/x/deno_graph 0.50.0 => 0.69.7
π¦ node-emoji 2.0.0 => 2.1.3
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 1.1.0
π :package: bump deno.land/std from 0.200.0 to 0.218.2
π :package: bump deno.land/x/deno_graph from 0.50.0 to 0.69.7
π :package: bump node-emoji from 2.0.0 to 2.1.3
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)
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:
- Version constraints on URL imports are not supported.
- 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.