@fluentcommerce/fc-connect-sdk 0.1.53 → 0.1.55
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 +30 -2
- package/README.md +39 -0
- package/dist/cjs/auth/index.d.ts +3 -0
- package/dist/cjs/auth/index.js +13 -0
- package/dist/cjs/auth/profile-loader.d.ts +18 -0
- package/dist/cjs/auth/profile-loader.js +208 -0
- package/dist/cjs/client-factory.d.ts +4 -0
- package/dist/cjs/client-factory.js +10 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/auth/index.d.ts +3 -0
- package/dist/esm/auth/index.js +2 -0
- package/dist/esm/auth/profile-loader.d.ts +18 -0
- package/dist/esm/auth/profile-loader.js +169 -0
- package/dist/esm/client-factory.d.ts +4 -0
- package/dist/esm/client-factory.js +9 -0
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +2 -1
- 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/dist/types/auth/index.d.ts +3 -0
- package/dist/types/auth/profile-loader.d.ts +18 -0
- package/dist/types/client-factory.d.ts +4 -0
- package/dist/types/index.d.ts +3 -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 -482
- 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
|
@@ -1,656 +1,656 @@
|
|
|
1
|
-
# Module 4: Parallel Queries
|
|
2
|
-
|
|
3
|
-
**Level:** Advanced
|
|
4
|
-
**Estimated Time:** 30 minutes
|
|
5
|
-
|
|
6
|
-
**SDK Version:** Use latest - `npm install @fluentcommerce/fc-connect-sdk@latest`
|
|
7
|
-
|
|
8
|
-
## Overview
|
|
9
|
-
|
|
10
|
-
This module teaches you how to paginate multiple connections **simultaneously** using parallel queries with `Promise.all()`. This is the recommended workaround when all connections need full pagination.
|
|
11
|
-
|
|
12
|
-
## Learning Objectives
|
|
13
|
-
|
|
14
|
-
By the end of this module, you will:
|
|
15
|
-
- ✅ Understand why parallel queries are the recommended approach
|
|
16
|
-
- ✅ Implement `Promise.all()` patterns for multi-connection pagination
|
|
17
|
-
- ✅ Handle errors and monitoring for parallel operations
|
|
18
|
-
- ✅ Know when to use parallel vs sequential approaches
|
|
19
|
-
- ✅ Optimize performance for bulk exports
|
|
20
|
-
|
|
21
|
-
## Why Parallel Queries?
|
|
22
|
-
|
|
23
|
-
### The Challenge
|
|
24
|
-
|
|
25
|
-
```typescript
|
|
26
|
-
// ❌ This won't work - can only target ONE connection
|
|
27
|
-
const result = await client.graphql({
|
|
28
|
-
query: multiConnectionQuery,
|
|
29
|
-
pagination: {
|
|
30
|
-
connectionPath: ['products', 'locations'] // ← NOT SUPPORTED
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### The Solution
|
|
36
|
-
|
|
37
|
-
```typescript
|
|
38
|
-
// ✅ Use separate queries in parallel
|
|
39
|
-
const [products, locations] = await Promise.all([
|
|
40
|
-
client.graphql({
|
|
41
|
-
query: productsQuery,
|
|
42
|
-
pagination: { maxPages: 10 }
|
|
43
|
-
}),
|
|
44
|
-
client.graphql({
|
|
45
|
-
query: locationsQuery,
|
|
46
|
-
pagination: { maxPages: 5 }
|
|
47
|
-
})
|
|
48
|
-
]);
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Benefits of Parallel Queries
|
|
52
|
-
|
|
53
|
-
| Aspect | Single Query | Parallel Queries |
|
|
54
|
-
|--------|-------------|------------------|
|
|
55
|
-
| **All connections paginated** | ❌ No | ✅ Yes |
|
|
56
|
-
| **Independent limits** | ❌ Same for all | ✅ Different per connection |
|
|
57
|
-
| **Progress tracking** | ⚠️ One callback | ✅ Separate callbacks |
|
|
58
|
-
| **Error isolation** | ⚠️ All-or-nothing | ✅ Can handle individually |
|
|
59
|
-
| **Performance** | ⚠️ Sequential | ✅ Parallel execution |
|
|
60
|
-
| **Flexibility** | ⚠️ Limited | ✅ Full control |
|
|
61
|
-
|
|
62
|
-
## Basic Parallel Query Pattern
|
|
63
|
-
|
|
64
|
-
### Step 1: Define Separate Queries
|
|
65
|
-
|
|
66
|
-
```typescript
|
|
67
|
-
const productsQuery = `
|
|
68
|
-
query GetProducts($first: Int!, $after: String) {
|
|
69
|
-
products(first: $first, after: $after) {
|
|
70
|
-
edges {
|
|
71
|
-
node { id ref type status }
|
|
72
|
-
cursor
|
|
73
|
-
}
|
|
74
|
-
pageInfo { hasNextPage }
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
`;
|
|
78
|
-
|
|
79
|
-
const locationsQuery = `
|
|
80
|
-
query GetLocations($first: Int!, $after: String) {
|
|
81
|
-
locations(first: $first, after: $after) {
|
|
82
|
-
edges {
|
|
83
|
-
node { id ref name type }
|
|
84
|
-
cursor
|
|
85
|
-
}
|
|
86
|
-
pageInfo { hasNextPage }
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
`;
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### Step 2: Execute in Parallel
|
|
93
|
-
|
|
94
|
-
```typescript
|
|
95
|
-
const [productsResult, locationsResult] = await Promise.all([
|
|
96
|
-
client.graphql({
|
|
97
|
-
query: productsQuery,
|
|
98
|
-
variables: { first: 100 },
|
|
99
|
-
pagination: {
|
|
100
|
-
maxPages: 10,
|
|
101
|
-
maxRecords: 1000,
|
|
102
|
-
onProgress: (page, records) => {
|
|
103
|
-
console.log(`[Products] Page ${page}: ${records} records`);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}),
|
|
107
|
-
client.graphql({
|
|
108
|
-
query: locationsQuery,
|
|
109
|
-
variables: { first: 50 },
|
|
110
|
-
pagination: {
|
|
111
|
-
maxPages: 5,
|
|
112
|
-
maxRecords: 250,
|
|
113
|
-
onProgress: (page, records) => {
|
|
114
|
-
console.log(`[Locations] Page ${page}: ${records} records`);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
})
|
|
118
|
-
]);
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### Step 3: Process Results
|
|
122
|
-
|
|
123
|
-
```typescript
|
|
124
|
-
// Access data from each result
|
|
125
|
-
const products = productsResult.data.products.edges.map(e => e.node);
|
|
126
|
-
const locations = locationsResult.data.locations.edges.map(e => e.node);
|
|
127
|
-
|
|
128
|
-
// Check metadata
|
|
129
|
-
console.log(`Products: ${productsResult.extensions.autoPagination.totalRecords} records`);
|
|
130
|
-
console.log(`Locations: ${locationsResult.extensions.autoPagination.totalRecords} records`);
|
|
131
|
-
|
|
132
|
-
// Combine if needed
|
|
133
|
-
const combinedData = {
|
|
134
|
-
products,
|
|
135
|
-
locations,
|
|
136
|
-
metadata: {
|
|
137
|
-
productsPages: productsResult.extensions.autoPagination.totalPages,
|
|
138
|
-
locationsPages: locationsResult.extensions.autoPagination.totalPages
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
## Real-World Examples
|
|
144
|
-
|
|
145
|
-
### Example 1: Simple Dual Export
|
|
146
|
-
|
|
147
|
-
```typescript
|
|
148
|
-
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
149
|
-
|
|
150
|
-
async function exportProductsAndLocations() {
|
|
151
|
-
const client = await createClient({
|
|
152
|
-
config: {
|
|
153
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
154
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
155
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
156
|
-
username: process.env.FLUENT_USERNAME!,
|
|
157
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
158
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
console.log('Starting parallel export...\n');
|
|
163
|
-
|
|
164
|
-
const [products, locations] = await Promise.all([
|
|
165
|
-
client.graphql({
|
|
166
|
-
query: `
|
|
167
|
-
query GetProducts($first: Int!, $after: String) {
|
|
168
|
-
products(first: $first, after: $after) {
|
|
169
|
-
edges {
|
|
170
|
-
node { id ref type status }
|
|
171
|
-
cursor
|
|
172
|
-
}
|
|
173
|
-
pageInfo { hasNextPage }
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
`,
|
|
177
|
-
variables: { first: 100 },
|
|
178
|
-
pagination: {
|
|
179
|
-
maxPages: 10,
|
|
180
|
-
maxRecords: 1000,
|
|
181
|
-
onProgress: (page, records) => {
|
|
182
|
-
console.log(`[Products] Page ${page}: ${records} records`);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}),
|
|
186
|
-
client.graphql({
|
|
187
|
-
query: `
|
|
188
|
-
query GetLocations($first: Int!, $after: String) {
|
|
189
|
-
locations(first: $first, after: $after) {
|
|
190
|
-
edges {
|
|
191
|
-
node { id ref name type }
|
|
192
|
-
cursor
|
|
193
|
-
}
|
|
194
|
-
pageInfo { hasNextPage }
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
`,
|
|
198
|
-
variables: { first: 50 },
|
|
199
|
-
pagination: {
|
|
200
|
-
maxPages: 5,
|
|
201
|
-
maxRecords: 250,
|
|
202
|
-
onProgress: (page, records) => {
|
|
203
|
-
console.log(`[Locations] Page ${page}: ${records} records`);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
})
|
|
207
|
-
]);
|
|
208
|
-
|
|
209
|
-
console.log('\n✅ Export complete!');
|
|
210
|
-
console.log(`Products: ${products.extensions.autoPagination.totalRecords}`);
|
|
211
|
-
console.log(`Locations: ${locations.extensions.autoPagination.totalRecords}`);
|
|
212
|
-
|
|
213
|
-
return {
|
|
214
|
-
products: products.data.products.edges.map(e => e.node),
|
|
215
|
-
locations: locations.data.locations.edges.map(e => e.node)
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// Run
|
|
220
|
-
exportProductsAndLocations().catch(console.error);
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
**Output:**
|
|
224
|
-
```
|
|
225
|
-
Starting parallel export...
|
|
226
|
-
|
|
227
|
-
[Products] Page 1: 100 records
|
|
228
|
-
[Locations] Page 1: 50 records
|
|
229
|
-
[Products] Page 2: 200 records
|
|
230
|
-
[Locations] Page 2: 100 records
|
|
231
|
-
[Products] Page 3: 300 records
|
|
232
|
-
[Locations] Page 3: 150 records
|
|
233
|
-
...
|
|
234
|
-
|
|
235
|
-
✅ Export complete!
|
|
236
|
-
Products: 873
|
|
237
|
-
Locations: 234
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
### Example 2: Bulk Export (3+ Connections)
|
|
241
|
-
|
|
242
|
-
```typescript
|
|
243
|
-
async function bulkExport() {
|
|
244
|
-
const client = await createClient({ /* config */ });
|
|
245
|
-
|
|
246
|
-
console.log('Starting bulk export...\n');
|
|
247
|
-
|
|
248
|
-
const [products, locations, virtualPositions, orders] = await Promise.all([
|
|
249
|
-
client.graphql({
|
|
250
|
-
query: productsQuery,
|
|
251
|
-
variables: { first: 100 },
|
|
252
|
-
pagination: {
|
|
253
|
-
maxRecords: 5000,
|
|
254
|
-
onProgress: (p, r) => process.stdout.write(`\r[Products] ${r}`)
|
|
255
|
-
}
|
|
256
|
-
}),
|
|
257
|
-
client.graphql({
|
|
258
|
-
query: locationsQuery,
|
|
259
|
-
variables: { first: 50 },
|
|
260
|
-
pagination: {
|
|
261
|
-
maxRecords: 500,
|
|
262
|
-
onProgress: (p, r) => process.stdout.write(`\r[Locations] ${r}`)
|
|
263
|
-
}
|
|
264
|
-
}),
|
|
265
|
-
client.graphql({
|
|
266
|
-
query: virtualPositionsQuery,
|
|
267
|
-
variables: { first: 200 },
|
|
268
|
-
pagination: {
|
|
269
|
-
maxRecords: 10000,
|
|
270
|
-
onProgress: (p, r) => process.stdout.write(`\r[VirtualPos] ${r}`)
|
|
271
|
-
}
|
|
272
|
-
}),
|
|
273
|
-
client.graphql({
|
|
274
|
-
query: ordersQuery,
|
|
275
|
-
variables: { first: 75 },
|
|
276
|
-
pagination: {
|
|
277
|
-
maxRecords: 2000,
|
|
278
|
-
onProgress: (p, r) => process.stdout.write(`\r[Orders] ${r}`)
|
|
279
|
-
}
|
|
280
|
-
})
|
|
281
|
-
]);
|
|
282
|
-
|
|
283
|
-
console.log('\n\n✅ Bulk export complete!');
|
|
284
|
-
console.log(`Products: ${products.extensions.autoPagination.totalRecords}`);
|
|
285
|
-
console.log(`Locations: ${locations.extensions.autoPagination.totalRecords}`);
|
|
286
|
-
console.log(`Virtual Positions: ${virtualPositions.extensions.autoPagination.totalRecords}`);
|
|
287
|
-
console.log(`Orders: ${orders.extensions.autoPagination.totalRecords}`);
|
|
288
|
-
}
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
### Example 3: Sequential Processing (When Needed)
|
|
292
|
-
|
|
293
|
-
Sometimes you need sequential execution (one after another):
|
|
294
|
-
|
|
295
|
-
```typescript
|
|
296
|
-
async function sequentialExport() {
|
|
297
|
-
const client = await createClient({ /* config */ });
|
|
298
|
-
|
|
299
|
-
// Step 1: Get all products first
|
|
300
|
-
console.log('Fetching products...');
|
|
301
|
-
const products = await client.graphql({
|
|
302
|
-
query: productsQuery,
|
|
303
|
-
variables: { first: 100 },
|
|
304
|
-
pagination: { maxPages: 10 }
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
console.log(`✅ Products: ${products.extensions.autoPagination.totalRecords}\n`);
|
|
308
|
-
|
|
309
|
-
// Step 2: Get locations (after products complete)
|
|
310
|
-
console.log('Fetching locations...');
|
|
311
|
-
const locations = await client.graphql({
|
|
312
|
-
query: locationsQuery,
|
|
313
|
-
variables: { first: 50 },
|
|
314
|
-
pagination: { maxPages: 5 }
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
console.log(`✅ Locations: ${locations.extensions.autoPagination.totalRecords}\n`);
|
|
318
|
-
|
|
319
|
-
// Step 3: Get virtual positions (after locations complete)
|
|
320
|
-
console.log('Fetching virtual positions...');
|
|
321
|
-
const virtualPositions = await client.graphql({
|
|
322
|
-
query: virtualPositionsQuery,
|
|
323
|
-
variables: { first: 200 },
|
|
324
|
-
pagination: { maxPages: 20 }
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
console.log(`✅ Virtual Positions: ${virtualPositions.extensions.autoPagination.totalRecords}`);
|
|
328
|
-
|
|
329
|
-
return { products, locations, virtualPositions };
|
|
330
|
-
}
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
**Use Sequential When:**
|
|
334
|
-
- ⚠️ API has strict rate limits
|
|
335
|
-
- ⚠️ Memory constraints (large datasets)
|
|
336
|
-
- ⚠️ One query depends on results of previous
|
|
337
|
-
|
|
338
|
-
**Use Parallel When:**
|
|
339
|
-
- ✅ Queries are independent
|
|
340
|
-
- ✅ Want faster execution
|
|
341
|
-
- ✅ Have sufficient memory/resources
|
|
342
|
-
|
|
343
|
-
## Error Handling
|
|
344
|
-
|
|
345
|
-
### Basic Error Handling
|
|
346
|
-
|
|
347
|
-
```typescript
|
|
348
|
-
try {
|
|
349
|
-
const [products, locations] = await Promise.all([
|
|
350
|
-
client.graphql({ query: productsQuery, pagination: { maxPages: 10 } }),
|
|
351
|
-
client.graphql({ query: locationsQuery, pagination: { maxPages: 5 } })
|
|
352
|
-
]);
|
|
353
|
-
|
|
354
|
-
console.log('✅ Both queries succeeded');
|
|
355
|
-
} catch (error) {
|
|
356
|
-
console.error('❌ At least one query failed:', error);
|
|
357
|
-
// Both results lost if one fails
|
|
358
|
-
}
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
### Individual Error Handling with Promise.allSettled
|
|
362
|
-
|
|
363
|
-
```typescript
|
|
364
|
-
const results = await Promise.allSettled([
|
|
365
|
-
client.graphql({
|
|
366
|
-
query: productsQuery,
|
|
367
|
-
pagination: { maxPages: 10 }
|
|
368
|
-
}),
|
|
369
|
-
client.graphql({
|
|
370
|
-
query: locationsQuery,
|
|
371
|
-
pagination: { maxPages: 5 }
|
|
372
|
-
})
|
|
373
|
-
]);
|
|
374
|
-
|
|
375
|
-
// Process results individually
|
|
376
|
-
results.forEach((result, index) => {
|
|
377
|
-
const name = index === 0 ? 'Products' : 'Locations';
|
|
378
|
-
|
|
379
|
-
if (result.status === 'fulfilled') {
|
|
380
|
-
const { totalRecords } = result.value.extensions.autoPagination;
|
|
381
|
-
console.log(`✅ ${name}: ${totalRecords} records`);
|
|
382
|
-
} else {
|
|
383
|
-
console.error(`❌ ${name} failed:`, result.reason);
|
|
384
|
-
}
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
// Extract successful results
|
|
388
|
-
const products = results[0].status === 'fulfilled' ? results[0].value : null;
|
|
389
|
-
const locations = results[1].status === 'fulfilled' ? results[1].value : null;
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
### Retry Failed Queries
|
|
393
|
-
|
|
394
|
-
```typescript
|
|
395
|
-
async function fetchWithRetry(queryFn: () => Promise<any>, maxRetries = 3) {
|
|
396
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
397
|
-
try {
|
|
398
|
-
return await queryFn();
|
|
399
|
-
} catch (error) {
|
|
400
|
-
if (attempt === maxRetries) throw error;
|
|
401
|
-
console.log(`⚠️ Attempt ${attempt} failed, retrying...`);
|
|
402
|
-
await new Promise(resolve => setTimeout(resolve, 1000 * attempt));
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
const [products, locations] = await Promise.all([
|
|
408
|
-
fetchWithRetry(() =>
|
|
409
|
-
client.graphql({
|
|
410
|
-
query: productsQuery,
|
|
411
|
-
pagination: { maxPages: 10 }
|
|
412
|
-
})
|
|
413
|
-
),
|
|
414
|
-
fetchWithRetry(() =>
|
|
415
|
-
client.graphql({
|
|
416
|
-
query: locationsQuery,
|
|
417
|
-
pagination: { maxPages: 5 }
|
|
418
|
-
})
|
|
419
|
-
)
|
|
420
|
-
]);
|
|
421
|
-
```
|
|
422
|
-
|
|
423
|
-
## Progress Monitoring
|
|
424
|
-
|
|
425
|
-
### Aggregate Progress Tracking
|
|
426
|
-
|
|
427
|
-
```typescript
|
|
428
|
-
class ProgressTracker {
|
|
429
|
-
private progress: Map<string, { page: number; records: number }> = new Map();
|
|
430
|
-
|
|
431
|
-
update(name: string, page: number, records: number) {
|
|
432
|
-
this.progress.set(name, { page, records });
|
|
433
|
-
this.display();
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
display() {
|
|
437
|
-
process.stdout.write('\r'); // Clear line
|
|
438
|
-
const status = Array.from(this.progress.entries())
|
|
439
|
-
.map(([name, { page, records }]) => `${name}: ${records} (p${page})`)
|
|
440
|
-
.join(' | ');
|
|
441
|
-
process.stdout.write(status);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
const tracker = new ProgressTracker();
|
|
446
|
-
|
|
447
|
-
const [products, locations, virtualPositions] = await Promise.all([
|
|
448
|
-
client.graphql({
|
|
449
|
-
query: productsQuery,
|
|
450
|
-
pagination: {
|
|
451
|
-
maxPages: 10,
|
|
452
|
-
onProgress: (page, records) => tracker.update('Products', page, records)
|
|
453
|
-
}
|
|
454
|
-
}),
|
|
455
|
-
client.graphql({
|
|
456
|
-
query: locationsQuery,
|
|
457
|
-
pagination: {
|
|
458
|
-
maxPages: 5,
|
|
459
|
-
onProgress: (page, records) => tracker.update('Locations', page, records)
|
|
460
|
-
}
|
|
461
|
-
}),
|
|
462
|
-
client.graphql({
|
|
463
|
-
query: virtualPositionsQuery,
|
|
464
|
-
pagination: {
|
|
465
|
-
maxPages: 20,
|
|
466
|
-
onProgress: (page, records) => tracker.update('VirtualPos', page, records)
|
|
467
|
-
}
|
|
468
|
-
})
|
|
469
|
-
]);
|
|
470
|
-
|
|
471
|
-
console.log('\n✅ Complete!');
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
**Output:**
|
|
475
|
-
```
|
|
476
|
-
Products: 873 (p9) | Locations: 234 (p5) | VirtualPos: 1847 (p10)
|
|
477
|
-
✅ Complete!
|
|
478
|
-
```
|
|
479
|
-
|
|
480
|
-
## Performance Optimization
|
|
481
|
-
|
|
482
|
-
### Optimize Page Sizes
|
|
483
|
-
|
|
484
|
-
Different entities have different optimal page sizes:
|
|
485
|
-
|
|
486
|
-
```typescript
|
|
487
|
-
const [products, locations, virtualPositions] = await Promise.all([
|
|
488
|
-
client.graphql({
|
|
489
|
-
query: productsQuery,
|
|
490
|
-
variables: { first: 50 }, // ← Medium complexity
|
|
491
|
-
pagination: { maxRecords: 5000 }
|
|
492
|
-
}),
|
|
493
|
-
client.graphql({
|
|
494
|
-
query: locationsQuery,
|
|
495
|
-
variables: { first: 100 }, // ← Simple entity
|
|
496
|
-
pagination: { maxRecords: 500 }
|
|
497
|
-
}),
|
|
498
|
-
client.graphql({
|
|
499
|
-
query: virtualPositionsQuery,
|
|
500
|
-
variables: { first: 200 }, // ← Very simple
|
|
501
|
-
pagination: { maxRecords: 10000 }
|
|
502
|
-
})
|
|
503
|
-
]);
|
|
504
|
-
```
|
|
505
|
-
|
|
506
|
-
**Guidelines:**
|
|
507
|
-
- Simple entities (locations, virtual positions): 100-200/page
|
|
508
|
-
- Medium entities (products): 50-100/page
|
|
509
|
-
- Complex entities (orders with items): 20-50/page
|
|
510
|
-
|
|
511
|
-
### Connection Pooling
|
|
512
|
-
|
|
513
|
-
Reuse client instances:
|
|
514
|
-
|
|
515
|
-
```typescript
|
|
516
|
-
// ✅ Good - reuse client
|
|
517
|
-
const client = await createClient({ /* config */ });
|
|
518
|
-
|
|
519
|
-
const [batch1, batch2, batch3] = await Promise.all([
|
|
520
|
-
client.graphql({ query: query1, pagination: { maxPages: 10 } }),
|
|
521
|
-
client.graphql({ query: query2, pagination: { maxPages: 5 } }),
|
|
522
|
-
client.graphql({ query: query3, pagination: { maxPages: 8 } })
|
|
523
|
-
]);
|
|
524
|
-
|
|
525
|
-
// ❌ Bad - create new client each time
|
|
526
|
-
const results = await Promise.all([
|
|
527
|
-
createClient({ ... }).then(c => c.graphql({ ... })),
|
|
528
|
-
createClient({ ... }).then(c => c.graphql({ ... })),
|
|
529
|
-
createClient({ ... }).then(c => c.graphql({ ... }))
|
|
530
|
-
]);
|
|
531
|
-
```
|
|
532
|
-
|
|
533
|
-
### Batch Size Limits
|
|
534
|
-
|
|
535
|
-
Don't query too many connections at once:
|
|
536
|
-
|
|
537
|
-
```typescript
|
|
538
|
-
// ⚠️ Risky - 10 parallel queries
|
|
539
|
-
const results = await Promise.all([...Array(10)].map(/* query */));
|
|
540
|
-
|
|
541
|
-
// ✅ Better - chunk into batches
|
|
542
|
-
async function queryInBatches(queries: any[], batchSize = 3) {
|
|
543
|
-
const results = [];
|
|
544
|
-
for (let i = 0; i < queries.length; i += batchSize) {
|
|
545
|
-
const batch = queries.slice(i, i + batchSize);
|
|
546
|
-
const batchResults = await Promise.all(batch.map(q => client.graphql(q)));
|
|
547
|
-
results.push(...batchResults);
|
|
548
|
-
}
|
|
549
|
-
return results;
|
|
550
|
-
}
|
|
551
|
-
```
|
|
552
|
-
|
|
553
|
-
## Trade-offs: Parallel vs Single Query
|
|
554
|
-
|
|
555
|
-
### Parallel Queries
|
|
556
|
-
|
|
557
|
-
**Pros:**
|
|
558
|
-
- ✅ All connections fully paginated
|
|
559
|
-
- ✅ Independent limits per connection
|
|
560
|
-
- ✅ Better error isolation
|
|
561
|
-
- ✅ Faster execution (parallel)
|
|
562
|
-
- ✅ Separate progress tracking
|
|
563
|
-
|
|
564
|
-
**Cons:**
|
|
565
|
-
- ⚠️ Multiple network requests
|
|
566
|
-
- ⚠️ More code to write
|
|
567
|
-
- ⚠️ Manual result combining
|
|
568
|
-
- ⚠️ Higher initial resource usage
|
|
569
|
-
|
|
570
|
-
### Single Query with connectionPath
|
|
571
|
-
|
|
572
|
-
**Pros:**
|
|
573
|
-
- ✅ Single network request
|
|
574
|
-
- ✅ Less code to write
|
|
575
|
-
- ✅ Atomic operation
|
|
576
|
-
|
|
577
|
-
**Cons:**
|
|
578
|
-
- ⚠️ Only one connection paginated
|
|
579
|
-
- ⚠️ Other connections limited to first page
|
|
580
|
-
- ⚠️ Single point of failure
|
|
581
|
-
|
|
582
|
-
## Key Takeaways
|
|
583
|
-
|
|
584
|
-
- 🎯 **Use `Promise.all()`** - For paginating multiple connections
|
|
585
|
-
- 🎯 **Separate queries** - One query per connection
|
|
586
|
-
- 🎯 **Independent configs** - Different limits per connection
|
|
587
|
-
- 🎯 **Error handling** - Use `Promise.allSettled()` for resilience
|
|
588
|
-
- 🎯 **Monitor individually** - Separate `onProgress` callbacks
|
|
589
|
-
- 🎯 **Optimize page sizes** - Match entity complexity
|
|
590
|
-
|
|
591
|
-
## Practice Exercise
|
|
592
|
-
|
|
593
|
-
Implement a parallel export that:
|
|
594
|
-
1. Fetches products (100/page, max 1000 records)
|
|
595
|
-
2. Fetches locations (50/page, max 500 records)
|
|
596
|
-
3. Fetches virtual positions (200/page, max 5000 records)
|
|
597
|
-
4. Tracks progress for each
|
|
598
|
-
5. Handles errors gracefully with `Promise.allSettled()`
|
|
599
|
-
|
|
600
|
-
<details>
|
|
601
|
-
<summary>Solution</summary>
|
|
602
|
-
|
|
603
|
-
```typescript
|
|
604
|
-
async function parallelExport() {
|
|
605
|
-
const client = await createClient({ /* config */ });
|
|
606
|
-
|
|
607
|
-
console.log('Starting parallel export...\n');
|
|
608
|
-
|
|
609
|
-
const results = await Promise.allSettled([
|
|
610
|
-
client.graphql({
|
|
611
|
-
query: productsQuery,
|
|
612
|
-
variables: { first: 100 },
|
|
613
|
-
pagination: {
|
|
614
|
-
maxRecords: 1000,
|
|
615
|
-
onProgress: (p, r) => console.log(`[Products] Page ${p}: ${r} records`)
|
|
616
|
-
}
|
|
617
|
-
}),
|
|
618
|
-
client.graphql({
|
|
619
|
-
query: locationsQuery,
|
|
620
|
-
variables: { first: 50 },
|
|
621
|
-
pagination: {
|
|
622
|
-
maxRecords: 500,
|
|
623
|
-
onProgress: (p, r) => console.log(`[Locations] Page ${p}: ${r} records`)
|
|
624
|
-
}
|
|
625
|
-
}),
|
|
626
|
-
client.graphql({
|
|
627
|
-
query: virtualPositionsQuery,
|
|
628
|
-
variables: { first: 200 },
|
|
629
|
-
pagination: {
|
|
630
|
-
maxRecords: 5000,
|
|
631
|
-
onProgress: (p, r) => console.log(`[VirtualPos] Page ${p}: ${r} records`)
|
|
632
|
-
}
|
|
633
|
-
})
|
|
634
|
-
]);
|
|
635
|
-
|
|
636
|
-
const names = ['Products', 'Locations', 'VirtualPositions'];
|
|
637
|
-
results.forEach((result, index) => {
|
|
638
|
-
if (result.status === 'fulfilled') {
|
|
639
|
-
console.log(`✅ ${names[index]}: ${result.value.extensions.autoPagination.totalRecords}`);
|
|
640
|
-
} else {
|
|
641
|
-
console.error(`❌ ${names[index]} failed:`, result.reason.message);
|
|
642
|
-
}
|
|
643
|
-
});
|
|
644
|
-
|
|
645
|
-
return {
|
|
646
|
-
products: results[0].status === 'fulfilled' ? results[0].value.data.products : null,
|
|
647
|
-
locations: results[1].status === 'fulfilled' ? results[1].value.data.locations : null,
|
|
648
|
-
virtualPositions: results[2].status === 'fulfilled' ? results[2].value.data.virtualPositions : null
|
|
649
|
-
};
|
|
650
|
-
}
|
|
651
|
-
```
|
|
652
|
-
</details>
|
|
653
|
-
|
|
654
|
-
## Next Steps
|
|
655
|
-
|
|
656
|
-
Continue to [Module 5: Best Practices](./multiple-connections-05-best-practices.md) to learn production patterns and optimization techniques.
|
|
1
|
+
# Module 4: Parallel Queries
|
|
2
|
+
|
|
3
|
+
**Level:** Advanced
|
|
4
|
+
**Estimated Time:** 30 minutes
|
|
5
|
+
|
|
6
|
+
**SDK Version:** Use latest - `npm install @fluentcommerce/fc-connect-sdk@latest`
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
This module teaches you how to paginate multiple connections **simultaneously** using parallel queries with `Promise.all()`. This is the recommended workaround when all connections need full pagination.
|
|
11
|
+
|
|
12
|
+
## Learning Objectives
|
|
13
|
+
|
|
14
|
+
By the end of this module, you will:
|
|
15
|
+
- ✅ Understand why parallel queries are the recommended approach
|
|
16
|
+
- ✅ Implement `Promise.all()` patterns for multi-connection pagination
|
|
17
|
+
- ✅ Handle errors and monitoring for parallel operations
|
|
18
|
+
- ✅ Know when to use parallel vs sequential approaches
|
|
19
|
+
- ✅ Optimize performance for bulk exports
|
|
20
|
+
|
|
21
|
+
## Why Parallel Queries?
|
|
22
|
+
|
|
23
|
+
### The Challenge
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
// ❌ This won't work - can only target ONE connection
|
|
27
|
+
const result = await client.graphql({
|
|
28
|
+
query: multiConnectionQuery,
|
|
29
|
+
pagination: {
|
|
30
|
+
connectionPath: ['products', 'locations'] // ← NOT SUPPORTED
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### The Solution
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// ✅ Use separate queries in parallel
|
|
39
|
+
const [products, locations] = await Promise.all([
|
|
40
|
+
client.graphql({
|
|
41
|
+
query: productsQuery,
|
|
42
|
+
pagination: { maxPages: 10 }
|
|
43
|
+
}),
|
|
44
|
+
client.graphql({
|
|
45
|
+
query: locationsQuery,
|
|
46
|
+
pagination: { maxPages: 5 }
|
|
47
|
+
})
|
|
48
|
+
]);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Benefits of Parallel Queries
|
|
52
|
+
|
|
53
|
+
| Aspect | Single Query | Parallel Queries |
|
|
54
|
+
|--------|-------------|------------------|
|
|
55
|
+
| **All connections paginated** | ❌ No | ✅ Yes |
|
|
56
|
+
| **Independent limits** | ❌ Same for all | ✅ Different per connection |
|
|
57
|
+
| **Progress tracking** | ⚠️ One callback | ✅ Separate callbacks |
|
|
58
|
+
| **Error isolation** | ⚠️ All-or-nothing | ✅ Can handle individually |
|
|
59
|
+
| **Performance** | ⚠️ Sequential | ✅ Parallel execution |
|
|
60
|
+
| **Flexibility** | ⚠️ Limited | ✅ Full control |
|
|
61
|
+
|
|
62
|
+
## Basic Parallel Query Pattern
|
|
63
|
+
|
|
64
|
+
### Step 1: Define Separate Queries
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
const productsQuery = `
|
|
68
|
+
query GetProducts($first: Int!, $after: String) {
|
|
69
|
+
products(first: $first, after: $after) {
|
|
70
|
+
edges {
|
|
71
|
+
node { id ref type status }
|
|
72
|
+
cursor
|
|
73
|
+
}
|
|
74
|
+
pageInfo { hasNextPage }
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
`;
|
|
78
|
+
|
|
79
|
+
const locationsQuery = `
|
|
80
|
+
query GetLocations($first: Int!, $after: String) {
|
|
81
|
+
locations(first: $first, after: $after) {
|
|
82
|
+
edges {
|
|
83
|
+
node { id ref name type }
|
|
84
|
+
cursor
|
|
85
|
+
}
|
|
86
|
+
pageInfo { hasNextPage }
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
`;
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Step 2: Execute in Parallel
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
const [productsResult, locationsResult] = await Promise.all([
|
|
96
|
+
client.graphql({
|
|
97
|
+
query: productsQuery,
|
|
98
|
+
variables: { first: 100 },
|
|
99
|
+
pagination: {
|
|
100
|
+
maxPages: 10,
|
|
101
|
+
maxRecords: 1000,
|
|
102
|
+
onProgress: (page, records) => {
|
|
103
|
+
console.log(`[Products] Page ${page}: ${records} records`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}),
|
|
107
|
+
client.graphql({
|
|
108
|
+
query: locationsQuery,
|
|
109
|
+
variables: { first: 50 },
|
|
110
|
+
pagination: {
|
|
111
|
+
maxPages: 5,
|
|
112
|
+
maxRecords: 250,
|
|
113
|
+
onProgress: (page, records) => {
|
|
114
|
+
console.log(`[Locations] Page ${page}: ${records} records`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
})
|
|
118
|
+
]);
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Step 3: Process Results
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
// Access data from each result
|
|
125
|
+
const products = productsResult.data.products.edges.map(e => e.node);
|
|
126
|
+
const locations = locationsResult.data.locations.edges.map(e => e.node);
|
|
127
|
+
|
|
128
|
+
// Check metadata
|
|
129
|
+
console.log(`Products: ${productsResult.extensions.autoPagination.totalRecords} records`);
|
|
130
|
+
console.log(`Locations: ${locationsResult.extensions.autoPagination.totalRecords} records`);
|
|
131
|
+
|
|
132
|
+
// Combine if needed
|
|
133
|
+
const combinedData = {
|
|
134
|
+
products,
|
|
135
|
+
locations,
|
|
136
|
+
metadata: {
|
|
137
|
+
productsPages: productsResult.extensions.autoPagination.totalPages,
|
|
138
|
+
locationsPages: locationsResult.extensions.autoPagination.totalPages
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Real-World Examples
|
|
144
|
+
|
|
145
|
+
### Example 1: Simple Dual Export
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
149
|
+
|
|
150
|
+
async function exportProductsAndLocations() {
|
|
151
|
+
const client = await createClient({
|
|
152
|
+
config: {
|
|
153
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
154
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
155
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
156
|
+
username: process.env.FLUENT_USERNAME!,
|
|
157
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
158
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
console.log('Starting parallel export...\n');
|
|
163
|
+
|
|
164
|
+
const [products, locations] = await Promise.all([
|
|
165
|
+
client.graphql({
|
|
166
|
+
query: `
|
|
167
|
+
query GetProducts($first: Int!, $after: String) {
|
|
168
|
+
products(first: $first, after: $after) {
|
|
169
|
+
edges {
|
|
170
|
+
node { id ref type status }
|
|
171
|
+
cursor
|
|
172
|
+
}
|
|
173
|
+
pageInfo { hasNextPage }
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
`,
|
|
177
|
+
variables: { first: 100 },
|
|
178
|
+
pagination: {
|
|
179
|
+
maxPages: 10,
|
|
180
|
+
maxRecords: 1000,
|
|
181
|
+
onProgress: (page, records) => {
|
|
182
|
+
console.log(`[Products] Page ${page}: ${records} records`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}),
|
|
186
|
+
client.graphql({
|
|
187
|
+
query: `
|
|
188
|
+
query GetLocations($first: Int!, $after: String) {
|
|
189
|
+
locations(first: $first, after: $after) {
|
|
190
|
+
edges {
|
|
191
|
+
node { id ref name type }
|
|
192
|
+
cursor
|
|
193
|
+
}
|
|
194
|
+
pageInfo { hasNextPage }
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
`,
|
|
198
|
+
variables: { first: 50 },
|
|
199
|
+
pagination: {
|
|
200
|
+
maxPages: 5,
|
|
201
|
+
maxRecords: 250,
|
|
202
|
+
onProgress: (page, records) => {
|
|
203
|
+
console.log(`[Locations] Page ${page}: ${records} records`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
})
|
|
207
|
+
]);
|
|
208
|
+
|
|
209
|
+
console.log('\n✅ Export complete!');
|
|
210
|
+
console.log(`Products: ${products.extensions.autoPagination.totalRecords}`);
|
|
211
|
+
console.log(`Locations: ${locations.extensions.autoPagination.totalRecords}`);
|
|
212
|
+
|
|
213
|
+
return {
|
|
214
|
+
products: products.data.products.edges.map(e => e.node),
|
|
215
|
+
locations: locations.data.locations.edges.map(e => e.node)
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Run
|
|
220
|
+
exportProductsAndLocations().catch(console.error);
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Output:**
|
|
224
|
+
```
|
|
225
|
+
Starting parallel export...
|
|
226
|
+
|
|
227
|
+
[Products] Page 1: 100 records
|
|
228
|
+
[Locations] Page 1: 50 records
|
|
229
|
+
[Products] Page 2: 200 records
|
|
230
|
+
[Locations] Page 2: 100 records
|
|
231
|
+
[Products] Page 3: 300 records
|
|
232
|
+
[Locations] Page 3: 150 records
|
|
233
|
+
...
|
|
234
|
+
|
|
235
|
+
✅ Export complete!
|
|
236
|
+
Products: 873
|
|
237
|
+
Locations: 234
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Example 2: Bulk Export (3+ Connections)
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
async function bulkExport() {
|
|
244
|
+
const client = await createClient({ /* config */ });
|
|
245
|
+
|
|
246
|
+
console.log('Starting bulk export...\n');
|
|
247
|
+
|
|
248
|
+
const [products, locations, virtualPositions, orders] = await Promise.all([
|
|
249
|
+
client.graphql({
|
|
250
|
+
query: productsQuery,
|
|
251
|
+
variables: { first: 100 },
|
|
252
|
+
pagination: {
|
|
253
|
+
maxRecords: 5000,
|
|
254
|
+
onProgress: (p, r) => process.stdout.write(`\r[Products] ${r}`)
|
|
255
|
+
}
|
|
256
|
+
}),
|
|
257
|
+
client.graphql({
|
|
258
|
+
query: locationsQuery,
|
|
259
|
+
variables: { first: 50 },
|
|
260
|
+
pagination: {
|
|
261
|
+
maxRecords: 500,
|
|
262
|
+
onProgress: (p, r) => process.stdout.write(`\r[Locations] ${r}`)
|
|
263
|
+
}
|
|
264
|
+
}),
|
|
265
|
+
client.graphql({
|
|
266
|
+
query: virtualPositionsQuery,
|
|
267
|
+
variables: { first: 200 },
|
|
268
|
+
pagination: {
|
|
269
|
+
maxRecords: 10000,
|
|
270
|
+
onProgress: (p, r) => process.stdout.write(`\r[VirtualPos] ${r}`)
|
|
271
|
+
}
|
|
272
|
+
}),
|
|
273
|
+
client.graphql({
|
|
274
|
+
query: ordersQuery,
|
|
275
|
+
variables: { first: 75 },
|
|
276
|
+
pagination: {
|
|
277
|
+
maxRecords: 2000,
|
|
278
|
+
onProgress: (p, r) => process.stdout.write(`\r[Orders] ${r}`)
|
|
279
|
+
}
|
|
280
|
+
})
|
|
281
|
+
]);
|
|
282
|
+
|
|
283
|
+
console.log('\n\n✅ Bulk export complete!');
|
|
284
|
+
console.log(`Products: ${products.extensions.autoPagination.totalRecords}`);
|
|
285
|
+
console.log(`Locations: ${locations.extensions.autoPagination.totalRecords}`);
|
|
286
|
+
console.log(`Virtual Positions: ${virtualPositions.extensions.autoPagination.totalRecords}`);
|
|
287
|
+
console.log(`Orders: ${orders.extensions.autoPagination.totalRecords}`);
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Example 3: Sequential Processing (When Needed)
|
|
292
|
+
|
|
293
|
+
Sometimes you need sequential execution (one after another):
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
async function sequentialExport() {
|
|
297
|
+
const client = await createClient({ /* config */ });
|
|
298
|
+
|
|
299
|
+
// Step 1: Get all products first
|
|
300
|
+
console.log('Fetching products...');
|
|
301
|
+
const products = await client.graphql({
|
|
302
|
+
query: productsQuery,
|
|
303
|
+
variables: { first: 100 },
|
|
304
|
+
pagination: { maxPages: 10 }
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
console.log(`✅ Products: ${products.extensions.autoPagination.totalRecords}\n`);
|
|
308
|
+
|
|
309
|
+
// Step 2: Get locations (after products complete)
|
|
310
|
+
console.log('Fetching locations...');
|
|
311
|
+
const locations = await client.graphql({
|
|
312
|
+
query: locationsQuery,
|
|
313
|
+
variables: { first: 50 },
|
|
314
|
+
pagination: { maxPages: 5 }
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
console.log(`✅ Locations: ${locations.extensions.autoPagination.totalRecords}\n`);
|
|
318
|
+
|
|
319
|
+
// Step 3: Get virtual positions (after locations complete)
|
|
320
|
+
console.log('Fetching virtual positions...');
|
|
321
|
+
const virtualPositions = await client.graphql({
|
|
322
|
+
query: virtualPositionsQuery,
|
|
323
|
+
variables: { first: 200 },
|
|
324
|
+
pagination: { maxPages: 20 }
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
console.log(`✅ Virtual Positions: ${virtualPositions.extensions.autoPagination.totalRecords}`);
|
|
328
|
+
|
|
329
|
+
return { products, locations, virtualPositions };
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
**Use Sequential When:**
|
|
334
|
+
- ⚠️ API has strict rate limits
|
|
335
|
+
- ⚠️ Memory constraints (large datasets)
|
|
336
|
+
- ⚠️ One query depends on results of previous
|
|
337
|
+
|
|
338
|
+
**Use Parallel When:**
|
|
339
|
+
- ✅ Queries are independent
|
|
340
|
+
- ✅ Want faster execution
|
|
341
|
+
- ✅ Have sufficient memory/resources
|
|
342
|
+
|
|
343
|
+
## Error Handling
|
|
344
|
+
|
|
345
|
+
### Basic Error Handling
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
try {
|
|
349
|
+
const [products, locations] = await Promise.all([
|
|
350
|
+
client.graphql({ query: productsQuery, pagination: { maxPages: 10 } }),
|
|
351
|
+
client.graphql({ query: locationsQuery, pagination: { maxPages: 5 } })
|
|
352
|
+
]);
|
|
353
|
+
|
|
354
|
+
console.log('✅ Both queries succeeded');
|
|
355
|
+
} catch (error) {
|
|
356
|
+
console.error('❌ At least one query failed:', error);
|
|
357
|
+
// Both results lost if one fails
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Individual Error Handling with Promise.allSettled
|
|
362
|
+
|
|
363
|
+
```typescript
|
|
364
|
+
const results = await Promise.allSettled([
|
|
365
|
+
client.graphql({
|
|
366
|
+
query: productsQuery,
|
|
367
|
+
pagination: { maxPages: 10 }
|
|
368
|
+
}),
|
|
369
|
+
client.graphql({
|
|
370
|
+
query: locationsQuery,
|
|
371
|
+
pagination: { maxPages: 5 }
|
|
372
|
+
})
|
|
373
|
+
]);
|
|
374
|
+
|
|
375
|
+
// Process results individually
|
|
376
|
+
results.forEach((result, index) => {
|
|
377
|
+
const name = index === 0 ? 'Products' : 'Locations';
|
|
378
|
+
|
|
379
|
+
if (result.status === 'fulfilled') {
|
|
380
|
+
const { totalRecords } = result.value.extensions.autoPagination;
|
|
381
|
+
console.log(`✅ ${name}: ${totalRecords} records`);
|
|
382
|
+
} else {
|
|
383
|
+
console.error(`❌ ${name} failed:`, result.reason);
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
// Extract successful results
|
|
388
|
+
const products = results[0].status === 'fulfilled' ? results[0].value : null;
|
|
389
|
+
const locations = results[1].status === 'fulfilled' ? results[1].value : null;
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### Retry Failed Queries
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
async function fetchWithRetry(queryFn: () => Promise<any>, maxRetries = 3) {
|
|
396
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
397
|
+
try {
|
|
398
|
+
return await queryFn();
|
|
399
|
+
} catch (error) {
|
|
400
|
+
if (attempt === maxRetries) throw error;
|
|
401
|
+
console.log(`⚠️ Attempt ${attempt} failed, retrying...`);
|
|
402
|
+
await new Promise(resolve => setTimeout(resolve, 1000 * attempt));
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
const [products, locations] = await Promise.all([
|
|
408
|
+
fetchWithRetry(() =>
|
|
409
|
+
client.graphql({
|
|
410
|
+
query: productsQuery,
|
|
411
|
+
pagination: { maxPages: 10 }
|
|
412
|
+
})
|
|
413
|
+
),
|
|
414
|
+
fetchWithRetry(() =>
|
|
415
|
+
client.graphql({
|
|
416
|
+
query: locationsQuery,
|
|
417
|
+
pagination: { maxPages: 5 }
|
|
418
|
+
})
|
|
419
|
+
)
|
|
420
|
+
]);
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
## Progress Monitoring
|
|
424
|
+
|
|
425
|
+
### Aggregate Progress Tracking
|
|
426
|
+
|
|
427
|
+
```typescript
|
|
428
|
+
class ProgressTracker {
|
|
429
|
+
private progress: Map<string, { page: number; records: number }> = new Map();
|
|
430
|
+
|
|
431
|
+
update(name: string, page: number, records: number) {
|
|
432
|
+
this.progress.set(name, { page, records });
|
|
433
|
+
this.display();
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
display() {
|
|
437
|
+
process.stdout.write('\r'); // Clear line
|
|
438
|
+
const status = Array.from(this.progress.entries())
|
|
439
|
+
.map(([name, { page, records }]) => `${name}: ${records} (p${page})`)
|
|
440
|
+
.join(' | ');
|
|
441
|
+
process.stdout.write(status);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
const tracker = new ProgressTracker();
|
|
446
|
+
|
|
447
|
+
const [products, locations, virtualPositions] = await Promise.all([
|
|
448
|
+
client.graphql({
|
|
449
|
+
query: productsQuery,
|
|
450
|
+
pagination: {
|
|
451
|
+
maxPages: 10,
|
|
452
|
+
onProgress: (page, records) => tracker.update('Products', page, records)
|
|
453
|
+
}
|
|
454
|
+
}),
|
|
455
|
+
client.graphql({
|
|
456
|
+
query: locationsQuery,
|
|
457
|
+
pagination: {
|
|
458
|
+
maxPages: 5,
|
|
459
|
+
onProgress: (page, records) => tracker.update('Locations', page, records)
|
|
460
|
+
}
|
|
461
|
+
}),
|
|
462
|
+
client.graphql({
|
|
463
|
+
query: virtualPositionsQuery,
|
|
464
|
+
pagination: {
|
|
465
|
+
maxPages: 20,
|
|
466
|
+
onProgress: (page, records) => tracker.update('VirtualPos', page, records)
|
|
467
|
+
}
|
|
468
|
+
})
|
|
469
|
+
]);
|
|
470
|
+
|
|
471
|
+
console.log('\n✅ Complete!');
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
**Output:**
|
|
475
|
+
```
|
|
476
|
+
Products: 873 (p9) | Locations: 234 (p5) | VirtualPos: 1847 (p10)
|
|
477
|
+
✅ Complete!
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
## Performance Optimization
|
|
481
|
+
|
|
482
|
+
### Optimize Page Sizes
|
|
483
|
+
|
|
484
|
+
Different entities have different optimal page sizes:
|
|
485
|
+
|
|
486
|
+
```typescript
|
|
487
|
+
const [products, locations, virtualPositions] = await Promise.all([
|
|
488
|
+
client.graphql({
|
|
489
|
+
query: productsQuery,
|
|
490
|
+
variables: { first: 50 }, // ← Medium complexity
|
|
491
|
+
pagination: { maxRecords: 5000 }
|
|
492
|
+
}),
|
|
493
|
+
client.graphql({
|
|
494
|
+
query: locationsQuery,
|
|
495
|
+
variables: { first: 100 }, // ← Simple entity
|
|
496
|
+
pagination: { maxRecords: 500 }
|
|
497
|
+
}),
|
|
498
|
+
client.graphql({
|
|
499
|
+
query: virtualPositionsQuery,
|
|
500
|
+
variables: { first: 200 }, // ← Very simple
|
|
501
|
+
pagination: { maxRecords: 10000 }
|
|
502
|
+
})
|
|
503
|
+
]);
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
**Guidelines:**
|
|
507
|
+
- Simple entities (locations, virtual positions): 100-200/page
|
|
508
|
+
- Medium entities (products): 50-100/page
|
|
509
|
+
- Complex entities (orders with items): 20-50/page
|
|
510
|
+
|
|
511
|
+
### Connection Pooling
|
|
512
|
+
|
|
513
|
+
Reuse client instances:
|
|
514
|
+
|
|
515
|
+
```typescript
|
|
516
|
+
// ✅ Good - reuse client
|
|
517
|
+
const client = await createClient({ /* config */ });
|
|
518
|
+
|
|
519
|
+
const [batch1, batch2, batch3] = await Promise.all([
|
|
520
|
+
client.graphql({ query: query1, pagination: { maxPages: 10 } }),
|
|
521
|
+
client.graphql({ query: query2, pagination: { maxPages: 5 } }),
|
|
522
|
+
client.graphql({ query: query3, pagination: { maxPages: 8 } })
|
|
523
|
+
]);
|
|
524
|
+
|
|
525
|
+
// ❌ Bad - create new client each time
|
|
526
|
+
const results = await Promise.all([
|
|
527
|
+
createClient({ ... }).then(c => c.graphql({ ... })),
|
|
528
|
+
createClient({ ... }).then(c => c.graphql({ ... })),
|
|
529
|
+
createClient({ ... }).then(c => c.graphql({ ... }))
|
|
530
|
+
]);
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
### Batch Size Limits
|
|
534
|
+
|
|
535
|
+
Don't query too many connections at once:
|
|
536
|
+
|
|
537
|
+
```typescript
|
|
538
|
+
// ⚠️ Risky - 10 parallel queries
|
|
539
|
+
const results = await Promise.all([...Array(10)].map(/* query */));
|
|
540
|
+
|
|
541
|
+
// ✅ Better - chunk into batches
|
|
542
|
+
async function queryInBatches(queries: any[], batchSize = 3) {
|
|
543
|
+
const results = [];
|
|
544
|
+
for (let i = 0; i < queries.length; i += batchSize) {
|
|
545
|
+
const batch = queries.slice(i, i + batchSize);
|
|
546
|
+
const batchResults = await Promise.all(batch.map(q => client.graphql(q)));
|
|
547
|
+
results.push(...batchResults);
|
|
548
|
+
}
|
|
549
|
+
return results;
|
|
550
|
+
}
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
## Trade-offs: Parallel vs Single Query
|
|
554
|
+
|
|
555
|
+
### Parallel Queries
|
|
556
|
+
|
|
557
|
+
**Pros:**
|
|
558
|
+
- ✅ All connections fully paginated
|
|
559
|
+
- ✅ Independent limits per connection
|
|
560
|
+
- ✅ Better error isolation
|
|
561
|
+
- ✅ Faster execution (parallel)
|
|
562
|
+
- ✅ Separate progress tracking
|
|
563
|
+
|
|
564
|
+
**Cons:**
|
|
565
|
+
- ⚠️ Multiple network requests
|
|
566
|
+
- ⚠️ More code to write
|
|
567
|
+
- ⚠️ Manual result combining
|
|
568
|
+
- ⚠️ Higher initial resource usage
|
|
569
|
+
|
|
570
|
+
### Single Query with connectionPath
|
|
571
|
+
|
|
572
|
+
**Pros:**
|
|
573
|
+
- ✅ Single network request
|
|
574
|
+
- ✅ Less code to write
|
|
575
|
+
- ✅ Atomic operation
|
|
576
|
+
|
|
577
|
+
**Cons:**
|
|
578
|
+
- ⚠️ Only one connection paginated
|
|
579
|
+
- ⚠️ Other connections limited to first page
|
|
580
|
+
- ⚠️ Single point of failure
|
|
581
|
+
|
|
582
|
+
## Key Takeaways
|
|
583
|
+
|
|
584
|
+
- 🎯 **Use `Promise.all()`** - For paginating multiple connections
|
|
585
|
+
- 🎯 **Separate queries** - One query per connection
|
|
586
|
+
- 🎯 **Independent configs** - Different limits per connection
|
|
587
|
+
- 🎯 **Error handling** - Use `Promise.allSettled()` for resilience
|
|
588
|
+
- 🎯 **Monitor individually** - Separate `onProgress` callbacks
|
|
589
|
+
- 🎯 **Optimize page sizes** - Match entity complexity
|
|
590
|
+
|
|
591
|
+
## Practice Exercise
|
|
592
|
+
|
|
593
|
+
Implement a parallel export that:
|
|
594
|
+
1. Fetches products (100/page, max 1000 records)
|
|
595
|
+
2. Fetches locations (50/page, max 500 records)
|
|
596
|
+
3. Fetches virtual positions (200/page, max 5000 records)
|
|
597
|
+
4. Tracks progress for each
|
|
598
|
+
5. Handles errors gracefully with `Promise.allSettled()`
|
|
599
|
+
|
|
600
|
+
<details>
|
|
601
|
+
<summary>Solution</summary>
|
|
602
|
+
|
|
603
|
+
```typescript
|
|
604
|
+
async function parallelExport() {
|
|
605
|
+
const client = await createClient({ /* config */ });
|
|
606
|
+
|
|
607
|
+
console.log('Starting parallel export...\n');
|
|
608
|
+
|
|
609
|
+
const results = await Promise.allSettled([
|
|
610
|
+
client.graphql({
|
|
611
|
+
query: productsQuery,
|
|
612
|
+
variables: { first: 100 },
|
|
613
|
+
pagination: {
|
|
614
|
+
maxRecords: 1000,
|
|
615
|
+
onProgress: (p, r) => console.log(`[Products] Page ${p}: ${r} records`)
|
|
616
|
+
}
|
|
617
|
+
}),
|
|
618
|
+
client.graphql({
|
|
619
|
+
query: locationsQuery,
|
|
620
|
+
variables: { first: 50 },
|
|
621
|
+
pagination: {
|
|
622
|
+
maxRecords: 500,
|
|
623
|
+
onProgress: (p, r) => console.log(`[Locations] Page ${p}: ${r} records`)
|
|
624
|
+
}
|
|
625
|
+
}),
|
|
626
|
+
client.graphql({
|
|
627
|
+
query: virtualPositionsQuery,
|
|
628
|
+
variables: { first: 200 },
|
|
629
|
+
pagination: {
|
|
630
|
+
maxRecords: 5000,
|
|
631
|
+
onProgress: (p, r) => console.log(`[VirtualPos] Page ${p}: ${r} records`)
|
|
632
|
+
}
|
|
633
|
+
})
|
|
634
|
+
]);
|
|
635
|
+
|
|
636
|
+
const names = ['Products', 'Locations', 'VirtualPositions'];
|
|
637
|
+
results.forEach((result, index) => {
|
|
638
|
+
if (result.status === 'fulfilled') {
|
|
639
|
+
console.log(`✅ ${names[index]}: ${result.value.extensions.autoPagination.totalRecords}`);
|
|
640
|
+
} else {
|
|
641
|
+
console.error(`❌ ${names[index]} failed:`, result.reason.message);
|
|
642
|
+
}
|
|
643
|
+
});
|
|
644
|
+
|
|
645
|
+
return {
|
|
646
|
+
products: results[0].status === 'fulfilled' ? results[0].value.data.products : null,
|
|
647
|
+
locations: results[1].status === 'fulfilled' ? results[1].value.data.locations : null,
|
|
648
|
+
virtualPositions: results[2].status === 'fulfilled' ? results[2].value.data.virtualPositions : null
|
|
649
|
+
};
|
|
650
|
+
}
|
|
651
|
+
```
|
|
652
|
+
</details>
|
|
653
|
+
|
|
654
|
+
## Next Steps
|
|
655
|
+
|
|
656
|
+
Continue to [Module 5: Best Practices](./multiple-connections-05-best-practices.md) to learn production patterns and optimization techniques.
|