QOL improvements or CLI
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			This commit is contained in:
		
							
								
								
									
										5
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							@ -1,3 +1,4 @@
 | 
			
		||||
{
 | 
			
		||||
   "deno.enable": true
 | 
			
		||||
}
 | 
			
		||||
   "deno.enable": true,
 | 
			
		||||
   "deno.unstable": true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								cli/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								cli/README.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
			
		||||
A CLI for the denreg registry.
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
Recommended way for installation is
 | 
			
		||||
`deno install -A --unstable https://deno.hibas123.de/raw/@denreg-cli/denreg.ts`
 | 
			
		||||
Since the cli requires access to:
 | 
			
		||||
 | 
			
		||||
-  reading and writing files
 | 
			
		||||
-  access to environment variables
 | 
			
		||||
-  network access
 | 
			
		||||
 | 
			
		||||
The -A flag is the easiest way to install. You can however manually grant the required permissions.
 | 
			
		||||
 | 
			
		||||
| permission    | reason                                                                                            |
 | 
			
		||||
| ------------- | ------------------------------------------------------------------------------------------------- |
 | 
			
		||||
| --allow-read  | Read configuration files (~/.denreg) as well the your project files on publish                    |
 | 
			
		||||
| --allow-write | Write configuration file while using setup and init as well as during publish for temporary files |
 | 
			
		||||
| --allow-net   | Access to network for uploading to the registry (can be exclusive to the registry)                |
 | 
			
		||||
| --allow-env   | Required to get config file path relative to user home directory                                  |
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
import { Cliffy, Path, FS, Compress, Base64 } from "../deps.ts";
 | 
			
		||||
import { Cliffy, Path, FS } from "../deps.ts";
 | 
			
		||||
