Url provider
The UrlProvider upgrades from an arbitrary url (a cdn, object storage, or a
custom host). It downloads a standalone binary with the asset option and
reinstalls a script with the url option. One of the two is required.
Binary upgrades
Set asset to the download url, or to a function that builds it per build
target:
import { UrlProvider } from "@cliffy/upgrade/provider/url";
const provider = new UrlProvider({
asset: ({ name, version, os, arch }) =>
`https://cdn.example.com/${name}/${version}/${name}-${os}-${arch}.tar.gz`,
});
The asset filename decides how the download is unpacked. It defaults to the last
path segment of the url. When the url doesn't end in the filename, return an
{ url, name } object instead of a string:
import { UrlProvider } from "@cliffy/upgrade/provider/url";
new UrlProvider({
asset: ({ version, os, arch }) => ({
url: `https://cdn.example.com/download?v=${version}&target=${os}-${arch}`,
name: `my-cli-${os}-${arch}.tar.gz`,
}),
});
For a private host, send auth headers with the assetHeaders option (a
HeadersInit, or a function of the build target returning one).
Script upgrades
Set url to the exact script entrypoint, or to a function of the cli name and
the resolved version. Script upgrades are only supported on Deno, where the url
is installed with deno install:
import { UrlProvider } from "@cliffy/upgrade/provider/url";
new UrlProvider({
url: ({ name, version }) =>
`https://cdn.example.com/${name}/${version}/cli.ts`,
});
Because url already points at the exact entrypoint, the main option is not
supported by this provider.
Listing versions
The provider has no registry to query, so the latest target can only be
resolved from the versions option (a Versions object, or a function
returning one):
import { UrlProvider } from "@cliffy/upgrade/provider/url";
new UrlProvider({
asset: "https://cdn.example.com/my-cli/latest/my-cli.tar.gz",
versions: async () => {
const response = await fetch(
"https://cdn.example.com/my-cli/versions.json",
);
return await response.json();
},
});
Without it, an explicit version must be requested, the --list-versions option
is not registered, and the automatic version check is skipped.
A function resolver is only run by the automatic version check if it can run
without triggering a permission prompt. Add hasRequiredPermissions to report
that, otherwise the check is skipped:
import { UrlProvider } from "@cliffy/upgrade/provider/url";
new UrlProvider({
asset: "https://cdn.example.com/my-cli/latest/my-cli.tar.gz",
versions: () =>
fetch("https://cdn.example.com/my-cli/versions.json")
.then((response) => response.json()),
hasRequiredPermissions: async () =>
(await Deno.permissions.query({ name: "net", host: "cdn.example.com" }))
.state === "granted",
});
Homepage
The homepage option sets the url shown in the upgrade success message.
Asset formats, custom extractors, the binary name, and the install location are shared with the other binary providers. See binary upgrade.