@senchou/cli
Version:
Generate TypeScript for Kubernetes resources.
118 lines (77 loc) • 8.26 kB
JavaScript
;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}`)});