{"version":3,"file":"index.mjs","sources":["../../src/engine/index.ts"],"sourcesContent":["import { PassThrough, Transform, Readable, Writable } from 'stream';\nimport { pipeline } from 'stream/promises';\nimport { extname } from 'path';\nimport { EOL } from 'os';\nimport type Chain from 'stream-chain';\nimport { chain } from 'stream-chain';\nimport { isEmpty, uniq, last, isNumber, set, pick } from 'lodash/fp';\nimport { diff as semverDiff } from 'semver';\n\nimport type { Struct, Utils } from '@strapi/types';\n\nimport type {\n  IAsset,\n  IDestinationProvider,\n  IEntity,\n  ILink,\n  IMetadata,\n  ISourceProvider,\n  ITransferEngine,\n  ITransferEngineOptions,\n  TransferProgress,\n  ITransferResults,\n  TransferStage,\n  TransferTransform,\n  IProvider,\n  TransferFilters,\n  TransferFilterPreset,\n  StreamItem,\n  SchemaDiffHandler,\n  SchemaDiffHandlerContext,\n  ErrorHandler,\n  ErrorHandlerContext,\n  ErrorHandlers,\n  ErrorCode,\n  StageProgress,\n} from '../../types';\nimport type { Diff } from '../utils/json';\n\nimport { compareSchemas, validateProvider } from './validation';\n\nimport { TransferEngineError, TransferEngineValidationError } from './errors';\nimport {\n  createDiagnosticReporter,\n  IDiagnosticReporter,\n  ErrorDiagnosticSeverity,\n} from '../utils/diagnostic';\nimport { DataTransferError } from '../errors';\nimport * as utils from '../utils';\nimport { ProviderTransferError } from '../errors/providers';\n\nexport const TRANSFER_STAGES: ReadonlyArray<TransferStage> = Object.freeze([\n  'entities',\n  'links',\n  'assets',\n  'schemas',\n  'configuration',\n]);\n\nexport type TransferGroupFilter = Record<TransferFilterPreset, TransferFilters>;\n\n/**\n * Preset filters for only/exclude options\n * */\nexport const TransferGroupPresets: TransferGroupFilter = {\n  content: {\n    links: true, // Example: content includes the entire links stage\n    entities: true,\n    // TODO: If we need to implement filtering on a running stage, it would be done like this, but we still need to implement it\n    // [\n    //   // Example: content processes the entities stage, but filters individual entities\n    //   {\n    //     filter(data) {\n    //       return shouldIncludeThisData(data);\n    //     },\n    //   },\n    // ],\n  },\n  files: {\n    assets: true,\n  },\n  config: {\n    configuration: true,\n  },\n};\n\nexport const DEFAULT_VERSION_STRATEGY = 'ignore';\nexport const DEFAULT_SCHEMA_STRATEGY = 'strict';\n\ntype SchemaMap = Utils.String.Dict<Struct.Schema>;\n\nclass TransferEngine<\n  S extends ISourceProvider = ISourceProvider,\n  D extends IDestinationProvider = IDestinationProvider,\n> implements ITransferEngine\n{\n  sourceProvider: ISourceProvider;\n\n  destinationProvider: IDestinationProvider;\n\n  options: ITransferEngineOptions;\n\n  #metadata: { source?: IMetadata; destination?: IMetadata } = {};\n\n  #schema: { source?: SchemaMap; destination?: SchemaMap } = {};\n\n  // Progress of the current stage\n  progress: {\n    // metrics on the progress such as size and record count\n    data: TransferProgress;\n    // stream that emits events\n    stream: PassThrough;\n  };\n\n  diagnostics: IDiagnosticReporter;\n\n  #handlers: {\n    schemaDiff: SchemaDiffHandler[];\n    errors: Partial<ErrorHandlers>;\n  } = {\n    schemaDiff: [],\n    errors: {},\n  };\n\n  #currentStreamController?: AbortController;\n\n  #aborted: boolean = false;\n\n  onSchemaDiff(handler: SchemaDiffHandler) {\n    this.#handlers?.schemaDiff?.push(handler);\n  }\n\n  addErrorHandler(handlerName: ErrorCode, handler: ErrorHandler) {\n    if (!this.#handlers.errors[handlerName]) {\n      this.#handlers.errors[handlerName] = [];\n    }\n    this.#handlers.errors[handlerName]?.push(handler);\n  }\n\n  async attemptResolveError(error: Error) {\n    const context: ErrorHandlerContext = {};\n    if (error instanceof ProviderTransferError && error.details?.details.code) {\n      const errorCode = error.details?.details.code as ErrorCode;\n      if (!this.#handlers.errors[errorCode]) {\n        this.#handlers.errors[errorCode] = [];\n      }\n      await utils.middleware.runMiddleware(context ?? {}, this.#handlers.errors[errorCode] ?? []);\n    }\n\n    return !!context.ignore;\n  }\n\n  constructor(sourceProvider: S, destinationProvider: D, options: ITransferEngineOptions) {\n    this.diagnostics = createDiagnosticReporter();\n\n    validateProvider('source', sourceProvider);\n    validateProvider('destination', destinationProvider);\n\n    this.sourceProvider = sourceProvider;\n    this.destinationProvider = destinationProvider;\n    this.options = options;\n\n    this.progress = { data: {}, stream: new PassThrough({ objectMode: true }) };\n  }\n\n  /**\n   * Report a fatal error and throw it\n   */\n  panic(error: Error) {\n    this.reportError(error, 'fatal');\n\n    throw error;\n  }\n\n  /**\n   * Report an error diagnostic\n   */\n  reportError(error: Error, severity: ErrorDiagnosticSeverity) {\n    this.diagnostics.report({\n      kind: 'error',\n      details: {\n        severity,\n        createdAt: new Date(),\n        name: error.name,\n        message: error.message,\n        error,\n      },\n    });\n  }\n\n  /**\n   * Report a warning diagnostic\n   */\n  reportWarning(message: string, origin?: string) {\n    this.diagnostics.report({\n      kind: 'warning',\n      details: { createdAt: new Date(), message, origin },\n    });\n  }\n\n  /**\n   * Report an info diagnostic\n   */\n  reportInfo(message: string, params?: unknown) {\n    this.diagnostics.report({\n      kind: 'info',\n      details: { createdAt: new Date(), message, params, origin: 'engine' },\n    });\n  }\n\n  /**\n   * Create and return a transform stream based on the given stage and options.\n   *\n   * Allowed transformations includes 'filter' and 'map'.\n   */\n  #createStageTransformStream<T extends TransferStage>(\n    key: T,\n    options: { includeGlobal?: boolean } = {}\n  ): PassThrough | Transform {\n    const { includeGlobal = true } = options;\n    const { throttle } = this.options;\n    const { global: globalTransforms, [key]: stageTransforms } = this.options?.transforms ?? {};\n\n    let stream: PassThrough | Chain = new PassThrough({ objectMode: true });\n\n    const applyTransforms = <U>(transforms: TransferTransform<U>[] = []) => {\n      const chainTransforms: StreamItem[] = [];\n      for (const transform of transforms) {\n        if ('filter' in transform) {\n          chainTransforms.push(utils.stream.filter(transform.filter));\n        }\n\n        if ('map' in transform) {\n          chainTransforms.push(utils.stream.map(transform.map));\n        }\n      }\n      if (chainTransforms.length) {\n        stream = stream.pipe(chain(chainTransforms));\n      }\n    };\n\n    if (includeGlobal) {\n      applyTransforms(globalTransforms);\n    }\n\n    if (isNumber(throttle) && throttle > 0) {\n      stream = stream.pipe(\n        new PassThrough({\n          objectMode: true,\n          async transform(data, _encoding, callback) {\n            await new Promise((resolve) => {\n              setTimeout(resolve, throttle);\n            });\n            callback(null, data);\n          },\n        })\n      );\n    }\n\n    applyTransforms(stageTransforms as TransferTransform<unknown>[]);\n\n    return stream;\n  }\n\n  /**\n   * Update the Engine's transfer progress data for a given stage.\n   *\n   * Providing aggregate options enable custom computation to get the size (bytes) or the aggregate key associated with the data\n   */\n  #updateTransferProgress<T = unknown>(\n    stage: TransferStage,\n    data: T,\n    aggregate?: {\n      size?: (value: T) => number;\n      key?: (value: T) => string;\n    }\n  ) {\n    if (!this.progress.data[stage]) {\n      this.progress.data[stage] = { count: 0, bytes: 0, startTime: Date.now() };\n    }\n\n    const stageProgress = this.progress.data[stage];\n\n    if (!stageProgress) {\n      return;\n    }\n\n    const size = aggregate?.size?.(data) ?? JSON.stringify(data).length;\n    const key = aggregate?.key?.(data);\n\n    stageProgress.count += 1;\n    stageProgress.bytes += size;\n\n    // Handle aggregate updates if necessary\n    if (key) {\n      if (!stageProgress.aggregates) {\n        stageProgress.aggregates = {};\n      }\n\n      const { aggregates } = stageProgress;\n\n      if (!aggregates[key]) {\n        aggregates[key] = { count: 0, bytes: 0 };\n      }\n\n      aggregates[key].count += 1;\n      aggregates[key].bytes += size;\n    }\n  }\n\n  /**\n   * Create and return a PassThrough stream for per-object progress tracking.\n   * Upon writing data into it, it'll update the Engine's transfer progress data and trigger stage update events.\n   */\n  #progressTracker(\n    stage: TransferStage,\n    aggregate?: {\n      size?(value: unknown): number;\n      key?(value: unknown): string;\n    }\n  ) {\n    return new PassThrough({\n      objectMode: true,\n      transform: (data, _encoding, callback) => {\n        this.#updateTransferProgress(stage, data, aggregate);\n        this.#emitStageUpdate('progress', stage);\n        callback(null, data);\n      },\n    });\n  }\n\n  /**\n   * Create and return a PassThrough stream for per-chunk progress tracking (used for assets).\n   * Pipes each asset's binary stream through a Transform that counts bytes and forwards chunks,\n   * then replaces asset.stream with that transform so the destination has a single consumer.\n   * This avoids consuming the stream (which would leave the destination with an empty stream)\n   * and ensures backpressure is applied so memory is not held for the entire transfer.\n   */\n  #progressTrackerChunks(\n    stage: TransferStage,\n    aggregate?: {\n      key?(value: unknown): string;\n    }\n  ) {\n    const updateAggregateBytes = this.#updateAggregateBytes.bind(this);\n    const incrementAggregateCount = this.#incrementAggregateCount.bind(this);\n    const emitStageUpdate = this.#emitStageUpdate.bind(this);\n\n    return new PassThrough({\n      objectMode: true,\n      transform: (asset, _encoding, callback) => {\n        if (!asset?.stream || typeof asset.stream.pipe !== 'function') {\n          return callback(null, asset);\n        }\n\n        const key = aggregate?.key?.(asset);\n        if (!this.progress.data[stage]) {\n          this.progress.data[stage] = { count: 0, bytes: 0, startTime: Date.now() };\n        }\n        const stageProgress = this.progress.data[stage];\n\n        if (!stageProgress) {\n          throw new TransferEngineError('fatal', 'Stage progress data not found');\n        }\n\n        const progressTransform = new Transform({\n          objectMode: true,\n          transform(chunk: Buffer | unknown, _enc, cb) {\n            // Asset file reads should yield Buffers; avoid skewing totals if not.\n            const byteLength = Buffer.isBuffer(chunk) ? chunk.length : 1;\n            stageProgress.bytes += byteLength;\n            if (key) {\n              updateAggregateBytes(stageProgress, key, byteLength);\n            }\n            emitStageUpdate('progress', stage);\n            cb(null, chunk);\n          },\n          flush(cb) {\n            stageProgress.count += 1;\n            if (key) {\n              incrementAggregateCount(stageProgress, key);\n            }\n            emitStageUpdate('progress', stage);\n            cb(null);\n          },\n        });\n\n        asset.stream.on('error', (err: Error) => progressTransform.destroy(err));\n        asset.stream.pipe(progressTransform);\n        asset.stream = progressTransform;\n        callback(null, asset);\n      },\n    });\n  }\n\n  #updateAggregateBytes = (stageProgress: StageProgress, key: string, bytes: number) => {\n    if (!stageProgress.aggregates) {\n      stageProgress.aggregates = {};\n    }\n    if (!stageProgress.aggregates[key]) {\n      stageProgress.aggregates[key] = { count: 0, bytes: 0 };\n    }\n    stageProgress.aggregates[key].bytes += bytes;\n  };\n\n  #incrementAggregateCount = (stageProgress: StageProgress, key: string) => {\n    if (!stageProgress.aggregates) {\n      stageProgress.aggregates = {};\n    }\n    if (!stageProgress.aggregates[key]) {\n      stageProgress.aggregates[key] = { count: 0, bytes: 0 };\n    }\n    stageProgress.aggregates[key].count += 1;\n  };\n\n  /**\n   * Shorthand method used to trigger transfer update events to every listeners\n   */\n  #emitTransferUpdate(type: 'init' | 'start' | 'finish' | 'error', payload?: object) {\n    this.progress.stream.emit(`transfer::${type}`, payload);\n  }\n\n  /**\n   * Shorthand method used to trigger stage update events to every listeners\n   */\n  #emitStageUpdate(\n    type: 'start' | 'finish' | 'progress' | 'skip' | 'error',\n    transferStage: TransferStage\n  ) {\n    this.progress.stream.emit(`stage::${type}`, {\n      data: this.progress.data,\n      stage: transferStage,\n    });\n  }\n\n  /**\n   * Run a version check between two strapi version (source and destination) using the strategy given to the engine during initialization.\n   *\n   * If there is a mismatch, throws a validation error.\n   */\n  #assertStrapiVersionIntegrity(sourceVersion?: string, destinationVersion?: string) {\n    const strategy = this.options.versionStrategy || DEFAULT_VERSION_STRATEGY;\n\n    const reject = () => {\n      throw new TransferEngineValidationError(\n        `The source and destination provide are targeting incompatible Strapi versions (using the \"${strategy}\" strategy). The source (${this.sourceProvider.name}) version is ${sourceVersion} and the destination (${this.destinationProvider.name}) version is ${destinationVersion}`,\n        {\n          check: 'strapi.version',\n          strategy,\n          versions: { source: sourceVersion, destination: destinationVersion },\n        }\n      );\n    };\n\n    if (\n      !sourceVersion ||\n      !destinationVersion ||\n      strategy === 'ignore' ||\n      destinationVersion === sourceVersion\n    ) {\n      return;\n    }\n\n    let diff;\n    try {\n      diff = semverDiff(sourceVersion, destinationVersion);\n    } catch {\n      reject();\n    }\n\n    if (!diff) {\n      return;\n    }\n\n    const validPatch = ['prelease', 'build'];\n    const validMinor = [...validPatch, 'patch', 'prepatch'];\n    const validMajor = [...validMinor, 'minor', 'preminor'];\n    if (strategy === 'patch' && validPatch.includes(diff)) {\n      return;\n    }\n    if (strategy === 'minor' && validMinor.includes(diff)) {\n      return;\n    }\n    if (strategy === 'major' && validMajor.includes(diff)) {\n      return;\n    }\n\n    reject();\n  }\n\n  /**\n   * Run a check between two set of schemas (source and destination) using the strategy given to the engine during initialization.\n   *\n   * If there are differences and/or incompatibilities between source and destination schemas, then throw a validation error.\n   */\n  #assertSchemasMatching(sourceSchemas: SchemaMap, destinationSchemas: SchemaMap) {\n    const strategy = this.options.schemaStrategy || DEFAULT_SCHEMA_STRATEGY;\n\n    if (strategy === 'ignore') {\n      return;\n    }\n\n    const keys = uniq(Object.keys(sourceSchemas).concat(Object.keys(destinationSchemas)));\n    const diffs: { [key: string]: Diff[] } = {};\n\n    keys.forEach((key) => {\n      const sourceSchema = sourceSchemas[key];\n      const destinationSchema = destinationSchemas[key];\n      const schemaDiffs = compareSchemas(sourceSchema, destinationSchema, strategy);\n\n      if (schemaDiffs.length) {\n        diffs[key] = schemaDiffs as Diff<Struct.Schema>[];\n      }\n    });\n\n    if (!isEmpty(diffs)) {\n      const formattedDiffs = Object.entries(diffs)\n        .map(([uid, ctDiffs]) => {\n          let msg = `- ${uid}:${EOL}`;\n\n          msg += ctDiffs\n            .sort((a, b) => (a.kind > b.kind ? -1 : 1))\n            .map((diff) => {\n              const path = diff.path.join('.');\n\n              if (diff.kind === 'added') {\n                return `${path} exists in destination schema but not in source schema and the data will not be transferred.`;\n              }\n\n              if (diff.kind === 'deleted') {\n                return `${path} exists in source schema but not in destination schema and the data will not be transferred.`;\n              }\n\n              if (diff.kind === 'modified') {\n                if (diff.types[0] === diff.types[1]) {\n                  return `Schema value changed at \"${path}\": \"${diff.values[0]}\" (${diff.types[0]}) => \"${diff.values[1]}\" (${diff.types[1]})`;\n                }\n\n                return `Schema has differing data types at \"${path}\": \"${diff.values[0]}\" (${diff.types[0]}) => \"${diff.values[1]}\" (${diff.types[1]})`;\n              }\n\n              throw new TransferEngineValidationError(`Invalid diff found for \"${uid}\"`, {\n                check: `schema on ${uid}`,\n              });\n            })\n            .map((line) => `  - ${line}`)\n            .join(EOL);\n\n          return msg;\n        })\n        .join(EOL);\n\n      throw new TransferEngineValidationError(\n        `Invalid schema changes detected during integrity checks (using the ${strategy} strategy). Please find a summary of the changes below:\\n${formattedDiffs}`,\n        {\n          check: 'schema.changes',\n          strategy,\n          diffs,\n        }\n      );\n    }\n  }\n\n  shouldSkipStage(stage: TransferStage) {\n    const { exclude, only } = this.options;\n\n    // schemas must always be included\n    if (stage === 'schemas') {\n      return false;\n    }\n\n    // everything is included by default unless 'only' has been set\n    let included = isEmpty(only);\n    if (only && only.length > 0) {\n      included = only.some((transferGroup) => {\n        return TransferGroupPresets[transferGroup][stage];\n      });\n    }\n\n    if (exclude && exclude.length > 0) {\n      if (included) {\n        included = !exclude.some((transferGroup) => {\n          return TransferGroupPresets[transferGroup][stage];\n        });\n      }\n    }\n\n    return !included;\n  }\n\n  async #transferStage(options: {\n    stage: TransferStage;\n    source?: Readable;\n    destination?: Writable;\n    transform?: PassThrough | Chain;\n    tracker?: PassThrough;\n  }) {\n    if (this.#aborted) {\n      throw new TransferEngineError('fatal', 'Transfer aborted.');\n    }\n\n    const { stage, source, destination, transform, tracker } = options;\n\n    const updateEndTime = () => {\n      const stageData = this.progress.data[stage];\n\n      if (stageData) {\n        stageData.endTime = Date.now();\n      }\n    };\n\n    if (!source || !destination || this.shouldSkipStage(stage)) {\n      // Wait until source and destination are closed\n      const results = await Promise.allSettled(\n        [source, destination].map((stream) => {\n          // if stream is undefined or already closed, resolve immediately\n          if (!stream || stream.destroyed) {\n            return Promise.resolve();\n          }\n\n          // Wait until the close event is produced and then destroy the stream and resolve\n          return new Promise((resolve, reject) => {\n            stream.on('close', resolve).on('error', reject).destroy();\n          });\n        })\n      );\n\n      results.forEach((state) => {\n        if (state.status === 'rejected') {\n          this.reportWarning(state.reason, `transfer(${stage})`);\n        }\n      });\n\n      this.#emitStageUpdate('skip', stage);\n\n      return;\n    }\n\n    this.#emitStageUpdate('start', stage);\n\n    try {\n      const streams: (Readable | Writable)[] = [source];\n\n      if (transform) {\n        streams.push(transform);\n      }\n      if (tracker) {\n        streams.push(tracker);\n      }\n\n      streams.push(destination);\n\n      // NOTE: to debug/confirm backpressure issues from misbehaving stream, uncomment the following lines\n      // source.on('pause', () => console.log(`[${stage}] Source paused due to backpressure`));\n      // source.on('resume', () => console.log(`[${stage}] Source resumed`));\n      // destination.on('drain', () =>\n      //   console.log(`[${stage}] Destination drained, resuming data flow`)\n      // );\n      // destination.on('error', (err) => console.error(`[${stage}] Destination error:`, err));\n\n      const controller = new AbortController();\n      const { signal } = controller;\n\n      // Store the controller so you can cancel later\n      this.#currentStreamController = controller;\n\n      await pipeline(streams, { signal });\n\n      this.#emitStageUpdate('finish', stage);\n    } catch (e) {\n      updateEndTime();\n      this.#emitStageUpdate('error', stage);\n      this.reportError(e as Error, 'error');\n      if (!destination.destroyed) {\n        destination.destroy(e as Error);\n      }\n      throw e;\n    } finally {\n      updateEndTime();\n    }\n  }\n\n  // Cause an ongoing transfer to abort gracefully\n  async abortTransfer(): Promise<void> {\n    this.#aborted = true;\n    this.#currentStreamController?.abort();\n    throw new TransferEngineError('fatal', 'Transfer aborted.');\n  }\n\n  async init(): Promise<void> {\n    // Resolve providers' resource and store\n    // them in the engine's internal state\n    await this.#resolveProviderResource();\n\n    // Update the destination provider's source metadata\n    const { source: sourceMetadata } = this.#metadata;\n\n    if (sourceMetadata) {\n      this.destinationProvider.setMetadata?.('source', sourceMetadata);\n    }\n  }\n\n  /**\n   * Run the bootstrap method in both source and destination providers\n   */\n  async bootstrap(): Promise<void> {\n    const results = await Promise.allSettled([\n      this.sourceProvider.bootstrap?.(this.diagnostics),\n      this.destinationProvider.bootstrap?.(this.diagnostics),\n    ]);\n\n    results.forEach((result) => {\n      if (result.status === 'rejected') {\n        this.panic(result.reason);\n      }\n    });\n  }\n\n  /**\n   * Run the close method in both source and destination providers\n   */\n  async close(): Promise<void> {\n    const results = await Promise.allSettled([\n      this.sourceProvider.close?.(),\n      this.destinationProvider.close?.(),\n    ]);\n\n    results.forEach((result) => {\n      if (result.status === 'rejected') {\n        this.panic(result.reason);\n      }\n    });\n  }\n\n  async #resolveProviderResource() {\n    const sourceMetadata = await this.sourceProvider.getMetadata();\n    const destinationMetadata = await this.destinationProvider.getMetadata();\n\n    if (sourceMetadata) {\n      this.#metadata.source = sourceMetadata;\n    }\n\n    if (destinationMetadata) {\n      this.#metadata.destination = destinationMetadata;\n    }\n  }\n\n  async #getSchemas() {\n    if (!this.#schema.source) {\n      this.#schema.source = (await this.sourceProvider.getSchemas?.()) as SchemaMap;\n    }\n\n    if (!this.#schema.destination) {\n      this.#schema.destination = (await this.destinationProvider.getSchemas?.()) as SchemaMap;\n    }\n\n    return {\n      sourceSchemas: this.#schema.source,\n      destinationSchemas: this.#schema.destination,\n    };\n  }\n\n  async integrityCheck() {\n    const sourceMetadata = await this.sourceProvider.getMetadata();\n    const destinationMetadata = await this.destinationProvider.getMetadata();\n\n    if (sourceMetadata && destinationMetadata) {\n      this.#assertStrapiVersionIntegrity(\n        sourceMetadata?.strapi?.version,\n        destinationMetadata?.strapi?.version\n      );\n    }\n\n    const { sourceSchemas, destinationSchemas } = await this.#getSchemas();\n\n    try {\n      if (sourceSchemas && destinationSchemas) {\n        this.#assertSchemasMatching(sourceSchemas, destinationSchemas);\n      }\n    } catch (error) {\n      // if this is a schema matching error, allow handlers to resolve it\n      if (error instanceof TransferEngineValidationError && error.details?.details?.diffs) {\n        const schemaDiffs = error.details?.details?.diffs as Record<string, Diff[]>;\n\n        const context: SchemaDiffHandlerContext = {\n          ignoredDiffs: {},\n          diffs: schemaDiffs,\n          source: this.sourceProvider,\n          destination: this.destinationProvider,\n        };\n\n        // if we don't have any handlers, throw the original error\n        if (isEmpty(this.#handlers.schemaDiff)) {\n          throw error;\n        }\n\n        await utils.middleware.runMiddleware<SchemaDiffHandlerContext>(\n          context,\n          this.#handlers.schemaDiff\n        );\n\n        // if there are any remaining diffs that weren't ignored\n        const unresolvedDiffs = utils.json.diff(context.diffs, context.ignoredDiffs);\n        if (unresolvedDiffs.length) {\n          this.panic(\n            new TransferEngineValidationError('Unresolved differences in schema', {\n              check: 'schema.changes',\n              unresolvedDiffs,\n            })\n          );\n        }\n\n        return;\n      }\n\n      throw error;\n    }\n  }\n\n  async transfer(): Promise<ITransferResults<S, D>> {\n    // reset data between transfers\n    this.progress.data = {};\n\n    try {\n      this.#emitTransferUpdate('init');\n      await this.bootstrap();\n      await this.init();\n\n      await this.integrityCheck();\n\n      this.#emitTransferUpdate('start');\n\n      await this.beforeTransfer();\n\n      // Run the transfer stages\n      await this.transferSchemas();\n      await this.transferEntities();\n      await this.transferAssets();\n      await this.transferLinks();\n      await this.transferConfiguration();\n      // Gracefully close the providers\n      await this.close();\n\n      this.#emitTransferUpdate('finish');\n    } catch (e: unknown) {\n      this.#emitTransferUpdate('error', { error: e });\n\n      const lastDiagnostic = last(this.diagnostics.stack.items);\n      // Do not report an error diagnostic if the last one reported the same error\n      if (\n        e instanceof Error &&\n        (!lastDiagnostic || lastDiagnostic.kind !== 'error' || lastDiagnostic.details.error !== e)\n      ) {\n        this.reportError(e, (e as DataTransferError).severity || 'fatal');\n      }\n\n      // Rollback the destination provider if an exception is thrown during the transfer\n      // Note: This will be configurable in the future\n      await this.destinationProvider.rollback?.(e as Error);\n\n      throw e;\n    }\n\n    return {\n      source: this.sourceProvider.results,\n      destination: this.destinationProvider.results,\n      engine: this.progress.data,\n    };\n  }\n\n  async beforeTransfer(): Promise<void> {\n    const runWithDiagnostic = async (provider: IProvider) => {\n      try {\n        await provider.beforeTransfer?.();\n      } catch (error) {\n        if (error instanceof Error) {\n          const resolved = await this.attemptResolveError(error);\n\n          if (resolved) {\n            return;\n          }\n          this.panic(error);\n        } else {\n          this.panic(\n            new Error(`Unknwon error when executing \"beforeTransfer\" on the ${origin} provider`)\n          );\n        }\n      }\n    };\n\n    await runWithDiagnostic(this.sourceProvider);\n    await runWithDiagnostic(this.destinationProvider);\n  }\n\n  async transferSchemas(): Promise<void> {\n    const stage: TransferStage = 'schemas';\n    if (this.shouldSkipStage(stage)) {\n      return;\n    }\n\n    const source = await this.sourceProvider.createSchemasReadStream?.();\n    const destination = await this.destinationProvider.createSchemasWriteStream?.();\n\n    const transform = this.#createStageTransformStream(stage);\n    const tracker = this.#progressTracker(stage, {\n      key: (value: Struct.Schema) => value.modelType,\n    });\n\n    await this.#transferStage({ stage, source, destination, transform, tracker });\n  }\n\n  async transferEntities(): Promise<void> {\n    const stage: TransferStage = 'entities';\n    if (this.shouldSkipStage(stage)) {\n      return;\n    }\n\n    const source = await this.sourceProvider.createEntitiesReadStream?.();\n    const destination = await this.destinationProvider.createEntitiesWriteStream?.();\n\n    const transform = chain([\n      this.#createStageTransformStream(stage),\n      new Transform({\n        objectMode: true,\n        transform: async (entity: IEntity, _encoding, callback) => {\n          const { destinationSchemas: schemas } = await this.#getSchemas();\n\n          if (!schemas) {\n            return callback(null, entity);\n          }\n\n          // TODO: this would be safer if we only ignored things in ignoredDiffs, otherwise continue and let an error be thrown\n          const availableContentTypes = Object.entries(schemas)\n            .filter(([, schema]) => schema.modelType === 'contentType')\n            .map(([uid]) => uid);\n\n          // If the type of the transferred entity doesn't exist in the destination, then discard it\n          if (!availableContentTypes.includes(entity.type)) {\n            return callback(null, undefined);\n          }\n\n          const { type, data } = entity;\n          const attributes = schemas[type].attributes;\n          const attributesToKeep = Object.keys(attributes).concat('documentId');\n          const updatedEntity = set('data', pick(attributesToKeep, data), entity);\n\n          callback(null, updatedEntity);\n        },\n      }),\n    ]);\n\n    const tracker = this.#progressTracker(stage, { key: (value: IEntity) => value.type });\n\n    await this.#transferStage({ stage, source, destination, transform, tracker });\n  }\n\n  async transferLinks(): Promise<void> {\n    const stage: TransferStage = 'links';\n    if (this.shouldSkipStage(stage)) {\n      return;\n    }\n\n    const source = await this.sourceProvider.createLinksReadStream?.();\n    const destination = await this.destinationProvider.createLinksWriteStream?.();\n\n    const transform = chain([\n      this.#createStageTransformStream(stage),\n      new Transform({\n        objectMode: true,\n        transform: async (link: ILink, _encoding, callback) => {\n          const { destinationSchemas: schemas } = await this.#getSchemas();\n          if (!schemas) {\n            return callback(null, link);\n          }\n\n          // TODO: this would be safer if we only ignored things in ignoredDiffs, otherwise continue and let an error be thrown\n          const availableContentTypes = Object.keys(schemas);\n\n          const isValidType = (uid: string) => availableContentTypes.includes(uid);\n\n          if (!isValidType(link.left.type) || !isValidType(link.right.type)) {\n            return callback(null, undefined); // ignore the link\n          }\n\n          callback(null, link);\n        },\n      }),\n    ]);\n\n    const tracker = this.#progressTracker(stage);\n\n    await this.#transferStage({ stage, source, destination, transform, tracker });\n  }\n\n  async transferAssets(): Promise<void> {\n    const stage: TransferStage = 'assets';\n    if (this.shouldSkipStage(stage)) {\n      return;\n    }\n\n    const source = await this.sourceProvider.createAssetsReadStream?.();\n    const destination = await this.destinationProvider.createAssetsWriteStream?.();\n\n    const transform = this.#createStageTransformStream(stage);\n    const tracker = this.#progressTrackerChunks(stage, {\n      key: (value: IAsset) => extname(value.filename) || 'No extension',\n    });\n\n    await this.#mergeSourceStageTotals(stage);\n    await this.#transferStage({ stage, source, destination, transform, tracker });\n  }\n\n  /**\n   * Merge optional source-reported totals into progress before the stage starts (CLI ETA / totals).\n   */\n  async #mergeSourceStageTotals(stage: TransferStage) {\n    const getTotals = this.sourceProvider.getStageTotals;\n    if (!getTotals) {\n      return;\n    }\n    const totals = await getTotals.call(this.sourceProvider, stage);\n    if (!totals || (totals.totalBytes == null && totals.totalCount == null)) {\n      return;\n    }\n    if (!this.progress.data[stage]) {\n      this.progress.data[stage] = { count: 0, bytes: 0, startTime: Date.now() };\n    }\n    const stageProgress = this.progress.data[stage];\n    if (!stageProgress) {\n      return;\n    }\n    if (totals.totalBytes != null) {\n      stageProgress.totalBytes = totals.totalBytes;\n    }\n    if (totals.totalCount != null) {\n      stageProgress.totalCount = totals.totalCount;\n    }\n  }\n\n  async transferConfiguration(): Promise<void> {\n    const stage: TransferStage = 'configuration';\n    if (this.shouldSkipStage(stage)) {\n      return;\n    }\n\n    const source = await this.sourceProvider.createConfigurationReadStream?.();\n    const destination = await this.destinationProvider.createConfigurationWriteStream?.();\n\n    const transform = this.#createStageTransformStream(stage);\n    const tracker = this.#progressTracker(stage);\n\n    await this.#transferStage({ stage, source, destination, transform, tracker });\n  }\n}\n\nexport const createTransferEngine = <S extends ISourceProvider, D extends IDestinationProvider>(\n  sourceProvider: S,\n  destinationProvider: D,\n  options: ITransferEngineOptions\n): TransferEngine<S, D> => {\n  return new TransferEngine<S, D>(sourceProvider, destinationProvider, options);\n};\n\nexport type {\n  TransferEngine,\n  ITransferEngine,\n  ITransferEngineOptions,\n  ISourceProvider,\n  IDestinationProvider,\n  TransferStage,\n  TransferFilterPreset,\n  ErrorHandlerContext,\n  SchemaDiffHandlerContext,\n  ITransferResults,\n};\n\nexport * as errors from './errors';\n"],"names":["TRANSFER_STAGES","Object","freeze","TransferGroupPresets","content","links","entities","files","assets","config","configuration","DEFAULT_VERSION_STRATEGY","DEFAULT_SCHEMA_STRATEGY","TransferEngine","onSchemaDiff","handler","schemaDiff","push","addErrorHandler","handlerName","errors","attemptResolveError","error","context","ProviderTransferError","details","code","errorCode","utils","ignore","panic","reportError","severity","diagnostics","report","kind","createdAt","Date","name","message","reportWarning","origin","reportInfo","params","shouldSkipStage","stage","exclude","only","options","included","isEmpty","length","some","transferGroup","abortTransfer","abort","TransferEngineError","init","source","sourceMetadata","destinationProvider","setMetadata","bootstrap","results","Promise","allSettled","sourceProvider","forEach","result","status","reason","close","integrityCheck","getMetadata","destinationMetadata","strapi","version","sourceSchemas","destinationSchemas","TransferEngineValidationError","diffs","schemaDiffs","ignoredDiffs","destination","unresolvedDiffs","check","transfer","progress","data","beforeTransfer","transferSchemas","transferEntities","transferAssets","transferLinks","transferConfiguration","e","lastDiagnostic","last","stack","items","Error","rollback","engine","runWithDiagnostic","provider","resolved","createSchemasReadStream","createSchemasWriteStream","transform","tracker","key","value","modelType","createEntitiesReadStream","createEntitiesWriteStream","chain","Transform","objectMode","entity","_encoding","callback","schemas","availableContentTypes","entries","filter","schema","map","uid","includes","type","undefined","attributes","attributesToKeep","keys","concat","updatedEntity","set","pick","createLinksReadStream","createLinksWriteStream","link","isValidType","left","right","createAssetsReadStream","createAssetsWriteStream","extname","filename","createConfigurationReadStream","createConfigurationWriteStream","stageProgress","bytes","aggregates","count","createDiagnosticReporter","validateProvider","stream","PassThrough","includeGlobal","throttle","global","globalTransforms","stageTransforms","transforms","applyTransforms","chainTransforms","pipe","isNumber","resolve","setTimeout","aggregate","startTime","now","size","JSON","stringify","updateAggregateBytes","bind","incrementAggregateCount","emitStageUpdate","asset","progressTransform","chunk","_enc","cb","byteLength","Buffer","isBuffer","flush","on","err","destroy","payload","emit","transferStage","sourceVersion","destinationVersion","strategy","versionStrategy","reject","versions","diff","semverDiff","validPatch","validMinor","validMajor","schemaStrategy","uniq","sourceSchema","destinationSchema","compareSchemas","formattedDiffs","ctDiffs","msg","EOL","sort","a","b","path","join","types","values","line","updateEndTime","stageData","endTime","destroyed","state","streams","controller","AbortController","signal","pipeline","getSchemas","getTotals","getStageTotals","totals","call","totalBytes","totalCount","createTransferEngine"],"mappings":"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"}