{"version":3,"sources":["jsdelivr-header.js","/npm/planfix-client@1.0.4/src/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,MAAM,EAAI,QAAQ,UACZ,MAAQ,QAAQ,QAAR,CAAiB,eACzB,QAAU,QAAQ,YAClB,QAAU,QAAQ,UAAU,QAAQ,YACpC,OAAS,QAAQ,aAAa,QAAQ,WACtC,aAAe,QAAQ,gBACvB,OAAS,QAAQ,UACjB,IAAM,QAAQ,OACd,YAAc,QAAQ,iBAE5B,IAAI,SAAW,8BAEf,MAAM,QAAU,CAEd,aAEA,cACA,iBACA,cACA,kBAEA,mBACA,sBACA,oBACA,mBACA,uBAEA,WACA,cACA,wBACA,WACA,gBACA,eACA,cACA,cACA,wBACA,oBACA,iCACA,qBACA,qBAEA,wBACA,0BAEA,aACA,gBACA,aACA,iBACA,yBACA,6BACA,gBAEA,wBACA,mBACA,sBACA,uBACA,mBACA,8BAEA,gBACA,mBACA,gBACA,oBACA,qBAEA,WACA,cACA,WACA,eACA,6BACA,oBACA,oBAEA,cACA,iBACA,2BACA,cACA,kBACA,8BACA,yBACA,4BACA,wBACA,uBACA,iBAEA,cACA,gBACA,WACA,yBACA,sBACA,sBACA,wBACA,kBACA,cAEA,wBACA,mBACA,wBACA,sBACA,qBACA,0BACA,qBACA,yBAyDF,SAAS,KAAK,EAAY,EAAQ,GAChC,OAAO,IAAI,EAAa,gBAAgB,GAAU,EACpD,CAEA,SAAS,gBAAgB,GACvB,IAAI,EAAS,GACb,GAAmB,iBAAR,EAET,OADA,GAAU,EACH,EAET,MAAM,EAAO,OAAO,KAAK,GAkBzB,OAjBA,EAAK,OAEL,EAAK,SAAQ,SAAU,GACrB,QAAQ,GACN,KAAK,MAAM,QAAQ,EAAI,IACrB,GAAU,EAAI,GAAK,IAAI,iBAAiB,KAAK,IAC7C,MAEF,IAAyB,iBAAb,EAAI,GACd,GAAU,gBAAgB,EAAI,IAC9B,MAEF,QACE,GAAU,EAAI,GAEpB,IAEO,CACT,CAnFA,OAAO,QAAU,SAAyB,GACxC,OAAO,EAAK,WAAY,gCACxB,OAAO,EAAK,OAAQ,4BACpB,OAAO,EAAK,QAAS,6BAErB,SAAW,EAAK,KAAO,SACvB,IAAI,EAAM,KAEV,MAAM,EAAS,CAAC,EA2ChB,OA1CA,QAAQ,SAAQ,SAAU,GACxB,EAAE,IAAI,EAAQ,EAGhB,SAAsB,GACpB,OAAO,SAAmB,GACxB,EAAS,EAAE,OAAO,CAAE,QAAS,EAAK,SAAW,GAE7C,MAAM,EAAgB,EAAE,OAAO,CAC7B,IAAK,CAAE,OAAQ,IACd,GAEC,IACF,EAAc,IAAM,EACpB,EAAO,IAAM,GAGf,EAAc,UAAY,KAAK,EAAY,EAAQ,EAAK,YAExD,MAAM,EAAa,aAAa,UAAW,GAG3C,OAFA,MAAM,cAAe,GAEd,QAAQ,CACb,IAAK,SACL,KAAM,EACN,KAAM,CACJ,KAAM,EAAK,OACX,SAAU,EAAK,OAAS,OAEzB,MAAK,SAAU,GAEhB,OADA,MAAM,eAAgB,EAAI,MACnB,OAAO,iBAAiB,EAAI,KAAM,CAAE,MAAM,EAAM,cAAc,EAAO,eAAe,GAC7F,IAAG,MAAK,SAAU,GAKhB,OAJI,EAAI,MACN,EAAM,EAAI,KAGL,CACT,IAAG,KAAK,YACV,CACF,CAvC4B,CAAa,GACzC,IAwCO,CACT","file":"/npm/planfix-client@1.0.4/src/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.19.2.\n * Original file: /npm/planfix-client@1.0.4/src/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","const _ = require('lodash')\nconst debug = require('debug')('planfix-api')\nconst Promise = require('bluebird')\nconst request = Promise.promisify(require('request'))\nconst xml2js = Promise.promisifyAll(require('xml2js'))\nconst js2xmlparser = require('js2xmlparser')\nconst assert = require('assert')\nconst md5 = require('md5')\nconst checkErrors = require('./checkErrors')\n\nlet BASE_URL = 'https://api.planfix.ru/xml/'\n\nconst methods = [\n  //auth\n  'auth.login',\n  //project\n  'project.add',\n  'project.update',\n  'project.get',\n  'project.getList',\n  //projectGroup\n  'projectGroup.add',\n  'projectGroup.update',\n  'projectGroup.move',\n  'projectGroup.get',\n  'projectGroup.getList',\n  //tasks\n  'task.add',\n  'task.update',\n  'task.updateCustomData',\n  'task.get',\n  'task.getMulti',\n  'task.getList',\n  'task.accept',\n  'task.reject',\n  'task.changeExpectDate',\n  'task.changeStatus',\n  'task.getPossibleStatusToChange',\n  'task.changeWorkers',\n  'task.getFilterList',\n  //taskStatus\n  'taskStatus.getSetList',\n  'taskStatus.getListOfSet',\n  //actions\n  'action.add',\n  'action.update',\n  'action.get',\n  'action.getList',\n  'action.getListByPeriod',\n  'action.getListWithAnalitic',\n  'action.delete',\n  //analytics\n  'analitic.getGroupList',\n  'analitic.getList',\n  'analitic.getOptions',\n  'analitic.getHandbook',\n  'analitic.getData',\n  'analitic.getDataByCondition',\n  //userGroup\n  'userGroup.add',\n  'userGroup.update',\n  'userGroup.get',\n  'userGroup.getList',\n  'userGroup.getHeads',\n  //user\n  'user.add',\n  'user.update',\n  'user.get',\n  'user.getList',\n  'user.updateGroupMembership',\n  'user.changeStatus',\n  'user.actionsAdded',\n  //contacts\n  'contact.add',\n  'contact.update',\n  'contact.updateCustomData',\n  'contact.get',\n  'contact.getList',\n  'contact.managePlanfixAccess',\n  'contact.updateUserInfo',\n  'contact.updateContractors',\n  'contact.getPhoneTypes',\n  'contact.getGroupList',\n  'contact.delete',\n  //file\n  'file.upload',\n  'file.download',\n  'file.get',\n  'file.getListForProject',\n  'file.getListForTask',\n  'file.getListForUser',\n  'file.getListForClient',\n  'file.getHistory',\n  'file.delete',\n  //handbook\n  'handbook.getGroupList',\n  'handbook.getList',\n  'handbook.getStructure',\n  'handbook.getRecords',\n  'handbook.getRecord',\n  'handbook.getRecordMulti',\n  'handbook.addRecord',\n  'handbook.updateRecord',\n]\n\nmodule.exports = function createApiClient(opts) {\n  assert(opts.privateKey, 'privateKey param is required')\n  assert(opts.apiKey, 'apiKey param is required')\n  assert(opts.account, 'account param is required')\n\n  BASE_URL = opts.url || BASE_URL\n  let sid = null\n\n  const client = {}\n  methods.forEach(function (methodName) {\n    _.set(client, methodName, createMethod(methodName))\n  })\n\n  function createMethod(methodName) {\n    return function apiMethod(params) {\n      params = _.extend({ account: opts.account }, params)\n\n      const requestObject = _.extend({\n        '@': { method: methodName },\n      }, params)\n\n      if (sid) {\n        requestObject.sid = sid\n        params.sid = sid\n      }\n\n      requestObject.signature = sign(methodName, params, opts.privateKey)\n\n      const xmlRequest = js2xmlparser('request', requestObject)\n      debug('xml request', xmlRequest)\n\n      return request({\n        url: BASE_URL,\n        body: xmlRequest,\n        auth: {\n          user: opts.apiKey,\n          password: opts.token || 'x',\n        },\n      }).then(function (res) {\n        debug('xml response', res.body)\n        return xml2js.parseStringAsync(res.body, { trim: true, explicitRoot: false, explicitArray: false })\n      }).then(function (res) {\n        if (res.sid) {\n          sid = res.sid\n        }\n\n        return res\n      }).then(checkErrors)\n    }\n  }\n\n  return client\n}\n\nfunction sign(methodName, params, key) {\n  return md5(methodName + implodeElements(params) + key)\n}\n\nfunction implodeElements(obj) {\n  let result = ''\n  if (typeof obj === 'string') {\n    result += obj\n    return result\n  }\n  const keys = Object.keys(obj)\n  keys.sort()\n\n  keys.forEach(function (key) {\n    switch (true) {\n      case Array.isArray(obj[key]):\n        result += obj[key].map(implodeElements).join('')\n        break\n\n      case typeof obj[key] === 'object':\n        result += implodeElements(obj[key])\n        break\n\n      default:\n        result += obj[key]\n    }\n  })\n\n  return result\n}\n"]}