This commit is contained in:
Fabian Stamm 2023-11-28 16:12:49 +01:00
commit 310c8e12fa
12 changed files with 166 additions and 57 deletions

View File

@ -1,45 +1,8 @@
import { Colors, Path, FS, Compress, Base64 } from "../deps.ts"; import { Colors, Path, FS, Compress, Base64 } from "../deps.ts";
import { getMeta, IMeta, log, getConfig } from "../global.ts"; import { getMeta, IMeta, log, getConfig } from "../global.ts";
import { runHooks } from "../helper/run_script.ts";
import { ServerError } from "../helper/server_error.ts"; import { ServerError } from "../helper/server_error.ts";
import { checkPermOrExit } from "../helper/permission.ts";
async function runScript(script: string) {
console.log(Colors.bold(Colors.blue("Running script:")), script);
const runPerm = await Deno.permissions.query({
name: "run",
});
if (runPerm.state !== "granted") {
console.log(
Colors.red("Missing --allow-run permission. Cannot run hooks!")
);
throw new Error("Missing --allow-run permission. Cannot run hooks!");
}
const process = Deno.run({
cmd: ["deno", "run", "-A", "--unstable", script],
});
const status = await process.status();
console.log(Colors.bold(Colors.blue("Finished script:")), script);
if (!status.success) {
throw new Error(
"A hook did not complete sucessfully. This is not a issue of denreg!"
);
}
}
async function runHooks(hooks: undefined | string | string[]) {
if (!hooks) return;
if (typeof hooks === "string") {
hooks = [hooks];
}
for (const hook of hooks) {
await runScript(hook);
}
}
export default async function publish(options: { dry: boolean }) { export default async function publish(options: { dry: boolean }) {
const originalMeta = await getMeta(); const originalMeta = await getMeta();
@ -100,6 +63,8 @@ export default async function publish(options: { dry: boolean }) {
); );
if (!options.dry) { if (!options.dry) {
await checkPermOrExit("net", "Net permission required for publishing");
log("Uploading new package version"); log("Uploading new package version");
await fetch(url, { await fetch(url, {
method: "POST", method: "POST",

18
cli/commands/run.ts Normal file
View File

@ -0,0 +1,18 @@
import { Colors, Path, FS, Compress, Base64 } from "../deps.ts";
import { getMeta, IMeta, log, getConfig } from "../global.ts";
import { ServerError } from "../helper/server_error.ts";
import { runScript } from "../helper/run_script.ts";
export default async function run(options: {}, name: string) {
const { scripts } = await getMeta();
if (!scripts || !scripts[name]) {
console.log(Colors.bold(Colors.red("Script not found:")), name);
} else {
let script = scripts[name];
if (!Array.isArray(script)) script = [script];
for (const s of script) {
await runScript(s);
}
}
}

View File

@ -1,7 +1,12 @@
import { CliffyPrompt, Colors } from "../deps.ts"; import { CliffyPrompt, Colors } from "../deps.ts";
import { version } from "../version.ts"; import { version } from "../version.ts";
import { requestPermOrExit } from "../helper/permission.ts";
export default async function upgrade() { export default async function upgrade() {
await requestPermOrExit(
"net",
"Net permission required to fetch new version"
);
const meta = await fetch( const meta = await fetch(
"https://deno.hibas123.de/raw/@denreg-cli/meta.json" "https://deno.hibas123.de/raw/@denreg-cli/meta.json"
).then((e) => e.json()); ).then((e) => e.json());
@ -20,19 +25,39 @@ export default async function upgrade() {
}); });
if (res) { if (res) {
const process = Deno.run({ const cmd_base = ["deno", "install", "-A", "--unstable", "-f"];
cmd: [
"deno", const cmd1 = [
"install", ...cmd_base,
"-A", `https://deno.hibas123.de/raw/@denreg-cli@${meta.version}/denreg.ts`,
"--unstable", ];
"-f",
`https://deno.hibas123.de/raw/@denreg-cli@${meta.version}/denreg.ts`, const cmd2 = [
], ...cmd_base,
`https://deno.hibas123.de/raw/@denreg-cli@${meta.version}/dpm.ts`,
];
await requestPermOrExit(
"run",
"Run permission required to install new version. Or run it manually: " +
cmd1.join(" ")
);
const process1 = Deno.run({
cmd: cmd1,
}); });
const s = await process.status(); const s1 = await process1.status();
if (!s) { if (!s1) {
console.log(Colors.red("Upgrade failed!"));
}
const process2 = Deno.run({
cmd: cmd2,
});
const s2 = await process2.status();
if (!s2) {
console.log(Colors.red("Upgrade failed!")); console.log(Colors.red("Upgrade failed!"));
} }
} }

View File

@ -1,14 +1,20 @@
import { CliffyCommand, Path, Colors } from "./deps.ts"; import { CliffyCommand, Path, Colors } from "./deps.ts";
import { checkPermOrExit } from "./helper/permission.ts";
await checkPermOrExit("env", "Requires --allow-env");
await checkPermOrExit("read", "Requires --allow-read");
await checkPermOrExit("write", "Requires --allow-write");
import { init } from "./global.ts"; import { init } from "./global.ts";
import { version } from "./version.ts"; import { version } from "./version.ts";
import setupCMD from "./commands/setup.ts"; import setupCMD from "./commands/setup.ts";
import initCMD from "./commands/init.ts"; import initCMD from "./commands/init.ts";
import bumpCMD from "./commands/bump.ts"; import bumpCMD from "./commands/bump.ts";
import publishCMD from "./commands/publish.ts"; import publishCMD from "./commands/publish.ts";
import deprecateCMD from "./commands/deprecate.ts"; import deprecateCMD from "./commands/deprecate.ts";
import upgradeCMD from "./commands/upgrade.ts"; import upgradeCMD from "./commands/upgrade.ts";
import runCMD from "./commands/run.ts";
const HOME_FOLDER = Deno.env.get("HOME") || Deno.env.get("USERPROFILE") || ""; const HOME_FOLDER = Deno.env.get("HOME") || Deno.env.get("USERPROFILE") || "";
@ -83,6 +89,14 @@ const flags = await new CliffyCommand.Command()
.description("Upgrade to latest version of denreg cli") .description("Upgrade to latest version of denreg cli")
.action(commandWrapper(upgradeCMD)) .action(commandWrapper(upgradeCMD))
) )
.command(
"run",
new CliffyCommand.Command()
.arguments("<name>")
// .complete("name", ()=>) //TODO: add autocomplete?
.description("Run script from meta.json")
.action(commandWrapper(runCMD))
)
.command("completions", new CliffyCommand.CompletionsCommand()) .command("completions", new CliffyCommand.CompletionsCommand())
.command("help", new CliffyCommand.HelpCommand().global()) .command("help", new CliffyCommand.HelpCommand().global())
.parse(Deno.args); .parse(Deno.args);

View File

@ -2,7 +2,10 @@ export * as Compress from "https://deno.hibas123.de/raw/@denreg-tar/mod.ts";
export * as Ini from "https://deno.land/x/ini@v2.1.0/mod.ts"; export * as Ini from "https://deno.land/x/ini@v2.1.0/mod.ts";
export * as CliffyPrompt from "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/mod.ts"; export * as CliffyPrompt from "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/mod.ts";
export * as CliffyCommand from "https://deno.land/x/cliffy@v1.0.0-rc.3/command/mod.ts"; export * as CliffyCommand from "https://deno.land/x/cliffy@v1.0.0-rc.3/command/mod.ts";
export * as Base64 from "https://deno.land/std@0.91.0/encoding/base64.ts";
export * as FS from "https://deno.land/std@0.91.0/fs/mod.ts";
export * as Colors from "https://deno.land/std@0.91.0/fmt/colors.ts"; export * as Cliffy from "https://deno.land/x/cliffy@v0.18.2/mod.ts";
export * as Path from "https://deno.land/std@0.91.0/path/mod.ts"; export * as Base64 from "https://deno.land/std@0.95.0/encoding/base64.ts";
export * as FS from "https://deno.land/std@0.95.0/fs/mod.ts";
export * as Colors from "https://deno.land/std@0.95.0/fmt/colors.ts";
export * as Path from "https://deno.land/std@0.95.0/path/mod.ts";

1
cli/dpm.ts Normal file
View File

@ -0,0 +1 @@
import "./denreg.ts";

View File

@ -14,6 +14,9 @@ export interface IMeta {
prepublish?: string | string[]; prepublish?: string | string[];
postpublish?: string | string[]; postpublish?: string | string[];
}; };
scripts?: {
[key: string]: string | string[];
};
} }
let verbose = false; let verbose = false;

26
cli/helper/permission.ts Normal file
View File

@ -0,0 +1,26 @@
import { Colors } from "../deps.ts";
export const checkPermOrExit = (name: string, err: string) =>
Deno.permissions.query({ name: name as any }).then((res) => {
if (res.state !== "granted") {
console.log(Colors.bold(Colors.red(err)));
Deno.exit(1);
}
});
export const requestPermOrExit = (name: string, err: string) => {
Deno.permissions
.query({ name: name as any })
.then((res) => {
if (res.state === "prompt") {
return Deno.permissions.request({ name: name as any });
}
return res;
})
.then((res) => {
if (res.state !== "granted") {
console.log(Colors.bold(Colors.red(err)));
Deno.exit(1);
}
});
};

51
cli/helper/run_script.ts Normal file
View File

@ -0,0 +1,51 @@
import { Colors } from "../deps.ts";
import { checkPermOrExit } from "../helper/permission.ts";
export async function runScript(script: string) {
await checkPermOrExit(
"run",
"Requires --allow-run to run scripts and hooks"
);
console.log(Colors.bold(Colors.blue("Running script:")), script);
const runPerm = await Deno.permissions.query({
name: "run",
});
if (runPerm.state !== "granted") {
console.log(
Colors.red("Missing --allow-run permission. Cannot run hooks!")
);
throw new Error("Missing --allow-run permission. Cannot run hooks!");
}
const process = Deno.run({
cmd: ["deno", "run", "-A", "--unstable", script],
});
const status = await process.status();
console.log(Colors.bold(Colors.blue("Finished script:")), script);
if (!status.success) {
throw new Error(
"A script did not complete sucessfully. This is not a issue of denreg!"
);
}
}
export async function runHooks(hooks: undefined | string | string[]) {
if (!hooks) return;
if (typeof hooks === "string") {
hooks = [hooks];
}
for (const hook of hooks) {
try {
await runScript(hook);
} catch (err) {
throw new Error(
"A hook did not complete sucessfully. This is not a issue of denreg!"
);
}
}
}

View File

@ -9,6 +9,9 @@
"**/*.js", "**/*.js",
"README.md" "README.md"
], ],
"scripts": {
"test": "version.ts"
},
"hooks": { "hooks": {
"prepublish": "pre.ts" "prepublish": "pre.ts"
} }

0
cli/test.ts Normal file
View File

View File

@ -1 +1 @@
export const version = "1.0.0" export const version = "1.0.0"