diff --git a/cli/commands/publish.ts b/cli/commands/publish.ts index e6f693a..67b4c5f 100644 --- a/cli/commands/publish.ts +++ b/cli/commands/publish.ts @@ -1,45 +1,8 @@ import { Colors, Path, FS, Compress, Base64 } from "../deps.ts"; import { getMeta, IMeta, log, getConfig } from "../global.ts"; +import { runHooks } from "../helper/run_script.ts"; import { ServerError } from "../helper/server_error.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); - } -} +import { checkPermOrExit } from "../helper/permission.ts"; export default async function publish(options: { dry: boolean }) { const originalMeta = await getMeta(); @@ -100,6 +63,8 @@ export default async function publish(options: { dry: boolean }) { ); if (!options.dry) { + await checkPermOrExit("net", "Net permission required for publishing"); + log("Uploading new package version"); await fetch(url, { method: "POST", diff --git a/cli/commands/run.ts b/cli/commands/run.ts new file mode 100644 index 0000000..684a393 --- /dev/null +++ b/cli/commands/run.ts @@ -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); + } + } +} diff --git a/cli/commands/upgrade.ts b/cli/commands/upgrade.ts index b9aab8e..2644fda 100644 --- a/cli/commands/upgrade.ts +++ b/cli/commands/upgrade.ts @@ -1,7 +1,12 @@ import { CliffyPrompt, Colors } from "../deps.ts"; import { version } from "../version.ts"; +import { requestPermOrExit } from "../helper/permission.ts"; export default async function upgrade() { + await requestPermOrExit( + "net", + "Net permission required to fetch new version" + ); const meta = await fetch( "https://deno.hibas123.de/raw/@denreg-cli/meta.json" ).then((e) => e.json()); @@ -20,19 +25,39 @@ export default async function upgrade() { }); if (res) { - const process = Deno.run({ - cmd: [ - "deno", - "install", - "-A", - "--unstable", - "-f", - `https://deno.hibas123.de/raw/@denreg-cli@${meta.version}/denreg.ts`, - ], + const cmd_base = ["deno", "install", "-A", "--unstable", "-f"]; + + const cmd1 = [ + ...cmd_base, + `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(); - if (!s) { + const s1 = await process1.status(); + 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!")); } } diff --git a/cli/denreg.ts b/cli/denreg.ts index bd3a5c4..bee4b2e 100644 --- a/cli/denreg.ts +++ b/cli/denreg.ts @@ -1,14 +1,20 @@ 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 { version } from "./version.ts"; - import setupCMD from "./commands/setup.ts"; import initCMD from "./commands/init.ts"; import bumpCMD from "./commands/bump.ts"; import publishCMD from "./commands/publish.ts"; import deprecateCMD from "./commands/deprecate.ts"; import upgradeCMD from "./commands/upgrade.ts"; +import runCMD from "./commands/run.ts"; 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") .action(commandWrapper(upgradeCMD)) ) + .command( + "run", + new CliffyCommand.Command() + .arguments("") + // .complete("name", ()=>) //TODO: add autocomplete? + .description("Run script from meta.json") + .action(commandWrapper(runCMD)) + ) .command("completions", new CliffyCommand.CompletionsCommand()) .command("help", new CliffyCommand.HelpCommand().global()) .parse(Deno.args); diff --git a/cli/deps.ts b/cli/deps.ts index 8282b0c..2c8da2b 100644 --- a/cli/deps.ts +++ b/cli/deps.ts @@ -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 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 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 Path from "https://deno.land/std@0.91.0/path/mod.ts"; + + +export * as Cliffy from "https://deno.land/x/cliffy@v0.18.2/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"; \ No newline at end of file diff --git a/cli/dpm.ts b/cli/dpm.ts new file mode 100644 index 0000000..bafc48e --- /dev/null +++ b/cli/dpm.ts @@ -0,0 +1 @@ +import "./denreg.ts"; diff --git a/cli/global.ts b/cli/global.ts index 6243f57..887c5b7 100644 --- a/cli/global.ts +++ b/cli/global.ts @@ -14,6 +14,9 @@ export interface IMeta { prepublish?: string | string[]; postpublish?: string | string[]; }; + scripts?: { + [key: string]: string | string[]; + }; } let verbose = false; diff --git a/cli/helper/permission.ts b/cli/helper/permission.ts new file mode 100644 index 0000000..d7bd4be --- /dev/null +++ b/cli/helper/permission.ts @@ -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); + } + }); +}; diff --git a/cli/helper/run_script.ts b/cli/helper/run_script.ts new file mode 100644 index 0000000..13a1949 --- /dev/null +++ b/cli/helper/run_script.ts @@ -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!" + ); + } + } +} diff --git a/cli/meta.json b/cli/meta.json index 22adee5..51925cb 100644 --- a/cli/meta.json +++ b/cli/meta.json @@ -9,6 +9,9 @@ "**/*.js", "README.md" ], + "scripts": { + "test": "version.ts" + }, "hooks": { "prepublish": "pre.ts" } diff --git a/cli/test.ts b/cli/test.ts new file mode 100644 index 0000000..e69de29 diff --git a/cli/version.ts b/cli/version.ts index 0fec7f7..edfb378 100644 --- a/cli/version.ts +++ b/cli/version.ts @@ -1 +1 @@ -export const version = "1.0.0" \ No newline at end of file +export const version = "1.0.0"