UNPKG

karabiner-human-config

Version:

The easiest way to write Karabiner-Elements configuration files, ever!

24 lines (20 loc) 6.58 kB
#!/usr/bin/env node var R=Object.defineProperty,J=Object.defineProperties;var U=Object.getOwnPropertyDescriptors;var w=Object.getOwnPropertySymbols;var P=Object.prototype.hasOwnProperty,V=Object.prototype.propertyIsEnumerable;var $=(e,t,o)=>t in e?R(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,n=(e,t)=>{for(var o in t||(t={}))P.call(t,o)&&$(e,o,t[o]);if(w)for(var o of w(t))V.call(t,o)&&$(e,o,t[o]);return e},x=(e,t)=>J(e,U(t));import _ from"node:fs";import H from"node:os";import d from"node:path";import{parseArgs as W}from"node:util";var f=e=>{let t=["lazy","repeat","halt"];e=e.replace(/\s+/g," ");let o=e.split(" "),s=o.reduce((r,i)=>(t.includes(i)&&(r[i]=!0),r),{});return[o.filter(r=>!t.includes(r)),s]},g=e=>{e=e.replace(/\s+/g," ");let t=e.split(" "),o=t.filter(r=>parseInt(r)>9),s=o.length===1?{hold_down_milliseconds:parseInt(o[0])}:{};return[t.filter(r=>isNaN(parseInt(r))||parseInt(r)<10),s]},O=e=>`^${e.replace(/\./g,"\\.")}$`,A=(e,t)=>{for(let[o,s]of Object.entries(t))e[o]&&(e[s]=e[o],delete e[o]);return e},p=(e,t)=>{let o=e.split(t);return o.length?[o[0].trim(),e.slice(o[0].length+t.length).trim()]:[e.trim()]},F=e=>/^[A-Z]/.test(e),u=(e,t,o)=>{let s=e[t];s!==void 0&&(e[t]=o(s))};var m={caps:"caps_lock",capslock:"caps_lock",cmd:"left_command",command:"left_command",l_cmd:"left_command",l_command:"left_command",lcmd:"left_command",lcommand:"left_command",left_cmd:"left_command",r_cmd:"right_command",r_command:"right_command",rcmd:"right_command",rcommand:"right_command",right_cmd:"right_command",ctrl:"left_control",control:"left_control",l_control:"left_control",l_ctrl:"left_control",lcontrol:"left_control",lctrl:"left_control",left_ctrl:"left_control",r_control:"right_control",r_ctrl:"right_control",rcontrol:"right_control",rctrl:"right_control",right_ctrl:"right_control",esc:"escape",grave:"grave_accent_and_tilde",accent:"grave_accent_and_tilde",tilde:"grave_accent_and_tilde",hyper:"left_command left_control left_option left_shift",opt:"left_option",option:"left_option",l_opt:"left_option",l_option:"left_option",left_opt:"left_option",lopt:"left_option",loption:"left_option",r_opt:"right_option",r_option:"right_option",right_opt:"right_option",ropt:"right_option",roption:"right_option",shift:"left_shift",l_shift:"left_shift",lshift:"left_shift",r_shift:"right_shift",rshift:"right_shift"};var E={t:"to",a:"to_if_alone",alone:"to_if_alone",h:"to_if_held_down",held:"to_if_held_down",u:"to_after_key_up",up:"to_after_key_up",d:"to_delayed_action",delayed:"to_delayed_action"};import{bundleId as B}from"bundle-id";var I=e=>{let[t,o]=p(e,"|");for(let[c,h]of Object.entries(m))t=t.replace(new RegExp(`\\b${c}\\b`,"g"),h),o=o==null?void 0:o.replace(new RegExp(`\\b${c}\\b`,"g"),h);let s=t.split(" "),l=s.pop(),r=s,i=o?o.split(" "):[],a=n(n({},r.length&&{mandatory:r}),i.length&&{optional:i});return n({key_code:l},Object.keys(a).length&&{modifiers:a})};var S=e=>{if(typeof e=="object")return e;let[t,o]=p(e,"$");for(let[a,c]of Object.entries(m))t=t.replace(new RegExp(`\\b${a}\\b`,"g"),c);let[s,l]=f(t),[r,i]=g(s.join(" "));return o?[n(n({shell_command:o},l),i)]:[n(n(n({key_code:r.pop()},r.length&&{modifiers:r}),l),i)]};var N=e=>{if(typeof e=="object")return e;let[t,o]=p(e,"$");for(let[a,c]of Object.entries(m))t=t.replace(new RegExp(`\\b${a}\\b`,"g"),c);let[s,l]=f(t),[r,i]=g(s.join(" "));return o?[n(n({shell_command:o},l),i)]:[n(n(n({key_code:r.pop()},r.length&&{modifiers:r}),l),i)]};var K=e=>{if(typeof e=="object")return e;let[t,o]=p(e,"$");for(let[a,c]of Object.entries(m))t=t.replace(new RegExp(`\\b${a}\\b`,"g"),c);let[s,l]=f(t),[r,i]=g(s.join(" "));return o?[n(n({shell_command:o},l),i)]:[n(n(n({key_code:r.pop()},r.length&&{modifiers:r}),l),i)]};var M=e=>{if(typeof e=="object")return e;let[t,o]=p(e,"$");for(let[a,c]of Object.entries(m))t=t.replace(new RegExp(`\\b${a}\\b`,"g"),c);let[s,l]=f(t),[r,i]=g(s.join(" "));return o?[n(n({shell_command:o},l),i)]:[n(n(n({key_code:r.pop()},r.length&&{modifiers:r}),l),i)]};var y=async({app:e,bundleId:t,config:o})=>{let s=[];for(let[l,r]of Object.entries(o)){if(typeof r=="string"&&(r={to:r}),F(l)){let a=await y({app:l.toLowerCase(),bundleId:O(await B(l)),config:r});s.push(...a);continue}if(r.hasOwnProperty("_self")){let a={[l]:r._self};delete r._self;let c=Object.fromEntries(Object.entries(r).map(([C,D])=>[`${l} ${C}`,D])),h=await y({app:e,bundleId:t,config:n(n({},a),c)});s.push(...h);continue}r=A(r,E);let i=n(n({type:"basic",description:t?`${e} ${l}`:l,from:l},r),t&&{conditions:[{type:"frontmost_application_if",bundle_identifiers:[t]}]});u(i,"from",I),u(i,"to_after_key_up",N),u(i,"to_if_alone",K),u(i,"to_if_held_down",M),u(i,"to",S),s.push(i)}return s};var b="karabiner-human-config",v="0.14.0";var k={name:"Neeraj Dalal",email:"admin@nrjdalal.com",url:"https://nrjdalal.com"};import z from"strip-json-comments";var T=`Version: ${b}@${v} Usage: $ ${b} [options] Options: -i, --input Input file path (default: konfig.json) -o, --output Output file path (default: karabiner.json) -v, --version Display version number -h, --help Display help message Author: ${k.name} <${k.email}> (${k.url})`,L=e=>{try{return W(e)}catch(t){throw new Error(`Error parsing arguments: ${t.message}`)}},Z=async()=>{var e;try{let{values:t}=L({options:{input:{type:"string",short:"i",default:"auto"},output:{type:"string",short:"o",default:"auto"},help:{type:"boolean",short:"h"},version:{type:"boolean",short:"v"},logfile:{type:"boolean",short:"l"}}});t.version&&(console.log(`${b}@${v}`),process.exit(0)),t.help&&(console.log(T),process.exit(0));let o={input:t.input==="auto"?d.resolve(process.cwd()+"/konfig.json"):d.resolve(t.input),output:t.output==="auto"?d.resolve(process.cwd()+"/karabiner.json")?d.resolve(process.cwd()+"/karabiner.json"):d.resolve(H.homedir()+"/.config/karabiner/karabiner.json"):d.resolve(t.output)};_.existsSync(o.input)||(console.log(T),console.error(`\x1B[31m Input file doesn't exist: ${o.input} \x1B[0m`),process.exit(1));let s={};try{s=JSON.parse(_.readFileSync(o.output,"utf-8"))}catch(i){console.log(`\x1B[33m Output file doesn't exist: ${o.output} \x1B[0m`)}let l=JSON.parse(z(_.readFileSync(o.input,"utf-8"))),r=x(n({},s),{profiles:[x(n({},(e=s.profiles)==null?void 0:e[0]),{complex_modifications:{rules:(await y({config:l})).map(i=>({manipulators:[i]}))}})]});t.logfile&&(_.writeFileSync(d.resolve(process.cwd()+"/.logfile"),JSON.stringify(r,null,2)+` `),process.exit(0)),_.writeFileSync(d.resolve(o.output),JSON.stringify(r,null,2)+` `),process.exit(0)}catch(t){console.error(` ${t.message} `),process.exit(1)}};Z();