{"version":3,"sources":["src/abagnale.js"],"names":[],"mappings":"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","file":"src/abagnale.js","sourcesContent":["// A safe way to slugify values. If the input is null, undefined, or\n// some other error happens downstream, we simply return `unknown`.\nfunction safeSlug(value = 'unknown') {\n  return encodeURIComponent(value)\n  .toLowerCase()\n  .replace(/[!'()*]/g, x => `%${x.charCodeAt(0).toString(16)}`) // RFC 3986 & https://developer.mozilla.org/cs/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\n  .replace(/%20|%2520/g, '-'); // Swap (encoded) spaces for hyphens\n}\n\nclass Abagnale {\n  constructor(options) {\n    this.options = options;\n\n    if (this.options === undefined) {\n      this.options = {};\n    }\n\n    if (this.options.separator === undefined) {\n      this.options.separator = '.';\n    }\n\n    if (this.options.uriSeparator === undefined) {\n      this.options.uriSeparator = '/';\n    }\n\n    this.cache = {};\n  }\n\n  /*\n    Get a unique ID, given an input ID as a base. If it has already been used,\n    then a number (starting at `2`) is appended until an unused ID is found.\n    Returns the first available ID.\n  */\n  getUnique(id) {\n    let number = 2;\n\n    if (this.cache[id] === undefined) {\n      this.cache[id] = true;\n      return id;\n    }\n\n    let name = `${id}-${number}`;\n    while (this.cache[name]) {\n      number++;\n      name = `${id}-${number}`;\n    }\n\n    this.cache[name] = true;\n    return name;\n  }\n\n  /*\n    Get a key for an array element or object member. The key can either be\n    the index, element name, member key value, element title, or element\n    class name depending on what makes the most sense. This can be used to\n    give paths like `api.parts.frob.get-a-frob.httptransaction.httpresponse`,\n    which is nicer than `category.0.0.0.0.0` when just using array indexes.\n    The selected slugified key is returned.\n  */\n  keyForArray(index, refract) {\n    let key;\n\n    switch (refract.element) {\n    case 'boolean': case 'string': case 'number': case 'array':\n    case 'enum': case 'object':\n      // Basic types just default to the index value.\n      key = index;\n      break;\n    default:\n      // Non-basic types default to the element name, e.g. `resource`.\n      key = safeSlug(refract.element);\n    }\n\n    // If this is a member and the key is a string, use the key value.\n    if (refract.content && refract.content.key &&\n        refract.content.key.element === 'string') {\n      key = safeSlug(refract.content.key.content);\n    }\n\n    // If there is a title or a *single* class name, use that instead as it\n    // should contain more specific and relevant information.\n    if (refract.meta) {\n      if (refract.meta.title) {\n        key = safeSlug(refract.meta.title);\n      } else if (refract.meta.classes && refract.meta.classes.length === 1) {\n        key = safeSlug(refract.meta.classes[0]);\n      }\n    }\n\n    return key;\n  }\n\n  /*\n    Get an ID for an element, based on the current path, any existing ID,\n    and any element class name. An existing ID will trump other values and\n    resets the path. Returns the unique ID to use.\n  */\n  idForElement(path, refract) {\n    let newPath = path;\n\n    if (refract.meta) {\n      if (refract.meta.id) {\n        if (typeof refract.meta.id === 'object') {\n          newPath = [refract.meta.id.content];\n        } else {\n          newPath = [refract.meta.id];\n        }\n      } else if (path.length === 0 && refract.meta.classes &&\n                 refract.meta.classes.length === 1) {\n        // This is the first item, and it has a class name, so we use that.\n        newPath = [refract.meta.classes[0]];\n      }\n    }\n\n    let id = newPath.join(this.options.separator);\n\n    if (!id) {\n      id = refract.element;\n    }\n\n    return this.getUnique(id);\n  }\n\n  /*\n    Forge an ID for a single refract structure and any children in-place.\n  */\n  forgeOne(path, refract) {\n    if (!refract) {\n      return refract;\n    }\n\n    if (!refract.meta) {\n      refract.meta = {};\n    }\n\n    refract.meta.id = this.idForElement(path, refract);\n\n    if (!refract.meta.links) {\n      refract.meta.links = [];\n    }\n\n    if (refract.meta.id && refract.meta.id.split) {\n      refract.meta.links.push({\n        element: 'link',\n        content: {\n          relation: 'uri-fragment',\n          href: refract.meta.id.split(this.options.separator)\n                               .map((item) => safeSlug(item))\n                               .join(this.options.uriSeparator),\n        },\n      });\n    }\n\n    // Array like content containing elements?\n    if (refract.content && refract.content.length && refract.content[0].element) {\n      for (let i = 0; i < refract.content.length; i++) {\n        const item = refract.content[i];\n        const key = this.keyForArray(i, item);\n        const newPath = [refract.meta.id, key].join(this.options.separator);\n\n        switch (item.element) {\n        case 'ref':\n          // Skip includes as the included object will have its own\n          // ID already.\n          continue;\n        case 'member':\n          // Probably object members\n          this.forgeOne([`${newPath}-member`], item);\n          this.forgeOne([`${newPath}-key`], item.content.key);\n          this.forgeOne([newPath], item.content.value);\n          break;\n        default:\n          // Probably array or enum items\n          this.forgeOne([newPath], item);\n        }\n      }\n    }\n\n    return refract;\n  }\n\n  /*\n    Forge IDs for an array of refract structures.\n  */\n  forge(structures) {\n    for (let i = 0; i < structures.length; i++) {\n      this.forgeOne([], structures[i]);\n    }\n\n    return structures;\n  }\n}\n\nmodule.exports = {\n  Abagnale,\n  forge(structures, options) {\n    const abagnale = new Abagnale(options);\n    return abagnale.forge(structures);\n  },\n};\n"]}