{"version":3,"file":"index.cjs","names":["Prometheus","asArray","defaultOptions","getMetrics","Prometheus","defaultOptions","defaultLabels","asArray","defaultOptions","getMetrics","Prometheus","defaultOptions","Prometheus","UrlValueParser","url","#startTime","#endTime"],"sources":["../src/environment/kubernetes.ts","../src/environment/skip-metrics-in-environment.ts","../src/client/client.ts","../src/create-gc-metrics/create-gc-metrics.ts","../src/create-gc-observer/create-gc-observer.ts","../src/create-graphql-metrics/create-graphql-metrics.ts","../src/create-http-metrics/create-http-metrics.ts","../src/end-measurement-from/end-measurement-from.ts","../src/sort-labels/sort-labels.ts","../src/create-request-recorder/create-request-recorder.ts","../src/normalizers/method/method.ts","../src/normalizers/path/path.ts","../src/normalizers/status-code/status-code.ts","../src/normalizers/index.ts","../src/summary/summary.ts","../src/timing/timing.ts"],"sourcesContent":["const isRunningInKubernetes = () =>\n  Boolean(process.env.KUBERNETES_SERVICE_HOST);\n\nexport { isRunningInKubernetes };\n","import type { TOptionalPromsterOptions } from '@promster/types';\n\nimport { isRunningInKubernetes } from './kubernetes';\n\ntype TSkipMetricsInEnvironmentOptions = {\n  detectKubernetes?: TOptionalPromsterOptions['detectKubernetes'];\n};\n\nconst skipMetricsInEnvironment = (options: TSkipMetricsInEnvironmentOptions) =>\n  options.detectKubernetes === true && !isRunningInKubernetes();\n\nexport { skipMetricsInEnvironment };\n","import { once } from 'es-toolkit/function';\nimport type { PrometheusContentType } from 'prom-client';\nimport * as Prometheus from 'prom-client';\n\nimport { skipMetricsInEnvironment } from '../environment';\n\n// NOTE:\n//   This is the `globalRegistry` provided by the `prom-client`\n//   We could create multiple registries with `new Prometheus.registry()`.\nconst defaultRegister = Prometheus.register;\n\ninterface TClientOptions extends Prometheus.DefaultMetricsCollectorConfiguration<PrometheusContentType> {\n  detectKubernetes?: boolean;\n  prefix?: string;\n}\n\nconst configure = once((options: TClientOptions) => {\n  const shouldSkipMetricsInEnvironment = skipMetricsInEnvironment(options);\n\n  if (!shouldSkipMetricsInEnvironment) {\n    Prometheus.collectDefaultMetrics(options);\n  }\n});\n\nexport { Prometheus, defaultRegister, configure };\n","import type { TDefaultedPromsterOptions, TGcMetrics } from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure, Prometheus } from '../client';\n\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n  Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst defaultOptions = {\n  getLabelValues: () => ({}),\n  labels: [],\n  metricPrefix: '',\n  metricNames: {\n    up: ['nodejs_up'],\n  },\n  gcCollectionInterval: 6000,\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n  up: asArray(options.metricNames.up).map(\n    (nameOfUpMetric: string) =>\n      new Prometheus.Gauge({\n        name: `${options.metricPrefix}${nameOfUpMetric}`,\n        help: '1 = nodejs server is up, 0 = nodejs server is not up',\n      }),\n  ),\n});\n\nconst createGcMetrics = (options: TDefaultedPromsterOptions): TGcMetrics => {\n  const defaultedOptions: TDefaultedPromsterOptions = merge(\n    defaultOptions,\n    options,\n  );\n\n  configure({\n    prefix: defaultedOptions.metricPrefix,\n  });\n\n  const gcMetrics = getMetrics(defaultedOptions);\n\n  return gcMetrics;\n};\n\ncreateGcMetrics.defaultOptions = defaultOptions;\n\nexport { createGcMetrics };\n","import { gcStats } from '@chainsafe/prometheus-gc-stats';\nimport type { TDefaultedPromsterOptions, TGcMetrics } from '@promster/types';\nimport { once } from 'es-toolkit/function';\n\nimport { defaultRegister } from '../client/client';\n\nconst defaultOptions = {\n  disableGcMetrics: false,\n};\n\nconst createGcObserver = once(\n  (_metrics: TGcMetrics, options: TDefaultedPromsterOptions) => () => {\n    gcStats(defaultRegister, {\n      collectionInterval: options.gcCollectionInterval,\n      prefix: options.metricPrefix,\n    });\n  },\n);\n\n// @ts-expect-error\ncreateGcObserver.defaultOptions = defaultOptions;\n\nexport { createGcObserver };\n","import type {\n  TDefaultedPromsterOptions,\n  TGraphQlMetrics,\n} from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure, Prometheus } from '../client';\n\nconst defaultGraphQlPercentiles = [0.5, 0.9, 0.95, 0.98, 0.99];\n\nconst defaultLabels = ['operation_name'];\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n  Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst shouldObserveGraphQlParseDurationAsHistogram = (\n  options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlParseDurationHistogram');\nconst shouldObserveGraphQlValidationDurationAsHistogram = (\n  options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlValidationDurationHistogram');\nconst shouldObserveGraphQlResolveFieldDurationAsHistogram = (\n  options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlResolveFieldDurationHistogram');\nconst shouldObserveGraphQlRequestDurationAsHistogram = (\n  options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlRequestDurationHistogram');\nconst shouldObserveGraphQlErrorsTotalAsCounter = (\n  options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlErrorsTotal');\n\nconst defaultOptions = {\n  getLabelValues: () => ({}),\n  labels: [],\n  metricPrefix: '',\n  metricTypes: [\n    'graphQlParseDurationHistogram',\n    'graphQlValidationDurationHistogram',\n    'graphQlResolveFieldDurationHistogram',\n    'graphQlRequestDurationHistogram',\n    'graphQlErrorsTotal',\n  ],\n  metricNames: {\n    graphQlParseDuration: ['graphql_parse_duration_seconds'],\n    graphQlValidationDuration: ['graphql_validation_duration_seconds'],\n    graphQlResolveFieldDuration: ['graphql_resolve_field_duration_seconds'],\n    graphQlRequestDuration: ['graphql_request_duration_seconds'],\n    graphQlErrorsTotal: ['graphql_errors_total'],\n  },\n  metricPercentiles: {\n    graphQlParseDuration: defaultGraphQlPercentiles,\n    graphQlValidationDuration: defaultGraphQlPercentiles,\n    graphQlResolveFieldDuration: defaultGraphQlPercentiles,\n    graphQlRequestDuration: defaultGraphQlPercentiles,\n    graphQlErrorsTotal: defaultGraphQlPercentiles,\n  },\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n  graphQlParseDuration: shouldObserveGraphQlParseDurationAsHistogram(options)\n    ? asArray(options.metricNames.graphQlParseDuration).map(\n        (nameOfGraphQlParseDuration: string) =>\n          new Prometheus.Histogram({\n            name: `${options.metricPrefix}${nameOfGraphQlParseDuration}`,\n            help: 'The GraphQL request parse time in seconds.',\n            labelNames: defaultLabels.concat(options.labels).toSorted(),\n            buckets:\n              options.metricPercentiles?.graphQlParseDuration ||\n              defaultGraphQlPercentiles,\n          }),\n      )\n    : undefined,\n\n  graphQlValidationDuration: shouldObserveGraphQlValidationDurationAsHistogram(\n    options,\n  )\n    ? asArray(options.metricNames.graphQlValidationDuration).map(\n        (nameOfGraphQlValidationDuration: string) =>\n          new Prometheus.Histogram({\n            name: `${options.metricPrefix}${nameOfGraphQlValidationDuration}`,\n            help: 'The GraphQL request validation time in seconds.',\n            labelNames: defaultLabels.concat(options.labels).toSorted(),\n            buckets:\n              options.metricPercentiles?.graphQlValidationDuration ||\n              defaultGraphQlPercentiles,\n          }),\n      )\n    : undefined,\n\n  graphQlResolveFieldDuration:\n    shouldObserveGraphQlResolveFieldDurationAsHistogram(options)\n      ? asArray(options.metricNames.graphQlResolveFieldDuration).map(\n          (nameOfGraphQlResolveFieldDuration: string) =>\n            new Prometheus.Histogram({\n              name: `${options.metricPrefix}${nameOfGraphQlResolveFieldDuration}`,\n              help: 'The GraphQL field resolving time in seconds.',\n              labelNames: defaultLabels\n                .concat(['field_name'])\n                .concat(options.labels)\n                .toSorted(),\n              buckets:\n                options.metricPercentiles?.graphQlResolveFieldDuration ||\n                defaultGraphQlPercentiles,\n            }),\n        )\n      : undefined,\n\n  graphQlRequestDuration: shouldObserveGraphQlRequestDurationAsHistogram(\n    options,\n  )\n    ? asArray(options.metricNames.graphQlRequestDuration).map(\n        (nameOfGraphQlRequestDuration: string) =>\n          new Prometheus.Histogram({\n            name: `${options.metricPrefix}${nameOfGraphQlRequestDuration}`,\n            help: 'The GraphQL request duration time in seconds.',\n            labelNames: defaultLabels.concat(options.labels).toSorted(),\n            buckets:\n              options.metricPercentiles?.graphQlRequestDuration ||\n              defaultGraphQlPercentiles,\n          }),\n      )\n    : undefined,\n\n  graphQlErrorsTotal: shouldObserveGraphQlErrorsTotalAsCounter(options)\n    ? asArray(options.metricNames.graphQlErrorsTotal).map(\n        (nameOfGraphQlErrorsCount: string) =>\n          new Prometheus.Counter({\n            name: `${options.metricPrefix}${nameOfGraphQlErrorsCount}`,\n            help: 'Count of errors while parsing, validating, or executing a GraphQL operation.',\n            labelNames: defaultLabels\n              .concat(['phase'])\n              .concat(options.labels)\n              .toSorted(),\n          }),\n      )\n    : undefined,\n});\n\nconst createGraphQlMetrics = (\n  options: TDefaultedPromsterOptions,\n): TGraphQlMetrics => {\n  const defaultedOptions: TDefaultedPromsterOptions = merge(\n    defaultOptions,\n    options,\n  );\n\n  configure({\n    prefix: defaultedOptions.metricPrefix,\n  });\n\n  const metrics = getMetrics(defaultedOptions);\n\n  return metrics;\n};\n\ncreateGraphQlMetrics.defaultOptions = defaultOptions;\n\nexport { createGraphQlMetrics };\n","import type { TDefaultedPromsterOptions, THttpMetrics } from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure, Prometheus } from '../client';\n\nconst defaultHttpRequestDurationPercentileInSeconds = [\n  0.5, 0.9, 0.95, 0.98, 0.99,\n];\nconst defaultHttpRequestDurationInSeconds = [\n  0.05, 0.1, 0.3, 0.5, 0.8, 1, 1.5, 2, 3, 10,\n];\nconst defaultHttpContentLengthInBytes = [\n  100000, 200000, 500000, 1000000, 1500000, 2000000, 3000000, 5000000, 10000000,\n];\n\nconst defaultLabels = ['path', 'status_code', 'method'];\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n  Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst shouldObserveHttpRequestsAsSummary = (\n  options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsSummary');\nconst shouldObserveHttpRequestsAsHistogram = (\n  options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsHistogram');\nconst shouldObserveHttpRequestsAsCounter = (\n  options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsTotal');\nconst shouldObserveHttpContentLengthAsHistogram = (\n  options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpContentLengthHistogram');\n\nconst defaultOptions = {\n  getLabelValues: () => ({}),\n  labels: [],\n  metricPrefix: '',\n  metricTypes: ['httpRequestsTotal', 'httpRequestsHistogram'],\n  metricNames: {\n    httpRequestsTotal: ['http_requests_total'],\n    httpRequestDurationPerPercentileInSeconds: [\n      'http_request_duration_per_percentile_seconds',\n    ],\n    httpRequestDurationInSeconds: ['http_request_duration_seconds'],\n    httpRequestContentLengthInBytes: ['http_request_content_length_bytes'],\n    httpResponseContentLengthInBytes: ['http_response_content_length_bytes'],\n  },\n  metricBuckets: {\n    httpRequestContentLengthInBytes: defaultHttpContentLengthInBytes,\n    httpRequestDurationInSeconds: defaultHttpRequestDurationInSeconds,\n  },\n  metricPercentiles: {\n    httpRequestDurationPerPercentileInSeconds:\n      defaultHttpRequestDurationPercentileInSeconds,\n    httpResponseContentLengthInBytes: defaultHttpContentLengthInBytes,\n  },\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n  httpRequestContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(\n    options,\n  )\n    ? asArray(options.metricNames.httpRequestContentLengthInBytes).map(\n        (nameOfHttpContentLengthMetric: string) =>\n          new Prometheus.Histogram({\n            name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,\n            help: 'The HTTP request content length in bytes.',\n            labelNames: defaultLabels.concat(options.labels).toSorted(),\n            buckets:\n              options.metricBuckets?.httpRequestContentLengthInBytes ||\n              defaultHttpContentLengthInBytes,\n          }),\n      )\n    : undefined,\n\n  httpResponseContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(\n    options,\n  )\n    ? asArray(options.metricNames.httpResponseContentLengthInBytes).map(\n        (nameOfHttpContentLengthMetric: string) =>\n          new Prometheus.Histogram({\n            name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,\n            help: 'The HTTP response content length in bytes.',\n            labelNames: defaultLabels.concat(options.labels).toSorted(),\n            buckets:\n              options.metricBuckets?.httpResponseContentLengthInBytes ||\n              defaultHttpContentLengthInBytes,\n          }),\n      )\n    : undefined,\n});\n\nconst getHttpRequestLatencyMetricsInSeconds = (\n  options: TDefaultedPromsterOptions,\n) => ({\n  httpRequestDurationPerPercentileInSeconds: shouldObserveHttpRequestsAsSummary(\n    options,\n  )\n    ? asArray(\n        options.metricNames.httpRequestDurationPerPercentileInSeconds,\n      ).map(\n        (nameOfHttpRequestDurationPerPercentileInSeconds: string) =>\n          new Prometheus.Summary({\n            name: `${options.metricPrefix}${nameOfHttpRequestDurationPerPercentileInSeconds}`,\n            help: 'The HTTP request latencies in seconds.',\n            labelNames: defaultLabels.concat(options.labels).toSorted(),\n            percentiles:\n              options.metricPercentiles\n                ?.httpRequestDurationPerPercentileInSeconds ||\n              defaultHttpRequestDurationPercentileInSeconds,\n          }),\n      )\n    : undefined,\n\n  httpRequestDurationInSeconds: shouldObserveHttpRequestsAsHistogram(options)\n    ? asArray(options.metricNames.httpRequestDurationInSeconds).map(\n        (nameOfHttpRequestDurationInSecondsMetric: string) =>\n          new Prometheus.Histogram({\n            name: `${options.metricPrefix}${nameOfHttpRequestDurationInSecondsMetric}`,\n            help: 'The HTTP request latencies in seconds.',\n            labelNames: defaultLabels.concat(options.labels).toSorted(),\n            buckets:\n              options.metricBuckets?.httpRequestDurationInSeconds ||\n              defaultHttpRequestDurationInSeconds,\n          }),\n      )\n    : undefined,\n});\n\nconst getHttpRequestCounterMetric = (options: TDefaultedPromsterOptions) => ({\n  httpRequestsTotal: shouldObserveHttpRequestsAsCounter(options)\n    ? asArray(options.metricNames.httpRequestsTotal).map(\n        (nameOfHttpRequestsTotalMetric: string) =>\n          new Prometheus.Counter({\n            name: `${options.metricPrefix}${nameOfHttpRequestsTotalMetric}`,\n            help: 'The total HTTP requests.',\n            labelNames: defaultLabels.concat(options.labels).toSorted(),\n          }),\n      )\n    : undefined,\n});\n\nconst createHttpMetrics = (\n  options: TDefaultedPromsterOptions,\n): THttpMetrics => {\n  const defaultedOptions: TDefaultedPromsterOptions = merge(\n    defaultOptions,\n    options,\n  );\n\n  configure({\n    prefix: defaultedOptions.metricPrefix,\n  });\n\n  const metrics = getMetrics(defaultedOptions);\n\n  const httpRequestLatencyMetricsInSeconds =\n    getHttpRequestLatencyMetricsInSeconds(defaultedOptions);\n  const httpRequestCounterMetric =\n    getHttpRequestCounterMetric(defaultedOptions);\n\n  return Object.assign(\n    {},\n    metrics,\n    httpRequestLatencyMetricsInSeconds,\n    httpRequestCounterMetric,\n  );\n};\n\ncreateHttpMetrics.defaultOptions = defaultOptions;\n\nexport { createHttpMetrics };\n","const NS_PER_SEC = 1e9;\n\nfunction endMeasurementFrom(start: [number, number]) {\n  const [seconds, nanoseconds] = process.hrtime(start);\n\n  return {\n    durationS: (seconds * NS_PER_SEC + nanoseconds) / NS_PER_SEC,\n  };\n}\n\nexport { endMeasurementFrom };\n","import type { TLabelValues } from '@promster/types';\n\nfunction sortLabels(unsortedLabels: TLabelValues): TLabelValues {\n  return Object.keys(unsortedLabels)\n    .toSorted((a, b) => {\n      if (a < b) {\n        return -1;\n      }\n\n      if (a > b) {\n        return 1;\n      }\n\n      return 0;\n    })\n    .reduce<TLabelValues>((sortedLabels, labelName) => {\n      sortedLabels[labelName] = unsortedLabels[labelName];\n      return sortedLabels;\n    }, {});\n}\n\nexport { sortLabels };\n","import type {\n  TDefaultedPromsterOptions,\n  THttpMetrics,\n  TLabelValues,\n  TOptionalPromsterOptions,\n} from '@promster/types';\nimport merge from 'merge-options';\n\nimport { endMeasurementFrom } from '../end-measurement-from';\nimport { skipMetricsInEnvironment } from '../environment';\nimport { sortLabels } from '../sort-labels';\nimport type { Timing } from '../timing';\n\ntype TRecordingOptions = {\n  labels: TLabelValues;\n  requestContentLength?: number;\n  responseContentLength?: number;\n};\n\ntype TLegacyTiming = [number, number];\nexport type TRequestRecorder = (\n  _timing: Timing | TLegacyTiming,\n  _recordingOptions: TRecordingOptions,\n) => void;\n\nconst defaultOptions: TOptionalPromsterOptions = {\n  detectKubernetes: false,\n};\n\nfunction isTiming(timing: Timing | TLegacyTiming): timing is Timing {\n  return !Array.isArray(timing);\n}\n\nconst createRequestRecorder = (\n  metrics: THttpMetrics,\n  options: TOptionalPromsterOptions = defaultOptions,\n): TRequestRecorder => {\n  const defaultedRecorderOptions: TDefaultedPromsterOptions = merge(\n    defaultOptions,\n    options,\n  );\n  const shouldSkipMetricsByEnvironment = skipMetricsInEnvironment(\n    defaultedRecorderOptions,\n  );\n\n  return (\n    timing: Timing | TLegacyTiming,\n    recordingOptions: TRecordingOptions,\n  ) => {\n    const durationS = isTiming(timing)\n      ? timing.end().value().seconds\n      : endMeasurementFrom(timing).durationS;\n\n    const labels = sortLabels(recordingOptions.labels);\n\n    if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n      if (metrics.httpRequestDurationInSeconds) {\n        for (const httpRequestDurationInSecondsMetricType of metrics.httpRequestDurationInSeconds) {\n          httpRequestDurationInSecondsMetricType.observe(labels, durationS);\n        }\n      }\n    }\n\n    if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n      if (metrics.httpRequestDurationPerPercentileInSeconds) {\n        for (const httpRequestDurationPerPercentileInSecondsMetricType of metrics.httpRequestDurationPerPercentileInSeconds) {\n          httpRequestDurationPerPercentileInSecondsMetricType.observe(\n            labels,\n            durationS,\n          );\n        }\n      }\n    }\n\n    if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n      if (metrics.httpRequestsTotal) {\n        for (const httpRequestsTotalMetricType of metrics.httpRequestsTotal) {\n          httpRequestsTotalMetricType.inc(labels);\n        }\n      }\n    }\n\n    if (recordingOptions.requestContentLength) {\n      if (metrics.httpRequestContentLengthInBytes) {\n        for (const httpRequestContentLengthInBytesMetricType of metrics.httpRequestContentLengthInBytes) {\n          httpRequestContentLengthInBytesMetricType.observe(\n            labels,\n            recordingOptions.requestContentLength,\n          );\n        }\n      }\n    }\n\n    if (recordingOptions.responseContentLength) {\n      if (metrics.httpResponseContentLengthInBytes) {\n        for (const httpResponseContentLengthInBytesMetricType of metrics.httpResponseContentLengthInBytes) {\n          httpResponseContentLengthInBytesMetricType.observe(\n            labels,\n            recordingOptions.responseContentLength,\n          );\n        }\n      }\n    }\n  };\n};\n\ncreateRequestRecorder.defaultOptions = defaultOptions;\n\nexport { createRequestRecorder, sortLabels, endMeasurementFrom };\n","const normalizeMethod = (method: string): string => method.toLowerCase();\n\nexport { normalizeMethod };\n","import url from 'node:url';\n\nimport UrlValueParser from 'url-value-parser';\n\nconst urlValueParser = new UrlValueParser();\n\nconst normalizePath = (path: string): string => {\n  const parsedPathname = url.parse(path).pathname;\n\n  if (!parsedPathname) {\n    return '';\n  }\n\n  return urlValueParser.replacePathValues(parsedPathname, '#val');\n};\n\nexport { normalizePath };\n","const normalizeStatusCode = (statusCode: number): number => statusCode;\n\nexport { normalizeStatusCode };\n","import { normalizeMethod } from './method';\nimport { normalizePath } from './path';\nimport { normalizeStatusCode } from './status-code';\n\nconst defaultNormalizers = {\n  normalizeStatusCode,\n  normalizePath,\n  normalizeMethod,\n};\n\nexport {\n  normalizeStatusCode,\n  normalizePath,\n  normalizeMethod,\n  defaultNormalizers,\n};\n","import { defaultRegister } from '../client';\n\nconst getSummary = async () => defaultRegister.metrics();\nconst getContentType = () => defaultRegister.contentType;\n\nexport { getSummary, getContentType };\n","class Timing {\n  static NS_PER_SEC = BigInt(1e9);\n\n  #startTime?: bigint;\n  #endTime?: bigint;\n\n  constructor() {\n    this.reset();\n  }\n\n  value() {\n    const startTime = this.#startTime;\n    const endTime = this.#endTime;\n\n    if (!endTime || !startTime) {\n      return { seconds: undefined };\n    }\n\n    return { seconds: Number(endTime - startTime) / Number(Timing.NS_PER_SEC) };\n  }\n\n  reset() {\n    this.#startTime = process.hrtime.bigint();\n    this.#endTime = undefined;\n\n    return this;\n  }\n\n  end() {\n    this.#endTime = process.hrtime.bigint();\n\n    return this;\n  }\n}\n\nconst timing = {\n  start() {\n    return new Timing();\n  },\n};\n\nexport default timing;\nexport { Timing };\n"],"mappings":"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"}