@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.56
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/CHANGELOG.md +12 -0
- package/README.md +11 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
|
@@ -1,820 +1,820 @@
|
|
|
1
|
-
# GraphQL Alias Batching Guide
|
|
2
|
-
|
|
3
|
-
**Last Updated:** 2025-01-24
|
|
4
|
-
**Status:** ✅ Production Ready
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 📋 Table of Contents
|
|
9
|
-
|
|
10
|
-
1. [Overview](#overview)
|
|
11
|
-
2. [When to Use Alias Batching](#when-to-use-alias-batching)
|
|
12
|
-
3. [How It Works](#how-it-works)
|
|
13
|
-
4. [Configuration](#configuration)
|
|
14
|
-
5. [Implementation Patterns](#implementation-patterns)
|
|
15
|
-
6. [Response Parsing](#response-parsing)
|
|
16
|
-
7. [Error Handling](#error-handling)
|
|
17
|
-
8. [Performance Considerations](#performance-considerations)
|
|
18
|
-
9. [Best Practices](#best-practices)
|
|
19
|
-
10. [Troubleshooting](#troubleshooting)
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Overview
|
|
24
|
-
|
|
25
|
-
GraphQL alias batching allows you to execute multiple mutations in a single HTTP request by using GraphQL aliases. This reduces network overhead and can improve performance for high-volume ingestion scenarios.
|
|
26
|
-
|
|
27
|
-
### What Are GraphQL Aliases?
|
|
28
|
-
|
|
29
|
-
GraphQL aliases let you include multiple fields (or mutations) with the same name in a single query by giving each one a unique alias:
|
|
30
|
-
|
|
31
|
-
```graphql
|
|
32
|
-
mutation BatchCreateLocations($input1: CreateLocationInput!, $input2: CreateLocationInput!) {
|
|
33
|
-
createLocation1: createLocation(input: $input1) { id ref name }
|
|
34
|
-
createLocation2: createLocation(input: $input2) { id ref name }
|
|
35
|
-
}
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
**Benefits:**
|
|
39
|
-
- ✅ **Reduced Network Overhead:** One HTTP request instead of multiple
|
|
40
|
-
- ✅ **Faster Execution:** Single round-trip to the server
|
|
41
|
-
- ✅ **Better Throughput:** Process more mutations per second
|
|
42
|
-
- ✅ **Server-Side Efficiency:** Server can optimize batch execution
|
|
43
|
-
|
|
44
|
-
**Trade-offs:**
|
|
45
|
-
- ⚠️ **Complex Error Handling:** Partial failures require parsing aliased responses
|
|
46
|
-
- ⚠️ **Request Size Limits:** Large batches may hit payload limits
|
|
47
|
-
- ⚠️ **Server Execution Control:** Server controls execution order (not client)
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## When to Use Alias Batching
|
|
52
|
-
|
|
53
|
-
### ✅ Use Alias Batching When:
|
|
54
|
-
|
|
55
|
-
1. **High-Volume Ingestion**
|
|
56
|
-
- Processing hundreds or thousands of records
|
|
57
|
-
- Network latency is a bottleneck
|
|
58
|
-
- Throughput is more important than latency
|
|
59
|
-
|
|
60
|
-
2. **Sequential Processing is Acceptable**
|
|
61
|
-
- Records don't depend on each other
|
|
62
|
-
- Order doesn't matter
|
|
63
|
-
- You can handle partial failures gracefully
|
|
64
|
-
|
|
65
|
-
3. **Rate Limiting Concerns**
|
|
66
|
-
- Want to reduce number of HTTP requests
|
|
67
|
-
- Server has strict rate limits
|
|
68
|
-
- Need to stay within quota
|
|
69
|
-
|
|
70
|
-
### ❌ Don't Use Alias Batching When:
|
|
71
|
-
|
|
72
|
-
1. **Low Volume (< 10 records)**
|
|
73
|
-
- Overhead doesn't justify complexity
|
|
74
|
-
- Separate requests are simpler
|
|
75
|
-
|
|
76
|
-
2. **Strict Error Isolation Needed**
|
|
77
|
-
- Need to know exactly which mutation failed
|
|
78
|
-
- Can't tolerate partial failures
|
|
79
|
-
- Want to retry individual mutations
|
|
80
|
-
|
|
81
|
-
3. **Dependent Mutations**
|
|
82
|
-
- Mutations depend on each other
|
|
83
|
-
- Need transaction-like behavior
|
|
84
|
-
- Order matters
|
|
85
|
-
|
|
86
|
-
### Decision Matrix
|
|
87
|
-
|
|
88
|
-
| Scenario | Separate Requests | Alias Batching |
|
|
89
|
-
|---------|------------------|----------------|
|
|
90
|
-
| < 10 records | ✅ Recommended | ❌ Overkill |
|
|
91
|
-
| 10-100 records | ✅ Simple | ⚠️ Optional |
|
|
92
|
-
| 100-1000 records | ⚠️ Slower | ✅ Recommended |
|
|
93
|
-
| > 1000 records | ❌ Too slow | ✅ Recommended |
|
|
94
|
-
| Need error isolation | ✅ Better | ⚠️ Complex |
|
|
95
|
-
| Need throughput | ⚠️ Slower | ✅ Better |
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## How It Works
|
|
100
|
-
|
|
101
|
-
### Architecture Overview
|
|
102
|
-
|
|
103
|
-
```
|
|
104
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
105
|
-
│ Client-Side Flow │
|
|
106
|
-
└─────────────────────────────────────────────────────────────┘
|
|
107
|
-
|
|
108
|
-
1. Map Items (GraphQLMutationMapper)
|
|
109
|
-
├─ Transform each record to GraphQL input
|
|
110
|
-
└─ Store mapped inputs
|
|
111
|
-
|
|
112
|
-
2. Batch Items (batchMap or manual)
|
|
113
|
-
├─ Group items into batches (e.g., 5 per batch)
|
|
114
|
-
└─ Generate aliased query
|
|
115
|
-
|
|
116
|
-
3. Execute Batches (Concurrency Control)
|
|
117
|
-
├─ Send batch 1: mutationsPerAliasBatch=5
|
|
118
|
-
├─ Send batch 2: mutationsPerAliasBatch=5
|
|
119
|
-
└─ Process concurrently (maxParallel=3)
|
|
120
|
-
|
|
121
|
-
4. Parse Responses
|
|
122
|
-
├─ Extract results by alias (createLocation1, createLocation2, ...)
|
|
123
|
-
├─ Identify partial failures
|
|
124
|
-
└─ Aggregate success/failure counts
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
### SDK Methods
|
|
128
|
-
|
|
129
|
-
#### 1. `GraphQLMutationMapper.batchMap()`
|
|
130
|
-
|
|
131
|
-
The SDK provides a `batchMap()` method that generates aliased queries:
|
|
132
|
-
|
|
133
|
-
```typescript
|
|
134
|
-
import { GraphQLMutationMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
135
|
-
|
|
136
|
-
const mapper = new GraphQLMutationMapper(mappingConfig, logger, { fluentClient: client });
|
|
137
|
-
|
|
138
|
-
// Batch map multiple items
|
|
139
|
-
const items = [
|
|
140
|
-
{ ref: 'LOC-001', name: 'Location 1' },
|
|
141
|
-
{ ref: 'LOC-002', name: 'Location 2' },
|
|
142
|
-
{ ref: 'LOC-003', name: 'Location 3' },
|
|
143
|
-
];
|
|
144
|
-
|
|
145
|
-
const batch = await mapper.batchMap(items, { mutationsPerBatch: 3 });
|
|
146
|
-
|
|
147
|
-
// Result:
|
|
148
|
-
// {
|
|
149
|
-
// query: "mutation BatchCreateLocations($input1: CreateLocationInput!, ...) { createLocation1: createLocation(...) { id ref } ... }",
|
|
150
|
-
// variables: { input1: {...}, input2: {...}, input3: {...} }
|
|
151
|
-
// }
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
#### 2. `buildAliasedMutationQuery()`
|
|
155
|
-
|
|
156
|
-
For manual query generation:
|
|
157
|
-
|
|
158
|
-
```typescript
|
|
159
|
-
import { buildAliasedMutationQuery } from '@fluentcommerce/fc-connect-sdk';
|
|
160
|
-
|
|
161
|
-
const query = buildAliasedMutationQuery(mappingConfig, batchSize);
|
|
162
|
-
// Generates: mutation BatchCreateLocations($input1: ..., $input2: ...) { createLocation1: ... createLocation2: ... }
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
---
|
|
166
|
-
|
|
167
|
-
## Configuration
|
|
168
|
-
|
|
169
|
-
### Template-Level Configuration
|
|
170
|
-
|
|
171
|
-
Templates use activation variables to control alias batching:
|
|
172
|
-
|
|
173
|
-
```typescript
|
|
174
|
-
// Concurrency control (number of concurrent alias batch requests)
|
|
175
|
-
const mutationBatchSize = parseInt(
|
|
176
|
-
activation?.getVariable('mutationBatchSize') || '1', // Default: 1 (sequential)
|
|
177
|
-
10
|
|
178
|
-
);
|
|
179
|
-
|
|
180
|
-
// Alias batching (number of mutations per aliased request)
|
|
181
|
-
const mutationsPerAliasBatch = activation?.getVariable('mutationsPerAliasBatch')
|
|
182
|
-
? parseInt(activation?.getVariable('mutationsPerAliasBatch') || '1', 10)
|
|
183
|
-
: undefined; // Default: undefined (disabled, use separate requests)
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### Configuration Examples
|
|
187
|
-
|
|
188
|
-
#### Example 1: Default (Sequential, No Aliases)
|
|
189
|
-
```typescript
|
|
190
|
-
mutationBatchSize: 1 // Sequential processing
|
|
191
|
-
mutationsPerAliasBatch: undefined // Disabled (separate requests)
|
|
192
|
-
```
|
|
193
|
-
**Result:** Each mutation is sent as a separate request, executed sequentially.
|
|
194
|
-
|
|
195
|
-
#### Example 2: Concurrent Requests (No Aliases)
|
|
196
|
-
```typescript
|
|
197
|
-
mutationBatchSize: 5 // 5 concurrent requests
|
|
198
|
-
mutationsPerAliasBatch: undefined // Disabled (separate requests)
|
|
199
|
-
```
|
|
200
|
-
**Result:** 5 separate HTTP requests sent concurrently.
|
|
201
|
-
|
|
202
|
-
#### Example 3: Alias Batching (Single Batch)
|
|
203
|
-
```typescript
|
|
204
|
-
mutationBatchSize: 1 // Sequential batch processing
|
|
205
|
-
mutationsPerAliasBatch: 5 // 5 mutations per aliased request
|
|
206
|
-
```
|
|
207
|
-
**Result:** Groups of 5 mutations bundled into single aliased requests, processed sequentially.
|
|
208
|
-
|
|
209
|
-
#### Example 4: Concurrent Alias Batching
|
|
210
|
-
```typescript
|
|
211
|
-
mutationBatchSize: 3 // 3 concurrent alias batch requests
|
|
212
|
-
mutationsPerAliasBatch: 5 // 5 mutations per aliased request
|
|
213
|
-
```
|
|
214
|
-
**Result:** Groups of 5 mutations bundled into aliased requests, with 3 such requests sent concurrently.
|
|
215
|
-
|
|
216
|
-
**Visual Example:**
|
|
217
|
-
```
|
|
218
|
-
100 locations, mutationsPerAliasBatch=5, mutationBatchSize=3
|
|
219
|
-
|
|
220
|
-
Batch 1: [Loc1-5] ──┐
|
|
221
|
-
Batch 2: [Loc6-10] ──┼─► Sent concurrently (3 batches)
|
|
222
|
-
Batch 3: [Loc11-15] ──┘
|
|
223
|
-
|
|
224
|
-
Batch 4: [Loc16-20] ──┐
|
|
225
|
-
Batch 5: [Loc21-25] ──┼─► Sent concurrently (3 batches)
|
|
226
|
-
Batch 6: [Loc26-30] ──┘
|
|
227
|
-
|
|
228
|
-
... (continues until all 100 locations processed)
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
### Mapping Config (Optional)
|
|
232
|
-
|
|
233
|
-
The `aliasBatching` config in `MappingConfig` is optional metadata. Templates use runtime parameters for flexibility:
|
|
234
|
-
|
|
235
|
-
```json
|
|
236
|
-
{
|
|
237
|
-
"mutation": "createLocation",
|
|
238
|
-
"sourceFormat": "json",
|
|
239
|
-
"aliasBatching": {
|
|
240
|
-
"enabled": true,
|
|
241
|
-
"mutationsPerBatch": 5,
|
|
242
|
-
"maxMutationsPerBatch": 20
|
|
243
|
-
},
|
|
244
|
-
"arguments": {
|
|
245
|
-
"input": {
|
|
246
|
-
"ref": { "source": "ref" },
|
|
247
|
-
"name": { "source": "name" }
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
**Note:** Templates use `mutationsPerAliasBatch` activation variable instead of this config for runtime flexibility.
|
|
254
|
-
|
|
255
|
-
---
|
|
256
|
-
|
|
257
|
-
## Implementation Patterns
|
|
258
|
-
|
|
259
|
-
### Pattern 1: Template Helper Functions
|
|
260
|
-
|
|
261
|
-
Templates include helper functions for alias batching:
|
|
262
|
-
|
|
263
|
-
```typescript
|
|
264
|
-
/**
|
|
265
|
-
* Execute mutations using GraphQL aliases (batched requests)
|
|
266
|
-
*/
|
|
267
|
-
async function executeMutationsWithAliases(
|
|
268
|
-
locations: Array<{ query: string; variables: any; input: any }>,
|
|
269
|
-
client: FluentClient,
|
|
270
|
-
mapper: GraphQLMutationMapper,
|
|
271
|
-
log: any,
|
|
272
|
-
retailerId: string,
|
|
273
|
-
maxParallel: number, // Concurrency control
|
|
274
|
-
mutationsPerAliasBatch: number // Mutations per aliased request
|
|
275
|
-
): Promise<MutationResult> {
|
|
276
|
-
// ... implementation
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* Build aliased batch query and variables
|
|
281
|
-
*/
|
|
282
|
-
function buildAliasedBatch(
|
|
283
|
-
batch: Array<{ query: string; variables: any; input: any }>,
|
|
284
|
-
mutationName: string,
|
|
285
|
-
retailerId: string
|
|
286
|
-
): { query: string; variables: Record<string, any> } {
|
|
287
|
-
// ... implementation
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Parse aliased GraphQL response
|
|
292
|
-
*/
|
|
293
|
-
function parseAliasResponse(
|
|
294
|
-
response: any,
|
|
295
|
-
batch: Array<{ query: string; variables: any; input: any }>,
|
|
296
|
-
mutationName: string
|
|
297
|
-
): { executed: number; failed: number; errors: Array<{ locationRef: string; error: string }> } {
|
|
298
|
-
// ... implementation
|
|
299
|
-
}
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
### Pattern 2: Using SDK batchMap()
|
|
303
|
-
|
|
304
|
-
For custom implementations:
|
|
305
|
-
|
|
306
|
-
```typescript
|
|
307
|
-
import { GraphQLMutationMapper, FluentClient } from '@fluentcommerce/fc-connect-sdk';
|
|
308
|
-
|
|
309
|
-
const mapper = new GraphQLMutationMapper(mappingConfig, logger, { fluentClient: client });
|
|
310
|
-
|
|
311
|
-
// Group items into batches
|
|
312
|
-
const batchSize = 5;
|
|
313
|
-
const batches: Array<typeof items> = [];
|
|
314
|
-
for (let i = 0; i < items.length; i += batchSize) {
|
|
315
|
-
batches.push(items.slice(i, i + batchSize));
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// Process batches
|
|
319
|
-
for (const batch of batches) {
|
|
320
|
-
// Generate aliased query
|
|
321
|
-
const { query, variables } = await mapper.batchMap(batch, {
|
|
322
|
-
mutationsPerBatch: batch.length
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
// Execute
|
|
326
|
-
const response = await client.graphql({ query, variables });
|
|
327
|
-
|
|
328
|
-
// Parse response
|
|
329
|
-
const results = parseAliasResponse(response, batch, 'createLocation');
|
|
330
|
-
// ... handle results
|
|
331
|
-
}
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
### Pattern 3: Dispatcher Pattern
|
|
335
|
-
|
|
336
|
-
Templates use a dispatcher to choose between modes:
|
|
337
|
-
|
|
338
|
-
```typescript
|
|
339
|
-
async function executeMutations(
|
|
340
|
-
locations: Array<{ query: string; variables: any; input: any }>,
|
|
341
|
-
client: FluentClient,
|
|
342
|
-
mapper: GraphQLMutationMapper,
|
|
343
|
-
log: any,
|
|
344
|
-
retailerId: string,
|
|
345
|
-
batchSize: number = 1,
|
|
346
|
-
mutationsPerAliasBatch?: number
|
|
347
|
-
): Promise<MutationResult> {
|
|
348
|
-
const useAliases = mutationsPerAliasBatch && mutationsPerAliasBatch > 1;
|
|
349
|
-
|
|
350
|
-
if (useAliases) {
|
|
351
|
-
return await executeMutationsWithAliases(
|
|
352
|
-
locations, client, mapper, log, retailerId,
|
|
353
|
-
batchSize, mutationsPerAliasBatch!
|
|
354
|
-
);
|
|
355
|
-
} else {
|
|
356
|
-
return await executeMutationsSeparate(
|
|
357
|
-
locations, client, mapper, log, retailerId, batchSize
|
|
358
|
-
);
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
---
|
|
364
|
-
|
|
365
|
-
## Response Parsing
|
|
366
|
-
|
|
367
|
-
### Response Structure
|
|
368
|
-
|
|
369
|
-
Aliased GraphQL responses have this structure:
|
|
370
|
-
|
|
371
|
-
```json
|
|
372
|
-
{
|
|
373
|
-
"data": {
|
|
374
|
-
"createLocation1": { "id": "123", "ref": "LOC-001", "name": "Location 1" },
|
|
375
|
-
"createLocation2": { "id": "124", "ref": "LOC-002", "name": "Location 2" },
|
|
376
|
-
"createLocation3": null // ← Partial failure
|
|
377
|
-
},
|
|
378
|
-
"errors": [
|
|
379
|
-
{
|
|
380
|
-
"message": "Location with ref 'LOC-003' already exists",
|
|
381
|
-
"path": ["createLocation3"],
|
|
382
|
-
"extensions": { "code": "DUPLICATE" }
|
|
383
|
-
}
|
|
384
|
-
]
|
|
385
|
-
}
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
### SDK Response Parser ✨ NEW
|
|
389
|
-
|
|
390
|
-
**The SDK now provides a built-in response parser** (available in latest SDK):
|
|
391
|
-
|
|
392
|
-
```typescript
|
|
393
|
-
import {
|
|
394
|
-
parseAliasedMutationResponse,
|
|
395
|
-
formatErrorSummary,
|
|
396
|
-
getFailedMutations,
|
|
397
|
-
getSuccessfulMutations,
|
|
398
|
-
type AliasedMutationResult
|
|
399
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
400
|
-
|
|
401
|
-
// Execute aliased mutation
|
|
402
|
-
const response = await client.graphql({ query, variables });
|
|
403
|
-
|
|
404
|
-
// Parse response
|
|
405
|
-
const result = parseAliasedMutationResponse(
|
|
406
|
-
response,
|
|
407
|
-
batchSize, // Number of mutations in the batch
|
|
408
|
-
'createLocation', // Base mutation name
|
|
409
|
-
inputs // Optional: original input data for error tracking
|
|
410
|
-
);
|
|
411
|
-
|
|
412
|
-
// Check results
|
|
413
|
-
console.log(`Executed: ${result.executed}, Failed: ${result.failed}`);
|
|
414
|
-
console.log(`All succeeded: ${result.allSucceeded}`);
|
|
415
|
-
|
|
416
|
-
if (!result.allSucceeded) {
|
|
417
|
-
console.error(formatErrorSummary(result));
|
|
418
|
-
|
|
419
|
-
// Get failed mutations
|
|
420
|
-
const failed = getFailedMutations(result);
|
|
421
|
-
failed.forEach(mutation => {
|
|
422
|
-
console.error(`${mutation.alias}: ${mutation.error?.message}`);
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
// Get successful mutations
|
|
427
|
-
const successful = getSuccessfulMutations(result);
|
|
428
|
-
console.log(`Created ${successful.length} locations successfully`);
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
### Result Structure
|
|
432
|
-
|
|
433
|
-
The parser returns an `AliasedMutationResult` object:
|
|
434
|
-
|
|
435
|
-
```typescript
|
|
436
|
-
interface AliasedMutationResult {
|
|
437
|
-
executed: number; // Total mutations that succeeded
|
|
438
|
-
failed: number; // Total mutations that failed
|
|
439
|
-
allSucceeded: boolean; // Whether all mutations succeeded
|
|
440
|
-
allFailed: boolean; // Whether all mutations failed
|
|
441
|
-
results: MutationResult[]; // Individual mutation results
|
|
442
|
-
errors: MutationError[]; // Aggregated errors
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
interface MutationResult {
|
|
446
|
-
alias: string; // e.g., 'createLocation1'
|
|
447
|
-
index: number; // 0-based index in batch
|
|
448
|
-
success: boolean; // Whether this mutation succeeded
|
|
449
|
-
data?: any; // Response data (if successful)
|
|
450
|
-
error?: MutationError; // Error details (if failed)
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
interface MutationError {
|
|
454
|
-
alias: string; // e.g., 'createLocation2'
|
|
455
|
-
index: number; // 0-based index in batch
|
|
456
|
-
inputRef?: string; // e.g., 'LOC-002' (from input data)
|
|
457
|
-
message: string; // Error message
|
|
458
|
-
graphqlErrors?: GraphQLError[];// Full GraphQL error details
|
|
459
|
-
input?: any; // Original input data
|
|
460
|
-
}
|
|
461
|
-
```
|
|
462
|
-
|
|
463
|
-
### Features
|
|
464
|
-
|
|
465
|
-
**Automatic Error Correlation:**
|
|
466
|
-
- Matches GraphQL errors to specific mutations via `path` arrays
|
|
467
|
-
- Extracts error messages and details
|
|
468
|
-
- Provides input reference tracking
|
|
469
|
-
|
|
470
|
-
**Flexible Input Tracking:**
|
|
471
|
-
```typescript
|
|
472
|
-
// Default: extracts 'ref' or 'id' from input
|
|
473
|
-
const result = parseAliasedMutationResponse(response, 3, 'createLocation', inputs);
|
|
474
|
-
|
|
475
|
-
// Custom: extract custom reference field
|
|
476
|
-
const result = parseAliasedMutationResponse(response, 3, 'createLocation', inputs, {
|
|
477
|
-
extractRef: (input: any) => input.customRef
|
|
478
|
-
});
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
**Helper Functions:**
|
|
482
|
-
- `getFailedMutations(result)` - Filter failed mutations
|
|
483
|
-
- `getSuccessfulMutations(result)` - Filter successful mutations
|
|
484
|
-
- `getErrorMessage(mutation)` - Extract error message
|
|
485
|
-
- `formatErrorSummary(result)` - Format for logging
|
|
486
|
-
|
|
487
|
-
### Alternative Template Parsing (Optional)
|
|
488
|
-
|
|
489
|
-
For templates that need custom parsing logic:
|
|
490
|
-
|
|
491
|
-
```typescript
|
|
492
|
-
function parseAliasResponse(
|
|
493
|
-
response: any,
|
|
494
|
-
batch: Array<{ query: string; variables: any; input: any }>,
|
|
495
|
-
mutationName: string
|
|
496
|
-
): { executed: number; failed: number; errors: Array<{ locationRef: string; error: string }> } {
|
|
497
|
-
const result = { executed: 0, failed: 0, errors: [] };
|
|
498
|
-
|
|
499
|
-
const data = response.data || {};
|
|
500
|
-
const errors = response.errors || [];
|
|
501
|
-
|
|
502
|
-
// Process each alias result
|
|
503
|
-
batch.forEach((item, index) => {
|
|
504
|
-
const alias = `${mutationName}${index + 1}`;
|
|
505
|
-
const aliasData = data[alias];
|
|
506
|
-
const aliasErrors = errors.filter((e: any) =>
|
|
507
|
-
e.path && Array.isArray(e.path) && e.path.includes(alias)
|
|
508
|
-
);
|
|
509
|
-
|
|
510
|
-
if (aliasData && !aliasErrors.length) {
|
|
511
|
-
result.executed++;
|
|
512
|
-
} else {
|
|
513
|
-
result.failed++;
|
|
514
|
-
const errorMsg = aliasErrors[0]?.message || 'Mutation failed';
|
|
515
|
-
const locationRef = item.input?.ref || 'unknown';
|
|
516
|
-
result.errors.push({
|
|
517
|
-
locationRef,
|
|
518
|
-
error: errorMsg,
|
|
519
|
-
});
|
|
520
|
-
}
|
|
521
|
-
});
|
|
522
|
-
|
|
523
|
-
return result;
|
|
524
|
-
}
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
**Note:** The SDK parser provides more robust error handling and type safety. Use it unless you need custom parsing logic.
|
|
528
|
-
|
|
529
|
-
### Alias Naming Pattern
|
|
530
|
-
|
|
531
|
-
The SDK uses a simple naming pattern: `{mutationName}{index}`
|
|
532
|
-
|
|
533
|
-
- `createLocation1`, `createLocation2`, `createLocation3`, ...
|
|
534
|
-
- `updateProduct1`, `updateProduct2`, `updateProduct3`, ...
|
|
535
|
-
- `deleteOrder1`, `deleteOrder2`, `deleteOrder3`, ...
|
|
536
|
-
|
|
537
|
-
**Not configurable** - this keeps the implementation simple and predictable.
|
|
538
|
-
|
|
539
|
-
---
|
|
540
|
-
|
|
541
|
-
## Error Handling
|
|
542
|
-
|
|
543
|
-
### Partial Failures
|
|
544
|
-
|
|
545
|
-
Aliased batches can have partial failures:
|
|
546
|
-
|
|
547
|
-
```json
|
|
548
|
-
{
|
|
549
|
-
"data": {
|
|
550
|
-
"createLocation1": { "id": "123", "ref": "LOC-001" },
|
|
551
|
-
"createLocation2": null, // ← Failed
|
|
552
|
-
"createLocation3": { "id": "125", "ref": "LOC-003" }
|
|
553
|
-
},
|
|
554
|
-
"errors": [
|
|
555
|
-
{
|
|
556
|
-
"message": "Duplicate ref: LOC-002",
|
|
557
|
-
"path": ["createLocation2"]
|
|
558
|
-
}
|
|
559
|
-
]
|
|
560
|
-
}
|
|
561
|
-
```
|
|
562
|
-
|
|
563
|
-
**Best Practices:**
|
|
564
|
-
1. ✅ Parse each alias result individually
|
|
565
|
-
2. ✅ Track which mutations succeeded/failed
|
|
566
|
-
3. ✅ Log partial failures for audit
|
|
567
|
-
4. ✅ Continue processing remaining batches
|
|
568
|
-
5. ✅ Don't retry entire batch if only one failed
|
|
569
|
-
|
|
570
|
-
### Error Parsing
|
|
571
|
-
|
|
572
|
-
```typescript
|
|
573
|
-
// Extract errors for specific alias
|
|
574
|
-
const aliasErrors = errors.filter((e: any) =>
|
|
575
|
-
e.path && Array.isArray(e.path) && e.path.includes(alias)
|
|
576
|
-
);
|
|
577
|
-
|
|
578
|
-
// Handle different error types
|
|
579
|
-
if (aliasErrors.length > 0) {
|
|
580
|
-
const error = aliasErrors[0];
|
|
581
|
-
if (error.extensions?.code === 'DUPLICATE') {
|
|
582
|
-
// Handle duplicate
|
|
583
|
-
} else if (error.extensions?.code === 'VALIDATION_ERROR') {
|
|
584
|
-
// Handle validation error
|
|
585
|
-
} else {
|
|
586
|
-
// Handle generic error
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
```
|
|
590
|
-
|
|
591
|
-
### Retry Strategy
|
|
592
|
-
|
|
593
|
-
**Don't retry entire batch** - retry individual mutations:
|
|
594
|
-
|
|
595
|
-
```typescript
|
|
596
|
-
// ❌ BAD: Retry entire batch
|
|
597
|
-
if (result.failed > 0) {
|
|
598
|
-
await retry(() => client.graphql({ query, variables }));
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
// ✅ GOOD: Retry individual mutations
|
|
602
|
-
const failedItems = batch.filter((item, idx) => {
|
|
603
|
-
const alias = `${mutationName}${idx + 1}`;
|
|
604
|
-
return !response.data[alias];
|
|
605
|
-
});
|
|
606
|
-
|
|
607
|
-
for (const item of failedItems) {
|
|
608
|
-
await retry(() => executeSingleMutation(item));
|
|
609
|
-
}
|
|
610
|
-
```
|
|
611
|
-
|
|
612
|
-
---
|
|
613
|
-
|
|
614
|
-
## Performance Considerations
|
|
615
|
-
|
|
616
|
-
### Network Overhead
|
|
617
|
-
|
|
618
|
-
**Separate Requests:**
|
|
619
|
-
- 100 mutations = 100 HTTP requests
|
|
620
|
-
- 100 × network latency = total time
|
|
621
|
-
|
|
622
|
-
**Alias Batching:**
|
|
623
|
-
- 100 mutations ÷ 5 per batch = 20 HTTP requests
|
|
624
|
-
- 20 × network latency = total time
|
|
625
|
-
|
|
626
|
-
**Savings:** ~80% reduction in network overhead
|
|
627
|
-
|
|
628
|
-
### Optimal Batch Size
|
|
629
|
-
|
|
630
|
-
**Factors to Consider:**
|
|
631
|
-
|
|
632
|
-
1. **Payload Size**
|
|
633
|
-
- GraphQL requests have size limits
|
|
634
|
-
- Larger batches = larger payloads
|
|
635
|
-
- **Recommendation:** 5-10 mutations per batch
|
|
636
|
-
|
|
637
|
-
2. **Error Isolation**
|
|
638
|
-
- Larger batches = more mutations affected by one failure
|
|
639
|
-
- **Recommendation:** 5-10 mutations per batch
|
|
640
|
-
|
|
641
|
-
3. **Server Processing**
|
|
642
|
-
- Server may process batches sequentially
|
|
643
|
-
- Larger batches = longer wait for first result
|
|
644
|
-
- **Recommendation:** 5-10 mutations per batch
|
|
645
|
-
|
|
646
|
-
**Default:** `mutationsPerAliasBatch: 5` (optimal balance)
|
|
647
|
-
|
|
648
|
-
### Concurrency vs Batch Size
|
|
649
|
-
|
|
650
|
-
**Trade-off:**
|
|
651
|
-
- **High concurrency + small batches:** More requests, faster per-request
|
|
652
|
-
- **Low concurrency + large batches:** Fewer requests, slower per-request
|
|
653
|
-
|
|
654
|
-
**Recommendation:**
|
|
655
|
-
- Start with `mutationBatchSize: 1`, `mutationsPerAliasBatch: 5`
|
|
656
|
-
- If throughput is low, increase `mutationBatchSize` to 3-5
|
|
657
|
-
- If errors increase, reduce `mutationsPerAliasBatch` to 3
|
|
658
|
-
|
|
659
|
-
---
|
|
660
|
-
|
|
661
|
-
## Best Practices
|
|
662
|
-
|
|
663
|
-
### ✅ DO
|
|
664
|
-
|
|
665
|
-
1. **Use Aliases for High Volume**
|
|
666
|
-
- Process 100+ records
|
|
667
|
-
- Network latency is a bottleneck
|
|
668
|
-
- Throughput is priority
|
|
669
|
-
|
|
670
|
-
2. **Keep Batch Sizes Reasonable**
|
|
671
|
-
- 5-10 mutations per batch
|
|
672
|
-
- Don't exceed payload limits
|
|
673
|
-
- Balance error isolation
|
|
674
|
-
|
|
675
|
-
3. **Handle Partial Failures**
|
|
676
|
-
- Parse each alias result
|
|
677
|
-
- Track individual success/failure
|
|
678
|
-
- Log errors for audit
|
|
679
|
-
|
|
680
|
-
4. **Monitor Performance**
|
|
681
|
-
- Track request count reduction
|
|
682
|
-
- Measure throughput improvement
|
|
683
|
-
- Watch for error rate changes
|
|
684
|
-
|
|
685
|
-
5. **Use Concurrency Control**
|
|
686
|
-
- Start with `mutationBatchSize: 1`
|
|
687
|
-
- Increase gradually if needed
|
|
688
|
-
- Respect rate limits
|
|
689
|
-
|
|
690
|
-
### ❌ DON'T
|
|
691
|
-
|
|
692
|
-
1. **Don't Use for Low Volume**
|
|
693
|
-
- < 10 records: use separate requests
|
|
694
|
-
- Overhead doesn't justify complexity
|
|
695
|
-
|
|
696
|
-
2. **Don't Make Batches Too Large**
|
|
697
|
-
- > 20 mutations per batch
|
|
698
|
-
- Risk hitting payload limits
|
|
699
|
-
- Poor error isolation
|
|
700
|
-
|
|
701
|
-
3. **Don't Retry Entire Batches**
|
|
702
|
-
- Retry individual mutations
|
|
703
|
-
- Don't waste successful mutations
|
|
704
|
-
|
|
705
|
-
4. **Don't Ignore Errors**
|
|
706
|
-
- Parse all alias results
|
|
707
|
-
- Log partial failures
|
|
708
|
-
- Track error patterns
|
|
709
|
-
|
|
710
|
-
5. **Don't Skip Concurrency Control**
|
|
711
|
-
- Always set `mutationBatchSize`
|
|
712
|
-
- Respect rate limits
|
|
713
|
-
- Don't overwhelm server
|
|
714
|
-
|
|
715
|
-
---
|
|
716
|
-
|
|
717
|
-
## Troubleshooting
|
|
718
|
-
|
|
719
|
-
### Issue: Batch Size Too Large
|
|
720
|
-
|
|
721
|
-
**Symptoms:**
|
|
722
|
-
- `413 Payload Too Large` errors
|
|
723
|
-
- Requests timing out
|
|
724
|
-
- Server rejecting requests
|
|
725
|
-
|
|
726
|
-
**Solution:**
|
|
727
|
-
```typescript
|
|
728
|
-
// Reduce batch size
|
|
729
|
-
mutationsPerAliasBatch: 3 // Instead of 10
|
|
730
|
-
```
|
|
731
|
-
|
|
732
|
-
### Issue: Partial Failures Not Detected
|
|
733
|
-
|
|
734
|
-
**Symptoms:**
|
|
735
|
-
- Some mutations fail silently
|
|
736
|
-
- Errors not logged
|
|
737
|
-
- Incomplete data
|
|
738
|
-
|
|
739
|
-
**Solution:**
|
|
740
|
-
```typescript
|
|
741
|
-
// Ensure parseAliasResponse checks all aliases
|
|
742
|
-
batch.forEach((item, index) => {
|
|
743
|
-
const alias = `${mutationName}${index + 1}`;
|
|
744
|
-
const aliasData = data[alias];
|
|
745
|
-
const aliasErrors = errors.filter(e => e.path?.includes(alias));
|
|
746
|
-
|
|
747
|
-
if (!aliasData || aliasErrors.length > 0) {
|
|
748
|
-
// Log error
|
|
749
|
-
}
|
|
750
|
-
});
|
|
751
|
-
```
|
|
752
|
-
|
|
753
|
-
### Issue: Slow Performance
|
|
754
|
-
|
|
755
|
-
**Symptoms:**
|
|
756
|
-
- Batches take longer than separate requests
|
|
757
|
-
- No throughput improvement
|
|
758
|
-
|
|
759
|
-
**Solution:**
|
|
760
|
-
```typescript
|
|
761
|
-
// Increase concurrency
|
|
762
|
-
mutationBatchSize: 5 // Instead of 1
|
|
763
|
-
|
|
764
|
-
// Or reduce batch size
|
|
765
|
-
mutationsPerAliasBatch: 3 // Instead of 10
|
|
766
|
-
```
|
|
767
|
-
|
|
768
|
-
### Issue: Wrong Alias Names
|
|
769
|
-
|
|
770
|
-
**Symptoms:**
|
|
771
|
-
- Can't find results in response
|
|
772
|
-
- Alias names don't match
|
|
773
|
-
|
|
774
|
-
**Solution:**
|
|
775
|
-
```typescript
|
|
776
|
-
// Ensure consistent naming pattern
|
|
777
|
-
const alias = `${mutationName}${index + 1}`; // Simple: createLocation1, createLocation2, etc.
|
|
778
|
-
|
|
779
|
-
// Don't use custom naming patterns
|
|
780
|
-
// ❌ const alias = `mut_${index}`;
|
|
781
|
-
// ✅ const alias = `${mutationName}${index + 1}`;
|
|
782
|
-
```
|
|
783
|
-
|
|
784
|
-
---
|
|
785
|
-
|
|
786
|
-
## Related Documentation
|
|
787
|
-
|
|
788
|
-
- [GraphQL Mutation Mapping Guide](graphql-mutation-mapping/graphql-mutation-mapping-readme.md)
|
|
789
|
-
- [Mapping Format Decision Tree](mapping-format-decision-tree.md)
|
|
790
|
-
- [Mapper Comparison Guide](mapping-mapper-comparison-guide.md)
|
|
791
|
-
- [Implementation Plan](./mapping-graphql-alias-batching-guide.md) (see this guide)
|
|
792
|
-
|
|
793
|
-
---
|
|
794
|
-
|
|
795
|
-
## Summary
|
|
796
|
-
|
|
797
|
-
**GraphQL alias batching** reduces network overhead and improves throughput for high-volume ingestion scenarios. Use it when:
|
|
798
|
-
|
|
799
|
-
- ✅ Processing 100+ records
|
|
800
|
-
- ✅ Network latency is a bottleneck
|
|
801
|
-
- ✅ Throughput is priority
|
|
802
|
-
- ✅ Partial failures are acceptable
|
|
803
|
-
|
|
804
|
-
**Configuration:**
|
|
805
|
-
- `mutationBatchSize`: Concurrency control (default: 1)
|
|
806
|
-
- `mutationsPerAliasBatch`: Mutations per aliased request (default: undefined = disabled)
|
|
807
|
-
|
|
808
|
-
**Best Practices:**
|
|
809
|
-
- Keep batch sizes reasonable (5-10 mutations)
|
|
810
|
-
- Handle partial failures gracefully
|
|
811
|
-
- Monitor performance and adjust as needed
|
|
812
|
-
- Use concurrency control to respect rate limits
|
|
813
|
-
|
|
814
|
-
The SDK provides complete alias batching support:
|
|
815
|
-
- **Query Generation:** `batchMap()`, `buildAliasedMutationQuery()`
|
|
816
|
-
- **Response Parsing:** `parseAliasedMutationResponse()` ✨ NEW
|
|
817
|
-
- **Helper Functions:** `formatErrorSummary()`, `getFailedMutations()`, `getSuccessfulMutations()`
|
|
818
|
-
|
|
819
|
-
Templates can use these SDK utilities or implement custom logic for specific requirements.
|
|
820
|
-
|
|
1
|
+
# GraphQL Alias Batching Guide
|
|
2
|
+
|
|
3
|
+
**Last Updated:** 2025-01-24
|
|
4
|
+
**Status:** ✅ Production Ready
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 📋 Table of Contents
|
|
9
|
+
|
|
10
|
+
1. [Overview](#overview)
|
|
11
|
+
2. [When to Use Alias Batching](#when-to-use-alias-batching)
|
|
12
|
+
3. [How It Works](#how-it-works)
|
|
13
|
+
4. [Configuration](#configuration)
|
|
14
|
+
5. [Implementation Patterns](#implementation-patterns)
|
|
15
|
+
6. [Response Parsing](#response-parsing)
|
|
16
|
+
7. [Error Handling](#error-handling)
|
|
17
|
+
8. [Performance Considerations](#performance-considerations)
|
|
18
|
+
9. [Best Practices](#best-practices)
|
|
19
|
+
10. [Troubleshooting](#troubleshooting)
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Overview
|
|
24
|
+
|
|
25
|
+
GraphQL alias batching allows you to execute multiple mutations in a single HTTP request by using GraphQL aliases. This reduces network overhead and can improve performance for high-volume ingestion scenarios.
|
|
26
|
+
|
|
27
|
+
### What Are GraphQL Aliases?
|
|
28
|
+
|
|
29
|
+
GraphQL aliases let you include multiple fields (or mutations) with the same name in a single query by giving each one a unique alias:
|
|
30
|
+
|
|
31
|
+
```graphql
|
|
32
|
+
mutation BatchCreateLocations($input1: CreateLocationInput!, $input2: CreateLocationInput!) {
|
|
33
|
+
createLocation1: createLocation(input: $input1) { id ref name }
|
|
34
|
+
createLocation2: createLocation(input: $input2) { id ref name }
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Benefits:**
|
|
39
|
+
- ✅ **Reduced Network Overhead:** One HTTP request instead of multiple
|
|
40
|
+
- ✅ **Faster Execution:** Single round-trip to the server
|
|
41
|
+
- ✅ **Better Throughput:** Process more mutations per second
|
|
42
|
+
- ✅ **Server-Side Efficiency:** Server can optimize batch execution
|
|
43
|
+
|
|
44
|
+
**Trade-offs:**
|
|
45
|
+
- ⚠️ **Complex Error Handling:** Partial failures require parsing aliased responses
|
|
46
|
+
- ⚠️ **Request Size Limits:** Large batches may hit payload limits
|
|
47
|
+
- ⚠️ **Server Execution Control:** Server controls execution order (not client)
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## When to Use Alias Batching
|
|
52
|
+
|
|
53
|
+
### ✅ Use Alias Batching When:
|
|
54
|
+
|
|
55
|
+
1. **High-Volume Ingestion**
|
|
56
|
+
- Processing hundreds or thousands of records
|
|
57
|
+
- Network latency is a bottleneck
|
|
58
|
+
- Throughput is more important than latency
|
|
59
|
+
|
|
60
|
+
2. **Sequential Processing is Acceptable**
|
|
61
|
+
- Records don't depend on each other
|
|
62
|
+
- Order doesn't matter
|
|
63
|
+
- You can handle partial failures gracefully
|
|
64
|
+
|
|
65
|
+
3. **Rate Limiting Concerns**
|
|
66
|
+
- Want to reduce number of HTTP requests
|
|
67
|
+
- Server has strict rate limits
|
|
68
|
+
- Need to stay within quota
|
|
69
|
+
|
|
70
|
+
### ❌ Don't Use Alias Batching When:
|
|
71
|
+
|
|
72
|
+
1. **Low Volume (< 10 records)**
|
|
73
|
+
- Overhead doesn't justify complexity
|
|
74
|
+
- Separate requests are simpler
|
|
75
|
+
|
|
76
|
+
2. **Strict Error Isolation Needed**
|
|
77
|
+
- Need to know exactly which mutation failed
|
|
78
|
+
- Can't tolerate partial failures
|
|
79
|
+
- Want to retry individual mutations
|
|
80
|
+
|
|
81
|
+
3. **Dependent Mutations**
|
|
82
|
+
- Mutations depend on each other
|
|
83
|
+
- Need transaction-like behavior
|
|
84
|
+
- Order matters
|
|
85
|
+
|
|
86
|
+
### Decision Matrix
|
|
87
|
+
|
|
88
|
+
| Scenario | Separate Requests | Alias Batching |
|
|
89
|
+
|---------|------------------|----------------|
|
|
90
|
+
| < 10 records | ✅ Recommended | ❌ Overkill |
|
|
91
|
+
| 10-100 records | ✅ Simple | ⚠️ Optional |
|
|
92
|
+
| 100-1000 records | ⚠️ Slower | ✅ Recommended |
|
|
93
|
+
| > 1000 records | ❌ Too slow | ✅ Recommended |
|
|
94
|
+
| Need error isolation | ✅ Better | ⚠️ Complex |
|
|
95
|
+
| Need throughput | ⚠️ Slower | ✅ Better |
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## How It Works
|
|
100
|
+
|
|
101
|
+
### Architecture Overview
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
105
|
+
│ Client-Side Flow │
|
|
106
|
+
└─────────────────────────────────────────────────────────────┘
|
|
107
|
+
|
|
108
|
+
1. Map Items (GraphQLMutationMapper)
|
|
109
|
+
├─ Transform each record to GraphQL input
|
|
110
|
+
└─ Store mapped inputs
|
|
111
|
+
|
|
112
|
+
2. Batch Items (batchMap or manual)
|
|
113
|
+
├─ Group items into batches (e.g., 5 per batch)
|
|
114
|
+
└─ Generate aliased query
|
|
115
|
+
|
|
116
|
+
3. Execute Batches (Concurrency Control)
|
|
117
|
+
├─ Send batch 1: mutationsPerAliasBatch=5
|
|
118
|
+
├─ Send batch 2: mutationsPerAliasBatch=5
|
|
119
|
+
└─ Process concurrently (maxParallel=3)
|
|
120
|
+
|
|
121
|
+
4. Parse Responses
|
|
122
|
+
├─ Extract results by alias (createLocation1, createLocation2, ...)
|
|
123
|
+
├─ Identify partial failures
|
|
124
|
+
└─ Aggregate success/failure counts
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### SDK Methods
|
|
128
|
+
|
|
129
|
+
#### 1. `GraphQLMutationMapper.batchMap()`
|
|
130
|
+
|
|
131
|
+
The SDK provides a `batchMap()` method that generates aliased queries:
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
import { GraphQLMutationMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
135
|
+
|
|
136
|
+
const mapper = new GraphQLMutationMapper(mappingConfig, logger, { fluentClient: client });
|
|
137
|
+
|
|
138
|
+
// Batch map multiple items
|
|
139
|
+
const items = [
|
|
140
|
+
{ ref: 'LOC-001', name: 'Location 1' },
|
|
141
|
+
{ ref: 'LOC-002', name: 'Location 2' },
|
|
142
|
+
{ ref: 'LOC-003', name: 'Location 3' },
|
|
143
|
+
];
|
|
144
|
+
|
|
145
|
+
const batch = await mapper.batchMap(items, { mutationsPerBatch: 3 });
|
|
146
|
+
|
|
147
|
+
// Result:
|
|
148
|
+
// {
|
|
149
|
+
// query: "mutation BatchCreateLocations($input1: CreateLocationInput!, ...) { createLocation1: createLocation(...) { id ref } ... }",
|
|
150
|
+
// variables: { input1: {...}, input2: {...}, input3: {...} }
|
|
151
|
+
// }
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
#### 2. `buildAliasedMutationQuery()`
|
|
155
|
+
|
|
156
|
+
For manual query generation:
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
import { buildAliasedMutationQuery } from '@fluentcommerce/fc-connect-sdk';
|
|
160
|
+
|
|
161
|
+
const query = buildAliasedMutationQuery(mappingConfig, batchSize);
|
|
162
|
+
// Generates: mutation BatchCreateLocations($input1: ..., $input2: ...) { createLocation1: ... createLocation2: ... }
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Configuration
|
|
168
|
+
|
|
169
|
+
### Template-Level Configuration
|
|
170
|
+
|
|
171
|
+
Templates use activation variables to control alias batching:
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
// Concurrency control (number of concurrent alias batch requests)
|
|
175
|
+
const mutationBatchSize = parseInt(
|
|
176
|
+
activation?.getVariable('mutationBatchSize') || '1', // Default: 1 (sequential)
|
|
177
|
+
10
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
// Alias batching (number of mutations per aliased request)
|
|
181
|
+
const mutationsPerAliasBatch = activation?.getVariable('mutationsPerAliasBatch')
|
|
182
|
+
? parseInt(activation?.getVariable('mutationsPerAliasBatch') || '1', 10)
|
|
183
|
+
: undefined; // Default: undefined (disabled, use separate requests)
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Configuration Examples
|
|
187
|
+
|
|
188
|
+
#### Example 1: Default (Sequential, No Aliases)
|
|
189
|
+
```typescript
|
|
190
|
+
mutationBatchSize: 1 // Sequential processing
|
|
191
|
+
mutationsPerAliasBatch: undefined // Disabled (separate requests)
|
|
192
|
+
```
|
|
193
|
+
**Result:** Each mutation is sent as a separate request, executed sequentially.
|
|
194
|
+
|
|
195
|
+
#### Example 2: Concurrent Requests (No Aliases)
|
|
196
|
+
```typescript
|
|
197
|
+
mutationBatchSize: 5 // 5 concurrent requests
|
|
198
|
+
mutationsPerAliasBatch: undefined // Disabled (separate requests)
|
|
199
|
+
```
|
|
200
|
+
**Result:** 5 separate HTTP requests sent concurrently.
|
|
201
|
+
|
|
202
|
+
#### Example 3: Alias Batching (Single Batch)
|
|
203
|
+
```typescript
|
|
204
|
+
mutationBatchSize: 1 // Sequential batch processing
|
|
205
|
+
mutationsPerAliasBatch: 5 // 5 mutations per aliased request
|
|
206
|
+
```
|
|
207
|
+
**Result:** Groups of 5 mutations bundled into single aliased requests, processed sequentially.
|
|
208
|
+
|
|
209
|
+
#### Example 4: Concurrent Alias Batching
|
|
210
|
+
```typescript
|
|
211
|
+
mutationBatchSize: 3 // 3 concurrent alias batch requests
|
|
212
|
+
mutationsPerAliasBatch: 5 // 5 mutations per aliased request
|
|
213
|
+
```
|
|
214
|
+
**Result:** Groups of 5 mutations bundled into aliased requests, with 3 such requests sent concurrently.
|
|
215
|
+
|
|
216
|
+
**Visual Example:**
|
|
217
|
+
```
|
|
218
|
+
100 locations, mutationsPerAliasBatch=5, mutationBatchSize=3
|
|
219
|
+
|
|
220
|
+
Batch 1: [Loc1-5] ──┐
|
|
221
|
+
Batch 2: [Loc6-10] ──┼─► Sent concurrently (3 batches)
|
|
222
|
+
Batch 3: [Loc11-15] ──┘
|
|
223
|
+
|
|
224
|
+
Batch 4: [Loc16-20] ──┐
|
|
225
|
+
Batch 5: [Loc21-25] ──┼─► Sent concurrently (3 batches)
|
|
226
|
+
Batch 6: [Loc26-30] ──┘
|
|
227
|
+
|
|
228
|
+
... (continues until all 100 locations processed)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Mapping Config (Optional)
|
|
232
|
+
|
|
233
|
+
The `aliasBatching` config in `MappingConfig` is optional metadata. Templates use runtime parameters for flexibility:
|
|
234
|
+
|
|
235
|
+
```json
|
|
236
|
+
{
|
|
237
|
+
"mutation": "createLocation",
|
|
238
|
+
"sourceFormat": "json",
|
|
239
|
+
"aliasBatching": {
|
|
240
|
+
"enabled": true,
|
|
241
|
+
"mutationsPerBatch": 5,
|
|
242
|
+
"maxMutationsPerBatch": 20
|
|
243
|
+
},
|
|
244
|
+
"arguments": {
|
|
245
|
+
"input": {
|
|
246
|
+
"ref": { "source": "ref" },
|
|
247
|
+
"name": { "source": "name" }
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**Note:** Templates use `mutationsPerAliasBatch` activation variable instead of this config for runtime flexibility.
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Implementation Patterns
|
|
258
|
+
|
|
259
|
+
### Pattern 1: Template Helper Functions
|
|
260
|
+
|
|
261
|
+
Templates include helper functions for alias batching:
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
/**
|
|
265
|
+
* Execute mutations using GraphQL aliases (batched requests)
|
|
266
|
+
*/
|
|
267
|
+
async function executeMutationsWithAliases(
|
|
268
|
+
locations: Array<{ query: string; variables: any; input: any }>,
|
|
269
|
+
client: FluentClient,
|
|
270
|
+
mapper: GraphQLMutationMapper,
|
|
271
|
+
log: any,
|
|
272
|
+
retailerId: string,
|
|
273
|
+
maxParallel: number, // Concurrency control
|
|
274
|
+
mutationsPerAliasBatch: number // Mutations per aliased request
|
|
275
|
+
): Promise<MutationResult> {
|
|
276
|
+
// ... implementation
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Build aliased batch query and variables
|
|
281
|
+
*/
|
|
282
|
+
function buildAliasedBatch(
|
|
283
|
+
batch: Array<{ query: string; variables: any; input: any }>,
|
|
284
|
+
mutationName: string,
|
|
285
|
+
retailerId: string
|
|
286
|
+
): { query: string; variables: Record<string, any> } {
|
|
287
|
+
// ... implementation
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Parse aliased GraphQL response
|
|
292
|
+
*/
|
|
293
|
+
function parseAliasResponse(
|
|
294
|
+
response: any,
|
|
295
|
+
batch: Array<{ query: string; variables: any; input: any }>,
|
|
296
|
+
mutationName: string
|
|
297
|
+
): { executed: number; failed: number; errors: Array<{ locationRef: string; error: string }> } {
|
|
298
|
+
// ... implementation
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Pattern 2: Using SDK batchMap()
|
|
303
|
+
|
|
304
|
+
For custom implementations:
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
import { GraphQLMutationMapper, FluentClient } from '@fluentcommerce/fc-connect-sdk';
|
|
308
|
+
|
|
309
|
+
const mapper = new GraphQLMutationMapper(mappingConfig, logger, { fluentClient: client });
|
|
310
|
+
|
|
311
|
+
// Group items into batches
|
|
312
|
+
const batchSize = 5;
|
|
313
|
+
const batches: Array<typeof items> = [];
|
|
314
|
+
for (let i = 0; i < items.length; i += batchSize) {
|
|
315
|
+
batches.push(items.slice(i, i + batchSize));
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// Process batches
|
|
319
|
+
for (const batch of batches) {
|
|
320
|
+
// Generate aliased query
|
|
321
|
+
const { query, variables } = await mapper.batchMap(batch, {
|
|
322
|
+
mutationsPerBatch: batch.length
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
// Execute
|
|
326
|
+
const response = await client.graphql({ query, variables });
|
|
327
|
+
|
|
328
|
+
// Parse response
|
|
329
|
+
const results = parseAliasResponse(response, batch, 'createLocation');
|
|
330
|
+
// ... handle results
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Pattern 3: Dispatcher Pattern
|
|
335
|
+
|
|
336
|
+
Templates use a dispatcher to choose between modes:
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
async function executeMutations(
|
|
340
|
+
locations: Array<{ query: string; variables: any; input: any }>,
|
|
341
|
+
client: FluentClient,
|
|
342
|
+
mapper: GraphQLMutationMapper,
|
|
343
|
+
log: any,
|
|
344
|
+
retailerId: string,
|
|
345
|
+
batchSize: number = 1,
|
|
346
|
+
mutationsPerAliasBatch?: number
|
|
347
|
+
): Promise<MutationResult> {
|
|
348
|
+
const useAliases = mutationsPerAliasBatch && mutationsPerAliasBatch > 1;
|
|
349
|
+
|
|
350
|
+
if (useAliases) {
|
|
351
|
+
return await executeMutationsWithAliases(
|
|
352
|
+
locations, client, mapper, log, retailerId,
|
|
353
|
+
batchSize, mutationsPerAliasBatch!
|
|
354
|
+
);
|
|
355
|
+
} else {
|
|
356
|
+
return await executeMutationsSeparate(
|
|
357
|
+
locations, client, mapper, log, retailerId, batchSize
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
## Response Parsing
|
|
366
|
+
|
|
367
|
+
### Response Structure
|
|
368
|
+
|
|
369
|
+
Aliased GraphQL responses have this structure:
|
|
370
|
+
|
|
371
|
+
```json
|
|
372
|
+
{
|
|
373
|
+
"data": {
|
|
374
|
+
"createLocation1": { "id": "123", "ref": "LOC-001", "name": "Location 1" },
|
|
375
|
+
"createLocation2": { "id": "124", "ref": "LOC-002", "name": "Location 2" },
|
|
376
|
+
"createLocation3": null // ← Partial failure
|
|
377
|
+
},
|
|
378
|
+
"errors": [
|
|
379
|
+
{
|
|
380
|
+
"message": "Location with ref 'LOC-003' already exists",
|
|
381
|
+
"path": ["createLocation3"],
|
|
382
|
+
"extensions": { "code": "DUPLICATE" }
|
|
383
|
+
}
|
|
384
|
+
]
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### SDK Response Parser ✨ NEW
|
|
389
|
+
|
|
390
|
+
**The SDK now provides a built-in response parser** (available in latest SDK):
|
|
391
|
+
|
|
392
|
+
```typescript
|
|
393
|
+
import {
|
|
394
|
+
parseAliasedMutationResponse,
|
|
395
|
+
formatErrorSummary,
|
|
396
|
+
getFailedMutations,
|
|
397
|
+
getSuccessfulMutations,
|
|
398
|
+
type AliasedMutationResult
|
|
399
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
400
|
+
|
|
401
|
+
// Execute aliased mutation
|
|
402
|
+
const response = await client.graphql({ query, variables });
|
|
403
|
+
|
|
404
|
+
// Parse response
|
|
405
|
+
const result = parseAliasedMutationResponse(
|
|
406
|
+
response,
|
|
407
|
+
batchSize, // Number of mutations in the batch
|
|
408
|
+
'createLocation', // Base mutation name
|
|
409
|
+
inputs // Optional: original input data for error tracking
|
|
410
|
+
);
|
|
411
|
+
|
|
412
|
+
// Check results
|
|
413
|
+
console.log(`Executed: ${result.executed}, Failed: ${result.failed}`);
|
|
414
|
+
console.log(`All succeeded: ${result.allSucceeded}`);
|
|
415
|
+
|
|
416
|
+
if (!result.allSucceeded) {
|
|
417
|
+
console.error(formatErrorSummary(result));
|
|
418
|
+
|
|
419
|
+
// Get failed mutations
|
|
420
|
+
const failed = getFailedMutations(result);
|
|
421
|
+
failed.forEach(mutation => {
|
|
422
|
+
console.error(`${mutation.alias}: ${mutation.error?.message}`);
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// Get successful mutations
|
|
427
|
+
const successful = getSuccessfulMutations(result);
|
|
428
|
+
console.log(`Created ${successful.length} locations successfully`);
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Result Structure
|
|
432
|
+
|
|
433
|
+
The parser returns an `AliasedMutationResult` object:
|
|
434
|
+
|
|
435
|
+
```typescript
|
|
436
|
+
interface AliasedMutationResult {
|
|
437
|
+
executed: number; // Total mutations that succeeded
|
|
438
|
+
failed: number; // Total mutations that failed
|
|
439
|
+
allSucceeded: boolean; // Whether all mutations succeeded
|
|
440
|
+
allFailed: boolean; // Whether all mutations failed
|
|
441
|
+
results: MutationResult[]; // Individual mutation results
|
|
442
|
+
errors: MutationError[]; // Aggregated errors
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
interface MutationResult {
|
|
446
|
+
alias: string; // e.g., 'createLocation1'
|
|
447
|
+
index: number; // 0-based index in batch
|
|
448
|
+
success: boolean; // Whether this mutation succeeded
|
|
449
|
+
data?: any; // Response data (if successful)
|
|
450
|
+
error?: MutationError; // Error details (if failed)
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
interface MutationError {
|
|
454
|
+
alias: string; // e.g., 'createLocation2'
|
|
455
|
+
index: number; // 0-based index in batch
|
|
456
|
+
inputRef?: string; // e.g., 'LOC-002' (from input data)
|
|
457
|
+
message: string; // Error message
|
|
458
|
+
graphqlErrors?: GraphQLError[];// Full GraphQL error details
|
|
459
|
+
input?: any; // Original input data
|
|
460
|
+
}
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### Features
|
|
464
|
+
|
|
465
|
+
**Automatic Error Correlation:**
|
|
466
|
+
- Matches GraphQL errors to specific mutations via `path` arrays
|
|
467
|
+
- Extracts error messages and details
|
|
468
|
+
- Provides input reference tracking
|
|
469
|
+
|
|
470
|
+
**Flexible Input Tracking:**
|
|
471
|
+
```typescript
|
|
472
|
+
// Default: extracts 'ref' or 'id' from input
|
|
473
|
+
const result = parseAliasedMutationResponse(response, 3, 'createLocation', inputs);
|
|
474
|
+
|
|
475
|
+
// Custom: extract custom reference field
|
|
476
|
+
const result = parseAliasedMutationResponse(response, 3, 'createLocation', inputs, {
|
|
477
|
+
extractRef: (input: any) => input.customRef
|
|
478
|
+
});
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
**Helper Functions:**
|
|
482
|
+
- `getFailedMutations(result)` - Filter failed mutations
|
|
483
|
+
- `getSuccessfulMutations(result)` - Filter successful mutations
|
|
484
|
+
- `getErrorMessage(mutation)` - Extract error message
|
|
485
|
+
- `formatErrorSummary(result)` - Format for logging
|
|
486
|
+
|
|
487
|
+
### Alternative Template Parsing (Optional)
|
|
488
|
+
|
|
489
|
+
For templates that need custom parsing logic:
|
|
490
|
+
|
|
491
|
+
```typescript
|
|
492
|
+
function parseAliasResponse(
|
|
493
|
+
response: any,
|
|
494
|
+
batch: Array<{ query: string; variables: any; input: any }>,
|
|
495
|
+
mutationName: string
|
|
496
|
+
): { executed: number; failed: number; errors: Array<{ locationRef: string; error: string }> } {
|
|
497
|
+
const result = { executed: 0, failed: 0, errors: [] };
|
|
498
|
+
|
|
499
|
+
const data = response.data || {};
|
|
500
|
+
const errors = response.errors || [];
|
|
501
|
+
|
|
502
|
+
// Process each alias result
|
|
503
|
+
batch.forEach((item, index) => {
|
|
504
|
+
const alias = `${mutationName}${index + 1}`;
|
|
505
|
+
const aliasData = data[alias];
|
|
506
|
+
const aliasErrors = errors.filter((e: any) =>
|
|
507
|
+
e.path && Array.isArray(e.path) && e.path.includes(alias)
|
|
508
|
+
);
|
|
509
|
+
|
|
510
|
+
if (aliasData && !aliasErrors.length) {
|
|
511
|
+
result.executed++;
|
|
512
|
+
} else {
|
|
513
|
+
result.failed++;
|
|
514
|
+
const errorMsg = aliasErrors[0]?.message || 'Mutation failed';
|
|
515
|
+
const locationRef = item.input?.ref || 'unknown';
|
|
516
|
+
result.errors.push({
|
|
517
|
+
locationRef,
|
|
518
|
+
error: errorMsg,
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
return result;
|
|
524
|
+
}
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
**Note:** The SDK parser provides more robust error handling and type safety. Use it unless you need custom parsing logic.
|
|
528
|
+
|
|
529
|
+
### Alias Naming Pattern
|
|
530
|
+
|
|
531
|
+
The SDK uses a simple naming pattern: `{mutationName}{index}`
|
|
532
|
+
|
|
533
|
+
- `createLocation1`, `createLocation2`, `createLocation3`, ...
|
|
534
|
+
- `updateProduct1`, `updateProduct2`, `updateProduct3`, ...
|
|
535
|
+
- `deleteOrder1`, `deleteOrder2`, `deleteOrder3`, ...
|
|
536
|
+
|
|
537
|
+
**Not configurable** - this keeps the implementation simple and predictable.
|
|
538
|
+
|
|
539
|
+
---
|
|
540
|
+
|
|
541
|
+
## Error Handling
|
|
542
|
+
|
|
543
|
+
### Partial Failures
|
|
544
|
+
|
|
545
|
+
Aliased batches can have partial failures:
|
|
546
|
+
|
|
547
|
+
```json
|
|
548
|
+
{
|
|
549
|
+
"data": {
|
|
550
|
+
"createLocation1": { "id": "123", "ref": "LOC-001" },
|
|
551
|
+
"createLocation2": null, // ← Failed
|
|
552
|
+
"createLocation3": { "id": "125", "ref": "LOC-003" }
|
|
553
|
+
},
|
|
554
|
+
"errors": [
|
|
555
|
+
{
|
|
556
|
+
"message": "Duplicate ref: LOC-002",
|
|
557
|
+
"path": ["createLocation2"]
|
|
558
|
+
}
|
|
559
|
+
]
|
|
560
|
+
}
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
**Best Practices:**
|
|
564
|
+
1. ✅ Parse each alias result individually
|
|
565
|
+
2. ✅ Track which mutations succeeded/failed
|
|
566
|
+
3. ✅ Log partial failures for audit
|
|
567
|
+
4. ✅ Continue processing remaining batches
|
|
568
|
+
5. ✅ Don't retry entire batch if only one failed
|
|
569
|
+
|
|
570
|
+
### Error Parsing
|
|
571
|
+
|
|
572
|
+
```typescript
|
|
573
|
+
// Extract errors for specific alias
|
|
574
|
+
const aliasErrors = errors.filter((e: any) =>
|
|
575
|
+
e.path && Array.isArray(e.path) && e.path.includes(alias)
|
|
576
|
+
);
|
|
577
|
+
|
|
578
|
+
// Handle different error types
|
|
579
|
+
if (aliasErrors.length > 0) {
|
|
580
|
+
const error = aliasErrors[0];
|
|
581
|
+
if (error.extensions?.code === 'DUPLICATE') {
|
|
582
|
+
// Handle duplicate
|
|
583
|
+
} else if (error.extensions?.code === 'VALIDATION_ERROR') {
|
|
584
|
+
// Handle validation error
|
|
585
|
+
} else {
|
|
586
|
+
// Handle generic error
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
### Retry Strategy
|
|
592
|
+
|
|
593
|
+
**Don't retry entire batch** - retry individual mutations:
|
|
594
|
+
|
|
595
|
+
```typescript
|
|
596
|
+
// ❌ BAD: Retry entire batch
|
|
597
|
+
if (result.failed > 0) {
|
|
598
|
+
await retry(() => client.graphql({ query, variables }));
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// ✅ GOOD: Retry individual mutations
|
|
602
|
+
const failedItems = batch.filter((item, idx) => {
|
|
603
|
+
const alias = `${mutationName}${idx + 1}`;
|
|
604
|
+
return !response.data[alias];
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
for (const item of failedItems) {
|
|
608
|
+
await retry(() => executeSingleMutation(item));
|
|
609
|
+
}
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
---
|
|
613
|
+
|
|
614
|
+
## Performance Considerations
|
|
615
|
+
|
|
616
|
+
### Network Overhead
|
|
617
|
+
|
|
618
|
+
**Separate Requests:**
|
|
619
|
+
- 100 mutations = 100 HTTP requests
|
|
620
|
+
- 100 × network latency = total time
|
|
621
|
+
|
|
622
|
+
**Alias Batching:**
|
|
623
|
+
- 100 mutations ÷ 5 per batch = 20 HTTP requests
|
|
624
|
+
- 20 × network latency = total time
|
|
625
|
+
|
|
626
|
+
**Savings:** ~80% reduction in network overhead
|
|
627
|
+
|
|
628
|
+
### Optimal Batch Size
|
|
629
|
+
|
|
630
|
+
**Factors to Consider:**
|
|
631
|
+
|
|
632
|
+
1. **Payload Size**
|
|
633
|
+
- GraphQL requests have size limits
|
|
634
|
+
- Larger batches = larger payloads
|
|
635
|
+
- **Recommendation:** 5-10 mutations per batch
|
|
636
|
+
|
|
637
|
+
2. **Error Isolation**
|
|
638
|
+
- Larger batches = more mutations affected by one failure
|
|
639
|
+
- **Recommendation:** 5-10 mutations per batch
|
|
640
|
+
|
|
641
|
+
3. **Server Processing**
|
|
642
|
+
- Server may process batches sequentially
|
|
643
|
+
- Larger batches = longer wait for first result
|
|
644
|
+
- **Recommendation:** 5-10 mutations per batch
|
|
645
|
+
|
|
646
|
+
**Default:** `mutationsPerAliasBatch: 5` (optimal balance)
|
|
647
|
+
|
|
648
|
+
### Concurrency vs Batch Size
|
|
649
|
+
|
|
650
|
+
**Trade-off:**
|
|
651
|
+
- **High concurrency + small batches:** More requests, faster per-request
|
|
652
|
+
- **Low concurrency + large batches:** Fewer requests, slower per-request
|
|
653
|
+
|
|
654
|
+
**Recommendation:**
|
|
655
|
+
- Start with `mutationBatchSize: 1`, `mutationsPerAliasBatch: 5`
|
|
656
|
+
- If throughput is low, increase `mutationBatchSize` to 3-5
|
|
657
|
+
- If errors increase, reduce `mutationsPerAliasBatch` to 3
|
|
658
|
+
|
|
659
|
+
---
|
|
660
|
+
|
|
661
|
+
## Best Practices
|
|
662
|
+
|
|
663
|
+
### ✅ DO
|
|
664
|
+
|
|
665
|
+
1. **Use Aliases for High Volume**
|
|
666
|
+
- Process 100+ records
|
|
667
|
+
- Network latency is a bottleneck
|
|
668
|
+
- Throughput is priority
|
|
669
|
+
|
|
670
|
+
2. **Keep Batch Sizes Reasonable**
|
|
671
|
+
- 5-10 mutations per batch
|
|
672
|
+
- Don't exceed payload limits
|
|
673
|
+
- Balance error isolation
|
|
674
|
+
|
|
675
|
+
3. **Handle Partial Failures**
|
|
676
|
+
- Parse each alias result
|
|
677
|
+
- Track individual success/failure
|
|
678
|
+
- Log errors for audit
|
|
679
|
+
|
|
680
|
+
4. **Monitor Performance**
|
|
681
|
+
- Track request count reduction
|
|
682
|
+
- Measure throughput improvement
|
|
683
|
+
- Watch for error rate changes
|
|
684
|
+
|
|
685
|
+
5. **Use Concurrency Control**
|
|
686
|
+
- Start with `mutationBatchSize: 1`
|
|
687
|
+
- Increase gradually if needed
|
|
688
|
+
- Respect rate limits
|
|
689
|
+
|
|
690
|
+
### ❌ DON'T
|
|
691
|
+
|
|
692
|
+
1. **Don't Use for Low Volume**
|
|
693
|
+
- < 10 records: use separate requests
|
|
694
|
+
- Overhead doesn't justify complexity
|
|
695
|
+
|
|
696
|
+
2. **Don't Make Batches Too Large**
|
|
697
|
+
- > 20 mutations per batch
|
|
698
|
+
- Risk hitting payload limits
|
|
699
|
+
- Poor error isolation
|
|
700
|
+
|
|
701
|
+
3. **Don't Retry Entire Batches**
|
|
702
|
+
- Retry individual mutations
|
|
703
|
+
- Don't waste successful mutations
|
|
704
|
+
|
|
705
|
+
4. **Don't Ignore Errors**
|
|
706
|
+
- Parse all alias results
|
|
707
|
+
- Log partial failures
|
|
708
|
+
- Track error patterns
|
|
709
|
+
|
|
710
|
+
5. **Don't Skip Concurrency Control**
|
|
711
|
+
- Always set `mutationBatchSize`
|
|
712
|
+
- Respect rate limits
|
|
713
|
+
- Don't overwhelm server
|
|
714
|
+
|
|
715
|
+
---
|
|
716
|
+
|
|
717
|
+
## Troubleshooting
|
|
718
|
+
|
|
719
|
+
### Issue: Batch Size Too Large
|
|
720
|
+
|
|
721
|
+
**Symptoms:**
|
|
722
|
+
- `413 Payload Too Large` errors
|
|
723
|
+
- Requests timing out
|
|
724
|
+
- Server rejecting requests
|
|
725
|
+
|
|
726
|
+
**Solution:**
|
|
727
|
+
```typescript
|
|
728
|
+
// Reduce batch size
|
|
729
|
+
mutationsPerAliasBatch: 3 // Instead of 10
|
|
730
|
+
```
|
|
731
|
+
|
|
732
|
+
### Issue: Partial Failures Not Detected
|
|
733
|
+
|
|
734
|
+
**Symptoms:**
|
|
735
|
+
- Some mutations fail silently
|
|
736
|
+
- Errors not logged
|
|
737
|
+
- Incomplete data
|
|
738
|
+
|
|
739
|
+
**Solution:**
|
|
740
|
+
```typescript
|
|
741
|
+
// Ensure parseAliasResponse checks all aliases
|
|
742
|
+
batch.forEach((item, index) => {
|
|
743
|
+
const alias = `${mutationName}${index + 1}`;
|
|
744
|
+
const aliasData = data[alias];
|
|
745
|
+
const aliasErrors = errors.filter(e => e.path?.includes(alias));
|
|
746
|
+
|
|
747
|
+
if (!aliasData || aliasErrors.length > 0) {
|
|
748
|
+
// Log error
|
|
749
|
+
}
|
|
750
|
+
});
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
### Issue: Slow Performance
|
|
754
|
+
|
|
755
|
+
**Symptoms:**
|
|
756
|
+
- Batches take longer than separate requests
|
|
757
|
+
- No throughput improvement
|
|
758
|
+
|
|
759
|
+
**Solution:**
|
|
760
|
+
```typescript
|
|
761
|
+
// Increase concurrency
|
|
762
|
+
mutationBatchSize: 5 // Instead of 1
|
|
763
|
+
|
|
764
|
+
// Or reduce batch size
|
|
765
|
+
mutationsPerAliasBatch: 3 // Instead of 10
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
### Issue: Wrong Alias Names
|
|
769
|
+
|
|
770
|
+
**Symptoms:**
|
|
771
|
+
- Can't find results in response
|
|
772
|
+
- Alias names don't match
|
|
773
|
+
|
|
774
|
+
**Solution:**
|
|
775
|
+
```typescript
|
|
776
|
+
// Ensure consistent naming pattern
|
|
777
|
+
const alias = `${mutationName}${index + 1}`; // Simple: createLocation1, createLocation2, etc.
|
|
778
|
+
|
|
779
|
+
// Don't use custom naming patterns
|
|
780
|
+
// ❌ const alias = `mut_${index}`;
|
|
781
|
+
// ✅ const alias = `${mutationName}${index + 1}`;
|
|
782
|
+
```
|
|
783
|
+
|
|
784
|
+
---
|
|
785
|
+
|
|
786
|
+
## Related Documentation
|
|
787
|
+
|
|
788
|
+
- [GraphQL Mutation Mapping Guide](graphql-mutation-mapping/graphql-mutation-mapping-readme.md)
|
|
789
|
+
- [Mapping Format Decision Tree](mapping-format-decision-tree.md)
|
|
790
|
+
- [Mapper Comparison Guide](mapping-mapper-comparison-guide.md)
|
|
791
|
+
- [Implementation Plan](./mapping-graphql-alias-batching-guide.md) (see this guide)
|
|
792
|
+
|
|
793
|
+
---
|
|
794
|
+
|
|
795
|
+
## Summary
|
|
796
|
+
|
|
797
|
+
**GraphQL alias batching** reduces network overhead and improves throughput for high-volume ingestion scenarios. Use it when:
|
|
798
|
+
|
|
799
|
+
- ✅ Processing 100+ records
|
|
800
|
+
- ✅ Network latency is a bottleneck
|
|
801
|
+
- ✅ Throughput is priority
|
|
802
|
+
- ✅ Partial failures are acceptable
|
|
803
|
+
|
|
804
|
+
**Configuration:**
|
|
805
|
+
- `mutationBatchSize`: Concurrency control (default: 1)
|
|
806
|
+
- `mutationsPerAliasBatch`: Mutations per aliased request (default: undefined = disabled)
|
|
807
|
+
|
|
808
|
+
**Best Practices:**
|
|
809
|
+
- Keep batch sizes reasonable (5-10 mutations)
|
|
810
|
+
- Handle partial failures gracefully
|
|
811
|
+
- Monitor performance and adjust as needed
|
|
812
|
+
- Use concurrency control to respect rate limits
|
|
813
|
+
|
|
814
|
+
The SDK provides complete alias batching support:
|
|
815
|
+
- **Query Generation:** `batchMap()`, `buildAliasedMutationQuery()`
|
|
816
|
+
- **Response Parsing:** `parseAliasedMutationResponse()` ✨ NEW
|
|
817
|
+
- **Helper Functions:** `formatErrorSummary()`, `getFailedMutations()`, `getSuccessfulMutations()`
|
|
818
|
+
|
|
819
|
+
Templates can use these SDK utilities or implement custom logic for specific requirements.
|
|
820
|
+
|