@warlock.js/cascade 4.0.48 → 4.0.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/context/database-data-source-context.d.ts +29 -0
- package/cjs/context/database-data-source-context.d.ts.map +1 -0
- package/cjs/context/database-data-source-context.js +28 -0
- package/cjs/context/database-data-source-context.js.map +1 -0
- package/cjs/context/database-transaction-context.d.ts +31 -0
- package/cjs/context/database-transaction-context.d.ts.map +1 -0
- package/cjs/context/database-transaction-context.js +34 -0
- package/cjs/context/database-transaction-context.js.map +1 -0
- package/cjs/contracts/database-driver.contract.d.ts +143 -0
- package/cjs/contracts/database-driver.contract.d.ts.map +1 -0
- package/cjs/contracts/database-id-generator.contract.d.ts +109 -0
- package/cjs/contracts/database-id-generator.contract.d.ts.map +1 -0
- package/cjs/contracts/database-remover.contract.d.ts +104 -0
- package/cjs/contracts/database-remover.contract.d.ts.map +1 -0
- package/cjs/contracts/database-restorer.contract.d.ts +143 -0
- package/cjs/contracts/database-restorer.contract.d.ts.map +1 -0
- package/cjs/contracts/database-writer.contract.d.ts +119 -0
- package/cjs/contracts/database-writer.contract.d.ts.map +1 -0
- package/cjs/contracts/driver-blueprint.contract.d.ts +45 -0
- package/cjs/contracts/driver-blueprint.contract.d.ts.map +1 -0
- package/cjs/contracts/index.d.ts +10 -0
- package/cjs/contracts/index.d.ts.map +1 -0
- package/cjs/contracts/migration-driver.contract.d.ts +365 -0
- package/cjs/contracts/migration-driver.contract.d.ts.map +1 -0
- package/cjs/contracts/query-builder.contract.d.ts +1128 -0
- package/cjs/contracts/query-builder.contract.d.ts.map +1 -0
- package/cjs/contracts/sync-adapter.contract.d.ts +58 -0
- package/cjs/contracts/sync-adapter.contract.d.ts.map +1 -0
- package/cjs/data-source/data-source-registry.d.ts +104 -0
- package/cjs/data-source/data-source-registry.d.ts.map +1 -0
- package/cjs/data-source/data-source-registry.js +138 -0
- package/cjs/data-source/data-source-registry.js.map +1 -0
- package/cjs/data-source/data-source.d.ts +106 -0
- package/cjs/data-source/data-source.d.ts.map +1 -0
- package/cjs/data-source/data-source.js +77 -0
- package/cjs/data-source/data-source.js.map +1 -0
- package/cjs/database-dirty-tracker.d.ts +253 -0
- package/cjs/database-dirty-tracker.d.ts.map +1 -0
- package/cjs/database-dirty-tracker.js +389 -0
- package/cjs/database-dirty-tracker.js.map +1 -0
- package/cjs/drivers/mongo/mongo-id-generator.d.ts +116 -0
- package/cjs/drivers/mongo/mongo-id-generator.d.ts.map +1 -0
- package/cjs/drivers/mongo/mongo-id-generator.js +149 -0
- package/cjs/drivers/mongo/mongo-id-generator.js.map +1 -0
- package/cjs/drivers/mongo/mongo-migration-driver.d.ts +228 -0
- package/cjs/drivers/mongo/mongo-migration-driver.d.ts.map +1 -0
- package/cjs/drivers/mongo/mongo-migration-driver.js +524 -0
- package/cjs/drivers/mongo/mongo-migration-driver.js.map +1 -0
- package/cjs/drivers/mongo/mongo-query-builder.d.ts +922 -0
- package/cjs/drivers/mongo/mongo-query-builder.d.ts.map +1 -0
- package/cjs/drivers/mongo/mongo-query-builder.js +1740 -0
- package/cjs/drivers/mongo/mongo-query-builder.js.map +1 -0
- package/cjs/drivers/mongo/mongo-query-operations.d.ts +226 -0
- package/cjs/drivers/mongo/mongo-query-operations.d.ts.map +1 -0
- package/cjs/drivers/mongo/mongo-query-operations.js +270 -0
- package/cjs/drivers/mongo/mongo-query-operations.js.map +1 -0
- package/cjs/drivers/mongo/mongo-query-parser.d.ts +262 -0
- package/cjs/drivers/mongo/mongo-query-parser.d.ts.map +1 -0
- package/cjs/drivers/mongo/mongo-query-parser.js +1351 -0
- package/cjs/drivers/mongo/mongo-query-parser.js.map +1 -0
- package/cjs/drivers/mongo/mongo-sync-adapter.d.ts +79 -0
- package/cjs/drivers/mongo/mongo-sync-adapter.d.ts.map +1 -0
- package/cjs/drivers/mongo/mongo-sync-adapter.js +146 -0
- package/cjs/drivers/mongo/mongo-sync-adapter.js.map +1 -0
- package/cjs/drivers/mongo/mongodb-blueprint.d.ts +30 -0
- package/cjs/drivers/mongo/mongodb-blueprint.d.ts.map +1 -0
- package/cjs/drivers/mongo/mongodb-blueprint.js +51 -0
- package/cjs/drivers/mongo/mongodb-blueprint.js.map +1 -0
- package/cjs/drivers/mongo/mongodb-driver.d.ts +188 -0
- package/cjs/drivers/mongo/mongodb-driver.d.ts.map +1 -0
- package/cjs/drivers/mongo/mongodb-driver.js +411 -0
- package/cjs/drivers/mongo/mongodb-driver.js.map +1 -0
- package/cjs/drivers/mongo/types.d.ts +43 -0
- package/cjs/drivers/mongo/types.d.ts.map +1 -0
- package/cjs/errors/missing-data-source.error.d.ts +22 -0
- package/cjs/errors/missing-data-source.error.d.ts.map +1 -0
- package/cjs/errors/missing-data-source.error.js +29 -0
- package/cjs/errors/missing-data-source.error.js.map +1 -0
- package/cjs/events/model-events.d.ts +231 -0
- package/cjs/events/model-events.d.ts.map +1 -0
- package/cjs/events/model-events.js +259 -0
- package/cjs/events/model-events.js.map +1 -0
- package/cjs/expressions/aggregate-expressions.d.ts +215 -0
- package/cjs/expressions/aggregate-expressions.d.ts.map +1 -0
- package/cjs/expressions/aggregate-expressions.js +221 -0
- package/cjs/expressions/aggregate-expressions.js.map +1 -0
- package/cjs/expressions/index.d.ts +2 -0
- package/cjs/expressions/index.d.ts.map +1 -0
- package/cjs/index.d.ts +41 -0
- package/cjs/index.d.ts.map +1 -0
- package/cjs/index.js +1 -267
- package/cjs/index.js.map +1 -1
- package/cjs/migration/column-builder.d.ts +167 -0
- package/cjs/migration/column-builder.d.ts.map +1 -0
- package/cjs/migration/column-builder.js +217 -0
- package/cjs/migration/column-builder.js.map +1 -0
- package/cjs/migration/foreign-key-builder.d.ts +110 -0
- package/cjs/migration/foreign-key-builder.d.ts.map +1 -0
- package/cjs/migration/foreign-key-builder.js +129 -0
- package/cjs/migration/foreign-key-builder.js.map +1 -0
- package/cjs/migration/index.d.ts +6 -0
- package/cjs/migration/index.d.ts.map +1 -0
- package/cjs/migration/migration-runner.d.ts +231 -0
- package/cjs/migration/migration-runner.d.ts.map +1 -0
- package/cjs/migration/migration-runner.js +443 -0
- package/cjs/migration/migration-runner.js.map +1 -0
- package/cjs/migration/migration.js +1346 -0
- package/cjs/migration/migration.js.map +1 -0
- package/cjs/migration/types.d.ts +132 -0
- package/cjs/migration/types.d.ts.map +1 -0
- package/cjs/model/model.d.ts +1267 -0
- package/cjs/model/model.d.ts.map +1 -0
- package/cjs/model/model.js +1463 -0
- package/cjs/model/model.js.map +1 -0
- package/cjs/model/register-model.d.ts +80 -0
- package/cjs/model/register-model.d.ts.map +1 -0
- package/cjs/model/register-model.js +91 -0
- package/cjs/model/register-model.js.map +1 -0
- package/cjs/remover/database-remover.d.ts +100 -0
- package/cjs/remover/database-remover.d.ts.map +1 -0
- package/cjs/remover/database-remover.js +209 -0
- package/cjs/remover/database-remover.js.map +1 -0
- package/cjs/restorer/database-restorer.d.ts +131 -0
- package/cjs/restorer/database-restorer.d.ts.map +1 -0
- package/cjs/restorer/database-restorer.js +425 -0
- package/cjs/restorer/database-restorer.js.map +1 -0
- package/cjs/sync/index.d.ts +12 -0
- package/cjs/sync/index.d.ts.map +1 -0
- package/cjs/sync/model-events.d.ts +62 -0
- package/cjs/sync/model-events.d.ts.map +1 -0
- package/cjs/sync/model-events.js +49 -0
- package/cjs/sync/model-events.js.map +1 -0
- package/cjs/sync/model-sync-operation.d.ts +163 -0
- package/cjs/sync/model-sync-operation.d.ts.map +1 -0
- package/cjs/sync/model-sync-operation.js +292 -0
- package/cjs/sync/model-sync-operation.js.map +1 -0
- package/cjs/sync/model-sync.d.ts +130 -0
- package/cjs/sync/model-sync.d.ts.map +1 -0
- package/cjs/sync/model-sync.js +178 -0
- package/cjs/sync/model-sync.js.map +1 -0
- package/cjs/sync/sync-context.d.ts +70 -0
- package/cjs/sync/sync-context.d.ts.map +1 -0
- package/cjs/sync/sync-context.js +101 -0
- package/cjs/sync/sync-context.js.map +1 -0
- package/cjs/sync/sync-manager.d.ts +213 -0
- package/cjs/sync/sync-manager.d.ts.map +1 -0
- package/cjs/sync/sync-manager.js +689 -0
- package/cjs/sync/sync-manager.js.map +1 -0
- package/cjs/sync/types.d.ts +289 -0
- package/cjs/sync/types.d.ts.map +1 -0
- package/cjs/types.d.ts +45 -0
- package/cjs/types.d.ts.map +1 -0
- package/cjs/utils/connect-to-database.d.ts +246 -0
- package/cjs/utils/connect-to-database.d.ts.map +1 -0
- package/cjs/utils/connect-to-database.js +92 -0
- package/cjs/utils/connect-to-database.js.map +1 -0
- package/cjs/utils/database-writer.utils.d.ts +15 -0
- package/cjs/utils/database-writer.utils.d.ts.map +1 -0
- package/cjs/utils/database-writer.utils.js +14 -0
- package/cjs/utils/database-writer.utils.js.map +1 -0
- package/cjs/utils/define-model.js +100 -0
- package/cjs/utils/define-model.js.map +1 -0
- package/cjs/utils/once-connected.d.ts +146 -0
- package/cjs/utils/once-connected.d.ts.map +1 -0
- package/cjs/utils/once-connected.js +252 -0
- package/cjs/utils/once-connected.js.map +1 -0
- package/cjs/validation/database-seal-plugins.d.ts +2 -0
- package/cjs/validation/database-seal-plugins.d.ts.map +1 -0
- package/cjs/validation/database-seal-plugins.js +4 -0
- package/cjs/validation/database-seal-plugins.js.map +1 -0
- package/cjs/validation/database-writer-validation-error.d.ts +97 -0
- package/cjs/validation/database-writer-validation-error.d.ts.map +1 -0
- package/cjs/validation/database-writer-validation-error.js +160 -0
- package/cjs/validation/database-writer-validation-error.js.map +1 -0
- package/cjs/validation/index.d.ts +3 -0
- package/cjs/validation/index.d.ts.map +1 -0
- package/cjs/validation/mutators/embed-mutator.d.ts +9 -0
- package/cjs/validation/mutators/embed-mutator.d.ts.map +1 -0
- package/cjs/validation/mutators/embed-mutator.js +33 -0
- package/cjs/validation/mutators/embed-mutator.js.map +1 -0
- package/cjs/validation/plugins/embed-validator-plugin.d.ts +24 -0
- package/cjs/validation/plugins/embed-validator-plugin.d.ts.map +1 -0
- package/cjs/validation/plugins/embed-validator-plugin.js +18 -0
- package/cjs/validation/plugins/embed-validator-plugin.js.map +1 -0
- package/cjs/validation/rules/database-model-rule.d.ts +7 -0
- package/cjs/validation/rules/database-model-rule.d.ts.map +1 -0
- package/cjs/validation/rules/database-model-rule.js +27 -0
- package/cjs/validation/rules/database-model-rule.js.map +1 -0
- package/cjs/validation/transformers/embed-model-transformer.d.ts +3 -0
- package/cjs/validation/transformers/embed-model-transformer.d.ts.map +1 -0
- package/cjs/validation/transformers/embed-model-transformer.js +18 -0
- package/cjs/validation/transformers/embed-model-transformer.js.map +1 -0
- package/cjs/validation/validators/embed-validator.d.ts +21 -0
- package/cjs/validation/validators/embed-validator.d.ts.map +1 -0
- package/cjs/validation/validators/embed-validator.js +42 -0
- package/cjs/validation/validators/embed-validator.js.map +1 -0
- package/cjs/writer/database-writer.d.ts +181 -0
- package/cjs/writer/database-writer.d.ts.map +1 -0
- package/cjs/writer/database-writer.js +402 -0
- package/cjs/writer/database-writer.js.map +1 -0
- package/esm/context/database-data-source-context.d.ts +29 -0
- package/esm/context/database-data-source-context.d.ts.map +1 -0
- package/esm/context/database-data-source-context.js +28 -0
- package/esm/context/database-data-source-context.js.map +1 -0
- package/esm/context/database-transaction-context.d.ts +31 -0
- package/esm/context/database-transaction-context.d.ts.map +1 -0
- package/esm/context/database-transaction-context.js +34 -0
- package/esm/context/database-transaction-context.js.map +1 -0
- package/esm/contracts/database-driver.contract.d.ts +143 -0
- package/esm/contracts/database-driver.contract.d.ts.map +1 -0
- package/esm/contracts/database-id-generator.contract.d.ts +109 -0
- package/esm/contracts/database-id-generator.contract.d.ts.map +1 -0
- package/esm/contracts/database-remover.contract.d.ts +104 -0
- package/esm/contracts/database-remover.contract.d.ts.map +1 -0
- package/esm/contracts/database-restorer.contract.d.ts +143 -0
- package/esm/contracts/database-restorer.contract.d.ts.map +1 -0
- package/esm/contracts/database-writer.contract.d.ts +119 -0
- package/esm/contracts/database-writer.contract.d.ts.map +1 -0
- package/esm/contracts/driver-blueprint.contract.d.ts +45 -0
- package/esm/contracts/driver-blueprint.contract.d.ts.map +1 -0
- package/esm/contracts/index.d.ts +10 -0
- package/esm/contracts/index.d.ts.map +1 -0
- package/esm/contracts/migration-driver.contract.d.ts +365 -0
- package/esm/contracts/migration-driver.contract.d.ts.map +1 -0
- package/esm/contracts/query-builder.contract.d.ts +1128 -0
- package/esm/contracts/query-builder.contract.d.ts.map +1 -0
- package/esm/contracts/sync-adapter.contract.d.ts +58 -0
- package/esm/contracts/sync-adapter.contract.d.ts.map +1 -0
- package/esm/data-source/data-source-registry.d.ts +104 -0
- package/esm/data-source/data-source-registry.d.ts.map +1 -0
- package/esm/data-source/data-source-registry.js +138 -0
- package/esm/data-source/data-source-registry.js.map +1 -0
- package/esm/data-source/data-source.d.ts +106 -0
- package/esm/data-source/data-source.d.ts.map +1 -0
- package/esm/data-source/data-source.js +77 -0
- package/esm/data-source/data-source.js.map +1 -0
- package/esm/database-dirty-tracker.d.ts +253 -0
- package/esm/database-dirty-tracker.d.ts.map +1 -0
- package/esm/database-dirty-tracker.js +389 -0
- package/esm/database-dirty-tracker.js.map +1 -0
- package/esm/drivers/mongo/mongo-id-generator.d.ts +116 -0
- package/esm/drivers/mongo/mongo-id-generator.d.ts.map +1 -0
- package/esm/drivers/mongo/mongo-id-generator.js +149 -0
- package/esm/drivers/mongo/mongo-id-generator.js.map +1 -0
- package/esm/drivers/mongo/mongo-migration-driver.d.ts +228 -0
- package/esm/drivers/mongo/mongo-migration-driver.d.ts.map +1 -0
- package/esm/drivers/mongo/mongo-migration-driver.js +524 -0
- package/esm/drivers/mongo/mongo-migration-driver.js.map +1 -0
- package/esm/drivers/mongo/mongo-query-builder.d.ts +922 -0
- package/esm/drivers/mongo/mongo-query-builder.d.ts.map +1 -0
- package/esm/drivers/mongo/mongo-query-builder.js +1740 -0
- package/esm/drivers/mongo/mongo-query-builder.js.map +1 -0
- package/esm/drivers/mongo/mongo-query-operations.d.ts +226 -0
- package/esm/drivers/mongo/mongo-query-operations.d.ts.map +1 -0
- package/esm/drivers/mongo/mongo-query-operations.js +270 -0
- package/esm/drivers/mongo/mongo-query-operations.js.map +1 -0
- package/esm/drivers/mongo/mongo-query-parser.d.ts +262 -0
- package/esm/drivers/mongo/mongo-query-parser.d.ts.map +1 -0
- package/esm/drivers/mongo/mongo-query-parser.js +1351 -0
- package/esm/drivers/mongo/mongo-query-parser.js.map +1 -0
- package/esm/drivers/mongo/mongo-sync-adapter.d.ts +79 -0
- package/esm/drivers/mongo/mongo-sync-adapter.d.ts.map +1 -0
- package/esm/drivers/mongo/mongo-sync-adapter.js +146 -0
- package/esm/drivers/mongo/mongo-sync-adapter.js.map +1 -0
- package/esm/drivers/mongo/mongodb-blueprint.d.ts +30 -0
- package/esm/drivers/mongo/mongodb-blueprint.d.ts.map +1 -0
- package/esm/drivers/mongo/mongodb-blueprint.js +51 -0
- package/esm/drivers/mongo/mongodb-blueprint.js.map +1 -0
- package/esm/drivers/mongo/mongodb-driver.d.ts +188 -0
- package/esm/drivers/mongo/mongodb-driver.d.ts.map +1 -0
- package/esm/drivers/mongo/mongodb-driver.js +411 -0
- package/esm/drivers/mongo/mongodb-driver.js.map +1 -0
- package/esm/drivers/mongo/types.d.ts +43 -0
- package/esm/drivers/mongo/types.d.ts.map +1 -0
- package/esm/errors/missing-data-source.error.d.ts +22 -0
- package/esm/errors/missing-data-source.error.d.ts.map +1 -0
- package/esm/errors/missing-data-source.error.js +29 -0
- package/esm/errors/missing-data-source.error.js.map +1 -0
- package/esm/events/model-events.d.ts +231 -0
- package/esm/events/model-events.d.ts.map +1 -0
- package/esm/events/model-events.js +259 -0
- package/esm/events/model-events.js.map +1 -0
- package/esm/expressions/aggregate-expressions.d.ts +215 -0
- package/esm/expressions/aggregate-expressions.d.ts.map +1 -0
- package/esm/expressions/aggregate-expressions.js +221 -0
- package/esm/expressions/aggregate-expressions.js.map +1 -0
- package/esm/expressions/index.d.ts +2 -0
- package/esm/expressions/index.d.ts.map +1 -0
- package/esm/index.d.ts +41 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +1 -40
- package/esm/index.js.map +1 -1
- package/esm/migration/column-builder.d.ts +167 -0
- package/esm/migration/column-builder.d.ts.map +1 -0
- package/esm/migration/column-builder.js +217 -0
- package/esm/migration/column-builder.js.map +1 -0
- package/esm/migration/foreign-key-builder.d.ts +110 -0
- package/esm/migration/foreign-key-builder.d.ts.map +1 -0
- package/esm/migration/foreign-key-builder.js +129 -0
- package/esm/migration/foreign-key-builder.js.map +1 -0
- package/esm/migration/index.d.ts +6 -0
- package/esm/migration/index.d.ts.map +1 -0
- package/esm/migration/migration-runner.d.ts +231 -0
- package/esm/migration/migration-runner.d.ts.map +1 -0
- package/esm/migration/migration-runner.js +443 -0
- package/esm/migration/migration-runner.js.map +1 -0
- package/esm/migration/migration.js +1346 -0
- package/esm/migration/migration.js.map +1 -0
- package/esm/migration/types.d.ts +132 -0
- package/esm/migration/types.d.ts.map +1 -0
- package/esm/model/model.d.ts +1267 -0
- package/esm/model/model.d.ts.map +1 -0
- package/esm/model/model.js +1463 -0
- package/esm/model/model.js.map +1 -0
- package/esm/model/register-model.d.ts +80 -0
- package/esm/model/register-model.d.ts.map +1 -0
- package/esm/model/register-model.js +91 -0
- package/esm/model/register-model.js.map +1 -0
- package/esm/remover/database-remover.d.ts +100 -0
- package/esm/remover/database-remover.d.ts.map +1 -0
- package/esm/remover/database-remover.js +209 -0
- package/esm/remover/database-remover.js.map +1 -0
- package/esm/restorer/database-restorer.d.ts +131 -0
- package/esm/restorer/database-restorer.d.ts.map +1 -0
- package/esm/restorer/database-restorer.js +425 -0
- package/esm/restorer/database-restorer.js.map +1 -0
- package/esm/sync/index.d.ts +12 -0
- package/esm/sync/index.d.ts.map +1 -0
- package/esm/sync/model-events.d.ts +62 -0
- package/esm/sync/model-events.d.ts.map +1 -0
- package/esm/sync/model-events.js +49 -0
- package/esm/sync/model-events.js.map +1 -0
- package/esm/sync/model-sync-operation.d.ts +163 -0
- package/esm/sync/model-sync-operation.d.ts.map +1 -0
- package/esm/sync/model-sync-operation.js +292 -0
- package/esm/sync/model-sync-operation.js.map +1 -0
- package/esm/sync/model-sync.d.ts +130 -0
- package/esm/sync/model-sync.d.ts.map +1 -0
- package/esm/sync/model-sync.js +178 -0
- package/esm/sync/model-sync.js.map +1 -0
- package/esm/sync/sync-context.d.ts +70 -0
- package/esm/sync/sync-context.d.ts.map +1 -0
- package/esm/sync/sync-context.js +101 -0
- package/esm/sync/sync-context.js.map +1 -0
- package/esm/sync/sync-manager.d.ts +213 -0
- package/esm/sync/sync-manager.d.ts.map +1 -0
- package/esm/sync/sync-manager.js +689 -0
- package/esm/sync/sync-manager.js.map +1 -0
- package/esm/sync/types.d.ts +289 -0
- package/esm/sync/types.d.ts.map +1 -0
- package/esm/types.d.ts +45 -0
- package/esm/types.d.ts.map +1 -0
- package/esm/utils/connect-to-database.d.ts +246 -0
- package/esm/utils/connect-to-database.d.ts.map +1 -0
- package/esm/utils/connect-to-database.js +92 -0
- package/esm/utils/connect-to-database.js.map +1 -0
- package/esm/utils/database-writer.utils.d.ts +15 -0
- package/esm/utils/database-writer.utils.d.ts.map +1 -0
- package/esm/utils/database-writer.utils.js +14 -0
- package/esm/utils/database-writer.utils.js.map +1 -0
- package/esm/utils/define-model.js +100 -0
- package/esm/utils/define-model.js.map +1 -0
- package/esm/utils/once-connected.d.ts +146 -0
- package/esm/utils/once-connected.d.ts.map +1 -0
- package/esm/utils/once-connected.js +252 -0
- package/esm/utils/once-connected.js.map +1 -0
- package/esm/validation/database-seal-plugins.d.ts +2 -0
- package/esm/validation/database-seal-plugins.d.ts.map +1 -0
- package/esm/validation/database-seal-plugins.js +4 -0
- package/esm/validation/database-seal-plugins.js.map +1 -0
- package/esm/validation/database-writer-validation-error.d.ts +97 -0
- package/esm/validation/database-writer-validation-error.d.ts.map +1 -0
- package/esm/validation/database-writer-validation-error.js +160 -0
- package/esm/validation/database-writer-validation-error.js.map +1 -0
- package/esm/validation/index.d.ts +3 -0
- package/esm/validation/index.d.ts.map +1 -0
- package/esm/validation/mutators/embed-mutator.d.ts +9 -0
- package/esm/validation/mutators/embed-mutator.d.ts.map +1 -0
- package/esm/validation/mutators/embed-mutator.js +33 -0
- package/esm/validation/mutators/embed-mutator.js.map +1 -0
- package/esm/validation/plugins/embed-validator-plugin.d.ts +24 -0
- package/esm/validation/plugins/embed-validator-plugin.d.ts.map +1 -0
- package/esm/validation/plugins/embed-validator-plugin.js +18 -0
- package/esm/validation/plugins/embed-validator-plugin.js.map +1 -0
- package/esm/validation/rules/database-model-rule.d.ts +7 -0
- package/esm/validation/rules/database-model-rule.d.ts.map +1 -0
- package/esm/validation/rules/database-model-rule.js +27 -0
- package/esm/validation/rules/database-model-rule.js.map +1 -0
- package/esm/validation/transformers/embed-model-transformer.d.ts +3 -0
- package/esm/validation/transformers/embed-model-transformer.d.ts.map +1 -0
- package/esm/validation/transformers/embed-model-transformer.js +18 -0
- package/esm/validation/transformers/embed-model-transformer.js.map +1 -0
- package/esm/validation/validators/embed-validator.d.ts +21 -0
- package/esm/validation/validators/embed-validator.d.ts.map +1 -0
- package/esm/validation/validators/embed-validator.js +42 -0
- package/esm/validation/validators/embed-validator.js.map +1 -0
- package/esm/writer/database-writer.d.ts +181 -0
- package/esm/writer/database-writer.d.ts.map +1 -0
- package/esm/writer/database-writer.js +402 -0
- package/esm/writer/database-writer.js.map +1 -0
- package/package.json +61 -52
|
@@ -0,0 +1,689 @@
|
|
|
1
|
+
import {Model}from'../model/model.js';import {DEFAULT_MAX_SYNC_DEPTH,SyncContextManager}from'./sync-context.js';/**
|
|
2
|
+
* Sync manager service for handling multi-level sync operations.
|
|
3
|
+
*
|
|
4
|
+
* @module cascade-next/sync/sync-manager
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Manages sync operations across models with multi-level support.
|
|
8
|
+
*/
|
|
9
|
+
class SyncManager {
|
|
10
|
+
sourceModel;
|
|
11
|
+
driver;
|
|
12
|
+
/**
|
|
13
|
+
* Creates a new sync manager.
|
|
14
|
+
*
|
|
15
|
+
* @param sourceModel - The source model class
|
|
16
|
+
* @param driver - The database driver
|
|
17
|
+
*/
|
|
18
|
+
constructor(sourceModel, driver) {
|
|
19
|
+
this.sourceModel = sourceModel;
|
|
20
|
+
this.driver = driver;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Executes sync operations for a model update.
|
|
24
|
+
*
|
|
25
|
+
* @param sourceId - The source model ID
|
|
26
|
+
* @param updatedData - The updated data to sync (Model instance or plain data)
|
|
27
|
+
* @param changedFields - Fields that were changed (for filtering)
|
|
28
|
+
* @returns Sync result with success status and details
|
|
29
|
+
*/
|
|
30
|
+
async syncUpdate(sourceId, updatedData, changedFields) {
|
|
31
|
+
try {
|
|
32
|
+
const syncConfigs = this.getSyncConfigs();
|
|
33
|
+
if (syncConfigs.length === 0) {
|
|
34
|
+
return this.createEmptyResult();
|
|
35
|
+
}
|
|
36
|
+
const options = {
|
|
37
|
+
currentDepth: 1,
|
|
38
|
+
syncChain: [this.sourceModel.name],
|
|
39
|
+
maxDepth: DEFAULT_MAX_SYNC_DEPTH,
|
|
40
|
+
preventCircular: true,
|
|
41
|
+
};
|
|
42
|
+
const instructions = await this.collectInstructions({
|
|
43
|
+
sourceId,
|
|
44
|
+
updatedData,
|
|
45
|
+
changedFields,
|
|
46
|
+
syncConfigs,
|
|
47
|
+
options,
|
|
48
|
+
});
|
|
49
|
+
return await this.executeInstructions(instructions);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
// Catch-all error handler for unexpected failures
|
|
53
|
+
console.error(`Sync update failed for ${this.sourceModel.name}#${sourceId}:`, error);
|
|
54
|
+
return {
|
|
55
|
+
success: false,
|
|
56
|
+
attempted: 0,
|
|
57
|
+
succeeded: 0,
|
|
58
|
+
failed: 1,
|
|
59
|
+
errors: [
|
|
60
|
+
{
|
|
61
|
+
instruction: {
|
|
62
|
+
targetTable: "",
|
|
63
|
+
targetModel: "",
|
|
64
|
+
filter: {},
|
|
65
|
+
update: {},
|
|
66
|
+
depth: 0,
|
|
67
|
+
chain: [this.sourceModel.name],
|
|
68
|
+
sourceModel: this.sourceModel.name,
|
|
69
|
+
sourceId,
|
|
70
|
+
},
|
|
71
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
depthReached: 0,
|
|
75
|
+
contexts: [],
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Executes sync operations for a model update with a specific config.
|
|
81
|
+
* Used by ModelSyncOperation for event-based sync.
|
|
82
|
+
*
|
|
83
|
+
* @param sourceId - The source model ID
|
|
84
|
+
* @param updatedData - The updated data to sync
|
|
85
|
+
* @param changedFields - Fields that were changed
|
|
86
|
+
* @param config - The sync configuration to use
|
|
87
|
+
* @returns Sync result with success status and details
|
|
88
|
+
*/
|
|
89
|
+
async syncUpdateWithConfig(sourceId, updatedData, changedFields, config) {
|
|
90
|
+
try {
|
|
91
|
+
const options = {
|
|
92
|
+
currentDepth: 1,
|
|
93
|
+
syncChain: [this.sourceModel.name],
|
|
94
|
+
maxDepth: config.maxSyncDepth,
|
|
95
|
+
preventCircular: config.preventCircularSync,
|
|
96
|
+
};
|
|
97
|
+
const instructions = await this.collectInstructions({
|
|
98
|
+
sourceId,
|
|
99
|
+
updatedData,
|
|
100
|
+
changedFields,
|
|
101
|
+
syncConfigs: [config],
|
|
102
|
+
options,
|
|
103
|
+
});
|
|
104
|
+
return await this.executeInstructions(instructions);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error(`Sync update with config failed for ${this.sourceModel.name}#${sourceId}:`, error);
|
|
108
|
+
return {
|
|
109
|
+
success: false,
|
|
110
|
+
attempted: 0,
|
|
111
|
+
succeeded: 0,
|
|
112
|
+
failed: 1,
|
|
113
|
+
errors: [
|
|
114
|
+
{
|
|
115
|
+
instruction: {
|
|
116
|
+
targetTable: "",
|
|
117
|
+
targetModel: "",
|
|
118
|
+
filter: {},
|
|
119
|
+
update: {},
|
|
120
|
+
depth: 0,
|
|
121
|
+
chain: [this.sourceModel.name],
|
|
122
|
+
sourceModel: this.sourceModel.name,
|
|
123
|
+
sourceId,
|
|
124
|
+
},
|
|
125
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
depthReached: 0,
|
|
129
|
+
contexts: [],
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Executes sync delete operations with a specific config.
|
|
135
|
+
* Used by ModelSyncOperation for event-based sync.
|
|
136
|
+
*
|
|
137
|
+
* @param sourceId - The source model ID
|
|
138
|
+
* @param config - The sync configuration to use
|
|
139
|
+
* @returns Sync result with success status and details
|
|
140
|
+
*/
|
|
141
|
+
async syncDeleteWithConfig(sourceId, config) {
|
|
142
|
+
try {
|
|
143
|
+
if (!config.unsetOnDelete) {
|
|
144
|
+
return this.createEmptyResult();
|
|
145
|
+
}
|
|
146
|
+
const options = {
|
|
147
|
+
currentDepth: 1,
|
|
148
|
+
syncChain: [this.sourceModel.name],
|
|
149
|
+
maxDepth: config.maxSyncDepth,
|
|
150
|
+
preventCircular: config.preventCircularSync,
|
|
151
|
+
};
|
|
152
|
+
const instructions = await this.collectDeleteInstructions(sourceId, [config], options);
|
|
153
|
+
return await this.executeInstructions(instructions);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
console.error(`Sync delete with config failed for ${this.sourceModel.name}#${sourceId}:`, error);
|
|
157
|
+
return {
|
|
158
|
+
success: false,
|
|
159
|
+
attempted: 0,
|
|
160
|
+
succeeded: 0,
|
|
161
|
+
failed: 1,
|
|
162
|
+
errors: [
|
|
163
|
+
{
|
|
164
|
+
instruction: {
|
|
165
|
+
targetTable: "",
|
|
166
|
+
targetModel: "",
|
|
167
|
+
filter: {},
|
|
168
|
+
update: {},
|
|
169
|
+
depth: 0,
|
|
170
|
+
chain: [this.sourceModel.name],
|
|
171
|
+
sourceModel: this.sourceModel.name,
|
|
172
|
+
sourceId,
|
|
173
|
+
},
|
|
174
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
175
|
+
},
|
|
176
|
+
],
|
|
177
|
+
depthReached: 0,
|
|
178
|
+
contexts: [],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Executes sync operations for a model deletion.
|
|
184
|
+
*
|
|
185
|
+
* @param sourceId - The source model ID
|
|
186
|
+
* @returns Sync result with success status and details
|
|
187
|
+
*/
|
|
188
|
+
async syncDelete(sourceId) {
|
|
189
|
+
try {
|
|
190
|
+
const syncConfigs = this.getSyncConfigs();
|
|
191
|
+
if (syncConfigs.length === 0) {
|
|
192
|
+
return this.createEmptyResult();
|
|
193
|
+
}
|
|
194
|
+
const options = {
|
|
195
|
+
currentDepth: 1,
|
|
196
|
+
syncChain: [this.sourceModel.name],
|
|
197
|
+
maxDepth: DEFAULT_MAX_SYNC_DEPTH,
|
|
198
|
+
preventCircular: true,
|
|
199
|
+
};
|
|
200
|
+
const instructions = await this.collectDeleteInstructions(sourceId, syncConfigs, options);
|
|
201
|
+
return await this.executeInstructions(instructions);
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
// Catch-all error handler for unexpected failures
|
|
205
|
+
console.error(`Sync delete failed for ${this.sourceModel.name}#${sourceId}:`, error);
|
|
206
|
+
return {
|
|
207
|
+
success: false,
|
|
208
|
+
attempted: 0,
|
|
209
|
+
succeeded: 0,
|
|
210
|
+
failed: 1,
|
|
211
|
+
errors: [
|
|
212
|
+
{
|
|
213
|
+
instruction: {
|
|
214
|
+
targetTable: "",
|
|
215
|
+
targetModel: "",
|
|
216
|
+
filter: {},
|
|
217
|
+
update: {},
|
|
218
|
+
depth: 0,
|
|
219
|
+
chain: [this.sourceModel.name],
|
|
220
|
+
sourceModel: this.sourceModel.name,
|
|
221
|
+
sourceId,
|
|
222
|
+
},
|
|
223
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
224
|
+
},
|
|
225
|
+
],
|
|
226
|
+
depthReached: 0,
|
|
227
|
+
contexts: [],
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Collects sync instructions recursively with depth limiting.
|
|
233
|
+
*
|
|
234
|
+
* @param payload - Data payload
|
|
235
|
+
* @returns Array of sync instructions
|
|
236
|
+
*/
|
|
237
|
+
async collectInstructions(payload) {
|
|
238
|
+
const { sourceId, updatedData, changedFields, syncConfigs, options } = payload;
|
|
239
|
+
const instructions = [];
|
|
240
|
+
for (const config of syncConfigs) {
|
|
241
|
+
// Check if we should sync based on watched fields
|
|
242
|
+
if (!this.shouldSync(config, changedFields)) {
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
// Validate depth and circular references
|
|
246
|
+
const validation = SyncContextManager.validate(options.currentDepth, options.syncChain, config.targetModelClass.name, config.maxSyncDepth, config.preventCircularSync);
|
|
247
|
+
if (!validation.valid) {
|
|
248
|
+
console.warn(`Sync validation failed: ${validation.error}`);
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
// Get embedded data (handle both Model instance and plain data)
|
|
252
|
+
const embedData = await this.getEmbedData(updatedData, config);
|
|
253
|
+
// Build instruction
|
|
254
|
+
const instruction = this.buildUpdateInstruction(sourceId, config, embedData, options);
|
|
255
|
+
instructions.push(instruction);
|
|
256
|
+
// Emit syncing event
|
|
257
|
+
await this.emitSyncingEvent(instruction);
|
|
258
|
+
// Recursively collect instructions for next level
|
|
259
|
+
if (SyncContextManager.canSyncDeeper(options.currentDepth, config.maxSyncDepth)) {
|
|
260
|
+
const nextLevelInstructions = await this.collectNextLevelInstructions(instruction, embedData, changedFields, config, options);
|
|
261
|
+
instructions.push(...nextLevelInstructions);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return instructions;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Collects delete sync instructions.
|
|
268
|
+
*
|
|
269
|
+
* @param sourceId - Source model ID
|
|
270
|
+
* @param syncConfigs - Sync configurations
|
|
271
|
+
* @param options - Instruction options
|
|
272
|
+
* @returns Array of sync instructions
|
|
273
|
+
*/
|
|
274
|
+
async collectDeleteInstructions(sourceId, syncConfigs, options) {
|
|
275
|
+
const instructions = [];
|
|
276
|
+
for (const config of syncConfigs) {
|
|
277
|
+
if (!config.unsetOnDelete) {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const validation = SyncContextManager.validate(options.currentDepth, options.syncChain, config.targetModelClass.name, config.maxSyncDepth, config.preventCircularSync);
|
|
281
|
+
if (!validation.valid) {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const instruction = this.buildDeleteInstruction(sourceId, config, options);
|
|
285
|
+
instructions.push(instruction);
|
|
286
|
+
await this.emitSyncingEvent(instruction);
|
|
287
|
+
}
|
|
288
|
+
return instructions;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Collects instructions for the next level in the sync chain.
|
|
292
|
+
*
|
|
293
|
+
* @param parentInstruction - The parent instruction
|
|
294
|
+
* @param embedData - Embedded data from parent
|
|
295
|
+
* @param changedFields - Changed fields
|
|
296
|
+
* @param parentConfig - Parent sync config
|
|
297
|
+
* @param parentOptions - Parent instruction options
|
|
298
|
+
* @returns Array of next-level sync instructions
|
|
299
|
+
*/
|
|
300
|
+
async collectNextLevelInstructions(parentInstruction, embedData, changedFields, parentConfig, parentOptions) {
|
|
301
|
+
const targetModelClass = parentConfig.targetModelClass;
|
|
302
|
+
const targetSyncConfigs = this.getSyncConfigsForModel(targetModelClass);
|
|
303
|
+
if (targetSyncConfigs.length === 0) {
|
|
304
|
+
return [];
|
|
305
|
+
}
|
|
306
|
+
const nextOptions = {
|
|
307
|
+
currentDepth: parentOptions.currentDepth + 1,
|
|
308
|
+
syncChain: SyncContextManager.extendChain(parentOptions.syncChain, targetModelClass.name),
|
|
309
|
+
maxDepth: Math.min(parentConfig.maxSyncDepth, parentOptions.maxDepth),
|
|
310
|
+
preventCircular: parentOptions.preventCircular && parentConfig.preventCircularSync,
|
|
311
|
+
};
|
|
312
|
+
// Get the ID from embed data for next level
|
|
313
|
+
const sourceId = embedData[parentConfig.identifierField];
|
|
314
|
+
return await this.collectInstructions({
|
|
315
|
+
sourceId,
|
|
316
|
+
updatedData: embedData,
|
|
317
|
+
changedFields,
|
|
318
|
+
syncConfigs: targetSyncConfigs,
|
|
319
|
+
options: nextOptions,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Builds an update sync instruction.
|
|
324
|
+
*
|
|
325
|
+
* @param sourceId - Source model ID
|
|
326
|
+
* @param config - Sync configuration
|
|
327
|
+
* @param embedData - Embedded data to sync
|
|
328
|
+
* @param options - Instruction options
|
|
329
|
+
* @returns Sync instruction
|
|
330
|
+
*/
|
|
331
|
+
buildUpdateInstruction(sourceId, config, embedData, options) {
|
|
332
|
+
const targetModelClass = config.targetModelClass;
|
|
333
|
+
const filter = this.buildFilter(sourceId, config);
|
|
334
|
+
const update = this.buildUpdate(embedData, config);
|
|
335
|
+
const instruction = {
|
|
336
|
+
targetTable: targetModelClass.table,
|
|
337
|
+
targetModel: targetModelClass.name,
|
|
338
|
+
filter,
|
|
339
|
+
update,
|
|
340
|
+
depth: options.currentDepth,
|
|
341
|
+
chain: [...options.syncChain],
|
|
342
|
+
sourceModel: this.sourceModel.name,
|
|
343
|
+
sourceId,
|
|
344
|
+
};
|
|
345
|
+
// Add array update metadata if needed
|
|
346
|
+
if (config.isMany) {
|
|
347
|
+
instruction.isArrayUpdate = true;
|
|
348
|
+
instruction.arrayField = config.targetField;
|
|
349
|
+
instruction.identifierField = config.identifierField;
|
|
350
|
+
instruction.identifierValue = sourceId;
|
|
351
|
+
}
|
|
352
|
+
return instruction;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Builds a delete sync instruction.
|
|
356
|
+
*
|
|
357
|
+
* @param sourceId - Source model ID
|
|
358
|
+
* @param config - Sync configuration
|
|
359
|
+
* @param options - Instruction options
|
|
360
|
+
* @returns Sync instruction
|
|
361
|
+
*/
|
|
362
|
+
buildDeleteInstruction(sourceId, config, options) {
|
|
363
|
+
const targetModelClass = config.targetModelClass;
|
|
364
|
+
const filter = this.buildFilter(sourceId, config);
|
|
365
|
+
const update = { $unset: { [config.targetField]: 1 } };
|
|
366
|
+
return {
|
|
367
|
+
targetTable: targetModelClass.table,
|
|
368
|
+
targetModel: targetModelClass.name,
|
|
369
|
+
filter,
|
|
370
|
+
update,
|
|
371
|
+
depth: options.currentDepth,
|
|
372
|
+
chain: [...options.syncChain],
|
|
373
|
+
sourceModel: this.sourceModel.name,
|
|
374
|
+
sourceId,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Builds a filter for identifying target documents.
|
|
379
|
+
*
|
|
380
|
+
* @param sourceId - Source model ID
|
|
381
|
+
* @param config - Sync configuration
|
|
382
|
+
* @returns Filter object
|
|
383
|
+
*/
|
|
384
|
+
buildFilter(sourceId, config) {
|
|
385
|
+
if (config.isMany) {
|
|
386
|
+
// For arrays: { "products.id": productId }
|
|
387
|
+
return { [`${config.targetField}.${config.identifierField}`]: sourceId };
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
// For single: { "category.id": categoryId }
|
|
391
|
+
return { [`${config.targetField}.${config.identifierField}`]: sourceId };
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Builds an update operation for syncing data.
|
|
396
|
+
*
|
|
397
|
+
* @param embedData - Embedded data to sync
|
|
398
|
+
* @param config - Sync configuration
|
|
399
|
+
* @returns Update operation object
|
|
400
|
+
*/
|
|
401
|
+
buildUpdate(embedData, config) {
|
|
402
|
+
if (config.isMany) {
|
|
403
|
+
// For arrays: use positional operator $
|
|
404
|
+
return { $set: { [`${config.targetField}.$`]: embedData } };
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
// For single: direct set
|
|
408
|
+
return { $set: { [config.targetField]: embedData } };
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Executes sync instructions with batch optimization.
|
|
413
|
+
* Groups by depth and target table for optimal batching.
|
|
414
|
+
*
|
|
415
|
+
* @param instructions - Array of sync instructions
|
|
416
|
+
* @returns Sync result
|
|
417
|
+
*/
|
|
418
|
+
async executeInstructions(instructions) {
|
|
419
|
+
const result = {
|
|
420
|
+
success: true,
|
|
421
|
+
attempted: instructions.length,
|
|
422
|
+
succeeded: 0,
|
|
423
|
+
failed: 0,
|
|
424
|
+
errors: [],
|
|
425
|
+
depthReached: 0,
|
|
426
|
+
contexts: [],
|
|
427
|
+
};
|
|
428
|
+
if (instructions.length === 0) {
|
|
429
|
+
return result;
|
|
430
|
+
}
|
|
431
|
+
// Group instructions by depth for sequential execution
|
|
432
|
+
const instructionsByDepth = this.groupByDepth(instructions);
|
|
433
|
+
for (const [depth, depthInstructions] of instructionsByDepth) {
|
|
434
|
+
result.depthReached = Math.max(result.depthReached, depth);
|
|
435
|
+
// Further group by target table for better batching
|
|
436
|
+
const instructionsByTable = this.groupByTable(depthInstructions);
|
|
437
|
+
for (const [table, tableInstructions] of instructionsByTable) {
|
|
438
|
+
try {
|
|
439
|
+
// Try batch execution first (all instructions for this table)
|
|
440
|
+
await this.executeBatch(tableInstructions, result);
|
|
441
|
+
}
|
|
442
|
+
catch (batchError) {
|
|
443
|
+
// Fallback to individual execution on batch failure
|
|
444
|
+
console.warn(`Batch execution failed for table ${table} at depth ${depth}, falling back to individual execution`);
|
|
445
|
+
await this.executeIndividual(tableInstructions, result);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
result.success = result.failed === 0;
|
|
450
|
+
return result;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Executes instructions in batch.
|
|
454
|
+
*
|
|
455
|
+
* @param instructions - Instructions to execute
|
|
456
|
+
* @param result - Result object to update
|
|
457
|
+
*/
|
|
458
|
+
async executeBatch(instructions, result) {
|
|
459
|
+
for (const instruction of instructions) {
|
|
460
|
+
try {
|
|
461
|
+
const updateResult = await this.driver.updateMany(instruction.targetTable, instruction.filter, instruction.update);
|
|
462
|
+
const context = SyncContextManager.createContext(instruction, updateResult.modifiedCount);
|
|
463
|
+
result.contexts.push(context);
|
|
464
|
+
result.succeeded++;
|
|
465
|
+
await this.emitSyncedEvent(context);
|
|
466
|
+
}
|
|
467
|
+
catch (error) {
|
|
468
|
+
throw error; // Re-throw for batch fallback
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Executes instructions individually (fallback).
|
|
474
|
+
* Provides detailed error reporting for each failed instruction.
|
|
475
|
+
*
|
|
476
|
+
* @param instructions - Instructions to execute
|
|
477
|
+
* @param result - Result object to update
|
|
478
|
+
*/
|
|
479
|
+
async executeIndividual(instructions, result) {
|
|
480
|
+
for (const instruction of instructions) {
|
|
481
|
+
try {
|
|
482
|
+
const updateResult = await this.driver.updateMany(instruction.targetTable, instruction.filter, instruction.update);
|
|
483
|
+
const context = SyncContextManager.createContext(instruction, updateResult.modifiedCount);
|
|
484
|
+
result.contexts.push(context);
|
|
485
|
+
result.succeeded++;
|
|
486
|
+
await this.emitSyncedEvent(context);
|
|
487
|
+
}
|
|
488
|
+
catch (error) {
|
|
489
|
+
result.failed++;
|
|
490
|
+
const errorMessage = this.formatSyncError(instruction, error);
|
|
491
|
+
const syncError = new Error(errorMessage);
|
|
492
|
+
// Preserve original error stack if available
|
|
493
|
+
if (error instanceof Error && error.stack) {
|
|
494
|
+
syncError.stack = error.stack;
|
|
495
|
+
}
|
|
496
|
+
result.errors.push({
|
|
497
|
+
instruction,
|
|
498
|
+
error: syncError,
|
|
499
|
+
});
|
|
500
|
+
// Log detailed error for debugging
|
|
501
|
+
console.error(`Sync operation failed:`, {
|
|
502
|
+
sourceModel: instruction.sourceModel,
|
|
503
|
+
sourceId: instruction.sourceId,
|
|
504
|
+
targetModel: instruction.targetModel,
|
|
505
|
+
targetTable: instruction.targetTable,
|
|
506
|
+
depth: instruction.depth,
|
|
507
|
+
chain: SyncContextManager.formatChain(instruction.chain),
|
|
508
|
+
filter: instruction.filter,
|
|
509
|
+
error: errorMessage,
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Formats a sync error with detailed context.
|
|
516
|
+
*
|
|
517
|
+
* @param instruction - The failed instruction
|
|
518
|
+
* @param error - The error that occurred
|
|
519
|
+
* @returns Formatted error message
|
|
520
|
+
*/
|
|
521
|
+
formatSyncError(instruction, error) {
|
|
522
|
+
const baseMessage = error instanceof Error ? error.message : String(error);
|
|
523
|
+
const chain = SyncContextManager.formatChain(instruction.chain);
|
|
524
|
+
return [
|
|
525
|
+
`Sync failed at depth ${instruction.depth}:`,
|
|
526
|
+
`Chain: ${chain} → ${instruction.targetModel}`,
|
|
527
|
+
`Source: ${instruction.sourceModel}#${instruction.sourceId}`,
|
|
528
|
+
`Target: ${instruction.targetTable}`,
|
|
529
|
+
`Error: ${baseMessage}`,
|
|
530
|
+
].join(" | ");
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Groups instructions by depth for batch processing.
|
|
534
|
+
*
|
|
535
|
+
* @param instructions - Instructions to group
|
|
536
|
+
* @returns Map of depth to instructions (sorted ascending)
|
|
537
|
+
*/
|
|
538
|
+
groupByDepth(instructions) {
|
|
539
|
+
const grouped = new Map();
|
|
540
|
+
for (const instruction of instructions) {
|
|
541
|
+
const depth = instruction.depth;
|
|
542
|
+
if (!grouped.has(depth)) {
|
|
543
|
+
grouped.set(depth, []);
|
|
544
|
+
}
|
|
545
|
+
grouped.get(depth).push(instruction);
|
|
546
|
+
}
|
|
547
|
+
// Sort by depth (ascending) for sequential execution
|
|
548
|
+
return new Map([...grouped.entries()].sort((a, b) => a[0] - b[0]));
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Groups instructions by target table for batch optimization.
|
|
552
|
+
*
|
|
553
|
+
* @param instructions - Instructions to group
|
|
554
|
+
* @returns Map of table name to instructions
|
|
555
|
+
*/
|
|
556
|
+
groupByTable(instructions) {
|
|
557
|
+
const grouped = new Map();
|
|
558
|
+
for (const instruction of instructions) {
|
|
559
|
+
const table = instruction.targetTable;
|
|
560
|
+
if (!grouped.has(table)) {
|
|
561
|
+
grouped.set(table, []);
|
|
562
|
+
}
|
|
563
|
+
grouped.get(table).push(instruction);
|
|
564
|
+
}
|
|
565
|
+
return grouped;
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Checks if sync should proceed based on watched fields.
|
|
569
|
+
*
|
|
570
|
+
* @param config - Sync configuration
|
|
571
|
+
* @param changedFields - Fields that changed
|
|
572
|
+
* @returns True if sync should proceed
|
|
573
|
+
*/
|
|
574
|
+
shouldSync(config, changedFields) {
|
|
575
|
+
if (config.watchFields.length === 0) {
|
|
576
|
+
return true; // Watch all fields
|
|
577
|
+
}
|
|
578
|
+
return config.watchFields.some((field) => changedFields.includes(field));
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* Gets embedded data from the source model.
|
|
582
|
+
*
|
|
583
|
+
* @param data - Source model data or Model instance
|
|
584
|
+
* @param config - Sync configuration
|
|
585
|
+
* @returns Embedded data
|
|
586
|
+
*/
|
|
587
|
+
async getEmbedData(data, config) {
|
|
588
|
+
// If data is a Model instance, call the embed method on it
|
|
589
|
+
if (data instanceof Model) {
|
|
590
|
+
if (Array.isArray(config.embedKey)) {
|
|
591
|
+
return data.only(config.embedKey);
|
|
592
|
+
}
|
|
593
|
+
if (typeof data[config.embedKey] !== "function") {
|
|
594
|
+
return data[config.embedKey];
|
|
595
|
+
}
|
|
596
|
+
// Fallback: use embedData() if available
|
|
597
|
+
if (typeof data.embedData === "function") {
|
|
598
|
+
return data.embedData;
|
|
599
|
+
}
|
|
600
|
+
// Last resort: return model data
|
|
601
|
+
return data.data;
|
|
602
|
+
}
|
|
603
|
+
// Otherwise, return the data as-is
|
|
604
|
+
return data;
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* Gets sync configurations from the source model.
|
|
608
|
+
*
|
|
609
|
+
* @returns Array of sync configurations
|
|
610
|
+
*/
|
|
611
|
+
getSyncConfigs() {
|
|
612
|
+
const syncWith = this.sourceModel.syncWith;
|
|
613
|
+
if (!syncWith || !Array.isArray(syncWith)) {
|
|
614
|
+
return [];
|
|
615
|
+
}
|
|
616
|
+
return syncWith.map((builder) => typeof builder.build === "function" ? builder.build() : builder);
|
|
617
|
+
}
|
|
618
|
+
/**
|
|
619
|
+
* Gets sync configurations for a specific model.
|
|
620
|
+
*
|
|
621
|
+
* @param modelClass - The model class
|
|
622
|
+
* @returns Array of sync configurations
|
|
623
|
+
*/
|
|
624
|
+
getSyncConfigsForModel(modelClass) {
|
|
625
|
+
const syncWith = modelClass.syncWith;
|
|
626
|
+
if (!syncWith || !Array.isArray(syncWith)) {
|
|
627
|
+
return [];
|
|
628
|
+
}
|
|
629
|
+
return syncWith.map((builder) => typeof builder.build === "function" ? builder.build() : builder);
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* Emits a syncing event.
|
|
633
|
+
*
|
|
634
|
+
* @param instruction - The sync instruction
|
|
635
|
+
*/
|
|
636
|
+
async emitSyncingEvent(instruction) {
|
|
637
|
+
const payload = {
|
|
638
|
+
sourceModel: instruction.sourceModel,
|
|
639
|
+
sourceId: instruction.sourceId,
|
|
640
|
+
targetModel: instruction.targetModel,
|
|
641
|
+
filter: instruction.filter,
|
|
642
|
+
update: instruction.update,
|
|
643
|
+
affectedCount: 0,
|
|
644
|
+
depth: instruction.depth,
|
|
645
|
+
chain: instruction.chain,
|
|
646
|
+
};
|
|
647
|
+
// Emit on source model
|
|
648
|
+
if (typeof this.sourceModel.emitSyncEvent === "function") {
|
|
649
|
+
await this.sourceModel.emitSyncEvent("syncing", payload);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
/**
|
|
653
|
+
* Emits a synced event.
|
|
654
|
+
*
|
|
655
|
+
* @param context - The sync context
|
|
656
|
+
*/
|
|
657
|
+
async emitSyncedEvent(context) {
|
|
658
|
+
const payload = {
|
|
659
|
+
sourceModel: context.sourceModel,
|
|
660
|
+
sourceId: context.sourceId,
|
|
661
|
+
targetModel: context.targetModel,
|
|
662
|
+
filter: context.filter,
|
|
663
|
+
update: context.update,
|
|
664
|
+
affectedCount: context.affectedCount,
|
|
665
|
+
depth: context.currentDepth,
|
|
666
|
+
chain: context.syncChain,
|
|
667
|
+
};
|
|
668
|
+
// Emit on source model
|
|
669
|
+
if (typeof this.sourceModel.emitSyncEvent === "function") {
|
|
670
|
+
await this.sourceModel.emitSyncEvent("synced", payload);
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Creates an empty sync result.
|
|
675
|
+
*
|
|
676
|
+
* @returns Empty sync result
|
|
677
|
+
*/
|
|
678
|
+
createEmptyResult() {
|
|
679
|
+
return {
|
|
680
|
+
success: true,
|
|
681
|
+
attempted: 0,
|
|
682
|
+
succeeded: 0,
|
|
683
|
+
failed: 0,
|
|
684
|
+
errors: [],
|
|
685
|
+
depthReached: 0,
|
|
686
|
+
contexts: [],
|
|
687
|
+
};
|
|
688
|
+
}
|
|
689
|
+
}export{SyncManager};//# sourceMappingURL=sync-manager.js.map
|