{"version":3,"sources":["jsdelivr-header.js","/npm/@appsignal/javascript@1.6.1/src/index.ts"],"names":[],"mappings":"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","file":"/npm/@appsignal/javascript@1.6.1/dist/cjs/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@appsignal/javascript@1.6.1/dist/cjs/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * The AppSignal client.\n * @module Appsignal\n */\n\nimport type { Breadcrumb } from \"./breadcrumb\"\nexport type { Breadcrumb }\nimport type { Decorator, Override } from \"./hook\"\nimport type { HashMap } from \"./hashmap\"\n\nexport { isError } from \"./error\"\n\nimport { toHashMap } from \"./hashmap\"\nimport { VERSION } from \"./version\"\nimport { PushApi } from \"./api\"\nimport { Environment } from \"./environment\"\nimport { Span, toBacktraceMatcher } from \"./span\"\nexport { Span }\nimport { Queue } from \"./queue\"\nimport { Dispatcher } from \"./dispatcher\"\n\nimport { AppsignalOptions, BacktraceMatcher } from \"./options\"\n\nexport default class Appsignal {\n  public VERSION = VERSION\n  public ignored: RegExp[] = []\n  private backtraceMatchers: BacktraceMatcher[] = []\n\n  private _dispatcher: Dispatcher\n  private _options: AppsignalOptions\n  private _api: PushApi\n  private _breadcrumbs: Breadcrumb[] = []\n\n  private _hooks = {\n    decorators: Array<Decorator>(),\n    overrides: Array<Override>()\n  }\n\n  private _env = Environment.serialize()\n  private _queue = new Queue([])\n\n  /**\n   * Creates a new instance of the AppSignal client.\n   *\n   * @constructor\n   *\n   * @param   {AppsignalOptions}  options        An object of options to configure the AppSignal client\n   */\n  constructor(options: AppsignalOptions) {\n    const {\n      key = \"\",\n      uri,\n      revision,\n      ignoreErrors,\n      matchBacktracePaths\n    } = options\n\n    // `revision` should be a `string`, but we attempt to\n    // normalise to one anyway\n    if (revision && typeof revision !== \"string\") {\n      options.revision = String(revision)\n    }\n\n    // starting with no key means nothing will be sent to the API\n    if (key === \"\") {\n      console.info(\n        \"[APPSIGNAL]: No API key provided. Started in development mode. No data will be sent.\"\n      )\n    }\n\n    this._api = new PushApi({\n      key,\n      uri,\n      version: this.VERSION\n    })\n\n    // ignored exceptions are checked against the `message`\n    // property of a given `Error`\n    if (ignoreErrors && Array.isArray(ignoreErrors)) {\n      this.ignored = ignoreErrors\n        .filter(value => value instanceof RegExp)\n        .map(unglobalize)\n    }\n\n    if (matchBacktracePaths) {\n      let paths: (RegExp | BacktraceMatcher)[]\n\n      if (Array.isArray(matchBacktracePaths)) {\n        paths = matchBacktracePaths\n      } else {\n        paths = [matchBacktracePaths]\n      }\n\n      for (const matcher of paths) {\n        if (matcher instanceof RegExp) {\n          this.backtraceMatchers.push(toBacktraceMatcher(unglobalize(matcher)))\n        } else if (typeof matcher === \"function\") {\n          this.backtraceMatchers.push(matcher)\n        }\n      }\n    }\n\n    this._dispatcher = new Dispatcher(this._queue, this._api)\n\n    this._options = options\n  }\n\n  /**\n   * Records and sends a browser `Error` to AppSignal.\n   *\n   * @param   {Error | ErrorEvent}             error          A JavaScript Error object\n   * @param   {Function | void}                fn             Optional callback function to modify span before it's sent.\n   *\n   * @return  {Promise<Span> | void}             An API response, or `void` if `Promise` is unsupported.\n   */\n  public send<T>(error: Error, fn?: (span: Span) => T): Promise<Span> | void\n\n  /**\n   * Records and sends a browser `Error` to AppSignal.\n   *\n   * @param   {Error | ErrorEvent}             error          A JavaScript Error object\n   * @param   {object}                         tags           An key, value object of tags\n   * @param   {string}                         namespace      An optional namespace name\n   *\n   * @return  {Promise<Span> | void}             An API response, or `void` if `Promise` is unsupported.\n   */\n  public send(\n    error: Error | ErrorEvent,\n    tags?: object,\n    namespace?: string\n  ): Promise<Span> | void\n\n  /**\n   * Records and sends an Appsignal `Span` object to AppSignal.\n   *\n   * @param   {Span}             span          An Appsignal Span object\n   *\n   * @return  {Promise<Span>}                    An API response, or `void` if `Promise` is unsupported.\n   */\n  public send(span: Span): Promise<Span> | void\n\n  /**\n   *\n   * @param   {Error | Span | ErrorEvent}  data           A JavaScript Error or Appsignal Span object\n   * @param   {object | Function}          tagsOrFn       An key-value object of tags or a callback function to customize the span before it is sent.\n   * @param   {string}                     namespace      DEPRECATED: An optional namespace name.\n   *\n   * @return  {Promise<Span> | void}             An API response, or `void` if `Promise` is unsupported.\n   */\n  public send<T>(\n    data: Error | Span | ErrorEvent,\n    tagsOrFn?: object | ((span: Span) => T),\n    namespace?: string\n  ): Promise<any> | void {\n    if (\n      !(data instanceof Error) &&\n      !(data instanceof Span) &&\n      !(data && data.error instanceof Error)\n    ) {\n      // @TODO: route this through a central logger\n      console.error(\n        \"[APPSIGNAL]: Can't send error, given error is not a valid type\"\n      )\n      return\n    }\n\n    let error: Error | Span\n\n    if (\"error\" in data) {\n      error = data.error as Error // handle ErrorEvent\n    } else {\n      error = data\n    }\n\n    // a \"span\" currently refers to a fixed point in time, as opposed to\n    // a range or length in time. this may change in future!\n    let span = error instanceof Span ? error : this._createSpanFromError(error)\n\n    // A Span can be \"decorated\" with metadata after it has been created,\n    // but before it is sent to the API and before metadata provided\n    // as arguments is added\n\n    for (const decorator of this._hooks.decorators) {\n      const previousSpan = span\n      span = decorator(span)\n      // In previous versions of this integration, the return value was\n      // ignored, and the original span was used. This was a bug, but it\n      // worked given an implicit expectation that the span would be\n      // modified in place.\n      //\n      // Avoid a breaking change for \"broken\" decorators that do not\n      // return a value by using the previous span.\n      if (span === undefined) {\n        span = previousSpan\n      }\n    }\n\n    if (tagsOrFn) {\n      if (typeof tagsOrFn === \"function\") {\n        const callback = tagsOrFn\n        callback(span)\n      } else {\n        console.warn(\n          \"[APPSIGNAL]: DEPRECATED: Calling the `send`/`sendError` function with a tags object is deprecated. Use the callback argument instead.\"\n        )\n        const tags = (toHashMap(tagsOrFn) || {}) as HashMap<string>\n        span.setTags(tags)\n      }\n    }\n    if (namespace) {\n      console.warn(\n        \"[APPSIGNAL]: DEPRECATED: Calling the `send`/`sendError` function with a namespace is deprecated. Use the callback argument instead.\"\n      )\n      span.setNamespace(namespace)\n    }\n\n    if (this._breadcrumbs.length > 0) span.setBreadcrumbs(this._breadcrumbs)\n\n    // A Span can be \"overridden\" with metadata after it has been created,\n    // but before it is sent to the API and after metadata provided\n    // as arguments is added\n\n    for (const override of this._hooks.overrides) {\n      const previousSpan = span\n      const nextSpan = override(span)\n\n      if (nextSpan === false) {\n        // If the override returns false, we ignore this span.\n        console.warn(\"[APPSIGNAL]: Ignored a span due to override.\")\n        return\n      }\n\n      // In previous versions of this integration, the return value was\n      // ignored, and the original span was used. This was a bug, but it\n      // worked given an implicit expectation that the span would be\n      // modified in place.\n      //\n      // Avoid a breaking change for \"broken\" overrides that do not\n      // return a value by using the previous span.\n      span = nextSpan ?? previousSpan\n    }\n\n    // Ignore user defined errors after overrides.\n    const message = span.getError()?.message\n\n    if (message && this.ignored.some(el => el.test(message))) {\n      console.warn(`[APPSIGNAL]: Ignored a span: ${message}`)\n      return\n    }\n\n    span.cleanBacktracePath(this.backtraceMatchers)\n\n    if (Environment.supportsPromises()) {\n      // clear breadcrumbs as they are now loaded into the span,\n      // and we are sure that it's possible to send them\n      this._breadcrumbs = []\n\n      // if no key is supplied, we just output the span to the console\n      if (!this._options.key) {\n        // @TODO: route this through a central logger\n        console.warn(\n          \"[APPSIGNAL]: Span not sent because we're in development mode:\",\n          span\n        )\n      } else {\n        // attempt to push to the API\n        return this._api.push(span).catch(() => {\n          this._queue.push(span)\n\n          // schedule on next tick\n          setTimeout(() => this._dispatcher.schedule(), 0)\n        })\n      }\n    } else {\n      // @TODO: route this through a central logger\n      console.error(\n        \"[APPSIGNAL]: Error not sent. A Promise polyfill is required.\"\n      )\n      return\n    }\n  }\n\n  sendError<T>(error: Error | ErrorEvent): Promise<Span> | void\n  sendError<T>(\n    error: Error | ErrorEvent,\n    callback: (span: Span) => T\n  ): Promise<Span> | void\n  sendError<T>(\n    error: Error | ErrorEvent,\n    tags?: object,\n    namespace?: string\n  ): Promise<Span> | void\n\n  /**\n   * Records and sends a browser `Error` to AppSignal. An alias to `#send()`\n   * to maintain compatibility.\n   *\n   * @param   {Error | ErrorEvent}  error          A JavaScript Error object\n   * @param   {object | Function}   tagsOrFn       An key-value object of tags or callback function to customize the span before it is sent.\n   * @param   {string}              namespace      DEPRECATED: An optional namespace name\n   *\n   * @return  {Promise<Span> | void}               An API response, or `void` if `Promise` is unsupported.\n   */\n  public sendError<T>(\n    error: Error | ErrorEvent,\n    tagsOrFn?: object | ((span: Span) => T),\n    namespace?: string\n  ): Promise<Span> | void {\n    return this.send(error, tagsOrFn, namespace)\n  }\n\n  /**\n   * Registers and installs a valid plugin.\n   *\n   * A plugin is typically a function that can be used to provide a\n   * reference to the `Appsignal` instance via returning a function\n   * that can be bound to `this`.\n   *\n   * @param   {Plugin}            plugin         A JavaScript Error object\n   *\n   * @return  {void}\n   */\n  public use(plugin: Function): void {\n    plugin.call(this)\n  }\n\n  /**\n   * Creates a new `Span`, augmented with the current environment.\n   *\n   * @param   {Function | void}   fn         Optional function to modify span\n   *\n   * @return  {Span}              An AppSignal `Span` object\n   */\n  public createSpan(fn?: (span: Span) => void): Span {\n    const { revision = \"\", namespace } = this._options\n\n    const span = new Span({\n      environment: this._env,\n      revision\n    })\n\n    // set default namespace from constructor if none is set\n    if (namespace) span.setNamespace(namespace)\n\n    if (fn && typeof fn === \"function\") fn(span)\n\n    return span\n  }\n\n  /**\n   * Wraps and catches errors within a given function. If the function throws an\n   * error, a rejected `Promise` will be returned and the error thrown will be\n   * logged to AppSignal.\n   */\n  public async wrap<T>(fn: () => T, callbackFn?: (span: Span) => T): Promise<T>\n\n  /**\n   * Wraps and catches errors within a given function. If the function throws an\n   * error, a rejected `Promise` will be returned and the error thrown will be\n   * logged to AppSignal.\n   */\n  public async wrap<T>(\n    fn: () => T,\n    tags?: object,\n    namespace?: string\n  ): Promise<T>\n\n  /**\n   * Wraps and catches errors within a given function. If the function throws an\n   * error, a rejected `Promise` will be returned and the error thrown will be\n   * logged to AppSignal.\n   *\n   * @param   {Function}          fn             A function to wrap\n   * @param   {object | Function} tagsOrFn       An key-value object of tags or a callback function to customize the span before it is sent.\n   * @param   {string}            namespace      DEPRECATED: An optional namespace name\n   *\n   * @return  {Promise<any>}      A Promise containing the return value of the function, or a `Span` if an error was thrown.\n   */\n  public async wrap<T>(\n    fn: () => T,\n    tagsOrFn?: object | ((span: Span) => T),\n    namespace?: string\n  ): Promise<T> {\n    try {\n      return await fn()\n    } catch (e) {\n      if (e instanceof Error || e instanceof ErrorEvent) {\n        await this.sendError(e, tagsOrFn, namespace)\n      }\n      return Promise.reject(e)\n    }\n  }\n\n  /**\n   * Registers a span decorator to be applied every time a Span\n   * is sent to the Push API\n   *\n   * @param   {Function}  decorator  A decorator function, returning `Span`\n   *\n   * @return  {void}\n   */\n  public addDecorator<T extends Decorator>(decorator: T): void {\n    this._hooks.decorators.push(decorator)\n  }\n\n  /**\n   * Registers a span override to be applied every time a Span\n   * is sent to the Push API\n   *\n   * @param   {Function}  override  An override function, returning `Span`\n   *\n   * @return  {void}\n   */\n  public addOverride<T extends Override>(override: T): void {\n    this._hooks.overrides.push(override)\n  }\n\n  /**\n   * Sends a demonstration error to AppSignal.\n   *\n   * @return  {void}\n   */\n  public demo(): void {\n    const span = this._createSpanFromError(\n      new Error(\n        \"Hello world! This is an error used for demonstration purposes.\"\n      )\n    )\n\n    span\n      .setAction(\"TestAction\")\n      .setParams({\n        path: \"/hello\",\n        method: \"GET\"\n      })\n      .setTags({\n        demo_sample: \"true\"\n      })\n\n    this.send(span)\n  }\n\n  /**\n   * Adds a breadcrumb.\n   *\n   * @param   {Breadcrumb}  breadcrumb  A valid breadcrumb\n   *\n   * @return  {void}\n   */\n  public addBreadcrumb(breadcrumb: Omit<Breadcrumb, \"timestamp\">): void {\n    const crumb: Breadcrumb = {\n      timestamp: Math.round(new Date().getTime() / 1000),\n      ...breadcrumb,\n      metadata: toHashMap(breadcrumb.metadata)\n    }\n\n    if (!crumb.category) {\n      console.warn(\"[APPSIGNAL]: Breadcrumb not added. `category` is missing.\")\n      return\n    }\n\n    if (!crumb.action) {\n      console.warn(\"[APPSIGNAL]: Breadcrumb not added. `action` is missing.\")\n      return\n    }\n\n    if (this._breadcrumbs.length === 20) {\n      this._breadcrumbs.pop()\n    }\n\n    this._breadcrumbs.unshift(crumb)\n  }\n\n  /**\n   * Creates a valid AppSignal `Span` from a JavaScript `Error`\n   * object.\n   *\n   * @param   {Error}  error  A JavaScript error\n   *\n   * @return  {Span}         An AppSignal event\n   */\n  private _createSpanFromError(error: Error): Span {\n    const event = this.createSpan()\n    event.setError(error)\n\n    return event\n  }\n}\n\n// Returns a new `RegExp` object with the global flag removed.\n// This fixes issues where using global regexes repeatedly with `test` against\n// different strings will return unexpected results, due to the regex object\n// storing the location of its last match and resuming the search from there.\nfunction unglobalize(regexp: RegExp): RegExp {\n  return new RegExp(regexp.source, regexp.flags.replace(\"g\", \"\"))\n}\n"]}