text: "use strict";
  var __read = (this && this.__read) || function (o, n) {
      var m = typeof Symbol === "function" && o[Symbol.iterator];
      if (!m) return o;
      var i = m.call(o), r, ar = [], e;
      try {
          while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
      }
      catch (error) { e = { error: error }; }
      finally {
          try {
              if (r && !r.done && (m = i["return"])) m.call(i);
          }
          finally { if (e) throw e.error; }
      }
      return ar;
  };
  var __values = (this && this.__values) || function (o) {
      var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
      if (m) return m.call(o);
      return {
          next: function () {
              if (o && i >= o.length) o = void 0;
              return { value: o && o[i++], done: !o };
          }
      };
  };
  Object.defineProperty(exports, "__esModule", { value: true });
  var is_1 = require("@sentry/utils/is");
  var object_1 = require("@sentry/utils/object");
  var error_1 = require("./error");
  /** Regular expression used to parse a Dsn. */
  var DSN_REGEX = /^(?:(\w+):)\/\/(?:(\w+)(?::(\w+))?@)([\w\.-]+)(?::(\d+))?\/(.+)/;
  /** The Sentry Dsn, identifying a Sentry instance and project. */
  var Dsn = /** @class */ (function () {
      /** Creates a new Dsn component */
      function Dsn(from) {
          if (typeof from === 'string') {
              this.fromString(from);
          }
          else {
              this.fromComponents(from);
          }
          this.validate();
      }
      /**
       * Renders the string representation of this Dsn.
       *
       * By default, this will render the public representation without the password
       * component. To get the deprecated private representation, set `withPassword`
       * to true.
       *
       * @param withPassword When set to true, the password will be included.
       */
      Dsn.prototype.toString = function (withPassword) {
          if (withPassword === void 0) { withPassword = false; }
          // tslint:disable-next-line:no-this-assignment
          var _a = this, host = _a.host, path = _a.path, pass = _a.pass, port = _a.port, projectId = _a.projectId, protocol = _a.protocol, user = _a.user;
          return (protocol + "://" + user + (withPassword && pass ? ":" + pass : '') +
              ("@" + host + (port ? ":" + port : '') + "/" + (path ? path + "/" : path) + projectId));
      };
      /** Parses a string into this Dsn. */
      Dsn.prototype.fromString = function (str) {
          var match = DSN_REGEX.exec(str);
          if (!match) {
              throw new error_1.SentryError('Invalid Dsn');
          }
          var _a = __read(match.slice(1), 6), protocol = _a[0], user = _a[1], _b = _a[2], pass = _b === void 0 ? '' : _b, host = _a[3], _c = _a[4], port = _c === void 0 ? '' : _c, lastPath = _a[5];
          var path = '';
          var projectId = lastPath;
          var split = projectId.split('/');
          if (split.length > 1) {
              path = split.slice(0, -1).join('/');
              projectId = split.pop();
          }
          object_1.assign(this, { host: host, pass: pass, path: path, projectId: projectId, port: port, protocol: protocol, user: user });
      };
      /** Maps Dsn components into this instance. */
      Dsn.prototype.fromComponents = function (components) {
          this.protocol = components.protocol;
          this.user = components.user;
          this.pass = components.pass || '';
          this.host = components.host;
          this.port = components.port || '';
          this.path = components.path || '';
          this.projectId = components.projectId;
      };
      /** Validates this Dsn and throws on error. */
      Dsn.prototype.validate = function () {
          var e_1, _a;
          try {
              for (var _b = __values(['protocol', 'user', 'host', 'projectId']), _c = _b.next(); !_c.done; _c = _b.next()) {
                  var component = _c.value;
                  if (!this[component]) {
                      throw new error_1.SentryError("Invalid Dsn: Missing " + component);
                  }
              }
          }
          catch (e_1_1) { e_1 = { error: e_1_1 }; }
          finally {
              try {
                  if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
              }
              finally { if (e_1) throw e_1.error; }
          }
          if (this.protocol !== 'http' && this.protocol !== 'https') {
              throw new error_1.SentryError("Invalid Dsn: Unsupported protocol \"" + this.protocol + "\"");
          }
          if (this.port && is_1.isNaN(parseInt(this.port, 10))) {
              throw new error_1.SentryError("Invalid Dsn: Invalid port number \"" + this.port + "\"");
          }
      };
      return Dsn;
  }());
  exports.Dsn = Dsn;
  //# sourceMappingURL=dsn.js.map