{"version":3,"sources":["jsdelivr-header.js","/npm/mysql-chassis@5.0.0/dist/index.js"],"names":[],"mappings":"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","file":"/npm/mysql-chassis@5.0.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/mysql-chassis@5.0.0/dist/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","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _mysql = require('mysql');\n\nvar _mysql2 = _interopRequireDefault(_mysql);\n\nvar _path = require('path');\n\nvar _path2 = _interopRequireDefault(_path);\n\nvar _fs = require('fs');\n\nvar _fs2 = _interopRequireDefault(_fs);\n\nvar _utils = require('./utils');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar defaultConnectionOptions = {\n  password: '',\n  sqlPath: './sql',\n  retryLimit: Infinity,\n  connectionLimit: null, // If this is set to a numeric value, the connection will be \"pooled\"\n  transforms: {\n    undefined: 'NULL',\n    '': 'NULL',\n    'NOW()': 'NOW()',\n    'CURTIME()': 'CURTIME()'\n  }\n};\n\nvar MySql = function () {\n\n  /****************************************\n    Setup and Initialization\n  *****************************************/\n\n  function MySql(options) {\n    _classCallCheck(this, MySql);\n\n    options = _extends({}, defaultConnectionOptions, options);\n\n    var _options = options,\n        sqlPath = _options.sqlPath,\n        retryLimit = _options.retryLimit,\n        transforms = _options.transforms,\n        connectionOptions = _objectWithoutProperties(_options, ['sqlPath', 'retryLimit', 'transforms']);\n\n    this.connectionTries = 0;\n    this.retryLimit = retryLimit;\n\n    // Events that can be hooked into\n    this.events = {\n      connectionAttempt: null,\n      connectionSuccess: null,\n      connectionError: null,\n      connectionLost: null,\n      connectionTriesLimitReached: null,\n      sqlError: null\n    };\n\n    // Misc Setup\n    this.settings = { sqlPath: sqlPath, transforms: transforms };\n    this.middleware = {\n      onBeforeQuery: [],\n      onResults: []\n    };\n\n    // Connect\n    var isPool = Number.isInteger(connectionOptions.connectionLimit) && connectionOptions.connectionLimit > 0;\n    this.connection = this.connect(connectionOptions, isPool);\n\n    // Finish setting up pooling\n    if (isPool) this.initPool(connectionOptions);\n\n    // Setup Transactions (after connection)\n    this.initTransactions();\n  }\n\n  /**\n   * Events\n   */\n\n  _createClass(MySql, [{\n    key: 'on',\n    value: function on(eventName, cb) {\n      if (typeof eventName !== 'string') throw new Error('You must pass a string value for MySQL Chassis .on() events');\n      if (!this.events.hasOwnProperty(eventName)) throw new Error('MySQL Chassis does not have a db.on(\\'' + eventName + '\\') event. If you\\'re trying to access the underlying connection events from MySQLJS, use db.connection.on instead.');\n      this.events[eventName] = cb;\n    }\n  }, {\n    key: 'emit',\n    value: function emit(eventName) {\n      var _events;\n\n      if (typeof eventName !== 'string') throw new Error('You must pass a string value for MySQL Chassis .on() events');\n      if (!this.events.hasOwnProperty(eventName)) throw new Error('MySQL Chassis does not have a db.on(\\'' + eventName + '\\') event. If you\\'re trying to access the underlying connection events from MySQLJS, use db.connection.on instead.');\n      if (typeof this.events[eventName] !== 'function') return;\n\n      for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n\n      (_events = this.events)[eventName].apply(_events, args);\n    }\n\n    /**\n     * MySQL Transactions\n     */\n\n  }, {\n    key: 'initTransactions',\n    value: function initTransactions() {\n      var _this = this;\n\n      this.transactions = {};\n      this.transactions.begin = (0, _utils.promisify)(function (options, cb) {\n        return _this.connection.beginTransaction(options, cb);\n      });\n      this.transactions.commit = (0, _utils.promisify)(function (options, cb) {\n        return _this.connection.commit(options, cb);\n      });\n      this.transactions.rollback = (0, _utils.promisify)(function (options, cb) {\n        return _this.connection.rollback(options, cb);\n      });\n    }\n\n    /**\n     * Connect to the database using the underlying MySQLJS lib\n     * This method attempts to reconnect when the connection is lost\n     */\n\n  }, {\n    key: 'connect',\n    value: function connect(connectionOptions) {\n      var _this2 = this;\n\n      var pool = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      this.connectionTries++;\n      if (this.connectionTries > this.retryLimit) {\n        this.emit('connectionTriesLimitReached', this.connectionTries - 1);\n        return;\n      }\n      this.emit('connectionAttempt', this.connectionTries);\n      if (connectionOptions._connection) return connectionOptions._connection;\n\n      // Connection\n      var connection = pool ? _mysql2.default.createPool(connectionOptions) : _mysql2.default.createConnection(connectionOptions);\n\n      // Test initial connection\n      connection[pool ? 'getConnection' : 'connect'](function (err) {\n        // This error occurs when we cannot make a connection\n        if (err) {\n          _this2.emit('connectionError', err);\n          setTimeout(function () {\n            _this2.connect(connectionOptions);\n          }, 1000);\n        } else {\n          _this2.emit('connectionSuccess', _this2.connectionTries);\n          _this2.connectionTries = 0;\n        }\n      });\n\n      // This event fires when an established connection is lost\n      connection.on('error', function (err) {\n        _this2.emit('connectionLost', err);\n        if (err.code === 'PROTOCOL_CONNECTION_LOST') {\n          _this2.connect(connectionOptions);\n        } else {\n          throw err;\n        }\n      });\n\n      return connection;\n    }\n\n    /**\n     *  Initialize Pooling Methods\n     */\n\n  }, {\n    key: 'initPool',\n    value: function initPool(connectionOptions) {\n      var _this3 = this;\n\n      this.getConnection = function (cb) {\n        return _this3.connection.getConnection(function (err, connection) {\n          if (err) return cb(err);\n          var chassisified = connection && new MySql(_extends({}, connectionOptions, {\n            _connection: connection\n          }));\n\n          if (!chassisified) return cb(new Error('Could not return new connection'));\n\n          return cb(null, chassisified);\n        });\n      };\n\n      if (this.connection.release) {\n        // has no callback, no need to be promisified\n        this.release = this.connection.release.bind(this.connection);\n      }\n    }\n\n    /****************************************\n      SQL\n    *****************************************/\n\n    /**\n     * Run a SELECT statement\n     */\n\n  }, {\n    key: 'select',\n    value: function select(sql) {\n      var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      return this.query(sql, values).then(function (results) {\n        return results.rows;\n      });\n    }\n\n    /**\n     * Run a SELECT statement from a file\n     */\n\n  }, {\n    key: 'selectFile',\n    value: function selectFile(filename) {\n      var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      return this.queryFile(filename, values).then(function (results) {\n        return results.rows;\n      });\n    }\n\n    /**\n     * Build and run a simple SELECT statement from arguments\n     */\n\n  }, {\n    key: 'selectWhere',\n    value: function selectWhere(fields, table, where) {\n      where = this.sqlWhere(where);\n      if (typeof table !== 'string') throw new Error('selectWhere table argument must be a string');\n      if (typeof fields === 'string') fields = fields.split(',');\n      if (Array.isArray(fields)) fields = fields.map(function (field) {\n        return '`' + field.trim() + '`';\n      }).join(', ');\n      return this.select('SELECT ' + fields + ' FROM `' + table + '` ' + where);\n    }\n\n    /**\n     * Build and run an INSERT statement\n     */\n\n  }, {\n    key: 'insert',\n    value: function insert(table) {\n      var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      var sql = 'INSERT INTO `' + table + '` SET ' + this.createInsertValues(values);\n      return this.query(sql);\n    }\n\n    /**\n     * Build and run an UPDATE statement\n     */\n\n  }, {\n    key: 'update',\n    value: function update(table, values, where) {\n      var sql = 'UPDATE `' + table + '` SET ' + this.createInsertValues(values) + ' ' + this.sqlWhere(where);\n      return this.query(sql);\n    }\n\n    /**\n     * Try running an INSERT statement. If the record already exists, run an update statement.\n     * This takes advantage of MySQL's `ON DUPLICATE KEY UPDATE` feature.\n     */\n\n  }, {\n    key: 'insertUpdate',\n    value: function insertUpdate(table) {\n      var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      values = this.createInsertValues(values);\n      var sql = 'INSERT INTO `' + table + '` SET ' + values + ' ON DUPLICATE KEY UPDATE ' + values;\n      return this.query(sql);\n    }\n\n    /**\n     * Try running an INSERT statement. If the record already exists, ingore the request without error.\n     * This takes advantage of MySQL's `INSERT IGNORE` feature.\n     */\n\n  }, {\n    key: 'insertIgnore',\n    value: function insertIgnore(table, values) {\n      var sql = 'INSERT IGNORE INTO `' + table + '` SET ' + this.createInsertValues(values);\n      return this.query(sql);\n    }\n\n    /**\n     * Insert multiple values in one statement. This method creates an sql statement similar to:\n     *  INSERT INTO table\n     *    (a,b,c)\n     *  VALUES\n     *    (1,2,3),\n     *    (4,5,6),\n     *    (7,8,9);\n     */\n\n  }, {\n    key: 'insertMultiple',\n    value: function insertMultiple(table, objects, cols) {\n      var _this4 = this;\n\n      // If only two arguments are passed, the second argument becomes objects\n      // and we will derive `cols` from the first object\n      if (cols === undefined) cols = Object.keys(objects[0]);\n\n      var values = objects.map(function (obj) {\n        var uniformObj = [];\n        obj = _this4.transformValues(obj);\n        cols.forEach(function (col) {\n          uniformObj.push(obj[col] || 'null');\n        });\n        return '(' + uniformObj.join(',') + ')';\n      });\n\n      var sql = 'INSERT INTO `' + table + '` (`' + cols.join('`,`') + '`) VALUES ' + values.join(',');\n      return this.query(sql);\n    }\n\n    /**\n     * Build and run a DELETE statement\n     */\n\n  }, {\n    key: 'delete',\n    value: function _delete(table, where) {\n      var sql = 'DELETE FROM `' + table + '` ' + this.sqlWhere(where);\n      return this.query(sql);\n    }\n\n    /**\n     * Prepare and run a query with bound values. Return a promise\n     */\n\n  }, {\n    key: 'query',\n    value: function query(originalSql) {\n      var _this5 = this;\n\n      var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      return new Promise(function (resolve, reject) {\n\n        // Apply Middleware\n        var finalSql = _this5.applyMiddlewareOnBeforeQuery(originalSql, values);\n\n        // Bind dynamic values to SQL\n        finalSql = _this5.queryBindValues(finalSql, values).trim();\n\n        _this5.connection.query({\n          sql: finalSql,\n          typeCast: function typeCast(field, next) {\n            return field.type === 'JSON' ? JSON.parse(field.string()) : next();\n          }\n        }, function (err, results, fields) {\n          if (err) {\n            // assign `sql` and preserve `message` prop\n            err.sql = finalSql;\n            _this5.emit('sqlError', err);\n            reject(err);\n          } else {\n\n            // Apply Middleware\n            results = _this5.applyMiddlewareOnResults(originalSql, results);\n\n            // When calling `connection.query`, the results returned are either \"rows\"\n            // in the case of a SELECT statement, or meta results in the case of non-SELECT\n\n            // If sql is SELECT\n            if (_this5.isSelect(finalSql)) {\n\n              // Results is the rows\n              resolve({ rows: results, fields: fields, sql: finalSql });\n            } else {\n              resolve(_extends({}, results, { sql: finalSql }));\n            }\n          }\n        });\n      });\n    }\n  }, {\n    key: 'queryFile',\n    value: function queryFile(filename) {\n      var _this6 = this;\n\n      var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      return this.getFile(filename).then(function (sql) {\n        return _this6.query(sql, values);\n      });\n    }\n\n    /****************************************\n      SQL Helper Functions\n    *****************************************/\n\n    /**\n     * Get File\n     */\n\n  }, {\n    key: 'getFile',\n    value: function getFile(filename) {\n\n      // Get full path\n      var filePath = _path2.default.resolve(_path2.default.join(this.settings.sqlPath, filename + (_path2.default.extname(filename) === '.sql' ? '' : '.sql')));\n\n      return new Promise(function (resolve, reject) {\n        _fs2.default.readFile(filePath, 'utf8', function (err, sql) {\n          if (err) {\n            reject('Cannot find: ' + err.path);\n          } else {\n            resolve(sql.trim());\n          }\n        });\n      });\n    }\n\n    /**\n     * Turns 'foo', into\n     *       '\\'foo\\''\n     */\n\n  }, {\n    key: 'escape',\n    value: function escape(content) {\n      return _mysql2.default.escape(content);\n    }\n\n    /**\n     * Turns `SELECT * FROM user WHERE user_id = :user_id`, into\n     *       `SELECT * FROM user WHERE user_id = 1`\n     */\n\n  }, {\n    key: 'queryBindValues',\n    value: function queryBindValues(query, values) {\n      var _this7 = this;\n\n      if (!values) return query;\n\n      return query.replace(/\\:(\\w+)/gm, function (txt, key) {\n        return values.hasOwnProperty(key) ? _this7.escape(values[key]) : txt;\n      });\n    }\n\n    /**\n     * Turns {user_id: 1, age: null}, into\n     *       \"WHERE user_id = 1 AND age IS NULL\"\n     */\n\n  }, {\n    key: 'sqlWhere',\n    value: function sqlWhere(where) {\n      if (!where) return '';\n      if (typeof where === 'string') return where;\n\n      var whereArray = [];\n\n      for (var key in where) {\n        var value = where[key];\n        if (value === null) {\n          whereArray.push('`' + key + '` IS NULL');\n        } else {\n          whereArray.push('`' + key + '` = ' + this.escape(value));\n        }\n      }\n\n      return 'WHERE ' + whereArray.join(' AND ');\n    }\n\n    /**\n     * Turns {first_name: 'Brad', last_name: 'Westfall'}, into\n     *       `first_name` = 'Brad', `last_name` = 'Westfall'\n     */\n\n  }, {\n    key: 'createInsertValues',\n    value: function createInsertValues(values) {\n      var valuesArray = [];\n      var transformedValues = this.transformValues(values);\n\n      for (var key in transformedValues) {\n        var value = transformedValues[key];\n        valuesArray.push('`' + key + '` = ' + value);\n      }\n\n      return valuesArray.join();\n    }\n\n    /**\n     * If the argument values match the keys of the this.transforms\n     * object, then use the transforms value instead of the supplied value\n     */\n\n  }, {\n    key: 'transformValues',\n    value: function transformValues(values) {\n      var newObj = {};\n\n      for (var key in values) {\n        var rawValue = values[key];\n        var transform = this.settings.transforms[rawValue];\n        var value = this.settings.transforms.hasOwnProperty(rawValue) ? typeof transform === 'function' ? transform(rawValue, values) : transform : this.escape(rawValue);\n\n        newObj[key] = value;\n      }\n\n      return newObj;\n    }\n  }, {\n    key: 'isSelect',\n    value: function isSelect(sql) {\n      return sql.trim().toUpperCase().match(/^SELECT/);\n    }\n\n    /****************************************\n      Middleware\n    *****************************************/\n\n  }, {\n    key: 'onResults',\n    value: function onResults(middleware) {\n      if (typeof middleware !== 'function') return;\n      this.middleware.onResults.push(middleware);\n    }\n  }, {\n    key: 'onBeforeQuery',\n    value: function onBeforeQuery(middleware) {\n      if (typeof middleware !== 'function') return;\n      this.middleware.onBeforeQuery.push(middleware);\n    }\n  }, {\n    key: 'applyMiddlewareOnResults',\n    value: function applyMiddlewareOnResults(sql, results) {\n      this.middleware.onResults.forEach(function (middleware) {\n        results = middleware(sql, results);\n      });\n      return results;\n    }\n  }, {\n    key: 'applyMiddlewareOnBeforeQuery',\n    value: function applyMiddlewareOnBeforeQuery(sql, values) {\n      this.middleware.onBeforeQuery.forEach(function (middleware) {\n        sql = middleware(sql, values);\n      });\n      return sql;\n    }\n  }]);\n\n  return MySql;\n}();\n\nexports.default = MySql;"]}