diff --git a/packages/core/data-transfer/src/engine/index.ts b/packages/core/data-transfer/src/engine/index.ts index fad735aa3c..cfdc52a2a2 100644 --- a/packages/core/data-transfer/src/engine/index.ts +++ b/packages/core/data-transfer/src/engine/index.ts @@ -23,6 +23,7 @@ import type { TransferFilters, TransferFilterPreset, SchemaDiffHandler, + SchemaDiffHandlerContext, SchemaMap, } from '../../types'; import type { Diff } from '../utils/json'; @@ -30,11 +31,7 @@ import type { Diff } from '../utils/json'; import { compareSchemas, validateProvider } from './validation'; import { filter, map } from '../utils/stream'; -import { - TransferEngineError, - TransferEngineInitializationError, - TransferEngineValidationError, -} from './errors'; +import { TransferEngineError, TransferEngineValidationError } from './errors'; import { createDiagnosticReporter, IDiagnosticReporter, @@ -98,8 +95,6 @@ class TransferEngine< #metadata: { source?: IMetadata; destination?: IMetadata } = {}; - #ignoredDiffs: Record = {}; - // Progress of the current stage progress: { // metrics on the progress such as size and record count @@ -556,7 +551,7 @@ class TransferEngine< if (!this.#currentStream) { throw err; } - this.#currentStream?.destroy(err); + this.#currentStream.destroy(err); } async init(): Promise { @@ -640,20 +635,29 @@ class TransferEngine< if (error instanceof TransferEngineValidationError && error.details?.details?.diffs) { const schemaDiffs = error.details?.details?.diffs as Record; - const context = { - ignoreDiffs: {}, + const context: SchemaDiffHandlerContext = { + ignoredDiffs: {}, diffs: schemaDiffs, source: this.sourceProvider, destination: this.destinationProvider, }; - await runMiddleware(context, this.#handlers.schemaDiff); + // if we don't have any handlers, throw the original error + if (isEmpty(this.#handlers.schemaDiff)) { + throw error; + } - this.#ignoredDiffs = context.ignoreDiffs; + await runMiddleware(context, this.#handlers.schemaDiff); // if there are any remaining diffs that weren't ignored - if (utils.json.diff(context.diffs, this.#ignoredDiffs).length) { - this.panic(new TransferEngineInitializationError('Unresolved differences in schema')); + const unresolvedDiffs = utils.json.diff(context.diffs, context.ignoredDiffs); + if (unresolvedDiffs.length) { + this.panic( + new TransferEngineValidationError('Unresolved differences in schema', { + check: 'schema.changes', + unresolvedDiffs, + }) + ); } return; diff --git a/packages/core/data-transfer/types/transfer-engine.d.ts b/packages/core/data-transfer/types/transfer-engine.d.ts index 5ecc0bce21..1c9c729739 100644 --- a/packages/core/data-transfer/types/transfer-engine.d.ts +++ b/packages/core/data-transfer/types/transfer-engine.d.ts @@ -8,15 +8,16 @@ export type TransferFilterPreset = 'content' | 'files' | 'config'; type SchemaMap = Record; // Error resolving handler middleware for the transfer engine -export type Next = (context: T) => void | Promise; -export type Middleware = (context: T, next: Next) => Promise | void; +export type NextMiddleware = (context: T) => void | Promise; +export type Middleware = (context: T, next: NextMiddleware) => Promise | void; export type SchemaDiffHandlerContext = { + ignoredDiffs: Record; diffs: Record; source: ISourceProvider; destination: IDestinationProvider; }; -export type SchemaDiffHandler = (data: SchemaDiffHandlerContext, next: SchemaDiffHandler) => void; +export type SchemaDiffHandler = Middleware; /** * Defines the capabilities and properties of the transfer engine diff --git a/packages/core/strapi/lib/commands/utils/data-transfer.js b/packages/core/strapi/lib/commands/utils/data-transfer.js index 9aef8343d3..a87b9a3a76 100644 --- a/packages/core/strapi/lib/commands/utils/data-transfer.js +++ b/packages/core/strapi/lib/commands/utils/data-transfer.js @@ -334,7 +334,7 @@ const getDiffHandler = (engine, { force }) => { setSignalHandler(() => abortTransfer({ engine, strapi })); if (confirmed) { - context.ignoreDiffs = merge(context.diffs, context.ignoredDiffs); + context.ignoredDiffs = merge(context.diffs, context.ignoredDiffs); } return next(context);