{"version":3,"file":"transformDataFrame.cjs","sources":["../../../src/transformations/transformDataFrame.ts"],"sourcesContent":["import { cloneDeep } from 'lodash';\nimport { MonoTypeOperatorFunction, Observable, of } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\n\nimport { DataFrame } from '../types/dataFrame';\nimport {\n  CustomTransformOperator,\n  DataTransformContext,\n  DataTransformerConfig,\n  FrameMatcher,\n} from '../types/transformations';\n\nimport { getFrameMatchers } from './matchers';\nimport { standardTransformersRegistry, TransformerRegistryItem } from './standardTransformersRegistry';\n\nconst getOperator =\n  (config: DataTransformerConfig, ctx: DataTransformContext): MonoTypeOperatorFunction<DataFrame[]> =>\n  (source) => {\n    const info = standardTransformersRegistry.get(config.id);\n\n    if (!info) {\n      return source;\n    }\n\n    const defaultOptions = info.transformation.defaultOptions ?? {};\n    const options = { ...defaultOptions, ...config.options };\n\n    // when running within Scenes, we can skip var interpolation, since it's already handled upstream\n    const isScenes = window.__grafanaSceneContext != null;\n\n    const interpolated = isScenes\n      ? options\n      : deepIterate(cloneDeep(options), (v) => {\n          if (typeof v === 'string') {\n            return ctx.interpolate(v);\n          }\n          return v;\n        });\n\n    const matcher = config.filter?.options ? getFrameMatchers(config.filter) : undefined;\n    return source.pipe(\n      mergeMap((before) =>\n        of(filterInput(before, matcher)).pipe(\n          info.transformation.operator(interpolated, ctx),\n          postProcessTransform(before, info, matcher)\n        )\n      )\n    );\n  };\n\nfunction filterInput(data: DataFrame[], matcher?: FrameMatcher) {\n  if (matcher) {\n    return data.filter((v) => matcher(v));\n  }\n  return data;\n}\n\nconst postProcessTransform =\n  (before: DataFrame[], info: TransformerRegistryItem, matcher?: FrameMatcher): MonoTypeOperatorFunction<DataFrame[]> =>\n  (source) =>\n    source.pipe(\n      map((after) => {\n        if (after === before) {\n          return after;\n        }\n\n        // Add back the filtered out frames\n        if (matcher) {\n          // keep the frame order the same\n          let insert = 0;\n          const append = before.filter((v, idx) => {\n            const keep = !matcher(v);\n            if (keep && !insert) {\n              insert = idx;\n            }\n            return keep;\n          });\n          if (append.length) {\n            after.splice(insert, 0, ...append);\n          }\n        }\n        return after;\n      })\n    );\n\n/**\n * Apply configured transformations to the input data\n */\nexport function transformDataFrame(\n  options: Array<DataTransformerConfig | CustomTransformOperator>,\n  data: DataFrame[],\n  ctx?: DataTransformContext\n): Observable<DataFrame[]> {\n  const stream = of<DataFrame[]>(data);\n\n  if (!options.length) {\n    return stream;\n  }\n\n  const operators: Array<MonoTypeOperatorFunction<DataFrame[]>> = [];\n  const context = ctx ?? { interpolate: (str) => str };\n\n  for (let index = 0; index < options.length; index++) {\n    const config = options[index];\n\n    if (isCustomTransformation(config)) {\n      operators.push(config(context));\n    } else {\n      if (config.disabled) {\n        continue;\n      }\n      operators.push(getOperator(config, context));\n    }\n  }\n\n  // @ts-ignore TypeScript has a hard time understanding this construct\n  return stream.pipe.apply(stream, operators);\n}\n\nfunction isCustomTransformation(t: DataTransformerConfig | CustomTransformOperator): t is CustomTransformOperator {\n  return typeof t === 'function';\n}\n\nfunction deepIterate<T extends object>(obj: T, doSomething: (current: any) => any): T;\n// eslint-disable-next-line no-redeclare\nfunction deepIterate(obj: any, doSomething: (current: any) => any): any {\n  if (Array.isArray(obj)) {\n    return obj.map((o) => deepIterate(o, doSomething));\n  }\n\n  if (typeof obj === 'object') {\n    for (const key in obj) {\n      obj[key] = deepIterate(obj[key], doSomething);\n    }\n\n    return obj;\n  } else {\n    return doSomething(obj) ?? obj;\n  }\n}\n"],"names":["standardTransformersRegistry","cloneDeep","getFrameMatchers","mergeMap","of","map"],"mappings":"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"}