{"version":3,"file":"index.mjs","sources":["../dist/index.mjs"],"sourcesContent":["// ../cross-env-config/dist/index.mjs\nvar CrossEnvConfig = class {\n  /**\n   * Get a config value from either the environment or any registry overrides\n   * @param prop\n   */\n  static get(prop) {\n    return this.safeEnvLookup(prop);\n  }\n  /**\n   * Set a value explicitly\n   *\n   * @param key\n   * @param value\n   */\n  static set(key, value) {\n    return this._overrides.set(key, value);\n  }\n  /**\n   * Alias a key to another key if helpful. This is useful if you have different naming\n   * constructs for different environments.\n   *\n   * @param from\n   * @param to\n   */\n  static alias(from, to) {\n    return this._aliases.set(from, to);\n  }\n  /**\n   * Helpful if you've decided to store settings in another object and want to\n   * make that available here. For example in client-side implementations you may reserve\n   * a window.FLATFILE_CONFIG object to store settings.\n   *\n   * @param obj\n   */\n  static attachConfigRegistry(obj) {\n    this._registry = obj;\n  }\n  /**\n   * Use this to provide an override getter for config values. This is useful\n   * if you need to dynamically look up values. Overrides will still take precedence.\n   *\n   * @param cb\n   */\n  static attachConfigFactory(cb) {\n    this._factory = cb;\n  }\n  static reset() {\n    this._overrides = /* @__PURE__ */ new Map();\n    this._registry = void 0;\n    this._factory = void 0;\n  }\n  /**\n   * Internal function for traversing the possible environment sources for a value\n   *\n   * @param prop\n   * @private\n   */\n  static safeEnvLookup(prop) {\n    let values = [];\n    if (this._overrides.get(prop)) {\n      values.push(this._overrides.get(prop));\n    }\n    if (typeof this._registry === \"object\") {\n      values.push(this._registry[prop]);\n    }\n    if (typeof this._factory === \"function\") {\n      values.push(this._factory(prop));\n    }\n    if (typeof process === \"object\" && typeof process.env === \"object\") {\n      values.push(process.env[prop]);\n    }\n    values.push(...this.checkForBrowserVariables(prop));\n    const foundValue = values.find((v) => v !== void 0);\n    if (foundValue !== void 0) {\n      return foundValue;\n    }\n    const alias = this._aliases.get(prop);\n    if (alias) {\n      return this.safeEnvLookup(alias);\n    }\n    return void 0;\n  }\n  /**\n   * Internal function for checking for stored variables in a browser-like environment\n   *\n   * @param prop\n   * @private\n   */\n  static checkForBrowserVariables(prop) {\n    let values = [];\n    if (typeof window === \"object\") {\n      const windowValue = window[`CROSSENV_${prop}`];\n      if (windowValue !== void 0) {\n        values.push(windowValue);\n      }\n      if (typeof sessionStorage === \"object\") {\n        const storedValue = sessionStorage.getItem(`CROSSENV_${prop}`);\n        if (storedValue !== null) {\n          values.push(storedValue);\n        }\n      }\n    }\n    return values;\n  }\n};\nCrossEnvConfig._overrides = /* @__PURE__ */ new Map();\nCrossEnvConfig._aliases = /* @__PURE__ */ new Map();\n\n// src/events/authenticated.client.ts\nimport axios from \"axios\";\n\n// src/utils/helpers.ts\nvar ensureSingleTrailingSlash = (url) => {\n  while (url.endsWith(\"/\")) {\n    url = url.slice(0, -1);\n  }\n  return url + \"/\";\n};\n\n// src/events/authenticated.client.ts\nvar AuthenticatedClient = class {\n  constructor(accessToken, apiUrl) {\n    const FLATFILE_API_URL = CrossEnvConfig.get(\"AGENT_INTERNAL_URL\") || \"http://localhost:3000\";\n    const bearerToken = CrossEnvConfig.get(\"FLATFILE_BEARER_TOKEN\");\n    this._accessToken = accessToken || bearerToken || \"...\";\n    this._apiUrl = apiUrl || FLATFILE_API_URL ? ensureSingleTrailingSlash(apiUrl || FLATFILE_API_URL) : void 0;\n  }\n  async fetch(url, options) {\n    const headers = {\n      Authorization: `Bearer ${this._accessToken}`,\n      \"x-disable-hooks\": \"true\"\n    };\n    const axiosInstance = axios.create({\n      headers,\n      validateStatus: (status) => {\n        return status >= 200 && status <= 399;\n      }\n    });\n    const fetchUrl = this._apiUrl + url;\n    const config = {\n      url: fetchUrl,\n      method: \"GET\",\n      ...options\n    };\n    try {\n      const resp = await axiosInstance(config);\n      return resp.data.data;\n    } catch (err) {\n      console.log(\"event.fetch error: \", err);\n    }\n  }\n  /**\n   *\n   * @deprecated use @flatfile/cross-env-config instead\n   */\n  setVariables({\n    accessToken,\n    apiUrl\n  }) {\n    this._accessToken = accessToken;\n    this._apiUrl = apiUrl;\n  }\n};\n\n// src/events/cache.ts\nvar EventCache = class {\n  constructor() {\n    this.eventCache = /* @__PURE__ */ new Map();\n  }\n  async init(key, callback) {\n    if (this.eventCache.get(key)) {\n      return this.eventCache.get(key);\n    } else {\n      const result = await callback();\n      this.eventCache.set(key, result);\n      return result;\n    }\n  }\n  async set(key, callback) {\n    if (this.eventCache.get(key)) {\n      const result = await callback();\n      this.eventCache.set(key, result);\n      return result;\n    } else {\n      throw new Error(\"Cache key not found\");\n    }\n  }\n  get(key) {\n    if (this.eventCache.get(key)) {\n      return this.eventCache.get(key);\n    } else {\n      throw new Error(\"Cache key not found\");\n    }\n  }\n  delete(key) {\n    if (!key) {\n      this.eventCache.clear();\n    } else if (this.eventCache.get(key)) {\n      if (Array.isArray(key)) {\n        key.forEach((k) => this.eventCache.delete(k));\n      } else {\n        this.eventCache.delete(key);\n      }\n    } else {\n      throw new Error(\"Cache key not found\");\n    }\n  }\n};\n\n// src/events/flatfile.event.ts\nvar FlatfileEvent = class extends AuthenticatedClient {\n  constructor(src, accessToken, apiUrl) {\n    super(accessToken, apiUrl);\n    this.src = src;\n    this.afterAllCallbacks = /* @__PURE__ */ new Map();\n    this.cache = new EventCache();\n    this.domain = src.domain;\n    this.topic = src.topic;\n    this.context = src.context;\n    this.payload = src.payload;\n    this.target = src.target || \"\";\n    this.origin = src.origin || {};\n    this.action = src.context?.actionName || \"\";\n    this.namespace = src.namespaces || [];\n    this.createdAt = src.createdAt || void 0;\n    const data = async (options) => this.fetchData(options);\n    data.then = (onfulfilled, onrejected) => {\n      return this.data().then(onfulfilled, onrejected);\n    };\n    this.data = data;\n  }\n  /**\n   * Should return either event body if expanded already or fetch data from the\n   * signed dataURL\n   */\n  async fetchData(options) {\n    const dataUrl = new URLSearchParams(this.src.dataUrl);\n    if (options) {\n      for (const [key, values] of Object.entries(options)) {\n        if (Array.isArray(values)) {\n          for (const value of values) {\n            dataUrl.append(key, value);\n          }\n        } else {\n          dataUrl.append(key, values);\n        }\n      }\n    }\n    const decodedURL = decodeURIComponent(dataUrl.toString());\n    if (decodedURL) {\n      return this.fetch(decodedURL);\n    } else {\n      return this.payload;\n    }\n  }\n  afterAll(callback, cacheKey) {\n    const key = cacheKey || callback.toString();\n    if (!this.afterAllCallbacks.get(key)) {\n      this.afterAllCallbacks.set(key, callback);\n    }\n  }\n  async update(records) {\n    if (!this.src.dataUrl) {\n      throw new Error(\"Cannot set data on an event without a dataUrl\");\n    }\n    records.map((record) => {\n      record.messages?.map((message) => {\n        delete message.source;\n      });\n    });\n    await this.fetch(this.src.dataUrl, {\n      method: \"PUT\",\n      data: records\n    });\n  }\n  /**\n   * Fetch the Secrets as indicated by this event context\n   *\n   * @param key - The name of the secret to fetch\n   * @param options - (Optional) environmentId and spaceId to override event context\n   *\n   * @returns The value of the secret (usually a credential or token)\n   */\n  async secrets(key, options) {\n    const environmentId = options?.environmentId || this.context.environmentId || \"\";\n    const spaceId = options?.spaceId || this.context.spaceId || \"\";\n    if (!environmentId) {\n      throw new Error(\"environmentId is required to fetch secrets\");\n    }\n    let getSecrets = `v1/secrets?environmentId=${environmentId}`;\n    if (spaceId) {\n      getSecrets += `&spaceId=${spaceId}`;\n    }\n    const secretCacheKey = `secrets:${environmentId}${spaceId && `:${spaceId}`}`;\n    const secrets = await this.cache.init(secretCacheKey, async () => {\n      const secretsResponse = await this.fetch(getSecrets);\n      const SecretMap = /* @__PURE__ */ new Map();\n      secretsResponse?.forEach((secret) => {\n        SecretMap.set(secret.name, secret.value);\n      });\n      return SecretMap;\n    });\n    const value = secrets.get(key);\n    if (!value) {\n      throw new Error(`Secret ${key} not found`);\n    }\n    return value;\n  }\n};\n\n// ../../node_modules/wildcard-match/build/index.es.mjs\nfunction escapeRegExpChar(char) {\n  if (char === \"-\" || char === \"^\" || char === \"$\" || char === \"+\" || char === \".\" || char === \"(\" || char === \")\" || char === \"|\" || char === \"[\" || char === \"]\" || char === \"{\" || char === \"}\" || char === \"*\" || char === \"?\" || char === \"\\\\\") {\n    return \"\\\\\" + char;\n  } else {\n    return char;\n  }\n}\nfunction escapeRegExpString(str) {\n  var result = \"\";\n  for (var i = 0; i < str.length; i++) {\n    result += escapeRegExpChar(str[i]);\n  }\n  return result;\n}\nfunction transform(pattern, separator) {\n  if (separator === void 0) {\n    separator = true;\n  }\n  if (Array.isArray(pattern)) {\n    var regExpPatterns = pattern.map(function(p) {\n      return \"^\" + transform(p, separator) + \"$\";\n    });\n    return \"(?:\" + regExpPatterns.join(\"|\") + \")\";\n  }\n  var separatorSplitter = \"\";\n  var separatorMatcher = \"\";\n  var wildcard = \".\";\n  if (separator === true) {\n    separatorSplitter = \"/\";\n    separatorMatcher = \"[/\\\\\\\\]\";\n    wildcard = \"[^/\\\\\\\\]\";\n  } else if (separator) {\n    separatorSplitter = separator;\n    separatorMatcher = escapeRegExpString(separatorSplitter);\n    if (separatorMatcher.length > 1) {\n      separatorMatcher = \"(?:\" + separatorMatcher + \")\";\n      wildcard = \"((?!\" + separatorMatcher + \").)\";\n    } else {\n      wildcard = \"[^\" + separatorMatcher + \"]\";\n    }\n  }\n  var requiredSeparator = separator ? separatorMatcher + \"+?\" : \"\";\n  var optionalSeparator = separator ? separatorMatcher + \"*?\" : \"\";\n  var segments = separator ? pattern.split(separatorSplitter) : [pattern];\n  var result = \"\";\n  for (var s = 0; s < segments.length; s++) {\n    var segment = segments[s];\n    var nextSegment = segments[s + 1];\n    var currentSeparator = \"\";\n    if (!segment && s > 0) {\n      continue;\n    }\n    if (separator) {\n      if (s === segments.length - 1) {\n        currentSeparator = optionalSeparator;\n      } else if (nextSegment !== \"**\") {\n        currentSeparator = requiredSeparator;\n      } else {\n        currentSeparator = \"\";\n      }\n    }\n    if (separator && segment === \"**\") {\n      if (currentSeparator) {\n        result += s === 0 ? \"\" : currentSeparator;\n        result += \"(?:\" + wildcard + \"*?\" + currentSeparator + \")*?\";\n      }\n      continue;\n    }\n    for (var c = 0; c < segment.length; c++) {\n      var char = segment[c];\n      if (char === \"\\\\\") {\n        if (c < segment.length - 1) {\n          result += escapeRegExpChar(segment[c + 1]);\n          c++;\n        }\n      } else if (char === \"?\") {\n        result += wildcard;\n      } else if (char === \"*\") {\n        result += wildcard + \"*?\";\n      } else {\n        result += escapeRegExpChar(char);\n      }\n    }\n    result += currentSeparator;\n  }\n  return result;\n}\nfunction isMatch(regexp, sample) {\n  if (typeof sample !== \"string\") {\n    throw new TypeError(\"Sample must be a string, but \" + typeof sample + \" given\");\n  }\n  return regexp.test(sample);\n}\nfunction wildcardMatch(pattern, options) {\n  if (typeof pattern !== \"string\" && !Array.isArray(pattern)) {\n    throw new TypeError(\"The first argument must be a single pattern string or an array of patterns, but \" + typeof pattern + \" given\");\n  }\n  if (typeof options === \"string\" || typeof options === \"boolean\") {\n    options = { separator: options };\n  }\n  if (arguments.length === 2 && !(typeof options === \"undefined\" || typeof options === \"object\" && options !== null && !Array.isArray(options))) {\n    throw new TypeError(\"The second argument must be an options object or a string/boolean separator, but \" + typeof options + \" given\");\n  }\n  options = options || {};\n  if (options.separator === \"\\\\\") {\n    throw new Error(\"\\\\ is not a valid separator because it is used for escaping. Try setting the separator to `true` instead\");\n  }\n  var regexpPattern = transform(pattern, options.separator);\n  var regexp = new RegExp(\"^\" + regexpPattern + \"$\", options.flags);\n  var fn = isMatch.bind(null, regexp);\n  fn.options = options;\n  fn.pattern = pattern;\n  fn.regexp = regexp;\n  return fn;\n}\nvar index_es_default = wildcardMatch;\n\n// src/events/glob.match.ts\nimport flat from \"flat\";\nfunction glob(val, filter) {\n  if (!val || typeof val !== \"string\") {\n    return false;\n  }\n  return index_es_default(filter || \"**\", \":\")(val);\n}\nfunction objectMatches(object, filterObject) {\n  const cleanFilter = !filterObject || typeof filterObject !== \"object\" ? { \"**\": filterObject } : filterObject;\n  if (typeof object !== \"object\") {\n    throw new Error(\"You cannot filter a non-object\");\n  }\n  let denied = false;\n  const filter = flat(cleanFilter, { safe: true });\n  const flattened = flat(object, { safe: true });\n  for (const keyPattern in filter) {\n    const keys = filterKeys(flattened, keyPattern);\n    const valuePattern = Array.isArray(filter[keyPattern]) ? filter[keyPattern] : [filter[keyPattern]];\n    denied || (denied = !keys.some((key) => {\n      const value = flattened[key];\n      return valuePattern.some((match) => globOrMatch(value, match));\n    }));\n  }\n  return !denied;\n}\nfunction filterKeys(object, glob2) {\n  glob2 = glob2.includes(\"*\") || glob2.includes(\".\") ? glob2 : `**.${glob2}`;\n  const matcher = index_es_default(glob2, \".\");\n  return Object.keys(object).filter((key) => matcher(key));\n}\nfunction globOrMatch(val, filter) {\n  if (val === void 0 || val === null) {\n    return filter === null;\n  }\n  if (Array.isArray(val)) {\n    return val.some((v) => globOrMatch(v, filter));\n  }\n  if (typeof filter === \"string\") {\n    return glob(val.toString(), filter);\n  }\n  return val === filter;\n}\n\n// src/events/event.handler.ts\nvar EventHandler = class extends AuthenticatedClient {\n  constructor(filter, accessToken, apiUrl) {\n    super(accessToken, apiUrl);\n    /**\n     * Cache of registered listeners on this instance\n     * @private\n     */\n    this.listeners = [];\n    /**\n     * Cache of registered child nodes for this listener. These nodes will\n     * only receive events that pass the parent filter.\n     *\n     * @private\n     */\n    this.nodes = [];\n    if (filter) {\n      this.filterQuery = filter;\n    }\n  }\n  on(query, ...rest) {\n    let filter = {};\n    const callback = rest.pop();\n    if (rest.length) {\n      filter = rest.shift();\n    }\n    this.listeners.push([query, filter, callback]);\n    return this;\n  }\n  /**\n   * Add child nodes to send this event to as well\n   *\n   * @param node\n   */\n  addNode(node) {\n    this.nodes.push(node);\n    return this;\n  }\n  /**\n   * Dispatch an event and resolve the promise once it has completed (or\n   * errored\n   *\n   * @todo - is there a right order in which to resolve event listeners?\n   *   Should it matter?\n   *\n   * @param event\n   */\n  async dispatchEvent(event) {\n    if (!event)\n      return;\n    const eventPayload = event.src ? event.src : event;\n    event = new FlatfileEvent(eventPayload, this._accessToken, this._apiUrl);\n    await this.trigger(event, true);\n    for (const [_key, cb] of event.afterAllCallbacks) {\n      await cb(event);\n    }\n    event.cache.delete();\n  }\n  /**\n   * @deprecated legacy shim for receiving events from the VM layer\n   * @alias dispatchEvent\n   * @param event\n   */\n  async routeEvent(event) {\n    return this.dispatchEvent(event);\n  }\n  /**\n   * Actually trigger the event listeners on this particular target\n   *\n   * @note It is safer for now to run this in series to avoid IO locks and\n   *       potential race conditions and uncaught errors\n   *\n   * @param event\n   * @param recursive\n   */\n  async trigger(event, recursive = false) {\n    const listeners = this.getListeners(event, recursive);\n    for (const cb of listeners) {\n      await cb.callback(event);\n    }\n  }\n  /**\n   * Get any listeners from this target subscribing to this event\n   *\n   * @param event\n   * @param recursive\n   */\n  getListeners(event, recursive = false) {\n    if (!this.matchEvent(event, this.filterQuery)) {\n      return [];\n    }\n    const listeners = this.listeners.filter(([query, filter]) => {\n      const globbed = glob(event.topic, query);\n      const matched = this.matchEvent(event, filter);\n      return globbed && matched;\n    }).map(([query, filter, callback]) => ({ query, filter, callback }));\n    return !recursive ? listeners : [\n      ...listeners,\n      ...this.nodes.flatMap((n) => n.getListeners(event, true))\n    ];\n  }\n  /**\n   * Attach more event listeners using a callback function. Used most\n   * frequently for plugins.\n   *\n   * @param fn\n   */\n  use(fn) {\n    fn(this);\n    return this;\n  }\n  /**\n   * Filter an event out based on glob filter object\n   *\n   * @param event\n   * @param filter\n   */\n  matchEvent(event, filter) {\n    return filter ? objectMatches(event, filter) : true;\n  }\n};\n\n// src/flatfile.listener.ts\nvar FlatfileListener = class extends EventHandler {\n  /**\n   * Subscribe to events only within a certain namespace.\n   *\n   * @param namespace\n   * @param cb\n   */\n  namespace(namespaces, cb) {\n    return this.filter({ namespaces }, cb);\n  }\n  /**\n   * Filter by namespace\n   *\n   * @param filter\n   * @param cb\n   */\n  filter(filter, cb) {\n    const client = new this.constructor(filter);\n    this.addNode(client);\n    cb?.(client);\n    return client;\n  }\n  /**\n   * Start subscribing to events\n   *\n   * @param cb\n   */\n  static create(cb) {\n    const client = new this();\n    cb(client);\n    return client;\n  }\n  /**\n   * Mount this client using an acceptable Event Driver\n   */\n  mount(driver) {\n    driver.mountEventHandler(this);\n    return this;\n  }\n};\n\n// src/event-drivers/_EventDriver.ts\nvar EventDriver = class {\n  get handler() {\n    if (!this._handler) {\n      throw new Error(\"handler not registered yet\");\n    }\n    return this._handler;\n  }\n  /**\n   * Mount an event handler\n   *\n   * @param handler\n   */\n  mountEventHandler(handler) {\n    this._handler = handler;\n    return this;\n  }\n  /**\n   * Dispatch an event\n   *\n   * @param e\n   */\n  dispatchEvent(e) {\n    this.handler.dispatchEvent(e);\n    return this;\n  }\n};\n\n// src/event-drivers/Browser.ts\nvar Browser = class extends EventDriver {\n  constructor({\n    apiUrl,\n    accessToken,\n    environmentId\n  }) {\n    super();\n    this._apiUrl = apiUrl;\n    this._accessToken = accessToken;\n    this._environmentId = environmentId || \"\";\n  }\n  mountEventHandler(handler) {\n    handler.setVariables({\n      accessToken: this._accessToken,\n      apiUrl: this._apiUrl\n    });\n    this._handler = handler;\n    return this;\n  }\n};\n\n// src/event-drivers/FlatfileVirtualMachine.ts\nvar FlatfileVirtualMachine = class extends EventDriver {\n  /**\n   * This method is triggered from within the Flatfile Core VM Runner. This\n   * EventDriver does not have to listen for events because this method will\n   * be invoked as necessary.\n   *\n   * @param event\n   */\n  handle(event) {\n    this.dispatchEvent(event);\n  }\n  mountEventHandler(handler) {\n    this._handler = handler;\n    return this;\n  }\n};\n\n// src/index.ts\nvar Client = class extends FlatfileListener {\n};\nexport {\n  AuthenticatedClient,\n  Browser,\n  Client,\n  EventDriver,\n  EventHandler,\n  FlatfileEvent,\n  FlatfileListener,\n  FlatfileVirtualMachine\n};\n"],"names":["CrossEnvConfig","static","prop","this","safeEnvLookup","key","value","_overrides","set","from","to","_aliases","obj","_registry","cb","_factory","Map","values","get","push","process","env","checkForBrowserVariables","foundValue","find","v","alias","window","windowValue","sessionStorage","storedValue","getItem","ensureSingleTrailingSlash","url","endsWith","slice","AuthenticatedClient","constructor","accessToken","apiUrl","FLATFILE_API_URL","bearerToken","_accessToken","_apiUrl","async","options","headers","Authorization","axiosInstance","axios","create","validateStatus","status","fetchUrl","config","method","resp","data","err","console","log","setVariables","EventCache","eventCache","callback","result","Error","delete","Array","isArray","forEach","k","clear","FlatfileEvent","src","super","afterAllCallbacks","cache","domain","topic","context","payload","target","origin","action","actionName","namespace","namespaces","createdAt","fetchData","then","onfulfilled","onrejected","dataUrl","URLSearchParams","Object","entries","append","decodedURL","decodeURIComponent","toString","fetch","afterAll","cacheKey","records","map","record","messages","message","source","environmentId","spaceId","getSecrets","secretCacheKey","secrets","init","secretsResponse","SecretMap","secret","name","escapeRegExpChar","char","escapeRegExpString","str","i","length","transform","pattern","separator","regExpPatterns","p","join","separatorSplitter","separatorMatcher","wildcard","requiredSeparator","optionalSeparator","segments","split","s","segment","nextSegment","currentSeparator","c","isMatch","regexp","sample","TypeError","test","wildcardMatch","arguments","regexpPattern","RegExp","flags","fn","bind","index_es_default","glob","val","filter","objectMatches","object","filterObject","cleanFilter","denied","flat","safe","flattened","keyPattern","keys","filterKeys","valuePattern","some","match","globOrMatch","glob2","includes","matcher","EventHandler","listeners","nodes","filterQuery","on","query","rest","pop","shift","addNode","node","event","eventPayload","trigger","_key","dispatchEvent","recursive","getListeners","matchEvent","globbed","matched","flatMap","n","use","FlatfileListener","client","mount","driver","mountEventHandler","EventDriver","handler","_handler","e","Browser","_environmentId","FlatfileVirtualMachine","handle","Client"],"mappings":"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"}