@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +11 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md
CHANGED
|
@@ -1,824 +1,824 @@
|
|
|
1
|
-
# Module 6: API Reference
|
|
2
|
-
|
|
3
|
-
**Level:** Reference
|
|
4
|
-
**Estimated Time:** As needed
|
|
5
|
-
|
|
6
|
-
**SDK Version:** Use latest - `npm install @fluentcommerce/fc-connect-sdk@latest`
|
|
7
|
-
|
|
8
|
-
> **📝 Note:** This API reference is for **GraphQL pagination** with multiple paginated fields in a single query. It is **NOT** about multi-tenant connections or credential management.
|
|
9
|
-
|
|
10
|
-
## Overview
|
|
11
|
-
|
|
12
|
-
This module provides complete API documentation, configuration options, and reference material for multi-connection pagination.
|
|
13
|
-
|
|
14
|
-
## connectionPath Configuration
|
|
15
|
-
|
|
16
|
-
### Type Definition
|
|
17
|
-
|
|
18
|
-
```typescript
|
|
19
|
-
interface PaginationConfig {
|
|
20
|
-
enabled?: boolean; // Enable/disable auto-pagination
|
|
21
|
-
connectionPath?: string; // Path to target connection
|
|
22
|
-
maxPages?: number; // Maximum pages to fetch
|
|
23
|
-
maxRecords?: number; // Maximum total records
|
|
24
|
-
timeoutMs?: number; // Maximum time in milliseconds
|
|
25
|
-
delayMs?: number; // Delay between pages
|
|
26
|
-
direction?: 'forward' | 'backward'; // Pagination direction
|
|
27
|
-
abortSignal?: AbortSignal; // Cancel pagination
|
|
28
|
-
onProgress?: (page: number, totalRecords: number) => void;
|
|
29
|
-
onWarning?: (message: string) => void; // Warning callback
|
|
30
|
-
}
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### enabled Property
|
|
34
|
-
|
|
35
|
-
**Type:** `boolean | undefined`
|
|
36
|
-
|
|
37
|
-
**Default:** Auto-detected based on query variables and response structure
|
|
38
|
-
|
|
39
|
-
**Description:** Explicitly enable or disable auto-pagination. When not specified, the SDK auto-detects whether pagination should be enabled based on the presence of pagination variables (`$first`, `$after`, etc.) in the query.
|
|
40
|
-
|
|
41
|
-
**Examples:**
|
|
42
|
-
|
|
43
|
-
```typescript
|
|
44
|
-
// Explicitly enable
|
|
45
|
-
pagination: { enabled: true, maxPages: 10 }
|
|
46
|
-
|
|
47
|
-
// Explicitly disable
|
|
48
|
-
pagination: { enabled: false }
|
|
49
|
-
|
|
50
|
-
// Auto-detect (default behavior)
|
|
51
|
-
pagination: { maxPages: 10 } // enabled is auto-detected
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
**Use Cases:**
|
|
55
|
-
- Force pagination when auto-detection fails
|
|
56
|
-
- Disable pagination for specific queries
|
|
57
|
-
- Override default behavior
|
|
58
|
-
|
|
59
|
-
### connectionPath Property
|
|
60
|
-
|
|
61
|
-
**Type:** `string | undefined`
|
|
62
|
-
|
|
63
|
-
**Description:** Specifies which connection to paginate when query has multiple connections.
|
|
64
|
-
|
|
65
|
-
**Syntax:**
|
|
66
|
-
- **Root-level:** Simple field name (e.g., `'products'`)
|
|
67
|
-
- **Nested:** Dot notation (e.g., `'order.items'`)
|
|
68
|
-
- **Deep nested:** Multi-level (e.g., `'order.fulfilments.items'`)
|
|
69
|
-
|
|
70
|
-
**Default:** If not specified, SDK auto-detects first connection found.
|
|
71
|
-
|
|
72
|
-
**Examples:**
|
|
73
|
-
|
|
74
|
-
```typescript
|
|
75
|
-
// Root-level connection
|
|
76
|
-
pagination: { connectionPath: 'products' }
|
|
77
|
-
|
|
78
|
-
// Nested connection
|
|
79
|
-
pagination: { connectionPath: 'order.items' }
|
|
80
|
-
|
|
81
|
-
// Deep nested
|
|
82
|
-
pagination: { connectionPath: 'order.fulfilments.items' }
|
|
83
|
-
|
|
84
|
-
// Using alias
|
|
85
|
-
query { myProducts: products { ... } }
|
|
86
|
-
pagination: { connectionPath: 'myProducts' }
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
**Constraints:**
|
|
90
|
-
- ✅ Must be a **string** (not array)
|
|
91
|
-
- ✅ Must match actual response structure
|
|
92
|
-
- ✅ Case-sensitive
|
|
93
|
-
- ✅ Must point to a connection (has `edges`, `pageInfo`)
|
|
94
|
-
|
|
95
|
-
### maxPages Property
|
|
96
|
-
|
|
97
|
-
**Type:** `number | undefined`
|
|
98
|
-
|
|
99
|
-
**Description:** Maximum number of pages to fetch before stopping.
|
|
100
|
-
|
|
101
|
-
**Default:** `Infinity` (no limit)
|
|
102
|
-
|
|
103
|
-
**Behavior:** Pagination stops when ANY of these conditions is met (OR logic):
|
|
104
|
-
- `maxPages` reached
|
|
105
|
-
- `maxRecords` reached
|
|
106
|
-
- `timeoutMs` elapsed
|
|
107
|
-
- `pageInfo.hasNextPage` is false (no more data)
|
|
108
|
-
|
|
109
|
-
**Examples:**
|
|
110
|
-
|
|
111
|
-
```typescript
|
|
112
|
-
// Fetch up to 10 pages
|
|
113
|
-
pagination: { maxPages: 10 }
|
|
114
|
-
|
|
115
|
-
// Fetch up to 5 pages OR 500 records (whichever first)
|
|
116
|
-
pagination: { maxPages: 5, maxRecords: 500 }
|
|
117
|
-
|
|
118
|
-
// No page limit (fetch all)
|
|
119
|
-
pagination: { maxRecords: 10000 } // maxPages defaults to Infinity
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### maxRecords Property
|
|
123
|
-
|
|
124
|
-
**Type:** `number | undefined`
|
|
125
|
-
|
|
126
|
-
**Description:** Maximum total records to fetch before stopping.
|
|
127
|
-
|
|
128
|
-
**Default:** `Infinity` (no limit)
|
|
129
|
-
|
|
130
|
-
**Behavior:** Cumulative count across all pages. Stops when total records >= maxRecords.
|
|
131
|
-
|
|
132
|
-
**Examples:**
|
|
133
|
-
|
|
134
|
-
```typescript
|
|
135
|
-
// Fetch up to 1000 records
|
|
136
|
-
pagination: { maxRecords: 1000 }
|
|
137
|
-
|
|
138
|
-
// Fetch up to 1000 records OR 10 pages (whichever first)
|
|
139
|
-
pagination: { maxPages: 10, maxRecords: 1000 }
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### timeoutMs Property
|
|
143
|
-
|
|
144
|
-
**Type:** `number | undefined`
|
|
145
|
-
|
|
146
|
-
**Description:** Maximum time (in milliseconds) to spend fetching pages.
|
|
147
|
-
|
|
148
|
-
**Default:** `Infinity` (no timeout)
|
|
149
|
-
|
|
150
|
-
**Behavior:** Stops pagination when elapsed time exceeds timeout.
|
|
151
|
-
|
|
152
|
-
**Examples:**
|
|
153
|
-
|
|
154
|
-
```typescript
|
|
155
|
-
// Stop after 60 seconds
|
|
156
|
-
pagination: { timeoutMs: 60000 }
|
|
157
|
-
|
|
158
|
-
// Stop after 30 seconds OR 1000 records (whichever first)
|
|
159
|
-
pagination: { maxRecords: 1000, timeoutMs: 30000 }
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### onProgress Callback
|
|
163
|
-
|
|
164
|
-
**Type:** `((page: number, totalRecords: number) => void) | undefined`
|
|
165
|
-
|
|
166
|
-
**Description:** Callback function invoked after each page is fetched.
|
|
167
|
-
|
|
168
|
-
**Parameters:**
|
|
169
|
-
- `page`: Current page number (1-indexed)
|
|
170
|
-
- `totalRecords`: Cumulative total records fetched so far
|
|
171
|
-
|
|
172
|
-
**Use Cases:**
|
|
173
|
-
- Progress logging
|
|
174
|
-
- UI progress bars
|
|
175
|
-
- Performance monitoring
|
|
176
|
-
- Early termination logic
|
|
177
|
-
|
|
178
|
-
**Examples:**
|
|
179
|
-
|
|
180
|
-
```typescript
|
|
181
|
-
// Simple logging
|
|
182
|
-
pagination: {
|
|
183
|
-
maxPages: 10,
|
|
184
|
-
onProgress: (page, records) => {
|
|
185
|
-
console.log(`Page ${page}: ${records} records`);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// Progress bar
|
|
190
|
-
let progressBar = new ProgressBar();
|
|
191
|
-
pagination: {
|
|
192
|
-
maxPages: 100,
|
|
193
|
-
onProgress: (page, records) => {
|
|
194
|
-
progressBar.update(page / 100);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// Conditional logging
|
|
199
|
-
pagination: {
|
|
200
|
-
maxPages: 50,
|
|
201
|
-
onProgress: (page, records) => {
|
|
202
|
-
if (page % 5 === 0) { // Log every 5 pages
|
|
203
|
-
console.log(`[Checkpoint] Page ${page}: ${records} records`);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
### delayMs Property
|
|
210
|
-
|
|
211
|
-
**Type:** `number | undefined`
|
|
212
|
-
|
|
213
|
-
**Default:** `0` (no delay)
|
|
214
|
-
|
|
215
|
-
**Description:** Delay in milliseconds between page fetches. Useful for rate limiting to avoid overwhelming the API server.
|
|
216
|
-
|
|
217
|
-
**Examples:**
|
|
218
|
-
|
|
219
|
-
```typescript
|
|
220
|
-
// Add 500ms delay between pages
|
|
221
|
-
pagination: {
|
|
222
|
-
maxPages: 20,
|
|
223
|
-
delayMs: 500
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// Rate limiting for high-volume extraction
|
|
227
|
-
pagination: {
|
|
228
|
-
maxPages: 100,
|
|
229
|
-
delayMs: 1000 // 1 second delay
|
|
230
|
-
}
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
**Use Cases:**
|
|
234
|
-
- API rate limiting
|
|
235
|
-
- Server load management
|
|
236
|
-
- Throttling for large extractions
|
|
237
|
-
|
|
238
|
-
### direction Property
|
|
239
|
-
|
|
240
|
-
**Type:** `'forward' | 'backward' | undefined`
|
|
241
|
-
|
|
242
|
-
**Default:** Auto-detected from query variables
|
|
243
|
-
|
|
244
|
-
**Description:** Pagination direction. Forward pagination uses `first`/`after`, backward pagination uses `last`/`before`.
|
|
245
|
-
|
|
246
|
-
**Auto-Detection:**
|
|
247
|
-
- Queries with `$first` and `$after` → `'forward'`
|
|
248
|
-
- Queries with `$last` and `$before` → `'backward'`
|
|
249
|
-
|
|
250
|
-
**Examples:**
|
|
251
|
-
|
|
252
|
-
```typescript
|
|
253
|
-
// Forward pagination (explicit)
|
|
254
|
-
pagination: {
|
|
255
|
-
direction: 'forward',
|
|
256
|
-
maxPages: 10
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
// Backward pagination (explicit)
|
|
260
|
-
pagination: {
|
|
261
|
-
direction: 'backward',
|
|
262
|
-
maxPages: 10
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// Auto-detect from query variables (recommended)
|
|
266
|
-
pagination: { maxPages: 10 } // direction is auto-detected
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
**Note:** Forward pagination is recommended and most commonly used.
|
|
270
|
-
|
|
271
|
-
### abortSignal Property
|
|
272
|
-
|
|
273
|
-
**Type:** `AbortSignal | undefined`
|
|
274
|
-
|
|
275
|
-
**Default:** `undefined`
|
|
276
|
-
|
|
277
|
-
**Description:** AbortSignal for cancelling pagination mid-operation. Allows external cancellation of long-running pagination operations.
|
|
278
|
-
|
|
279
|
-
**Examples:**
|
|
280
|
-
|
|
281
|
-
```typescript
|
|
282
|
-
// Basic cancellation
|
|
283
|
-
const controller = new AbortController();
|
|
284
|
-
const promise = client.graphql({
|
|
285
|
-
query,
|
|
286
|
-
pagination: {
|
|
287
|
-
maxPages: 100,
|
|
288
|
-
abortSignal: controller.signal
|
|
289
|
-
}
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
// Cancel after 10 seconds
|
|
293
|
-
setTimeout(() => controller.abort(), 10000);
|
|
294
|
-
|
|
295
|
-
try {
|
|
296
|
-
const result = await promise;
|
|
297
|
-
} catch (error) {
|
|
298
|
-
if (error.name === 'AbortError') {
|
|
299
|
-
console.log('Pagination cancelled');
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
**Use Cases:**
|
|
305
|
-
- User-initiated cancellation (e.g., cancel button)
|
|
306
|
-
- Timeout enforcement
|
|
307
|
-
- Resource cleanup on component unmount
|
|
308
|
-
|
|
309
|
-
### onWarning Callback
|
|
310
|
-
|
|
311
|
-
**Type:** `((message: string) => void) | undefined`
|
|
312
|
-
|
|
313
|
-
**Description:** Callback function invoked when non-fatal warnings occur during pagination. Warnings don't stop pagination but indicate potential issues.
|
|
314
|
-
|
|
315
|
-
**Examples:**
|
|
316
|
-
|
|
317
|
-
```typescript
|
|
318
|
-
// Log warnings
|
|
319
|
-
pagination: {
|
|
320
|
-
maxPages: 10,
|
|
321
|
-
onWarning: (message) => {
|
|
322
|
-
console.warn(`[Pagination Warning] ${message}`);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// Track warnings for reporting
|
|
327
|
-
const warnings: string[] = [];
|
|
328
|
-
pagination: {
|
|
329
|
-
maxPages: 10,
|
|
330
|
-
onWarning: (message) => {
|
|
331
|
-
warnings.push(message);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
**Common Warnings:**
|
|
337
|
-
- Duplicate records detected (deduplication occurred)
|
|
338
|
-
- Unexpected response structure
|
|
339
|
-
- Performance degradation detected
|
|
340
|
-
|
|
341
|
-
## Response Metadata
|
|
342
|
-
|
|
343
|
-
### extensions.autoPagination
|
|
344
|
-
|
|
345
|
-
**Type:**
|
|
346
|
-
|
|
347
|
-
```typescript
|
|
348
|
-
interface AutoPaginationMetadata {
|
|
349
|
-
totalPages: number; // Total pages fetched
|
|
350
|
-
totalRecords: number; // Total records fetched
|
|
351
|
-
truncated: boolean; // True if stopped due to limit
|
|
352
|
-
timeElapsed?: number; // Time taken (ms)
|
|
353
|
-
}
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
**Location:** `result.extensions.autoPagination`
|
|
357
|
-
|
|
358
|
-
**Properties:**
|
|
359
|
-
|
|
360
|
-
#### totalPages
|
|
361
|
-
|
|
362
|
-
**Type:** `number`
|
|
363
|
-
|
|
364
|
-
**Description:** Total number of pages fetched during pagination.
|
|
365
|
-
|
|
366
|
-
**Example:**
|
|
367
|
-
```typescript
|
|
368
|
-
const result = await client.graphql({
|
|
369
|
-
query,
|
|
370
|
-
pagination: { maxPages: 10 }
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
console.log(result.extensions.autoPagination.totalPages);
|
|
374
|
-
// Output: 8 (if only 8 pages existed)
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
#### totalRecords
|
|
378
|
-
|
|
379
|
-
**Type:** `number`
|
|
380
|
-
|
|
381
|
-
**Description:** Total number of records fetched across all pages.
|
|
382
|
-
|
|
383
|
-
**Example:**
|
|
384
|
-
```typescript
|
|
385
|
-
const result = await client.graphql({
|
|
386
|
-
query,
|
|
387
|
-
pagination: { maxRecords: 1000 }
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
console.log(result.extensions.autoPagination.totalRecords);
|
|
391
|
-
// Output: 873 (actual records fetched)
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
#### truncated
|
|
395
|
-
|
|
396
|
-
**Type:** `boolean`
|
|
397
|
-
|
|
398
|
-
**Description:** `true` if pagination stopped due to a limit (maxPages, maxRecords, timeoutMs). `false` if all available data was fetched.
|
|
399
|
-
|
|
400
|
-
**Note:** The SDK does NOT provide a `truncationReason` property. To determine which limit was hit, check metadata values:
|
|
401
|
-
- If `totalPages === maxPages` → maxPages limit
|
|
402
|
-
- If `totalRecords >= maxRecords` → maxRecords limit
|
|
403
|
-
- If `timeElapsed >= timeoutMs` → timeout limit
|
|
404
|
-
|
|
405
|
-
**Examples:**
|
|
406
|
-
|
|
407
|
-
```typescript
|
|
408
|
-
// Basic truncation check
|
|
409
|
-
const result = await client.graphql({
|
|
410
|
-
query,
|
|
411
|
-
pagination: { maxPages: 10, maxRecords: 1000 }
|
|
412
|
-
});
|
|
413
|
-
|
|
414
|
-
if (result.extensions.autoPagination.truncated) {
|
|
415
|
-
console.log('⚠️ Hit a limit - more data may exist');
|
|
416
|
-
} else {
|
|
417
|
-
console.log('✅ Fetched all available data');
|
|
418
|
-
}
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
```typescript
|
|
422
|
-
// Determine which limit was hit
|
|
423
|
-
const result = await client.graphql({
|
|
424
|
-
query,
|
|
425
|
-
pagination: {
|
|
426
|
-
maxPages: 10,
|
|
427
|
-
maxRecords: 1000,
|
|
428
|
-
timeoutMs: 30000
|
|
429
|
-
}
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
const metadata = result.extensions.autoPagination;
|
|
433
|
-
|
|
434
|
-
if (metadata.truncated) {
|
|
435
|
-
// Check which limit caused truncation
|
|
436
|
-
if (metadata.totalPages === 10) {
|
|
437
|
-
console.log('⚠️ Stopped: Reached maxPages limit');
|
|
438
|
-
} else if (metadata.totalRecords >= 1000) {
|
|
439
|
-
console.log('⚠️ Stopped: Reached maxRecords limit');
|
|
440
|
-
} else if (metadata.timeElapsed && metadata.timeElapsed >= 30000) {
|
|
441
|
-
console.log('⚠️ Stopped: Timeout elapsed');
|
|
442
|
-
}
|
|
443
|
-
} else {
|
|
444
|
-
console.log('✅ Fetched all available data');
|
|
445
|
-
}
|
|
446
|
-
```
|
|
447
|
-
|
|
448
|
-
#### timeElapsed
|
|
449
|
-
|
|
450
|
-
**Type:** `number | undefined`
|
|
451
|
-
|
|
452
|
-
**Description:** Time taken (in milliseconds) for the entire pagination operation.
|
|
453
|
-
|
|
454
|
-
**Example:**
|
|
455
|
-
```typescript
|
|
456
|
-
const result = await client.graphql({
|
|
457
|
-
query,
|
|
458
|
-
pagination: { maxPages: 100 }
|
|
459
|
-
});
|
|
460
|
-
|
|
461
|
-
const seconds = result.extensions.autoPagination.timeElapsed! / 1000;
|
|
462
|
-
console.log(`Completed in ${seconds}s`);
|
|
463
|
-
```
|
|
464
|
-
|
|
465
|
-
## GraphQL Query Requirements
|
|
466
|
-
|
|
467
|
-
### Required Structure
|
|
468
|
-
|
|
469
|
-
For auto-pagination to work, your query must:
|
|
470
|
-
|
|
471
|
-
1. **Have pagination variables**
|
|
472
|
-
|
|
473
|
-
```typescript
|
|
474
|
-
// ✅ Required variables
|
|
475
|
-
query GetProducts($first: Int!, $after: String) { ... }
|
|
476
|
-
|
|
477
|
-
// OR (backward pagination)
|
|
478
|
-
query GetProducts($last: Int!, $before: String) { ... }
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
2. **Use variables in connection arguments**
|
|
482
|
-
|
|
483
|
-
```typescript
|
|
484
|
-
// ✅ Correct
|
|
485
|
-
products(first: $first, after: $after) { ... }
|
|
486
|
-
|
|
487
|
-
// ❌ Wrong - hardcoded values
|
|
488
|
-
products(first: 100) { ... }
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
3. **Include connection structure**
|
|
492
|
-
|
|
493
|
-
```typescript
|
|
494
|
-
// ✅ Required structure
|
|
495
|
-
products(first: $first, after: $after) {
|
|
496
|
-
edges {
|
|
497
|
-
node { id /* other fields */ }
|
|
498
|
-
cursor
|
|
499
|
-
}
|
|
500
|
-
pageInfo {
|
|
501
|
-
hasNextPage
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
```
|
|
505
|
-
|
|
506
|
-
### Relay Specification Compliance
|
|
507
|
-
|
|
508
|
-
The SDK expects **Relay-style cursor pagination**:
|
|
509
|
-
|
|
510
|
-
```graphql
|
|
511
|
-
type ProductConnection {
|
|
512
|
-
edges: [ProductEdge!]!
|
|
513
|
-
pageInfo: PageInfo!
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
type ProductEdge {
|
|
517
|
-
node: Product!
|
|
518
|
-
cursor: String!
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
type PageInfo {
|
|
522
|
-
hasNextPage: Boolean!
|
|
523
|
-
endCursor: String
|
|
524
|
-
}
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
**Required fields:**
|
|
528
|
-
- `edges`: Array of edge objects
|
|
529
|
-
- `edges[].node`: The actual data object
|
|
530
|
-
- `edges[].cursor`: Pagination cursor
|
|
531
|
-
- `pageInfo.hasNextPage`: Boolean indicating more pages exist
|
|
532
|
-
|
|
533
|
-
**Optional but recommended:**
|
|
534
|
-
- `pageInfo.endCursor`: Cursor of last edge
|
|
535
|
-
- `id` field in node for deduplication
|
|
536
|
-
|
|
537
|
-
## Auto-Detection Algorithm
|
|
538
|
-
|
|
539
|
-
### How It Works
|
|
540
|
-
|
|
541
|
-
When `connectionPath` is **not specified**, the SDK:
|
|
542
|
-
|
|
543
|
-
1. Checks if query has pagination variables (`$first`, `$after`, etc.)
|
|
544
|
-
2. Receives response from first query execution
|
|
545
|
-
3. Recursively searches response object for connection structure
|
|
546
|
-
4. Looks for objects with properties:
|
|
547
|
-
- `edges` (array)
|
|
548
|
-
- `pageInfo` (object)
|
|
549
|
-
- `pageInfo.hasNextPage` (boolean)
|
|
550
|
-
5. Uses **first match found**
|
|
551
|
-
|
|
552
|
-
### Search Order
|
|
553
|
-
|
|
554
|
-
**Depth-first traversal:**
|
|
555
|
-
|
|
556
|
-
```typescript
|
|
557
|
-
const response = {
|
|
558
|
-
products: { // ← Checked first
|
|
559
|
-
edges: [...],
|
|
560
|
-
pageInfo: {...}
|
|
561
|
-
},
|
|
562
|
-
locations: { // ← Checked second
|
|
563
|
-
edges: [...],
|
|
564
|
-
pageInfo: {...}
|
|
565
|
-
},
|
|
566
|
-
order: {
|
|
567
|
-
id: '123',
|
|
568
|
-
items: { // ← Checked third (nested)
|
|
569
|
-
edges: [...],
|
|
570
|
-
pageInfo: {...}
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
};
|
|
574
|
-
```
|
|
575
|
-
|
|
576
|
-
### When Auto-Detection Fails
|
|
577
|
-
|
|
578
|
-
Auto-detection fails when:
|
|
579
|
-
- No pagination variables in query
|
|
580
|
-
- Response doesn't match Relay structure
|
|
581
|
-
- Multiple connections exist (picks first, may not be desired)
|
|
582
|
-
- Non-standard field names (`items` instead of `edges`)
|
|
583
|
-
|
|
584
|
-
## Parallel Query Pattern (Promise.all)
|
|
585
|
-
|
|
586
|
-
### Basic Pattern
|
|
587
|
-
|
|
588
|
-
```typescript
|
|
589
|
-
const [result1, result2, result3] = await Promise.all([
|
|
590
|
-
client.graphql({
|
|
591
|
-
query: query1,
|
|
592
|
-
pagination: { maxPages: 10 }
|
|
593
|
-
}),
|
|
594
|
-
client.graphql({
|
|
595
|
-
query: query2,
|
|
596
|
-
pagination: { maxPages: 5 }
|
|
597
|
-
}),
|
|
598
|
-
client.graphql({
|
|
599
|
-
query: query3,
|
|
600
|
-
pagination: { maxPages: 8 }
|
|
601
|
-
})
|
|
602
|
-
]);
|
|
603
|
-
```
|
|
604
|
-
|
|
605
|
-
### Error Handling Pattern
|
|
606
|
-
|
|
607
|
-
```typescript
|
|
608
|
-
const results = await Promise.allSettled([
|
|
609
|
-
client.graphql({ query: query1, pagination: { maxPages: 10 } }),
|
|
610
|
-
client.graphql({ query: query2, pagination: { maxPages: 5 } }),
|
|
611
|
-
client.graphql({ query: query3, pagination: { maxPages: 8 } })
|
|
612
|
-
]);
|
|
613
|
-
|
|
614
|
-
results.forEach((result, index) => {
|
|
615
|
-
if (result.status === 'fulfilled') {
|
|
616
|
-
console.log(`Query ${index + 1}: ${result.value.extensions.autoPagination.totalRecords} records`);
|
|
617
|
-
} else {
|
|
618
|
-
console.error(`Query ${index + 1} failed:`, result.reason);
|
|
619
|
-
}
|
|
620
|
-
});
|
|
621
|
-
```
|
|
622
|
-
|
|
623
|
-
## Supported Pagination Directions
|
|
624
|
-
|
|
625
|
-
### Forward Pagination (Recommended)
|
|
626
|
-
|
|
627
|
-
```typescript
|
|
628
|
-
query GetProducts($first: Int!, $after: String) {
|
|
629
|
-
products(first: $first, after: $after) {
|
|
630
|
-
edges { node { id } cursor }
|
|
631
|
-
pageInfo {
|
|
632
|
-
hasNextPage
|
|
633
|
-
endCursor
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
```
|
|
638
|
-
|
|
639
|
-
**Variables:**
|
|
640
|
-
- `first`: Number of records per page
|
|
641
|
-
- `after`: Cursor of last record from previous page
|
|
642
|
-
|
|
643
|
-
### Backward Pagination
|
|
644
|
-
|
|
645
|
-
```typescript
|
|
646
|
-
query GetProducts($last: Int!, $before: String) {
|
|
647
|
-
products(last: $last, before: $before) {
|
|
648
|
-
edges { node { id } cursor }
|
|
649
|
-
pageInfo {
|
|
650
|
-
hasPreviousPage
|
|
651
|
-
startCursor
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
```
|
|
656
|
-
|
|
657
|
-
**Variables:**
|
|
658
|
-
- `last`: Number of records per page
|
|
659
|
-
- `before`: Cursor of first record from next page
|
|
660
|
-
|
|
661
|
-
**Note:** SDK primarily focuses on forward pagination. Backward pagination is supported but less common.
|
|
662
|
-
|
|
663
|
-
## Deduplication Behavior
|
|
664
|
-
|
|
665
|
-
### Automatic Deduplication
|
|
666
|
-
|
|
667
|
-
The SDK automatically deduplicates records across pages using the `id` field:
|
|
668
|
-
|
|
669
|
-
```typescript
|
|
670
|
-
// If pages have overlapping records (e.g., due to concurrent writes):
|
|
671
|
-
// Page 1: [{id: '1'}, {id: '2'}, {id: '3'}]
|
|
672
|
-
// Page 2: [{id: '3'}, {id: '4'}, {id: '5'}] // id:'3' duplicated
|
|
673
|
-
|
|
674
|
-
// SDK result: [{id: '1'}, {id: '2'}, {id: '3'}, {id: '4'}, {id: '5'}]
|
|
675
|
-
// Duplicate removed automatically
|
|
676
|
-
```
|
|
677
|
-
|
|
678
|
-
### Requirements
|
|
679
|
-
|
|
680
|
-
For deduplication to work:
|
|
681
|
-
- ✅ Each record must have an `id` field
|
|
682
|
-
- ✅ `id` must be unique across records
|
|
683
|
-
|
|
684
|
-
**If `id` is missing:**
|
|
685
|
-
- ⚠️ No deduplication occurs
|
|
686
|
-
- Duplicate records may appear in final result
|
|
687
|
-
|
|
688
|
-
## Limitations and Constraints
|
|
689
|
-
|
|
690
|
-
### Current Limitations
|
|
691
|
-
|
|
692
|
-
1. **Single connection per query**
|
|
693
|
-
- Can only paginate ONE connection per `client.graphql()` call
|
|
694
|
-
- Use parallel queries for multiple connections
|
|
695
|
-
|
|
696
|
-
2. **No array syntax for connectionPath**
|
|
697
|
-
- `connectionPath: ['products', 'locations']` is NOT supported
|
|
698
|
-
- Must use separate queries
|
|
699
|
-
|
|
700
|
-
3. **Relay spec required**
|
|
701
|
-
- Non-standard pagination structures not supported
|
|
702
|
-
- Must have `edges`, `pageInfo`, `hasNextPage`
|
|
703
|
-
|
|
704
|
-
4. **Forward pagination focus**
|
|
705
|
-
- Backward pagination (`last`, `before`) supported but less tested
|
|
706
|
-
- Bidirectional pagination not supported
|
|
707
|
-
|
|
708
|
-
### Performance Constraints
|
|
709
|
-
|
|
710
|
-
**Recommended limits:**
|
|
711
|
-
- `maxPages`: ≤ 100 for most use cases
|
|
712
|
-
- `maxRecords`: ≤ 10,000 for simple entities
|
|
713
|
-
- `timeoutMs`: ≤ 300,000 (5 minutes)
|
|
714
|
-
- Concurrent parallel queries: ≤ 5
|
|
715
|
-
|
|
716
|
-
**Resource usage:**
|
|
717
|
-
- Memory: ~1MB per 1,000 simple records
|
|
718
|
-
- Network: Proportional to page count × page size
|
|
719
|
-
- API rate limits: Respect Fluent Commerce limits
|
|
720
|
-
|
|
721
|
-
## TypeScript Types
|
|
722
|
-
|
|
723
|
-
### Complete Type Definitions
|
|
724
|
-
|
|
725
|
-
```typescript
|
|
726
|
-
import { GraphQLClient } from '@fluentcommerce/fc-connect-sdk';
|
|
727
|
-
|
|
728
|
-
interface PaginationConfig {
|
|
729
|
-
enabled?: boolean;
|
|
730
|
-
connectionPath?: string;
|
|
731
|
-
maxPages?: number;
|
|
732
|
-
maxRecords?: number;
|
|
733
|
-
timeoutMs?: number;
|
|
734
|
-
delayMs?: number;
|
|
735
|
-
direction?: 'forward' | 'backward';
|
|
736
|
-
abortSignal?: AbortSignal;
|
|
737
|
-
onProgress?: (page: number, totalRecords: number) => void;
|
|
738
|
-
onWarning?: (message: string) => void;
|
|
739
|
-
}
|
|
740
|
-
|
|
741
|
-
interface GraphQLOptions {
|
|
742
|
-
query: string;
|
|
743
|
-
variables?: Record<string, any>;
|
|
744
|
-
pagination?: PaginationConfig;
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
interface AutoPaginationMetadata {
|
|
748
|
-
totalPages: number;
|
|
749
|
-
totalRecords: number;
|
|
750
|
-
truncated: boolean;
|
|
751
|
-
timeElapsed?: number;
|
|
752
|
-
}
|
|
753
|
-
|
|
754
|
-
interface GraphQLResponse<T = any> {
|
|
755
|
-
data: T;
|
|
756
|
-
errors?: any[];
|
|
757
|
-
extensions: {
|
|
758
|
-
autoPagination: AutoPaginationMetadata;
|
|
759
|
-
};
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
// Usage
|
|
763
|
-
const result: GraphQLResponse<{ products: Connection<Product> }> =
|
|
764
|
-
await client.graphql({
|
|
765
|
-
query: productsQuery,
|
|
766
|
-
variables: { first: 100 },
|
|
767
|
-
pagination: {
|
|
768
|
-
connectionPath: 'products',
|
|
769
|
-
maxPages: 10,
|
|
770
|
-
delayMs: 500,
|
|
771
|
-
onWarning: (msg) => console.warn(msg)
|
|
772
|
-
}
|
|
773
|
-
});
|
|
774
|
-
```
|
|
775
|
-
|
|
776
|
-
## Quick Reference Summary
|
|
777
|
-
|
|
778
|
-
### Configuration Options
|
|
779
|
-
|
|
780
|
-
| Configuration | Type | Default | Description |
|
|
781
|
-
|---------------|------|---------|-------------|
|
|
782
|
-
| `enabled` | `boolean` | Auto-detect | Enable/disable auto-pagination |
|
|
783
|
-
| `connectionPath` | `string` | Auto-detect | Path to connection to paginate |
|
|
784
|
-
| `maxPages` | `number` | `Infinity` | Max pages to fetch (OR logic) |
|
|
785
|
-
| `maxRecords` | `number` | `Infinity` | Max total records (OR logic) |
|
|
786
|
-
| `timeoutMs` | `number` | `Infinity` | Max time in ms (OR logic) |
|
|
787
|
-
| `delayMs` | `number` | `0` | Delay between pages (ms) |
|
|
788
|
-
| `direction` | `'forward'|'backward'` | Auto-detect | Pagination direction |
|
|
789
|
-
| `abortSignal` | `AbortSignal` | `undefined` | Cancel pagination |
|
|
790
|
-
| `onProgress` | `function` | `undefined` | Callback after each page |
|
|
791
|
-
| `onWarning` | `function` | `undefined` | Callback for warnings |
|
|
792
|
-
|
|
793
|
-
### Response Metadata
|
|
794
|
-
|
|
795
|
-
| Metadata | Type | Description |
|
|
796
|
-
|----------|------|-------------|
|
|
797
|
-
| `totalPages` | `number` | Pages fetched |
|
|
798
|
-
| `totalRecords` | `number` | Total records fetched |
|
|
799
|
-
| `truncated` | `boolean` | Stopped due to limit |
|
|
800
|
-
| `timeElapsed` | `number` | Time taken (ms) |
|
|
801
|
-
|
|
802
|
-
**Note:** There is NO `truncationReason` property. To determine which limit was hit:
|
|
803
|
-
- Check if `totalPages === maxPages` → maxPages limit
|
|
804
|
-
- Check if `totalRecords >= maxRecords` → maxRecords limit
|
|
805
|
-
- Check if `timeElapsed >= timeoutMs` → timeout limit
|
|
806
|
-
|
|
807
|
-
## Related Documentation
|
|
808
|
-
|
|
809
|
-
- [Module 1: Foundations](.././modules/multiple-connections-01-foundations.md) - Core concepts
|
|
810
|
-
- [Module 2: Quick Start](.././modules/multiple-connections-02-quick-start.md) - Working examples
|
|
811
|
-
- [Module 3: Targeting Connections](./multiple-connections-03-targeting-connections.md) - connectionPath usage
|
|
812
|
-
- [Module 4: Parallel Queries](./multiple-connections-04-parallel-queries.md) - Promise.all patterns
|
|
813
|
-
- [Module 5: Best Practices](./multiple-connections-05-best-practices.md) - Production patterns
|
|
814
|
-
- [Auto-Pagination Guide](../../../02-CORE-GUIDES/auto-pagination/) - Core pagination documentation
|
|
815
|
-
- [Main Guide](../multiple-connections-readme.md) - Back to multiple connections overview
|
|
816
|
-
|
|
817
|
-
## Key Takeaways
|
|
818
|
-
|
|
819
|
-
- 🎯 **connectionPath** - String path to target connection
|
|
820
|
-
- 🎯 **OR-logic limits** - First limit hit stops pagination
|
|
821
|
-
- 🎯 **Auto-detection** - Works but explicit is better
|
|
822
|
-
- 🎯 **Relay structure** - Required for pagination
|
|
823
|
-
- 🎯 **Metadata** - Check `extensions.autoPagination`
|
|
824
|
-
- 🎯 **Deduplication** - Automatic by `id` field
|
|
1
|
+
# Module 6: API Reference
|
|
2
|
+
|
|
3
|
+
**Level:** Reference
|
|
4
|
+
**Estimated Time:** As needed
|
|
5
|
+
|
|
6
|
+
**SDK Version:** Use latest - `npm install @fluentcommerce/fc-connect-sdk@latest`
|
|
7
|
+
|
|
8
|
+
> **📝 Note:** This API reference is for **GraphQL pagination** with multiple paginated fields in a single query. It is **NOT** about multi-tenant connections or credential management.
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
This module provides complete API documentation, configuration options, and reference material for multi-connection pagination.
|
|
13
|
+
|
|
14
|
+
## connectionPath Configuration
|
|
15
|
+
|
|
16
|
+
### Type Definition
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
interface PaginationConfig {
|
|
20
|
+
enabled?: boolean; // Enable/disable auto-pagination
|
|
21
|
+
connectionPath?: string; // Path to target connection
|
|
22
|
+
maxPages?: number; // Maximum pages to fetch
|
|
23
|
+
maxRecords?: number; // Maximum total records
|
|
24
|
+
timeoutMs?: number; // Maximum time in milliseconds
|
|
25
|
+
delayMs?: number; // Delay between pages
|
|
26
|
+
direction?: 'forward' | 'backward'; // Pagination direction
|
|
27
|
+
abortSignal?: AbortSignal; // Cancel pagination
|
|
28
|
+
onProgress?: (page: number, totalRecords: number) => void;
|
|
29
|
+
onWarning?: (message: string) => void; // Warning callback
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### enabled Property
|
|
34
|
+
|
|
35
|
+
**Type:** `boolean | undefined`
|
|
36
|
+
|
|
37
|
+
**Default:** Auto-detected based on query variables and response structure
|
|
38
|
+
|
|
39
|
+
**Description:** Explicitly enable or disable auto-pagination. When not specified, the SDK auto-detects whether pagination should be enabled based on the presence of pagination variables (`$first`, `$after`, etc.) in the query.
|
|
40
|
+
|
|
41
|
+
**Examples:**
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
// Explicitly enable
|
|
45
|
+
pagination: { enabled: true, maxPages: 10 }
|
|
46
|
+
|
|
47
|
+
// Explicitly disable
|
|
48
|
+
pagination: { enabled: false }
|
|
49
|
+
|
|
50
|
+
// Auto-detect (default behavior)
|
|
51
|
+
pagination: { maxPages: 10 } // enabled is auto-detected
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Use Cases:**
|
|
55
|
+
- Force pagination when auto-detection fails
|
|
56
|
+
- Disable pagination for specific queries
|
|
57
|
+
- Override default behavior
|
|
58
|
+
|
|
59
|
+
### connectionPath Property
|
|
60
|
+
|
|
61
|
+
**Type:** `string | undefined`
|
|
62
|
+
|
|
63
|
+
**Description:** Specifies which connection to paginate when query has multiple connections.
|
|
64
|
+
|
|
65
|
+
**Syntax:**
|
|
66
|
+
- **Root-level:** Simple field name (e.g., `'products'`)
|
|
67
|
+
- **Nested:** Dot notation (e.g., `'order.items'`)
|
|
68
|
+
- **Deep nested:** Multi-level (e.g., `'order.fulfilments.items'`)
|
|
69
|
+
|
|
70
|
+
**Default:** If not specified, SDK auto-detects first connection found.
|
|
71
|
+
|
|
72
|
+
**Examples:**
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
// Root-level connection
|
|
76
|
+
pagination: { connectionPath: 'products' }
|
|
77
|
+
|
|
78
|
+
// Nested connection
|
|
79
|
+
pagination: { connectionPath: 'order.items' }
|
|
80
|
+
|
|
81
|
+
// Deep nested
|
|
82
|
+
pagination: { connectionPath: 'order.fulfilments.items' }
|
|
83
|
+
|
|
84
|
+
// Using alias
|
|
85
|
+
query { myProducts: products { ... } }
|
|
86
|
+
pagination: { connectionPath: 'myProducts' }
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Constraints:**
|
|
90
|
+
- ✅ Must be a **string** (not array)
|
|
91
|
+
- ✅ Must match actual response structure
|
|
92
|
+
- ✅ Case-sensitive
|
|
93
|
+
- ✅ Must point to a connection (has `edges`, `pageInfo`)
|
|
94
|
+
|
|
95
|
+
### maxPages Property
|
|
96
|
+
|
|
97
|
+
**Type:** `number | undefined`
|
|
98
|
+
|
|
99
|
+
**Description:** Maximum number of pages to fetch before stopping.
|
|
100
|
+
|
|
101
|
+
**Default:** `Infinity` (no limit)
|
|
102
|
+
|
|
103
|
+
**Behavior:** Pagination stops when ANY of these conditions is met (OR logic):
|
|
104
|
+
- `maxPages` reached
|
|
105
|
+
- `maxRecords` reached
|
|
106
|
+
- `timeoutMs` elapsed
|
|
107
|
+
- `pageInfo.hasNextPage` is false (no more data)
|
|
108
|
+
|
|
109
|
+
**Examples:**
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
// Fetch up to 10 pages
|
|
113
|
+
pagination: { maxPages: 10 }
|
|
114
|
+
|
|
115
|
+
// Fetch up to 5 pages OR 500 records (whichever first)
|
|
116
|
+
pagination: { maxPages: 5, maxRecords: 500 }
|
|
117
|
+
|
|
118
|
+
// No page limit (fetch all)
|
|
119
|
+
pagination: { maxRecords: 10000 } // maxPages defaults to Infinity
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### maxRecords Property
|
|
123
|
+
|
|
124
|
+
**Type:** `number | undefined`
|
|
125
|
+
|
|
126
|
+
**Description:** Maximum total records to fetch before stopping.
|
|
127
|
+
|
|
128
|
+
**Default:** `Infinity` (no limit)
|
|
129
|
+
|
|
130
|
+
**Behavior:** Cumulative count across all pages. Stops when total records >= maxRecords.
|
|
131
|
+
|
|
132
|
+
**Examples:**
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
// Fetch up to 1000 records
|
|
136
|
+
pagination: { maxRecords: 1000 }
|
|
137
|
+
|
|
138
|
+
// Fetch up to 1000 records OR 10 pages (whichever first)
|
|
139
|
+
pagination: { maxPages: 10, maxRecords: 1000 }
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### timeoutMs Property
|
|
143
|
+
|
|
144
|
+
**Type:** `number | undefined`
|
|
145
|
+
|
|
146
|
+
**Description:** Maximum time (in milliseconds) to spend fetching pages.
|
|
147
|
+
|
|
148
|
+
**Default:** `Infinity` (no timeout)
|
|
149
|
+
|
|
150
|
+
**Behavior:** Stops pagination when elapsed time exceeds timeout.
|
|
151
|
+
|
|
152
|
+
**Examples:**
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
// Stop after 60 seconds
|
|
156
|
+
pagination: { timeoutMs: 60000 }
|
|
157
|
+
|
|
158
|
+
// Stop after 30 seconds OR 1000 records (whichever first)
|
|
159
|
+
pagination: { maxRecords: 1000, timeoutMs: 30000 }
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### onProgress Callback
|
|
163
|
+
|
|
164
|
+
**Type:** `((page: number, totalRecords: number) => void) | undefined`
|
|
165
|
+
|
|
166
|
+
**Description:** Callback function invoked after each page is fetched.
|
|
167
|
+
|
|
168
|
+
**Parameters:**
|
|
169
|
+
- `page`: Current page number (1-indexed)
|
|
170
|
+
- `totalRecords`: Cumulative total records fetched so far
|
|
171
|
+
|
|
172
|
+
**Use Cases:**
|
|
173
|
+
- Progress logging
|
|
174
|
+
- UI progress bars
|
|
175
|
+
- Performance monitoring
|
|
176
|
+
- Early termination logic
|
|
177
|
+
|
|
178
|
+
**Examples:**
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
// Simple logging
|
|
182
|
+
pagination: {
|
|
183
|
+
maxPages: 10,
|
|
184
|
+
onProgress: (page, records) => {
|
|
185
|
+
console.log(`Page ${page}: ${records} records`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Progress bar
|
|
190
|
+
let progressBar = new ProgressBar();
|
|
191
|
+
pagination: {
|
|
192
|
+
maxPages: 100,
|
|
193
|
+
onProgress: (page, records) => {
|
|
194
|
+
progressBar.update(page / 100);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Conditional logging
|
|
199
|
+
pagination: {
|
|
200
|
+
maxPages: 50,
|
|
201
|
+
onProgress: (page, records) => {
|
|
202
|
+
if (page % 5 === 0) { // Log every 5 pages
|
|
203
|
+
console.log(`[Checkpoint] Page ${page}: ${records} records`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### delayMs Property
|
|
210
|
+
|
|
211
|
+
**Type:** `number | undefined`
|
|
212
|
+
|
|
213
|
+
**Default:** `0` (no delay)
|
|
214
|
+
|
|
215
|
+
**Description:** Delay in milliseconds between page fetches. Useful for rate limiting to avoid overwhelming the API server.
|
|
216
|
+
|
|
217
|
+
**Examples:**
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
// Add 500ms delay between pages
|
|
221
|
+
pagination: {
|
|
222
|
+
maxPages: 20,
|
|
223
|
+
delayMs: 500
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Rate limiting for high-volume extraction
|
|
227
|
+
pagination: {
|
|
228
|
+
maxPages: 100,
|
|
229
|
+
delayMs: 1000 // 1 second delay
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Use Cases:**
|
|
234
|
+
- API rate limiting
|
|
235
|
+
- Server load management
|
|
236
|
+
- Throttling for large extractions
|
|
237
|
+
|
|
238
|
+
### direction Property
|
|
239
|
+
|
|
240
|
+
**Type:** `'forward' | 'backward' | undefined`
|
|
241
|
+
|
|
242
|
+
**Default:** Auto-detected from query variables
|
|
243
|
+
|
|
244
|
+
**Description:** Pagination direction. Forward pagination uses `first`/`after`, backward pagination uses `last`/`before`.
|
|
245
|
+
|
|
246
|
+
**Auto-Detection:**
|
|
247
|
+
- Queries with `$first` and `$after` → `'forward'`
|
|
248
|
+
- Queries with `$last` and `$before` → `'backward'`
|
|
249
|
+
|
|
250
|
+
**Examples:**
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
// Forward pagination (explicit)
|
|
254
|
+
pagination: {
|
|
255
|
+
direction: 'forward',
|
|
256
|
+
maxPages: 10
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Backward pagination (explicit)
|
|
260
|
+
pagination: {
|
|
261
|
+
direction: 'backward',
|
|
262
|
+
maxPages: 10
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Auto-detect from query variables (recommended)
|
|
266
|
+
pagination: { maxPages: 10 } // direction is auto-detected
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
**Note:** Forward pagination is recommended and most commonly used.
|
|
270
|
+
|
|
271
|
+
### abortSignal Property
|
|
272
|
+
|
|
273
|
+
**Type:** `AbortSignal | undefined`
|
|
274
|
+
|
|
275
|
+
**Default:** `undefined`
|
|
276
|
+
|
|
277
|
+
**Description:** AbortSignal for cancelling pagination mid-operation. Allows external cancellation of long-running pagination operations.
|
|
278
|
+
|
|
279
|
+
**Examples:**
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
// Basic cancellation
|
|
283
|
+
const controller = new AbortController();
|
|
284
|
+
const promise = client.graphql({
|
|
285
|
+
query,
|
|
286
|
+
pagination: {
|
|
287
|
+
maxPages: 100,
|
|
288
|
+
abortSignal: controller.signal
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
// Cancel after 10 seconds
|
|
293
|
+
setTimeout(() => controller.abort(), 10000);
|
|
294
|
+
|
|
295
|
+
try {
|
|
296
|
+
const result = await promise;
|
|
297
|
+
} catch (error) {
|
|
298
|
+
if (error.name === 'AbortError') {
|
|
299
|
+
console.log('Pagination cancelled');
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
**Use Cases:**
|
|
305
|
+
- User-initiated cancellation (e.g., cancel button)
|
|
306
|
+
- Timeout enforcement
|
|
307
|
+
- Resource cleanup on component unmount
|
|
308
|
+
|
|
309
|
+
### onWarning Callback
|
|
310
|
+
|
|
311
|
+
**Type:** `((message: string) => void) | undefined`
|
|
312
|
+
|
|
313
|
+
**Description:** Callback function invoked when non-fatal warnings occur during pagination. Warnings don't stop pagination but indicate potential issues.
|
|
314
|
+
|
|
315
|
+
**Examples:**
|
|
316
|
+
|
|
317
|
+
```typescript
|
|
318
|
+
// Log warnings
|
|
319
|
+
pagination: {
|
|
320
|
+
maxPages: 10,
|
|
321
|
+
onWarning: (message) => {
|
|
322
|
+
console.warn(`[Pagination Warning] ${message}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Track warnings for reporting
|
|
327
|
+
const warnings: string[] = [];
|
|
328
|
+
pagination: {
|
|
329
|
+
maxPages: 10,
|
|
330
|
+
onWarning: (message) => {
|
|
331
|
+
warnings.push(message);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
**Common Warnings:**
|
|
337
|
+
- Duplicate records detected (deduplication occurred)
|
|
338
|
+
- Unexpected response structure
|
|
339
|
+
- Performance degradation detected
|
|
340
|
+
|
|
341
|
+
## Response Metadata
|
|
342
|
+
|
|
343
|
+
### extensions.autoPagination
|
|
344
|
+
|
|
345
|
+
**Type:**
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
interface AutoPaginationMetadata {
|
|
349
|
+
totalPages: number; // Total pages fetched
|
|
350
|
+
totalRecords: number; // Total records fetched
|
|
351
|
+
truncated: boolean; // True if stopped due to limit
|
|
352
|
+
timeElapsed?: number; // Time taken (ms)
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**Location:** `result.extensions.autoPagination`
|
|
357
|
+
|
|
358
|
+
**Properties:**
|
|
359
|
+
|
|
360
|
+
#### totalPages
|
|
361
|
+
|
|
362
|
+
**Type:** `number`
|
|
363
|
+
|
|
364
|
+
**Description:** Total number of pages fetched during pagination.
|
|
365
|
+
|
|
366
|
+
**Example:**
|
|
367
|
+
```typescript
|
|
368
|
+
const result = await client.graphql({
|
|
369
|
+
query,
|
|
370
|
+
pagination: { maxPages: 10 }
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
console.log(result.extensions.autoPagination.totalPages);
|
|
374
|
+
// Output: 8 (if only 8 pages existed)
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
#### totalRecords
|
|
378
|
+
|
|
379
|
+
**Type:** `number`
|
|
380
|
+
|
|
381
|
+
**Description:** Total number of records fetched across all pages.
|
|
382
|
+
|
|
383
|
+
**Example:**
|
|
384
|
+
```typescript
|
|
385
|
+
const result = await client.graphql({
|
|
386
|
+
query,
|
|
387
|
+
pagination: { maxRecords: 1000 }
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
console.log(result.extensions.autoPagination.totalRecords);
|
|
391
|
+
// Output: 873 (actual records fetched)
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
#### truncated
|
|
395
|
+
|
|
396
|
+
**Type:** `boolean`
|
|
397
|
+
|
|
398
|
+
**Description:** `true` if pagination stopped due to a limit (maxPages, maxRecords, timeoutMs). `false` if all available data was fetched.
|
|
399
|
+
|
|
400
|
+
**Note:** The SDK does NOT provide a `truncationReason` property. To determine which limit was hit, check metadata values:
|
|
401
|
+
- If `totalPages === maxPages` → maxPages limit
|
|
402
|
+
- If `totalRecords >= maxRecords` → maxRecords limit
|
|
403
|
+
- If `timeElapsed >= timeoutMs` → timeout limit
|
|
404
|
+
|
|
405
|
+
**Examples:**
|
|
406
|
+
|
|
407
|
+
```typescript
|
|
408
|
+
// Basic truncation check
|
|
409
|
+
const result = await client.graphql({
|
|
410
|
+
query,
|
|
411
|
+
pagination: { maxPages: 10, maxRecords: 1000 }
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
if (result.extensions.autoPagination.truncated) {
|
|
415
|
+
console.log('⚠️ Hit a limit - more data may exist');
|
|
416
|
+
} else {
|
|
417
|
+
console.log('✅ Fetched all available data');
|
|
418
|
+
}
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
```typescript
|
|
422
|
+
// Determine which limit was hit
|
|
423
|
+
const result = await client.graphql({
|
|
424
|
+
query,
|
|
425
|
+
pagination: {
|
|
426
|
+
maxPages: 10,
|
|
427
|
+
maxRecords: 1000,
|
|
428
|
+
timeoutMs: 30000
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
const metadata = result.extensions.autoPagination;
|
|
433
|
+
|
|
434
|
+
if (metadata.truncated) {
|
|
435
|
+
// Check which limit caused truncation
|
|
436
|
+
if (metadata.totalPages === 10) {
|
|
437
|
+
console.log('⚠️ Stopped: Reached maxPages limit');
|
|
438
|
+
} else if (metadata.totalRecords >= 1000) {
|
|
439
|
+
console.log('⚠️ Stopped: Reached maxRecords limit');
|
|
440
|
+
} else if (metadata.timeElapsed && metadata.timeElapsed >= 30000) {
|
|
441
|
+
console.log('⚠️ Stopped: Timeout elapsed');
|
|
442
|
+
}
|
|
443
|
+
} else {
|
|
444
|
+
console.log('✅ Fetched all available data');
|
|
445
|
+
}
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
#### timeElapsed
|
|
449
|
+
|
|
450
|
+
**Type:** `number | undefined`
|
|
451
|
+
|
|
452
|
+
**Description:** Time taken (in milliseconds) for the entire pagination operation.
|
|
453
|
+
|
|
454
|
+
**Example:**
|
|
455
|
+
```typescript
|
|
456
|
+
const result = await client.graphql({
|
|
457
|
+
query,
|
|
458
|
+
pagination: { maxPages: 100 }
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
const seconds = result.extensions.autoPagination.timeElapsed! / 1000;
|
|
462
|
+
console.log(`Completed in ${seconds}s`);
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
## GraphQL Query Requirements
|
|
466
|
+
|
|
467
|
+
### Required Structure
|
|
468
|
+
|
|
469
|
+
For auto-pagination to work, your query must:
|
|
470
|
+
|
|
471
|
+
1. **Have pagination variables**
|
|
472
|
+
|
|
473
|
+
```typescript
|
|
474
|
+
// ✅ Required variables
|
|
475
|
+
query GetProducts($first: Int!, $after: String) { ... }
|
|
476
|
+
|
|
477
|
+
// OR (backward pagination)
|
|
478
|
+
query GetProducts($last: Int!, $before: String) { ... }
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
2. **Use variables in connection arguments**
|
|
482
|
+
|
|
483
|
+
```typescript
|
|
484
|
+
// ✅ Correct
|
|
485
|
+
products(first: $first, after: $after) { ... }
|
|
486
|
+
|
|
487
|
+
// ❌ Wrong - hardcoded values
|
|
488
|
+
products(first: 100) { ... }
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
3. **Include connection structure**
|
|
492
|
+
|
|
493
|
+
```typescript
|
|
494
|
+
// ✅ Required structure
|
|
495
|
+
products(first: $first, after: $after) {
|
|
496
|
+
edges {
|
|
497
|
+
node { id /* other fields */ }
|
|
498
|
+
cursor
|
|
499
|
+
}
|
|
500
|
+
pageInfo {
|
|
501
|
+
hasNextPage
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
### Relay Specification Compliance
|
|
507
|
+
|
|
508
|
+
The SDK expects **Relay-style cursor pagination**:
|
|
509
|
+
|
|
510
|
+
```graphql
|
|
511
|
+
type ProductConnection {
|
|
512
|
+
edges: [ProductEdge!]!
|
|
513
|
+
pageInfo: PageInfo!
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
type ProductEdge {
|
|
517
|
+
node: Product!
|
|
518
|
+
cursor: String!
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
type PageInfo {
|
|
522
|
+
hasNextPage: Boolean!
|
|
523
|
+
endCursor: String
|
|
524
|
+
}
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
**Required fields:**
|
|
528
|
+
- `edges`: Array of edge objects
|
|
529
|
+
- `edges[].node`: The actual data object
|
|
530
|
+
- `edges[].cursor`: Pagination cursor
|
|
531
|
+
- `pageInfo.hasNextPage`: Boolean indicating more pages exist
|
|
532
|
+
|
|
533
|
+
**Optional but recommended:**
|
|
534
|
+
- `pageInfo.endCursor`: Cursor of last edge
|
|
535
|
+
- `id` field in node for deduplication
|
|
536
|
+
|
|
537
|
+
## Auto-Detection Algorithm
|
|
538
|
+
|
|
539
|
+
### How It Works
|
|
540
|
+
|
|
541
|
+
When `connectionPath` is **not specified**, the SDK:
|
|
542
|
+
|
|
543
|
+
1. Checks if query has pagination variables (`$first`, `$after`, etc.)
|
|
544
|
+
2. Receives response from first query execution
|
|
545
|
+
3. Recursively searches response object for connection structure
|
|
546
|
+
4. Looks for objects with properties:
|
|
547
|
+
- `edges` (array)
|
|
548
|
+
- `pageInfo` (object)
|
|
549
|
+
- `pageInfo.hasNextPage` (boolean)
|
|
550
|
+
5. Uses **first match found**
|
|
551
|
+
|
|
552
|
+
### Search Order
|
|
553
|
+
|
|
554
|
+
**Depth-first traversal:**
|
|
555
|
+
|
|
556
|
+
```typescript
|
|
557
|
+
const response = {
|
|
558
|
+
products: { // ← Checked first
|
|
559
|
+
edges: [...],
|
|
560
|
+
pageInfo: {...}
|
|
561
|
+
},
|
|
562
|
+
locations: { // ← Checked second
|
|
563
|
+
edges: [...],
|
|
564
|
+
pageInfo: {...}
|
|
565
|
+
},
|
|
566
|
+
order: {
|
|
567
|
+
id: '123',
|
|
568
|
+
items: { // ← Checked third (nested)
|
|
569
|
+
edges: [...],
|
|
570
|
+
pageInfo: {...}
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
};
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
### When Auto-Detection Fails
|
|
577
|
+
|
|
578
|
+
Auto-detection fails when:
|
|
579
|
+
- No pagination variables in query
|
|
580
|
+
- Response doesn't match Relay structure
|
|
581
|
+
- Multiple connections exist (picks first, may not be desired)
|
|
582
|
+
- Non-standard field names (`items` instead of `edges`)
|
|
583
|
+
|
|
584
|
+
## Parallel Query Pattern (Promise.all)
|
|
585
|
+
|
|
586
|
+
### Basic Pattern
|
|
587
|
+
|
|
588
|
+
```typescript
|
|
589
|
+
const [result1, result2, result3] = await Promise.all([
|
|
590
|
+
client.graphql({
|
|
591
|
+
query: query1,
|
|
592
|
+
pagination: { maxPages: 10 }
|
|
593
|
+
}),
|
|
594
|
+
client.graphql({
|
|
595
|
+
query: query2,
|
|
596
|
+
pagination: { maxPages: 5 }
|
|
597
|
+
}),
|
|
598
|
+
client.graphql({
|
|
599
|
+
query: query3,
|
|
600
|
+
pagination: { maxPages: 8 }
|
|
601
|
+
})
|
|
602
|
+
]);
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
### Error Handling Pattern
|
|
606
|
+
|
|
607
|
+
```typescript
|
|
608
|
+
const results = await Promise.allSettled([
|
|
609
|
+
client.graphql({ query: query1, pagination: { maxPages: 10 } }),
|
|
610
|
+
client.graphql({ query: query2, pagination: { maxPages: 5 } }),
|
|
611
|
+
client.graphql({ query: query3, pagination: { maxPages: 8 } })
|
|
612
|
+
]);
|
|
613
|
+
|
|
614
|
+
results.forEach((result, index) => {
|
|
615
|
+
if (result.status === 'fulfilled') {
|
|
616
|
+
console.log(`Query ${index + 1}: ${result.value.extensions.autoPagination.totalRecords} records`);
|
|
617
|
+
} else {
|
|
618
|
+
console.error(`Query ${index + 1} failed:`, result.reason);
|
|
619
|
+
}
|
|
620
|
+
});
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
## Supported Pagination Directions
|
|
624
|
+
|
|
625
|
+
### Forward Pagination (Recommended)
|
|
626
|
+
|
|
627
|
+
```typescript
|
|
628
|
+
query GetProducts($first: Int!, $after: String) {
|
|
629
|
+
products(first: $first, after: $after) {
|
|
630
|
+
edges { node { id } cursor }
|
|
631
|
+
pageInfo {
|
|
632
|
+
hasNextPage
|
|
633
|
+
endCursor
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
**Variables:**
|
|
640
|
+
- `first`: Number of records per page
|
|
641
|
+
- `after`: Cursor of last record from previous page
|
|
642
|
+
|
|
643
|
+
### Backward Pagination
|
|
644
|
+
|
|
645
|
+
```typescript
|
|
646
|
+
query GetProducts($last: Int!, $before: String) {
|
|
647
|
+
products(last: $last, before: $before) {
|
|
648
|
+
edges { node { id } cursor }
|
|
649
|
+
pageInfo {
|
|
650
|
+
hasPreviousPage
|
|
651
|
+
startCursor
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
**Variables:**
|
|
658
|
+
- `last`: Number of records per page
|
|
659
|
+
- `before`: Cursor of first record from next page
|
|
660
|
+
|
|
661
|
+
**Note:** SDK primarily focuses on forward pagination. Backward pagination is supported but less common.
|
|
662
|
+
|
|
663
|
+
## Deduplication Behavior
|
|
664
|
+
|
|
665
|
+
### Automatic Deduplication
|
|
666
|
+
|
|
667
|
+
The SDK automatically deduplicates records across pages using the `id` field:
|
|
668
|
+
|
|
669
|
+
```typescript
|
|
670
|
+
// If pages have overlapping records (e.g., due to concurrent writes):
|
|
671
|
+
// Page 1: [{id: '1'}, {id: '2'}, {id: '3'}]
|
|
672
|
+
// Page 2: [{id: '3'}, {id: '4'}, {id: '5'}] // id:'3' duplicated
|
|
673
|
+
|
|
674
|
+
// SDK result: [{id: '1'}, {id: '2'}, {id: '3'}, {id: '4'}, {id: '5'}]
|
|
675
|
+
// Duplicate removed automatically
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
### Requirements
|
|
679
|
+
|
|
680
|
+
For deduplication to work:
|
|
681
|
+
- ✅ Each record must have an `id` field
|
|
682
|
+
- ✅ `id` must be unique across records
|
|
683
|
+
|
|
684
|
+
**If `id` is missing:**
|
|
685
|
+
- ⚠️ No deduplication occurs
|
|
686
|
+
- Duplicate records may appear in final result
|
|
687
|
+
|
|
688
|
+
## Limitations and Constraints
|
|
689
|
+
|
|
690
|
+
### Current Limitations
|
|
691
|
+
|
|
692
|
+
1. **Single connection per query**
|
|
693
|
+
- Can only paginate ONE connection per `client.graphql()` call
|
|
694
|
+
- Use parallel queries for multiple connections
|
|
695
|
+
|
|
696
|
+
2. **No array syntax for connectionPath**
|
|
697
|
+
- `connectionPath: ['products', 'locations']` is NOT supported
|
|
698
|
+
- Must use separate queries
|
|
699
|
+
|
|
700
|
+
3. **Relay spec required**
|
|
701
|
+
- Non-standard pagination structures not supported
|
|
702
|
+
- Must have `edges`, `pageInfo`, `hasNextPage`
|
|
703
|
+
|
|
704
|
+
4. **Forward pagination focus**
|
|
705
|
+
- Backward pagination (`last`, `before`) supported but less tested
|
|
706
|
+
- Bidirectional pagination not supported
|
|
707
|
+
|
|
708
|
+
### Performance Constraints
|
|
709
|
+
|
|
710
|
+
**Recommended limits:**
|
|
711
|
+
- `maxPages`: ≤ 100 for most use cases
|
|
712
|
+
- `maxRecords`: ≤ 10,000 for simple entities
|
|
713
|
+
- `timeoutMs`: ≤ 300,000 (5 minutes)
|
|
714
|
+
- Concurrent parallel queries: ≤ 5
|
|
715
|
+
|
|
716
|
+
**Resource usage:**
|
|
717
|
+
- Memory: ~1MB per 1,000 simple records
|
|
718
|
+
- Network: Proportional to page count × page size
|
|
719
|
+
- API rate limits: Respect Fluent Commerce limits
|
|
720
|
+
|
|
721
|
+
## TypeScript Types
|
|
722
|
+
|
|
723
|
+
### Complete Type Definitions
|
|
724
|
+
|
|
725
|
+
```typescript
|
|
726
|
+
import { GraphQLClient } from '@fluentcommerce/fc-connect-sdk';
|
|
727
|
+
|
|
728
|
+
interface PaginationConfig {
|
|
729
|
+
enabled?: boolean;
|
|
730
|
+
connectionPath?: string;
|
|
731
|
+
maxPages?: number;
|
|
732
|
+
maxRecords?: number;
|
|
733
|
+
timeoutMs?: number;
|
|
734
|
+
delayMs?: number;
|
|
735
|
+
direction?: 'forward' | 'backward';
|
|
736
|
+
abortSignal?: AbortSignal;
|
|
737
|
+
onProgress?: (page: number, totalRecords: number) => void;
|
|
738
|
+
onWarning?: (message: string) => void;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
interface GraphQLOptions {
|
|
742
|
+
query: string;
|
|
743
|
+
variables?: Record<string, any>;
|
|
744
|
+
pagination?: PaginationConfig;
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
interface AutoPaginationMetadata {
|
|
748
|
+
totalPages: number;
|
|
749
|
+
totalRecords: number;
|
|
750
|
+
truncated: boolean;
|
|
751
|
+
timeElapsed?: number;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
interface GraphQLResponse<T = any> {
|
|
755
|
+
data: T;
|
|
756
|
+
errors?: any[];
|
|
757
|
+
extensions: {
|
|
758
|
+
autoPagination: AutoPaginationMetadata;
|
|
759
|
+
};
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
// Usage
|
|
763
|
+
const result: GraphQLResponse<{ products: Connection<Product> }> =
|
|
764
|
+
await client.graphql({
|
|
765
|
+
query: productsQuery,
|
|
766
|
+
variables: { first: 100 },
|
|
767
|
+
pagination: {
|
|
768
|
+
connectionPath: 'products',
|
|
769
|
+
maxPages: 10,
|
|
770
|
+
delayMs: 500,
|
|
771
|
+
onWarning: (msg) => console.warn(msg)
|
|
772
|
+
}
|
|
773
|
+
});
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
## Quick Reference Summary
|
|
777
|
+
|
|
778
|
+
### Configuration Options
|
|
779
|
+
|
|
780
|
+
| Configuration | Type | Default | Description |
|
|
781
|
+
|---------------|------|---------|-------------|
|
|
782
|
+
| `enabled` | `boolean` | Auto-detect | Enable/disable auto-pagination |
|
|
783
|
+
| `connectionPath` | `string` | Auto-detect | Path to connection to paginate |
|
|
784
|
+
| `maxPages` | `number` | `Infinity` | Max pages to fetch (OR logic) |
|
|
785
|
+
| `maxRecords` | `number` | `Infinity` | Max total records (OR logic) |
|
|
786
|
+
| `timeoutMs` | `number` | `Infinity` | Max time in ms (OR logic) |
|
|
787
|
+
| `delayMs` | `number` | `0` | Delay between pages (ms) |
|
|
788
|
+
| `direction` | `'forward'|'backward'` | Auto-detect | Pagination direction |
|
|
789
|
+
| `abortSignal` | `AbortSignal` | `undefined` | Cancel pagination |
|
|
790
|
+
| `onProgress` | `function` | `undefined` | Callback after each page |
|
|
791
|
+
| `onWarning` | `function` | `undefined` | Callback for warnings |
|
|
792
|
+
|
|
793
|
+
### Response Metadata
|
|
794
|
+
|
|
795
|
+
| Metadata | Type | Description |
|
|
796
|
+
|----------|------|-------------|
|
|
797
|
+
| `totalPages` | `number` | Pages fetched |
|
|
798
|
+
| `totalRecords` | `number` | Total records fetched |
|
|
799
|
+
| `truncated` | `boolean` | Stopped due to limit |
|
|
800
|
+
| `timeElapsed` | `number` | Time taken (ms) |
|
|
801
|
+
|
|
802
|
+
**Note:** There is NO `truncationReason` property. To determine which limit was hit:
|
|
803
|
+
- Check if `totalPages === maxPages` → maxPages limit
|
|
804
|
+
- Check if `totalRecords >= maxRecords` → maxRecords limit
|
|
805
|
+
- Check if `timeElapsed >= timeoutMs` → timeout limit
|
|
806
|
+
|
|
807
|
+
## Related Documentation
|
|
808
|
+
|
|
809
|
+
- [Module 1: Foundations](.././modules/multiple-connections-01-foundations.md) - Core concepts
|
|
810
|
+
- [Module 2: Quick Start](.././modules/multiple-connections-02-quick-start.md) - Working examples
|
|
811
|
+
- [Module 3: Targeting Connections](./multiple-connections-03-targeting-connections.md) - connectionPath usage
|
|
812
|
+
- [Module 4: Parallel Queries](./multiple-connections-04-parallel-queries.md) - Promise.all patterns
|
|
813
|
+
- [Module 5: Best Practices](./multiple-connections-05-best-practices.md) - Production patterns
|
|
814
|
+
- [Auto-Pagination Guide](../../../02-CORE-GUIDES/auto-pagination/) - Core pagination documentation
|
|
815
|
+
- [Main Guide](../multiple-connections-readme.md) - Back to multiple connections overview
|
|
816
|
+
|
|
817
|
+
## Key Takeaways
|
|
818
|
+
|
|
819
|
+
- 🎯 **connectionPath** - String path to target connection
|
|
820
|
+
- 🎯 **OR-logic limits** - First limit hit stops pagination
|
|
821
|
+
- 🎯 **Auto-detection** - Works but explicit is better
|
|
822
|
+
- 🎯 **Relay structure** - Required for pagination
|
|
823
|
+
- 🎯 **Metadata** - Check `extensions.autoPagination`
|
|
824
|
+
- 🎯 **Deduplication** - Automatic by `id` field
|