UNPKG

@senchou/cli

Version:

Generate TypeScript for Kubernetes resources.

118 lines (77 loc) 8.26 kB
"use strict";var E=Object.defineProperty,R=Object.defineProperties;var x=Object.getOwnPropertyDescriptors;var y=Object.getOwnPropertySymbols;var O=Object.prototype.hasOwnProperty,T=Object.prototype.propertyIsEnumerable;var k=(t,o,a)=>o in t?E(t,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[o]=a,g=(t,o)=>{for(var a in o||(o={}))O.call(o,a)&&k(t,a,o[a]);if(y)for(var a of y(o))T.call(o,a)&&k(t,a,o[a]);return t},b=(t,o)=>R(t,x(o));var C=require("arg"),A=require("@littlethings/log"),N=require("kleur"),D=require("fs"),G=require("path"),P=require("mkdirp"),L=require("@senchou/core");function i(t){return t&&typeof t=="object"&&"default"in t?t:{default:t}}var f=i(C),u=i(A),e=i(N),d=i(D),n=i(G),S=i(P),c=i(L);const $={"--help":Boolean,"-h":"--help","--verbose":f.default.COUNT,"-v":"--verbose"},v=f.default($,{permissive:!0});if(v["--verbose"]){switch(v["--verbose"]){default:case 0:break;case 1:u.default.setVerbosity("INFO");break;case 2:u.default.setVerbosity("DEBUG");break;case 3:u.default.setVerbosity("TRACE");break}v["--verbose"]>3&&u.default.setVerbosity("TRACE")}else u.default.setVerbosity("INFO");var r=u.default.create("@senchou/cli");const w=()=>{const t=` ${e.default.bold("DESCRIPTION")} Manage Kubernetes manifests with TypeScript. ${e.default.bold("USAGE")} ${e.default.dim("$")} ${e.default.bold("senchou")} <command> [options] ${e.default.bold("COMMANDS")} k8s Import types for a Kubernetes release crd Import types for a CustomResourceDefinition ${e.default.bold("OPTIONS")} --help, -h Show this help message --verbose, -v Set logging verbosity ${e.default.bold("EXAMPLE")} ${e.default.dim("$ # Get help for commands.")} ${e.default.dim("$")} ${e.default.bold("senchou k8s")} --help ${e.default.dim("$")} ${e.default.bold("senchou crd")} --help ${e.default.dim("$ # Run Senchou with verbose logging.")} ${e.default.dim("$")} ${e.default.bold("senchou")} -v ${e.default.dim("$")} ${e.default.bold("senchou")} -vv ${e.default.dim("$")} ${e.default.bold("senchou")} -vvv ${e.default.dim("$ # Run Senchou with no logging.")} ${e.default.dim("$")} LOG_LEVEL=SILENT ${e.default.bold("senchou")} ${e.default.dim("$ # Run Senchou with timestamps.")} ${e.default.dim("$")} LOG_TIMESTAMP=TRUE ${e.default.bold("senchou")} ${e.default.dim("$ # Filter logs from Senchou (based on log prefix).")} ${e.default.dim("$")} DEBUG="^some-regex$" ${e.default.bold("senchou")} `;console.log(t)},U=()=>{const t=` ${e.default.bold("DESCRIPTION")} Import types for a Kubernetes release. ${e.default.bold("USAGE")} ${e.default.dim("$")} ${e.default.bold("senchou k8s [version]")} ${e.default.bold("OPTIONS")} --help, -h Show this help message --output, -o Set the output directory (default: ./senchou) --force, -f Remove any conflicting files before writing ${e.default.bold("EXAMPLE")} ${e.default.dim("$ # Import the default Kubernetes release's types.")} ${e.default.dim("$")} ${e.default.bold("senchou k8s")} ${e.default.dim("$ # Import a specific Kubernetes release's types.")} ${e.default.dim("$")} ${e.default.bold("senchou k8s")} 1.20.0 ${e.default.dim("$ # Import to a custom directory.")} ${e.default.dim("$")} ${e.default.bold("senchou k8s")} --output ./my-code ${e.default.dim('$ # Overwrite an existing "k8s.ts" file.')} ${e.default.dim("$")} ${e.default.bold("senchou k8s")} --force `;console.log(t)},F=()=>f.default(b(g({},$),{"--output":String,"-o":"--output","--force":Boolean,"-f":"--force"})),m=t=>n.default.isAbsolute(t)?t:n.default.resolve(process.cwd(),t),M=async()=>{const t=F();t["--help"]&&(U(),process.exit(0));const o=t["--output"]?m(t["--output"]):m("senchou"),a=t._[1];r.debug(`Creating directory "${o}".`),await S.default(o);const s=n.default.resolve(o,"k8s.ts");d.default.existsSync(s)&&(t["--force"]?d.default.rmSync(s):(r.fatal(`File already exists at path "${s}".`),r.fatal('Remove the file and try again or use the "--force" option.'),process.exit(1)));const l=`k8s${a?`@${a}`:""}`;r.trace(`Importing schema for "${l}".`);const h=await c.default.import.kubernetes(l);r.trace("Generating code for schema.");const p=await c.default.generate.kubernetes(h);r.debug(`Writing code to file "${s}".`),d.default.writeFileSync(s,p)},I=()=>{const t=` ${e.default.bold("DESCRIPTION")} Import types for a CustomResourceDefinition. ${e.default.bold("USAGE")} ${e.default.dim("$")} ${e.default.bold("senchou crd <protocol>:<specifier>")} ${e.default.bold("OPTIONS")} --help, -h Show this help message --output, -o Set the output directory (default: ./senchou) --force, -f Remove any conflicting files before writing --name, -n Set the name of the output file (appended with ".ts") ${e.default.bold("PROTOCOLS")} ${e.default.bold("github")} CRDs can be imported from GitHub using the "github" protocol. To fetch from GitHub, you must supply an owner and repository name like the following. ${e.default.dim("$ # github:owner/repo")} ${e.default.dim("$")} ${e.default.bold("senchou crd github:traefik/traefik-helm-chart")} Tags can also be used to fetch CRDs from a specific release. ${e.default.dim("$ # github:owner/repo@tag")} ${e.default.dim("$")} ${e.default.bold("senchou crd github:traefik/traefik-helm-chart@v10.14.0")} ${e.default.bold("EXAMPLE")} ${e.default.dim("$ # Import types for Traefik from GitHub.")} ${e.default.dim("$")} ${e.default.bold("senchou crd")} github:traefik/traefik-helm-chart ${e.default.dim("$ # Import a specific version's types.")} ${e.default.dim("$")} ${e.default.bold("senchou crd")} github:traefik/traefik-helm-chart@v10.14.0 ${e.default.dim("$ # Import to a custom directory.")} ${e.default.dim("$")} ${e.default.bold("senchou crd")} github:traefik/traefik-helm-chart --output ./my-code ${e.default.dim("$ # Name the output file.")} ${e.default.dim("$")} ${e.default.bold("senchou crd")} github:traefik/traefik-helm-chart --name traefik ${e.default.dim("$ # Overwrite an existing file.")} ${e.default.dim("$")} ${e.default.bold("senchou crd")} github:traefik/traefik-helm-chart --force `;console.log(t)},q=()=>f.default(b(g({},$),{"--output":String,"-o":"--output","--force":Boolean,"-f":"--force","--name":String,"-n":"--name"})),V=t=>t.startsWith("github:")?t.split("github:")[1].split("@")[0].split("/")[1]:t.replace(/[^A-Za-z0-9]/g,"-"),B=async t=>{if(t.startsWith("github:"))return c.default.import.github(t.substring("github:".length));r.fatal(`Unknown protocol "${t}" for CRD.`),process.exit(1)},K=async()=>{const t=q();t["--help"]&&(I(),process.exit(0)),t._[1]||(r.fatal("No specifier entered."),I(),process.exit(1));const o=t._[1],a=t["--output"]?m(t["--output"]):m("senchou"),s=t["--name"]?t["--name"]:V(o);r.trace(`Using name "${s}" for resource.`),r.debug(`Creating directory "${a}".`),await S.default(a);const l=n.default.resolve(a,`${s}.ts`);d.default.existsSync(l)&&(t["--force"]?d.default.rmSync(l):(r.fatal(`File already exists at path "${l}".`),r.fatal('Remove the file and try again or use the "--force" option.'),process.exit(1))),r.trace(`Importing definitions for "${o}".`);const h=await B(o);r.trace("Generating code for definitions.");const p=await c.default.generate.crd(h);r.debug(`Writing code to file "${l}".`),d.default.writeFileSync(l,p)},_={k8s:M,crd:K},W=async()=>{var a;r.trace("Init."),r.trace("Parsing root arguments.");const t=f.default($,{permissive:!0});t["--help"]&&t._.length===0&&(r.trace("Printing root help message."),w(),process.exit(0)),t._.length===0&&(r.fatal("No command specified."),r.trace("Printing root help message due to error."),w(),process.exit(1));const o=(a=t._)==null?void 0:a[0];o&&o in _?(r.trace(`Executing command "${o}".`),await _[o]()):(r.fatal(`Unknown command "${o}".`),process.exit(1))};W().catch(t=>{var o,a,s;r.fatal(t.message||t);for(const l of(s=(a=(o=t.stack)==null?void 0:o.split(` `))==null?void 0:a.slice(1))!=null?s:[])r.fatal(`${l}`)});