{"version":3,"sources":["jsdelivr-header.js","/npm/@nikku/mons@0.1.1/mons.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;ACJA,MAAM,SAAE,UAAa,QAAQ,kBAEvB,aACJ,aAAY,WACZ,YACE,QAAQ,OAEN,QAAE,SAAY,QAAQ,OAG1B,KAAM,UACJ,QAAQ,QAEN,MAAQ,QAAQ,KAAK,SAAS,OAAS,QAAQ,KAAK,SAAS,UAAY,QAAQ,KAAK,SAAS,WAE/F,QAAU,QAAQ,KAAK,SAAS,aAEhC,QAAU,QAAQ,KAAK,SAAS,cAAgB,QAAQ,KAAK,SAAS,MAEtE,KAAO,QAAQ,KAAK,SAAS,UAE/B,OACF,QAAQ,IAAI,sOAcZ,QAAQ,KAAK,IAGX,UACF,QAAQ,IAAI,QAAQ,kBAAkB,SACtC,QAAQ,KAAK,IAOf,MAAM,QAAU,aAOhB,SAAS,aAEP,MAAM,EAAY,CAAE,QAAQ,MAAO,WAEnC,IAAK,MAAM,KAAY,EAAW,CAChC,MAAM,EAAa,SAAS,EAAU,WAMtC,GAJI,SACF,QAAQ,MAAM,2BAA2B,KAGtC,WAAW,GAIhB,IACE,MAAM,EAAS,KAAK,MAAM,aAAa,EAAY,SAMnD,OAJI,SACF,QAAQ,MAAM,mBAAmB,KAG5B,CACT,CAAE,MAAO,GACP,QAAQ,MAAM,iCAAiC,MAAe,EAAI,UACpE,CACF,CACF,CAEA,SAAS,KAAK,GAER,SACF,QAAQ,MAAM,KAAM,GAGtB,MAAM,EAAS,SAAS,GAAK,SAAS,QAMtC,OAJI,SACF,QAAQ,MAAM,KAAM,GAGf,CACT,CAEA,SAAS,uBAGP,OAFe,KAAK,kBAEN,MAAM,MAAM,QAAO,GAAK,EAAE,SAAS,gBAAe,KAAI,GAAK,EAAE,MAAM,MAAM,IACzF,CAEA,SAAS,oBAGP,OAFe,KAAK,yBAEN,MAAM,MAAM,MAAM,GAAI,GAAG,KAAI,GAAK,EAAE,MAAM,QAAQ,OAAO,GAAG,IAC5E,CAEA,SAAS,aAAa,EAAS,GAE7B,IAAK,IAAI,EAAI,EAAQ,OAAQ,EAAI,EAAG,IAAK,CAEvC,MAAM,EAAS,EAAQ,EAAI,GAI3B,GAFgB,EAAO,OAAM,GAAQ,EAAS,SAAS,EAAK,WAG1D,OAAO,CAEX,CAEA,MAAM,IAAI,MAAM,4BAClB,CAEA,SAAS,YAAY,EAAQ,GAiB3B,GAFA,KAAK,UAbY,EAAS,QAAO,GAAK,EAAO,OAAM,GAAK,EAAE,UAAY,MAAI,KAAI,GAAK,YAAY,eAEhF,EAAO,KAAI,GAAK,CAC7B,YAAY,EAAE,UACd,EAAE,QAAU,YAAc,GAC1B,EAAE,MAAQ,WAAW,EAAE,QAAU,cACjC,SACA,EAAE,OAAS,aAAa,EAAE,SAAW,GACrC,EAAE,QAAU,cAAc,EAAE,UAAY,GACxC,EAAE,MAAQ,WAAW,EAAE,QAAU,GACjC,EAAE,MAAQ,WAAW,EAAE,QAAU,MAChC,OAAO,KAAK,OAEqB,QAAQ,OAAQ,MAEhD,EAAO,MAAK,IAAM,EAAE,QAAQ,CAa9B,KAAK,UAXU,EAAO,KAAI,GAAK,CAC7B,YAAY,EAAE,UACd,EAAE,QAAU,YAAc,GAC1B,EAAE,MAAQ,WAAW,EAAE,QAAU,YACjC,SACA,EAAE,OAAS,aAAa,EAAE,SAAW,GACrC,EAAE,QAAU,cAAc,EAAE,UAAY,GACxC,EAAE,MAAQ,WAAW,EAAE,QAAU,GACjC,EAAE,MAAQ,WAAW,EAAE,QAAU,MAChC,OAAO,KAAK,OAES,QAAQ,OAAQ,KAC1C,CACF,CA7GK,UACH,QAAQ,MAAM,qCACd,QAAQ,KAAK,IA6Gf,MAAM,eAAiB,oBAEjB,SAAW,uBAGX,OAAS,MAAQ,QAAQ,GAAK,aAAa,QAAS,UAG1D,YAAY,OAAQ","file":"/npm/@nikku/mons@0.1.1/mons.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@nikku/mons@0.1.1/mons.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","#!/usr/bin/env node\n\nconst { execSync } = require('child_process');\n\nconst {\n  readFileSync,\n  existsSync\n} = require('fs');\n\nconst { homedir } = require('os');\n\nconst {\n  join: joinPath\n} = require('path');\n\nconst reset = process.argv.includes('-o') || process.argv.includes('--off') || process.argv.includes('--reset');\n\nconst verbose = process.argv.includes('--verbose');\n\nconst version = process.argv.includes('--version') || process.argv.includes('-v');\n\nconst help = process.argv.includes('--help');\n\nif (help) {\n  console.log(`\nUsage: mons [-o]\n\nStay sane with your multi screen configuration.\n\nOptions:\n  -o, --off          Switch to default configuration\n      --verbose      Output xrandr commands and results\n\nExamples:\n  mons\n  mons -o\n`);\n\n  process.exit(0);\n}\n\nif (version) {\n  console.log(require('./package.json').version);\n  process.exit(0);\n}\n\n/**\n * Screen configurations, will be matched from last to first with\n * first screen being the default configuration that is used with -o\n */\nconst configs = readConfig();\n\nif (!configs) {\n  console.error('E: no .monsrc configuration found');\n  process.exit(1);\n}\n\nfunction readConfig() {\n\n  const locations = [ process.cwd(), homedir() ];\n\n  for (const location of locations) {\n    const configPath = joinPath(location, '.monsrc');\n\n    if (verbose) {\n      console.debug(`D: checking config file ${configPath}`);\n    }\n\n    if (!existsSync(configPath)) {\n      continue;\n    }\n\n    try {\n      const config = JSON.parse(readFileSync(configPath, 'utf8'));\n\n      if (verbose) {\n        console.debug(`D: using config ${configPath}`);\n      }\n\n      return config;\n    } catch (err) {\n      console.error(`E: could not read config file ${configPath}: ${err.message}`);\n    }\n  }\n}\n\nfunction exec(cmd) {\n\n  if (verbose) {\n    console.debug('X:', cmd);\n  }\n\n  const result = execSync(cmd).toString('utf8');\n\n  if (verbose) {\n    console.debug('Y:', result);\n  }\n\n  return result;\n}\n\nfunction getConnectedMonitors() {\n  const result = exec(`xrandr --query`);\n\n  return result.split(/\\n/).filter(l => l.includes(' connected')).map(l => l.split(/\\s/)[0]);\n}\n\nfunction getActiveMonitors() {\n  const result = exec(`xrandr --listmonitors`);\n\n  return result.split('\\n').slice(1, -1).map(l => l.split(/\\s+/g).slice(-1)[0]);\n}\n\nfunction detectConfig(configs, monitors) {\n\n  for (let i = configs.length; i > 0; i--) {\n\n    const config = configs[i - 1];\n\n    const matches = config.every(part => monitors.includes(part.monitor));\n\n    if (matches) {\n      return config;\n    }\n  }\n\n  throw new Error('no matching configuration');\n}\n\nfunction applyConfig(config, monitors) {\n\n  const switchOf = monitors.filter(m => config.every(c => c.monitor !== m)).map(m => `--output ${m} --off`);\n\n  const enable = config.map(c => [\n    `--output ${c.monitor}`,\n    c.primary ? '--primary' : '',\n    c.scale ? `--scale ${c.scale}` : '--scale 0.5',\n    '--auto',\n    c.leftOf ? `--left-of ${c.leftOf}` : '',\n    c.rightOf ? `--right-of ${c.rightOf}` : '',\n    c.above ? `--above ${c.above}` : '',\n    c.below ? `--below ${c.below}` : ''\n  ]).flat().join(' ');\n\n  exec(`xrandr ${switchOf} ${enable}`.replace(/\\s+/g, ' '));\n\n  if (config.some(c => !c.scale)) {\n\n    const enable = config.map(c => [\n      `--output ${c.monitor}`,\n      c.primary ? '--primary' : '',\n      c.scale ? `--scale ${c.scale}` : '--scale 1',\n      '--auto',\n      c.leftOf ? `--left-of ${c.leftOf}` : '',\n      c.rightOf ? `--right-of ${c.rightOf}` : '',\n      c.above ? `--above ${c.above}` : '',\n      c.below ? `--below ${c.below}` : ''\n    ]).flat().join(' ');\n\n    exec(`xrandr ${enable}`.replace(/\\s+/g, ' '));\n  }\n}\n\nconst activeMonitors = getActiveMonitors();\n\nconst monitors = getConnectedMonitors();\n\n// detect\nconst config = reset ? configs[0] : detectConfig(configs, monitors);\n\n// apply\napplyConfig(config, activeMonitors);\n"]}