parent
47f6c61007
commit
69578ae09f
|
@ -38,17 +38,28 @@ export async function updatePlugsCommand() {
|
||||||
for (const plugUri of plugList) {
|
for (const plugUri of plugList) {
|
||||||
const [protocol, ...rest] = plugUri.split(":");
|
const [protocol, ...rest] = plugUri.split(":");
|
||||||
|
|
||||||
const plugNameMatch = /\/([^\/]+)\.plug\.js$/.exec(plugUri);
|
let plugName: string;
|
||||||
if (!plugNameMatch) {
|
if (protocol == "ghr") {
|
||||||
console.error(
|
// For GitHub Release, the plug is expected to be named same as repository
|
||||||
"Could not extract plug name from ",
|
plugName = rest[0].split("/")[1]; // skip repo owner
|
||||||
plugUri,
|
// Strip "silverbullet-foo" into "foo" (multiple plugs follow this convention)
|
||||||
"ignoring...",
|
if (plugName.startsWith("silverbullet-")) {
|
||||||
);
|
plugName = plugName.slice("silverbullet-".length);
|
||||||
continue;
|
}
|
||||||
}
|
} else {
|
||||||
|
// Other URIs are expected to contain the file .plug.js at the end
|
||||||
|
const plugNameMatch = /\/([^\/]+)\.plug\.js$/.exec(plugUri);
|
||||||
|
if (!plugNameMatch) {
|
||||||
|
console.error(
|
||||||
|
"Could not extract plug name from ",
|
||||||
|
plugUri,
|
||||||
|
"ignoring...",
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
const plugName = plugNameMatch[1];
|
plugName = plugNameMatch[1];
|
||||||
|
}
|
||||||
|
|
||||||
const manifests = await events.dispatchEvent(
|
const manifests = await events.dispatchEvent(
|
||||||
`get-plug:${protocol}`,
|
`get-plug:${protocol}`,
|
||||||
|
@ -141,20 +152,51 @@ export async function getPlugGithubRelease(
|
||||||
identifier: string,
|
identifier: string,
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
let [owner, repo, version] = identifier.split("/");
|
let [owner, repo, version] = identifier.split("/");
|
||||||
|
let releaseInfo: any = {};
|
||||||
|
let req: Response;
|
||||||
if (!version || version === "latest") {
|
if (!version || version === "latest") {
|
||||||
console.log("fetching the latest version");
|
console.log(`Fetching release manifest of latest version for ${repo}`);
|
||||||
const req = await fetch(
|
req = await fetch(
|
||||||
`https://api.github.com/repos/${owner}/${repo}/releases/latest`,
|
`https://api.github.com/repos/${owner}/${repo}/releases/latest`,
|
||||||
);
|
);
|
||||||
if (req.status !== 200) {
|
} else {
|
||||||
throw new Error(
|
console.log(`Fetching release manifest of version ${version} for ${repo}`);
|
||||||
`Could not fetch latest relase manifest from ${identifier}}`,
|
req = await fetch(
|
||||||
);
|
`https://api.github.com/repos/${owner}/${repo}/releases/tags/${version}`,
|
||||||
}
|
);
|
||||||
const result = await req.json();
|
|
||||||
version = result.name;
|
|
||||||
}
|
}
|
||||||
|
if (req.status !== 200) {
|
||||||
|
throw new Error(
|
||||||
|
`Could not fetch release manifest from ${identifier}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
releaseInfo = await req.json();
|
||||||
|
version = releaseInfo.tag_name;
|
||||||
|
|
||||||
|
let assetName: string | undefined;
|
||||||
|
const shortName = repo.startsWith("silverbullet-")
|
||||||
|
? repo.slice("silverbullet-".length)
|
||||||
|
: undefined;
|
||||||
|
for (const asset of releaseInfo.assets ?? []) {
|
||||||
|
if (asset.name === `${repo}.plug.js`) {
|
||||||
|
assetName = asset.name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Support plug like foo.plug.js are in repo silverbullet-foo
|
||||||
|
if (shortName && asset.name === `${shortName}.plug.js`) {
|
||||||
|
assetName = asset.name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!assetName) {
|
||||||
|
throw new Error(
|
||||||
|
`Could not find "${repo}.plug.js"` +
|
||||||
|
(shortName ? ` or "${shortName}.plug.js"` : "") +
|
||||||
|
` in release ${version}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const finalUrl =
|
const finalUrl =
|
||||||
`//github.com/${owner}/${repo}/releases/download/${version}/${repo}.plug.js`;
|
`//github.com/${owner}/${repo}/releases/download/${version}/${assetName}`;
|
||||||
return getPlugHTTPS(finalUrl);
|
return getPlugHTTPS(finalUrl);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,4 +8,4 @@ The [[Plugs/Editor]] plug has support for the following URI prefixes for plugs:
|
||||||
|
|
||||||
* `https:` loading plugs via HTTPS, e.g. `[https://](https://raw.githubusercontent.com/silverbulletmd/silverbullet-github/main/github.plug.js)`
|
* `https:` loading plugs via HTTPS, e.g. `[https://](https://raw.githubusercontent.com/silverbulletmd/silverbullet-github/main/github.plug.js)`
|
||||||
* `github:org/repo/file.plug.js` internally rewritten to a `https` url as above.
|
* `github:org/repo/file.plug.js` internally rewritten to a `https` url as above.
|
||||||
* `ghr:org/repo/version` to fetch a plug from a Github release
|
* `ghr:org/repo/version` to fetch a plug from a Github release. Will fetch latest version, if it was omitted.
|
||||||
|
|
|
@ -48,4 +48,6 @@ Once you’re happy with your plug, you can distribute it in various ways:
|
||||||
- You can put it on github by simply committing the resulting `.plug.js` file there and instructing users to point to by adding
|
- You can put it on github by simply committing the resulting `.plug.js` file there and instructing users to point to by adding
|
||||||
`- github:yourgithubuser/yourrepo/yourplugname.plug.js` to their `PLUGS` file
|
`- github:yourgithubuser/yourrepo/yourplugname.plug.js` to their `PLUGS` file
|
||||||
- Add a release in your github repo and instruct users to add the release as `- ghr:yourgithubuser/yourrepo` or if they need a specific release `- ghr:yourgithubuser/yourrepo/release-name`
|
- Add a release in your github repo and instruct users to add the release as `- ghr:yourgithubuser/yourrepo` or if they need a specific release `- ghr:yourgithubuser/yourrepo/release-name`
|
||||||
|
- You need to upload the plug file as asset in the release, with a name matching your repository, e.g, `yourrepo.plug.js`
|
||||||
|
- If your repository name starts with "silverbullet-", like `silverbullet-foo`, both `silverbullet-foo.plug.js` and `foo.plug.js` asset names will be tried
|
||||||
- You can put it on any other web server, and tell people to load it via https, e.g., `- https://mydomain.com/mypugname.plug.js`.
|
- You can put it on any other web server, and tell people to load it via https, e.g., `- https://mydomain.com/mypugname.plug.js`.
|
||||||
|
|
Loading…
Reference in New Issue