import {
 | 
			
		||||
   getMeta,
 | 
			
		||||
   setMeta,
 | 
			
		||||
@ -18,7 +18,7 @@ export default async function init() {
 | 
			
		||||
      description: "",
 | 
			
		||||
      author: getConfig("author"),
 | 
			
		||||
      contributors: [],
 | 
			
		||||
      files: ["**/*.ts", "**/*.js"],
 | 
			
		||||
      files: ["**/*.ts", "**/*.js", "README.md"],
 | 
			
		||||
      ...existing,
 | 
			
		||||
   };
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,19 @@ export default async function init() {
 | 
			
		||||
         message: "Who's the author of your package?",
 | 
			
		||||
         default: meta.author,
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      if (!(await FS.exists("README.md"))) {
 | 
			
		||||
         const res = await Cliffy.Confirm.prompt({
 | 
			
		||||
            message: "Autogenerate README?",
 | 
			
		||||
            default: true,
 | 
			
		||||
         });
 | 
			
		||||
         if (res) {
 | 
			
		||||
            await Deno.writeFile(
 | 
			
		||||
               "README.md",
 | 
			
		||||
               new TextEncoder().encode(meta.description || "")
 | 
			
		||||
            );
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   await setMeta(meta);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										226
									
								
								cli/denreg.ts
									
									
									
									
									
								
							
							
						
						
									
										226
									
								
								cli/denreg.ts
									
									
									
									
									
								
							@ -1,7 +1,4 @@
 | 
			
		||||
import { Ini, Cliffy, Compress, Base64 } from "./deps.ts";
 | 
			
		||||
import * as Colors from "https://deno.land/std@0.62.0/fmt/colors.ts";
 | 
			
		||||
import * as Path from "https://deno.land/std@0.62.0/path/mod.ts";
 | 
			
		||||
import * as FS from "https://deno.land/std@0.62.0/fs/mod.ts";
 | 
			
		||||
import { Cliffy, Path } from "./deps.ts";
 | 
			
		||||
import { init } from "./global.ts";
 | 
			
		||||
 | 
			
		||||
import setupCMD from "./commands/setup.ts";
 | 
			
		||||
@ -38,7 +35,7 @@ const flags = await new Cliffy.Command()
 | 
			
		||||
      default: Path.resolve(HOME_FOLDER, ".denreg"),
 | 
			
		||||
      global: true,
 | 
			
		||||
   })
 | 
			
		||||
   .option("-v, --verbose", "Verbose", {
 | 
			
		||||
   .option("-v, --verbose  [verbose:boolean]", "Verbose", {
 | 
			
		||||
      default: false,
 | 
			
		||||
      global: true,
 | 
			
		||||
   })
 | 
			
		||||
@ -76,222 +73,3 @@ await init(flags.options);
 | 
			
		||||
if (command) {
 | 
			
		||||
   await Promise.resolve((command as CommandHandler)(...opts));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// function log(...args: any[]) {
 | 
			
		||||
//    if (flags.options.verbose) console.log(...args);
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// const CONFIG_LOCATION = flags.options.config;
 | 
			
		||||
 | 
			
		||||
// function loadConfigSync() {
 | 
			
		||||
//    try {
 | 
			
		||||
//       const data = Deno.readFileSync(CONFIG_LOCATION);
 | 
			
		||||
//       return Ini.decode(new TextDecoder().decode(data));
 | 
			
		||||
//    } catch (err) {
 | 
			
		||||
//       return {};
 | 
			
		||||
//    }
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// const config = loadConfigSync();
 | 
			
		||||
 | 
			
		||||
// const { username, password, registry } = config;
 | 
			
		||||
 | 
			
		||||
// async function setConfig(name: string, value: string) {
 | 
			
		||||
//    config[name] = value;
 | 
			
		||||
 | 
			
		||||
//    const data = Ini.encode(config);
 | 
			
		||||
 | 
			
		||||
//    await Deno.writeFile(CONFIG_LOCATION, new TextEncoder().encode(data), {
 | 
			
		||||
//       create: true,
 | 
			
		||||
//    });
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// async function setup() {
 | 
			
		||||
//    const registry = await Cliffy.Input.prompt({
 | 
			
		||||
//       message: "What's your registry?",
 | 
			
		||||
//       default: config.registry,
 | 
			
		||||
//    });
 | 
			
		||||
//    const username = await Cliffy.Input.prompt({
 | 
			
		||||
//       message: "What's your username?",
 | 
			
		||||
//       default: config.username,
 | 
			
		||||
//    });
 | 
			
		||||
//    const password = await Cliffy.Secret.prompt({
 | 
			
		||||
//       message: "What's your password?",
 | 
			
		||||
//       hidden: true,
 | 
			
		||||
//       default: config.password,
 | 
			
		||||
//    });
 | 
			
		||||
 | 
			
		||||
//    const author = await Cliffy.Input.prompt({
 | 
			
		||||
//       message: "Who are you? (optional) Name <email@example.com>",
 | 
			
		||||
//       default: config.author,
 | 
			
		||||
//    });
 | 
			
		||||
 | 
			
		||||
//    await setConfig("registry", registry);
 | 
			
		||||
//    await setConfig("username", username);
 | 
			
		||||
//    await setConfig("password", password);
 | 
			
		||||
//    await setConfig("author", author);
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// interface IMeta {
 | 
			
		||||
//    name: string;
 | 
			
		||||
//    version: string;
 | 
			
		||||
//    description?: string;
 | 
			
		||||
//    author?: string;
 | 
			
		||||
//    contributors?: string[];
 | 
			
		||||
//    files: string[];
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// async function init() {
 | 
			
		||||
//    let existing = {};
 | 
			
		||||
//    try {
 | 
			
		||||
//       existing = await _getMeta();
 | 
			
		||||
//    } catch (err) {}
 | 
			
		||||
//    let meta: IMeta = {
 | 
			
		||||
//       name: Path.basename(Deno.cwd()).toLowerCase().replace(/\s+/g, "-"),
 | 
			
		||||
//       version: "0.0.1",
 | 
			
		||||
//       description: "",
 | 
			
		||||
//       author: config.author,
 | 
			
		||||
//       contributors: [],
 | 
			
		||||
//       files: ["**/*.ts", "**/*.js", "importmap.json"],
 | 
			
		||||
//       ...existing,
 | 
			
		||||
//    };
 | 
			
		||||
 | 
			
		||||
//    if (flags.options.interactive) {
 | 
			
		||||
//       meta.name = await Cliffy.Input.prompt({
 | 
			
		||||
//          message: "What's the name of your package?",
 | 
			
		||||
//          default: meta.name,
 | 
			
		||||
//       });
 | 
			
		||||
//       meta.description = await Cliffy.Input.prompt({
 | 
			
		||||
//          message: "What's the description of your package?",
 | 
			
		||||
//          default: meta.description,
 | 
			
		||||
//       });
 | 
			
		||||
//       meta.author = await Cliffy.Input.prompt({
 | 
			
		||||
//          message: "Who's the author of your package?",
 | 
			
		||||
//          default: meta.author,
 | 
			
		||||
//       });
 | 
			
		||||
//    }
 | 
			
		||||
 | 
			
		||||
//    await _setMeta(meta);
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// async function bump(options: any, type: "minor" | "major" | "patch") {
 | 
			
		||||
//    const meta = await _getMeta();
 | 
			
		||||
 | 
			
		||||
//    let [major = 0, minor = 0, patch = 0] = meta.version.split(".").map(Number);
 | 
			
		||||
 | 
			
		||||
//    switch (type) {
 | 
			
		||||
//       case "major":
 | 
			
		||||
//          major++;
 | 
			
		||||
//          break;
 | 
			
		||||
//       case "minor":
 | 
			
		||||
//          minor++;
 | 
			
		||||
//          break;
 | 
			
		||||
//       case "patch":
 | 
			
		||||
//          patch++;
 | 
			
		||||
//          break;
 | 
			
		||||
//       default:
 | 
			
		||||
//          throw new Error("type must be either major, minor or patch");
 | 
			
		||||
//    }
 | 
			
		||||
//    const newVersion = [major, minor, patch].join(".");
 | 
			
		||||
//    console.log(
 | 
			
		||||
//       "Bumping version from",
 | 
			
		||||
//       Colors.blue(meta.version),
 | 
			
		||||
//       "to",
 | 
			
		||||
//       Colors.blue(newVersion)
 | 
			
		||||
//    );
 | 
			
		||||
//    meta.version = newVersion;
 | 
			
		||||
//    await _setMeta(meta);
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// async function uploadPackage() {
 | 
			
		||||
//    const meta: IMeta = await _getMeta();
 | 
			
		||||
 | 
			
		||||
//    if (!meta.name) throw new Error("name is not set in meta.json");
 | 
			
		||||
//    if (!meta.version) throw new Error("version is not set in meta.json");
 | 
			
		||||
//    if (!meta.files || !Array.isArray(meta.files) || meta.files.length <= 0)
 | 
			
		||||
//       throw new Error("files is not set or empty in meta.json");
 | 
			
		||||
 | 
			
		||||
//    const tmpDir = await Deno.makeTempDir();
 | 
			
		||||
//    const packedFile = await Deno.makeTempFile();
 | 
			
		||||
 | 
			
		||||
//    try {
 | 
			
		||||
//       const walker = FS.walk(".", {
 | 
			
		||||
//          includeDirs: false,
 | 
			
		||||
//          includeFiles: true,
 | 
			
		||||
//          match: meta.files.map((file) => Path.globToRegExp(file)),
 | 
			
		||||
//       });
 | 
			
		||||
 | 
			
		||||
//       log("Copying files to package to", tmpDir);
 | 
			
		||||
 | 
			
		||||
//       const copy = async (path: string) => {
 | 
			
		||||
//          const dest = Path.join(tmpDir, path);
 | 
			
		||||
//          await FS.ensureDir(Path.dirname(dest));
 | 
			
		||||
//          await FS.copy(path, dest);
 | 
			
		||||
//       };
 | 
			
		||||
 | 
			
		||||
//       await copy("meta.json");
 | 
			
		||||
 | 
			
		||||
//       for await (const file of walker) {
 | 
			
		||||
//          await copy(file.path);
 | 
			
		||||
//       }
 | 
			
		||||
 | 
			
		||||
//       log("Compressing file");
 | 
			
		||||
 | 
			
		||||
//       await Compress.Tar.compress(tmpDir, packedFile, {
 | 
			
		||||
//          excludeSrc: true,
 | 
			
		||||
//       });
 | 
			
		||||
 | 
			
		||||
//       const url = new URL(config.registry);
 | 
			
		||||
//       url.pathname = "/api/package/" + meta.name;
 | 
			
		||||
 | 
			
		||||
//       log("Uploading new package version");
 | 
			
		||||
 | 
			
		||||
//       const res = await fetch(url, {
 | 
			
		||||
//          method: "POST",
 | 
			
		||||
//          body: await Deno.readFile(packedFile),
 | 
			
		||||
//          headers: {
 | 
			
		||||
//             Authorization:
 | 
			
		||||
//                "Basic " +
 | 
			
		||||
//                Base64.encode(config.username + ":" + config.password),
 | 
			
		||||
//          },
 | 
			
		||||
//       }).then((res) => (res.status === 200 ? res.json() : res.statusText));
 | 
			
		||||
 | 
			
		||||
//       log("Upload finished. Result:", res);
 | 
			
		||||
 | 
			
		||||
//       if (typeof res === "string" || res.error) {
 | 
			
		||||
//          console.log(
 | 
			
		||||
//             Colors.red("Error: " + (typeof res == "string" ? res : res.error))
 | 
			
		||||
//          );
 | 
			
		||||
//       } else {
 | 
			
		||||
//          if (res.success) {
 | 
			
		||||
//             console.log(Colors.green("Upload successfull"));
 | 
			
		||||
//          }
 | 
			
		||||
//       }
 | 
			
		||||
//    } finally {
 | 
			
		||||
//       await Deno.remove(tmpDir, { recursive: true });
 | 
			
		||||
//       await Deno.remove(packedFile);
 | 
			
		||||
//    }
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// async function _getMeta(): Promise<IMeta> {
 | 
			
		||||
//    log("Reading meta.json");
 | 
			
		||||
//    return (await FS.readJson("meta.json")) as IMeta;
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// async function _setMeta(meta: IMeta): Promise<void> {
 | 
			
		||||
//    log("Saving meta.json");
 | 
			
		||||
//    return FS.writeJson("meta.json", meta, {
 | 
			
		||||
//       spaces: "   ",
 | 
			
		||||
//    });
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// if (!username || !password || !registry) {
 | 
			
		||||
//    if (!flags.options.interactive) {
 | 
			
		||||
//       console.error(
 | 
			
		||||
//          Colors.red("Run setup or set necessary value in " + CONFIG_LOCATION)
 | 
			
		||||
//       );
 | 
			
		||||
//    } else {
 | 
			
		||||
//       log("Running setup");
 | 
			
		||||
//       await setup();
 | 
			
		||||
//    }
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
import { Ini, Cliffy, Compress, Base64, FS, Colors } from "./deps.ts";
 | 
			
		||||
import { Ini, FS, Colors } from "./deps.ts";
 | 
			
		||||
import setupCMD from "./commands/setup.ts";
 | 
			
		||||
 | 
			
		||||
export interface IMeta {
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,5 @@
 | 
			
		||||
   "description": "CLI for the DenReg package registry",
 | 
			
		||||
   "author": "Fabian Stamm <dev@fabianstamm.de>",
 | 
			
		||||
   "contributors": [],
 | 
			
		||||
   "files": [
 | 
			
		||||
      "**/*.ts",
 | 
			
		||||
      "**/*.js"
 | 
			
		||||
   ]
 | 
			
		||||
}
 | 
			
		||||
   "files": ["**/*.ts", "**/*.js", "README.md"]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user