github.com/jfrog/frogbot@v1.1.1-0.20231221090046-821a26f50338/action/node_modules/@octokit/endpoint/dist-src/util/url-template.js (about)

     1  // Based on https://github.com/bramstein/url-template, licensed under BSD
     2  // TODO: create separate package.
     3  //
     4  // Copyright (c) 2012-2014, Bram Stein
     5  // All rights reserved.
     6  // Redistribution and use in source and binary forms, with or without
     7  // modification, are permitted provided that the following conditions
     8  // are met:
     9  //  1. Redistributions of source code must retain the above copyright
    10  //     notice, this list of conditions and the following disclaimer.
    11  //  2. Redistributions in binary form must reproduce the above copyright
    12  //     notice, this list of conditions and the following disclaimer in the
    13  //     documentation and/or other materials provided with the distribution.
    14  //  3. The name of the author may not be used to endorse or promote products
    15  //     derived from this software without specific prior written permission.
    16  // THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
    17  // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    18  // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
    19  // EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
    20  // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
    21  // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    22  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
    23  // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    24  // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
    25  // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    26  /* istanbul ignore file */
    27  function encodeReserved(str) {
    28      return str
    29          .split(/(%[0-9A-Fa-f]{2})/g)
    30          .map(function (part) {
    31          if (!/%[0-9A-Fa-f]/.test(part)) {
    32              part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");
    33          }
    34          return part;
    35      })
    36          .join("");
    37  }
    38  function encodeUnreserved(str) {
    39      return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
    40          return "%" + c.charCodeAt(0).toString(16).toUpperCase();
    41      });
    42  }
    43  function encodeValue(operator, value, key) {
    44      value =
    45          operator === "+" || operator === "#"
    46              ? encodeReserved(value)
    47              : encodeUnreserved(value);
    48      if (key) {
    49          return encodeUnreserved(key) + "=" + value;
    50      }
    51      else {
    52          return value;
    53      }
    54  }
    55  function isDefined(value) {
    56      return value !== undefined && value !== null;
    57  }
    58  function isKeyOperator(operator) {
    59      return operator === ";" || operator === "&" || operator === "?";
    60  }
    61  function getValues(context, operator, key, modifier) {
    62      var value = context[key], result = [];
    63      if (isDefined(value) && value !== "") {
    64          if (typeof value === "string" ||
    65              typeof value === "number" ||
    66              typeof value === "boolean") {
    67              value = value.toString();
    68              if (modifier && modifier !== "*") {
    69                  value = value.substring(0, parseInt(modifier, 10));
    70              }
    71              result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
    72          }
    73          else {
    74              if (modifier === "*") {
    75                  if (Array.isArray(value)) {
    76                      value.filter(isDefined).forEach(function (value) {
    77                          result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
    78                      });
    79                  }
    80                  else {
    81                      Object.keys(value).forEach(function (k) {
    82                          if (isDefined(value[k])) {
    83                              result.push(encodeValue(operator, value[k], k));
    84                          }
    85                      });
    86                  }
    87              }
    88              else {
    89                  const tmp = [];
    90                  if (Array.isArray(value)) {
    91                      value.filter(isDefined).forEach(function (value) {
    92                          tmp.push(encodeValue(operator, value));
    93                      });
    94                  }
    95                  else {
    96                      Object.keys(value).forEach(function (k) {
    97                          if (isDefined(value[k])) {
    98                              tmp.push(encodeUnreserved(k));
    99                              tmp.push(encodeValue(operator, value[k].toString()));
   100                          }
   101                      });
   102                  }
   103                  if (isKeyOperator(operator)) {
   104                      result.push(encodeUnreserved(key) + "=" + tmp.join(","));
   105                  }
   106                  else if (tmp.length !== 0) {
   107                      result.push(tmp.join(","));
   108                  }
   109              }
   110          }
   111      }
   112      else {
   113          if (operator === ";") {
   114              if (isDefined(value)) {
   115                  result.push(encodeUnreserved(key));
   116              }
   117          }
   118          else if (value === "" && (operator === "&" || operator === "?")) {
   119              result.push(encodeUnreserved(key) + "=");
   120          }
   121          else if (value === "") {
   122              result.push("");
   123          }
   124      }
   125      return result;
   126  }
   127  export function parseUrl(template) {
   128      return {
   129          expand: expand.bind(null, template),
   130      };
   131  }
   132  function expand(template, context) {
   133      var operators = ["+", "#", ".", "/", ";", "?", "&"];
   134      return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) {
   135          if (expression) {
   136              let operator = "";
   137              const values = [];
   138              if (operators.indexOf(expression.charAt(0)) !== -1) {
   139                  operator = expression.charAt(0);
   140                  expression = expression.substr(1);
   141              }
   142              expression.split(/,/g).forEach(function (variable) {
   143                  var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable);
   144                  values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
   145              });
   146              if (operator && operator !== "+") {
   147                  var separator = ",";
   148                  if (operator === "?") {
   149                      separator = "&";
   150                  }
   151                  else if (operator !== "#") {
   152                      separator = operator;
   153                  }
   154                  return (values.length !== 0 ? operator : "") + values.join(separator);
   155              }
   156              else {
   157                  return values.join(",");
   158              }
   159          }
   160          else {
   161              return encodeReserved(literal);
   162          }
   163      });
   164  }