0.1.4Updated 6 months ago
import meta from "@infinity-beyond/deno.json" with { type: "json" };

const Default = new Headers({
  'X-Powered-By': `Infinity-Beyond (${meta.version})`
});

type HeaderLike = Headers | Record<string, string | undefined>;

/**
 * Returns a new Headers instance which combines all header-like entries into one
 * 
 * *Does not mutate any of the input values*. To mutate, us `apply` instead.
 * 
 * @param header_entries All headers to be combined
 * @returns 
 */
const concat = (...header_entries: (HeaderLike | undefined)[]) => {
  const initial = new Headers();

  for(const header of header_entries) {
    const entries = (header instanceof Headers) ? header.entries() : Object.entries<string | undefined>(header || {});

    for(const [key, value] of entries) {
      if(value) initial.set(key, value);
    }
  }

  return initial;
};

/**
 * Combines all header-like entries into the first passed Headers entry.
 * 
 * ***MUTATES** the first input value*. To avoid mutation, us `concat` instead.
 * 
 * @param initial The initial Headers entry
 * @param header_entries All other headers to be combined into the initial Headers entry
 * @returns 
 */
const apply = (initial: Headers, ...header_entries: (HeaderLike)[]) => {
  for(const header of header_entries) {
    const entries = (header instanceof Headers) ? header.entries() : Object.entries<string | undefined>(header);

    for(const [key, value] of entries) {
      if(value) initial.append(key, value);
    }
  }

  return initial;
}

const InfinityHeaders = {
  Default,
  concat,
  apply,
}

export default InfinityHeaders;