@fluentcommerce/fc-connect-sdk 0.1.53 → 0.1.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -2
- package/README.md +39 -0
- package/dist/cjs/auth/index.d.ts +3 -0
- package/dist/cjs/auth/index.js +13 -0
- package/dist/cjs/auth/profile-loader.d.ts +18 -0
- package/dist/cjs/auth/profile-loader.js +208 -0
- package/dist/cjs/client-factory.d.ts +4 -0
- package/dist/cjs/client-factory.js +10 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/auth/index.d.ts +3 -0
- package/dist/esm/auth/index.js +2 -0
- package/dist/esm/auth/profile-loader.d.ts +18 -0
- package/dist/esm/auth/profile-loader.js +169 -0
- package/dist/esm/client-factory.d.ts +4 -0
- package/dist/esm/client-factory.js +9 -0
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/dist/types/auth/index.d.ts +3 -0
- package/dist/types/auth/profile-loader.d.ts +18 -0
- package/dist/types/client-factory.d.ts +4 -0
- package/dist/types/index.d.ts +3 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -482
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
|
@@ -1,754 +1,754 @@
|
|
|
1
|
-
# Module 3: Configuration Mastery
|
|
2
|
-
|
|
3
|
-
> **Learning Objective:** Master all pagination configuration options and learn entity-specific performance tuning strategies.
|
|
4
|
-
>
|
|
5
|
-
> **Level:** Intermediate
|
|
6
|
-
|
|
7
|
-
## Table of Contents
|
|
8
|
-
|
|
9
|
-
1. [Complete Configuration Reference](#complete-configuration-reference)
|
|
10
|
-
2. `Safety Limits (OR-Logic)`
|
|
11
|
-
3. [Entity-Specific Recommendations](#entity-specific-recommendations)
|
|
12
|
-
4. [Progress Tracking](#progress-tracking)
|
|
13
|
-
5. [Pagination Direction](#pagination-direction)
|
|
14
|
-
6. [Delay and Rate Limiting](#delay-and-rate-limiting)
|
|
15
|
-
7. [Connection Path](#connection-path)
|
|
16
|
-
8. [Abort Signal](#abort-signal)
|
|
17
|
-
9. [Performance Tuning Guide](#performance-tuning-guide)
|
|
18
|
-
10. [Configuration Patterns](#configuration-patterns)
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Complete Configuration Reference
|
|
23
|
-
|
|
24
|
-
```typescript
|
|
25
|
-
interface PaginationConfig {
|
|
26
|
-
/** Enable/disable auto-pagination (default: auto-detected) */
|
|
27
|
-
enabled?: boolean;
|
|
28
|
-
|
|
29
|
-
/** Maximum pages to fetch (default: 100) */
|
|
30
|
-
maxPages?: number;
|
|
31
|
-
|
|
32
|
-
/** Maximum total records (default: 10,000) */
|
|
33
|
-
maxRecords?: number;
|
|
34
|
-
|
|
35
|
-
/** Timeout in milliseconds (default: 300,000 = 5 minutes) */
|
|
36
|
-
timeoutMs?: number;
|
|
37
|
-
|
|
38
|
-
/** Delay between page fetches in ms (default: 0) */
|
|
39
|
-
delayMs?: number;
|
|
40
|
-
|
|
41
|
-
/** Pagination direction (default: auto-detected) */
|
|
42
|
-
direction?: 'forward' | 'backward';
|
|
43
|
-
|
|
44
|
-
/** Path to connection in response (e.g., "order.items") */
|
|
45
|
-
connectionPath?: string;
|
|
46
|
-
|
|
47
|
-
/** AbortSignal to cancel pagination */
|
|
48
|
-
abortSignal?: AbortSignal;
|
|
49
|
-
|
|
50
|
-
/** Progress callback after each page */
|
|
51
|
-
onProgress?: (page: number, totalRecords: number) => void;
|
|
52
|
-
|
|
53
|
-
/** Warning callback for approaching limits */
|
|
54
|
-
onWarning?: (message: string) => void;
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
## Safety Limits (OR-Logic)
|
|
61
|
-
|
|
62
|
-
**CRITICAL:** Pagination stops when **the first limit is reached** (OR-logic, not AND-logic).
|
|
63
|
-
|
|
64
|
-
```typescript
|
|
65
|
-
pagination: {
|
|
66
|
-
maxPages: 50, // Stop after 50 pages
|
|
67
|
-
maxRecords: 5000, // OR stop after 5000 records
|
|
68
|
-
timeoutMs: 60000, // OR stop after 60 seconds
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Whichever limit is reached FIRST stops pagination!
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Example Scenarios
|
|
75
|
-
|
|
76
|
-
| Scenario | Result |
|
|
77
|
-
|----------|--------|
|
|
78
|
-
| Page 45 with 4800 records | Continue (no limit reached) |
|
|
79
|
-
| Page 50 with 4950 records | Stop (maxPages reached) |
|
|
80
|
-
| Page 48 with 5100 records | Stop (maxRecords reached) |
|
|
81
|
-
| 55 seconds elapsed, page 48 | Stop (timeoutMs reached) |
|
|
82
|
-
|
|
83
|
-
### Checking Truncation
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
const result = await client.graphql({
|
|
87
|
-
query,
|
|
88
|
-
variables: { first: 100 },
|
|
89
|
-
pagination: { maxPages: 50, maxRecords: 5000, timeoutMs: 60000 }
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
if (result.extensions.autoPagination.truncated) {
|
|
93
|
-
console.warn(`⚠️ Results truncated!`);
|
|
94
|
-
console.warn(`Reason: ${result.extensions.autoPagination.truncationReason}`);
|
|
95
|
-
// Possible values: "maxPages" | "maxRecords" | "timeout"
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## Entity-Specific Recommendations
|
|
102
|
-
|
|
103
|
-
Different Fluent entities have different complexities. Page size should match entity complexity:
|
|
104
|
-
|
|
105
|
-
### Simple Entities (High Page Size)
|
|
106
|
-
|
|
107
|
-
**Entities:** `virtualPositions`, `locations`, `inventoryQuantities`
|
|
108
|
-
|
|
109
|
-
**Characteristics:**
|
|
110
|
-
- Few fields
|
|
111
|
-
- No nested connections
|
|
112
|
-
- Simple scalar types
|
|
113
|
-
|
|
114
|
-
**Recommended Configuration:**
|
|
115
|
-
|
|
116
|
-
```typescript
|
|
117
|
-
// ✅ OPTIMAL for simple entities
|
|
118
|
-
pagination: {
|
|
119
|
-
maxPages: 100,
|
|
120
|
-
maxRecords: 10000,
|
|
121
|
-
timeoutMs: 120000 // 2 minutes
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
variables: {
|
|
125
|
-
first: 150 // Large page size OK
|
|
126
|
-
}
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
**Example:**
|
|
130
|
-
|
|
131
|
-
```typescript
|
|
132
|
-
const positions = await client.graphql({
|
|
133
|
-
query: `
|
|
134
|
-
query GetVirtualPositions($first: Int!, $after: String) {
|
|
135
|
-
virtualPositions(first: $first, after: $after) {
|
|
136
|
-
edges {
|
|
137
|
-
node { id ref productRef quantity groupRef }
|
|
138
|
-
cursor
|
|
139
|
-
}
|
|
140
|
-
pageInfo { hasNextPage }
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
`,
|
|
144
|
-
variables: { first: 150 }, // High page size
|
|
145
|
-
pagination: {
|
|
146
|
-
maxPages: 100,
|
|
147
|
-
maxRecords: 15000,
|
|
148
|
-
timeoutMs: 120000
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### Medium Complexity Entities (Medium Page Size)
|
|
154
|
-
|
|
155
|
-
**Entities:** `products`, `categories`, `carriers`
|
|
156
|
-
|
|
157
|
-
**Characteristics:**
|
|
158
|
-
- Multiple nested objects
|
|
159
|
-
- Some arrays
|
|
160
|
-
- Rich attribute data
|
|
161
|
-
|
|
162
|
-
**Recommended Configuration:**
|
|
163
|
-
|
|
164
|
-
```typescript
|
|
165
|
-
// ✅ OPTIMAL for medium complexity
|
|
166
|
-
pagination: {
|
|
167
|
-
maxPages: 50,
|
|
168
|
-
maxRecords: 5000,
|
|
169
|
-
timeoutMs: 180000 // 3 minutes
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
variables: {
|
|
173
|
-
first: 75 // Medium page size
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
**Example:**
|
|
178
|
-
|
|
179
|
-
```typescript
|
|
180
|
-
const products = await client.graphql({
|
|
181
|
-
query: `
|
|
182
|
-
query GetProducts($first: Int!, $after: String) {
|
|
183
|
-
products(first: $first, after: $after) {
|
|
184
|
-
edges {
|
|
185
|
-
node {
|
|
186
|
-
id
|
|
187
|
-
ref
|
|
188
|
-
type
|
|
189
|
-
gtin
|
|
190
|
-
attributes { name type value }
|
|
191
|
-
}
|
|
192
|
-
cursor
|
|
193
|
-
}
|
|
194
|
-
pageInfo { hasNextPage }
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
`,
|
|
198
|
-
variables: { first: 75 }, // Medium page size
|
|
199
|
-
pagination: {
|
|
200
|
-
maxPages: 50,
|
|
201
|
-
maxRecords: 5000,
|
|
202
|
-
timeoutMs: 180000
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
### Complex Entities (Low Page Size)
|
|
208
|
-
|
|
209
|
-
**Entities:** `orders` (with items), `fulfilments` (with items), deeply nested queries
|
|
210
|
-
|
|
211
|
-
**Characteristics:**
|
|
212
|
-
- Multiple levels of nesting
|
|
213
|
-
- Large arrays (order items)
|
|
214
|
-
- Complex attribute structures
|
|
215
|
-
|
|
216
|
-
**Recommended Configuration:**
|
|
217
|
-
|
|
218
|
-
```typescript
|
|
219
|
-
// ✅ OPTIMAL for complex entities
|
|
220
|
-
pagination: {
|
|
221
|
-
maxPages: 30,
|
|
222
|
-
maxRecords: 1000,
|
|
223
|
-
timeoutMs: 240000, // 4 minutes
|
|
224
|
-
delayMs: 100 // Rate limiting
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
variables: {
|
|
228
|
-
first: 20 // Small page size!
|
|
229
|
-
}
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
**Example:**
|
|
233
|
-
|
|
234
|
-
```typescript
|
|
235
|
-
const orders = await client.graphql({
|
|
236
|
-
query: `
|
|
237
|
-
query GetOrders($first: Int!, $after: String) {
|
|
238
|
-
orders(first: $first, after: $after) {
|
|
239
|
-
edges {
|
|
240
|
-
node {
|
|
241
|
-
id
|
|
242
|
-
ref
|
|
243
|
-
status
|
|
244
|
-
items {
|
|
245
|
-
edges {
|
|
246
|
-
node {
|
|
247
|
-
id
|
|
248
|
-
ref
|
|
249
|
-
productRef
|
|
250
|
-
quantity
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
cursor
|
|
256
|
-
}
|
|
257
|
-
pageInfo { hasNextPage }
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
`,
|
|
261
|
-
variables: { first: 20 }, // Small page size for nested data
|
|
262
|
-
pagination: {
|
|
263
|
-
maxPages: 30,
|
|
264
|
-
maxRecords: 1000,
|
|
265
|
-
timeoutMs: 240000,
|
|
266
|
-
delayMs: 100
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
---
|
|
272
|
-
|
|
273
|
-
## Progress Tracking
|
|
274
|
-
|
|
275
|
-
Monitor pagination progress with callbacks:
|
|
276
|
-
|
|
277
|
-
```typescript
|
|
278
|
-
const result = await client.graphql({
|
|
279
|
-
query,
|
|
280
|
-
variables: { first: 100 },
|
|
281
|
-
pagination: {
|
|
282
|
-
maxRecords: 10000,
|
|
283
|
-
|
|
284
|
-
// Called after each page fetch
|
|
285
|
-
onProgress: (page, totalRecords) => {
|
|
286
|
-
console.log(`📄 Page ${page}: ${totalRecords} records fetched`);
|
|
287
|
-
|
|
288
|
-
// Custom logic
|
|
289
|
-
if (page % 10 === 0) {
|
|
290
|
-
console.log(`Checkpoint: ${page} pages completed`);
|
|
291
|
-
}
|
|
292
|
-
},
|
|
293
|
-
|
|
294
|
-
// Called when approaching limits
|
|
295
|
-
onWarning: (message) => {
|
|
296
|
-
console.warn(`⚠️ ${message}`);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
});
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
### Advanced Progress Example
|
|
303
|
-
|
|
304
|
-
```typescript
|
|
305
|
-
let startTime = Date.now();
|
|
306
|
-
|
|
307
|
-
const result = await client.graphql({
|
|
308
|
-
query,
|
|
309
|
-
variables: { first: 100 },
|
|
310
|
-
pagination: {
|
|
311
|
-
maxPages: 100,
|
|
312
|
-
onProgress: (page, totalRecords) => {
|
|
313
|
-
const elapsed = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
314
|
-
const recordsPerSec = (totalRecords / (Date.now() - startTime) * 1000).toFixed(0);
|
|
315
|
-
|
|
316
|
-
process.stdout.write(
|
|
317
|
-
`\r📊 Page ${page} | Records: ${totalRecords} | ` +
|
|
318
|
-
`Time: ${elapsed}s | Rate: ${recordsPerSec} records/sec`
|
|
319
|
-
);
|
|
320
|
-
},
|
|
321
|
-
onWarning: (message) => {
|
|
322
|
-
console.warn(`\n⚠️ Warning: ${message}`);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
console.log('\n✅ Complete!');
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
---
|
|
331
|
-
|
|
332
|
-
## Pagination Direction
|
|
333
|
-
|
|
334
|
-
### Forward Pagination (Default)
|
|
335
|
-
|
|
336
|
-
Most common: fetch from beginning to end using `first` and `after`.
|
|
337
|
-
|
|
338
|
-
```typescript
|
|
339
|
-
// Forward pagination (default)
|
|
340
|
-
const result = await client.graphql({
|
|
341
|
-
query: `
|
|
342
|
-
query GetItems($first: Int!, $after: String) {
|
|
343
|
-
items(first: $first, after: $after) {
|
|
344
|
-
edges { node { id ref } cursor }
|
|
345
|
-
pageInfo { hasNextPage }
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
`,
|
|
349
|
-
variables: { first: 100 },
|
|
350
|
-
pagination: {
|
|
351
|
-
direction: 'forward' // Optional, auto-detected
|
|
352
|
-
}
|
|
353
|
-
});
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
### Backward Pagination
|
|
357
|
-
|
|
358
|
-
Fetch from end to beginning using `last` and `before`.
|
|
359
|
-
|
|
360
|
-
```typescript
|
|
361
|
-
// Backward pagination
|
|
362
|
-
const result = await client.graphql({
|
|
363
|
-
query: `
|
|
364
|
-
query GetItems($last: Int!, $before: String) {
|
|
365
|
-
items(last: $last, before: $before) {
|
|
366
|
-
edges { node { id ref } cursor }
|
|
367
|
-
pageInfo { hasPreviousPage }
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
`,
|
|
371
|
-
variables: { last: 100 },
|
|
372
|
-
pagination: {
|
|
373
|
-
direction: 'backward', // Required for backward
|
|
374
|
-
maxPages: 50
|
|
375
|
-
}
|
|
376
|
-
});
|
|
377
|
-
```
|
|
378
|
-
|
|
379
|
-
---
|
|
380
|
-
|
|
381
|
-
## Understanding Cursor Selection
|
|
382
|
-
|
|
383
|
-
The SDK automatically selects the correct cursor based on pagination direction:
|
|
384
|
-
|
|
385
|
-
### Forward Pagination (`first`/`after`)
|
|
386
|
-
|
|
387
|
-
Uses **last edge cursor** from each page:
|
|
388
|
-
|
|
389
|
-
```typescript
|
|
390
|
-
// SDK automatically does this:
|
|
391
|
-
const edges = result.data.items.edges;
|
|
392
|
-
const nextCursor = edges[edges.length - 1].cursor; // Last edge
|
|
393
|
-
// Next request: { first: 100, after: nextCursor }
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
**Why:** Next page starts AFTER the last item fetched, moving forward through the dataset.
|
|
397
|
-
|
|
398
|
-
### Backward Pagination (`last`/`before`)
|
|
399
|
-
|
|
400
|
-
Uses **first edge cursor** from each page:
|
|
401
|
-
|
|
402
|
-
```typescript
|
|
403
|
-
// SDK automatically does this:
|
|
404
|
-
const edges = result.data.items.edges;
|
|
405
|
-
const nextCursor = edges[0].cursor; // First edge
|
|
406
|
-
// Next request: { last: 100, before: nextCursor }
|
|
407
|
-
```
|
|
408
|
-
|
|
409
|
-
**Why:** Previous page ends BEFORE the first item fetched, moving backward through the dataset.
|
|
410
|
-
|
|
411
|
-
### Key Differences
|
|
412
|
-
|
|
413
|
-
| Direction | Cursor Position | Traversal Direction | Use Case |
|
|
414
|
-
|-----------|----------------|-------------------|----------|
|
|
415
|
-
| **Forward** | Last edge | Start → End | Full dataset exports, chronological processing |
|
|
416
|
-
| **Backward** | First edge | End → Start | Recent records, reverse chronological feeds |
|
|
417
|
-
|
|
418
|
-
### Common Mistakes
|
|
419
|
-
|
|
420
|
-
```typescript
|
|
421
|
-
// ❌ WRONG: Using wrong cursor for direction
|
|
422
|
-
// Forward pagination with first cursor
|
|
423
|
-
const cursor = edges[0].cursor; // Wrong!
|
|
424
|
-
variables: { first: 100, after: cursor }
|
|
425
|
-
|
|
426
|
-
// ❌ WRONG: Backward pagination with last cursor
|
|
427
|
-
const cursor = edges[edges.length - 1].cursor; // Wrong!
|
|
428
|
-
variables: { last: 100, before: cursor }
|
|
429
|
-
|
|
430
|
-
// ✅ CORRECT: SDK handles this automatically
|
|
431
|
-
const result = await orchestrator.extract({
|
|
432
|
-
direction: 'forward', // or 'backward'
|
|
433
|
-
// SDK picks correct cursor based on direction
|
|
434
|
-
});
|
|
435
|
-
```
|
|
436
|
-
|
|
437
|
-
---
|
|
438
|
-
|
|
439
|
-
## Delay and Rate Limiting
|
|
440
|
-
|
|
441
|
-
Add delays between page fetches to respect rate limits:
|
|
442
|
-
|
|
443
|
-
```typescript
|
|
444
|
-
const result = await client.graphql({
|
|
445
|
-
query,
|
|
446
|
-
variables: { first: 100 },
|
|
447
|
-
pagination: {
|
|
448
|
-
maxPages: 100,
|
|
449
|
-
delayMs: 200 // Wait 200ms between each page
|
|
450
|
-
}
|
|
451
|
-
});
|
|
452
|
-
|
|
453
|
-
// Total time = (pages * delayMs) + (pages * requestTime)
|
|
454
|
-
// Example: 50 pages * 200ms = 10 seconds of delays
|
|
455
|
-
```
|
|
456
|
-
|
|
457
|
-
### Use Cases for Delays
|
|
458
|
-
|
|
459
|
-
| Use Case | delayMs | Reason |
|
|
460
|
-
|----------|---------|--------|
|
|
461
|
-
| **API Rate Limits** | 100-500 | Avoid 429 errors |
|
|
462
|
-
| **Database Protection** | 200-300 | Reduce DB load |
|
|
463
|
-
| **Concurrent Operations** | 100-200 | Prevent resource contention |
|
|
464
|
-
| **Testing** | 1000+ | Simulate slow connections |
|
|
465
|
-
| **No Rate Limits** | 0 | Maximum speed |
|
|
466
|
-
|
|
467
|
-
---
|
|
468
|
-
|
|
469
|
-
## Connection Path
|
|
470
|
-
|
|
471
|
-
Specify which connection to paginate when multiple exist:
|
|
472
|
-
|
|
473
|
-
### Auto-Detection (Default)
|
|
474
|
-
|
|
475
|
-
```typescript
|
|
476
|
-
// SDK automatically finds first connection
|
|
477
|
-
const result = await client.graphql({
|
|
478
|
-
query: `
|
|
479
|
-
query GetData($first: Int!, $after: String) {
|
|
480
|
-
items(first: $first, after: $after) {
|
|
481
|
-
edges { node { id ref } cursor }
|
|
482
|
-
pageInfo { hasNextPage }
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
`,
|
|
486
|
-
variables: { first: 100 }
|
|
487
|
-
// connectionPath not needed - only one connection
|
|
488
|
-
});
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
### Explicit Path (Multiple Connections)
|
|
492
|
-
|
|
493
|
-
```typescript
|
|
494
|
-
// Multiple connections - must specify which to paginate
|
|
495
|
-
const result = await client.graphql({
|
|
496
|
-
query: `
|
|
497
|
-
query GetMultiple($first: Int!, $after: String) {
|
|
498
|
-
locations(first: $first, after: $after) {
|
|
499
|
-
edges { node { id ref name type } cursor }
|
|
500
|
-
pageInfo { hasNextPage }
|
|
501
|
-
}
|
|
502
|
-
products(first: $first, after: $after) {
|
|
503
|
-
edges { node { id ref type gtin } cursor }
|
|
504
|
-
pageInfo { hasNextPage }
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
`,
|
|
508
|
-
variables: { first: 100 },
|
|
509
|
-
pagination: {
|
|
510
|
-
connectionPath: 'locations' // Paginate locations only
|
|
511
|
-
}
|
|
512
|
-
});
|
|
513
|
-
```
|
|
514
|
-
|
|
515
|
-
### Nested Connection Path
|
|
516
|
-
|
|
517
|
-
```typescript
|
|
518
|
-
// Paginate nested connection
|
|
519
|
-
const result = await client.graphql({
|
|
520
|
-
query: `
|
|
521
|
-
query GetOrder($orderId: ID!, $first: Int!, $after: String) {
|
|
522
|
-
order(id: $orderId) {
|
|
523
|
-
id
|
|
524
|
-
ref
|
|
525
|
-
items(first: $first, after: $after) {
|
|
526
|
-
edges { node { id ref productRef quantity } cursor }
|
|
527
|
-
pageInfo { hasNextPage }
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
`,
|
|
532
|
-
variables: { orderId: 'ORDER123', first: 50 },
|
|
533
|
-
pagination: {
|
|
534
|
-
connectionPath: 'order.items', // Dot notation for nested
|
|
535
|
-
maxPages: 20
|
|
536
|
-
}
|
|
537
|
-
});
|
|
538
|
-
```
|
|
539
|
-
|
|
540
|
-
---
|
|
541
|
-
|
|
542
|
-
## Abort Signal
|
|
543
|
-
|
|
544
|
-
Cancel pagination programmatically:
|
|
545
|
-
|
|
546
|
-
```typescript
|
|
547
|
-
const controller = new AbortController();
|
|
548
|
-
|
|
549
|
-
// Start pagination
|
|
550
|
-
const paginationPromise = client.graphql({
|
|
551
|
-
query,
|
|
552
|
-
variables: { first: 100 },
|
|
553
|
-
pagination: {
|
|
554
|
-
maxPages: 1000,
|
|
555
|
-
abortSignal: controller.signal
|
|
556
|
-
}
|
|
557
|
-
});
|
|
558
|
-
|
|
559
|
-
// Cancel after 10 seconds
|
|
560
|
-
setTimeout(() => {
|
|
561
|
-
console.log('⏱️ Timeout reached, aborting pagination...');
|
|
562
|
-
controller.abort();
|
|
563
|
-
}, 10000);
|
|
564
|
-
|
|
565
|
-
try {
|
|
566
|
-
const result = await paginationPromise;
|
|
567
|
-
} catch (error) {
|
|
568
|
-
if (error.name === 'AbortError') {
|
|
569
|
-
console.log('✅ Pagination aborted successfully');
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
```
|
|
573
|
-
|
|
574
|
-
---
|
|
575
|
-
|
|
576
|
-
## Performance Tuning Guide
|
|
577
|
-
|
|
578
|
-
### Scenario 1: Maximum Speed
|
|
579
|
-
|
|
580
|
-
```typescript
|
|
581
|
-
// Goal: Fetch as fast as possible
|
|
582
|
-
pagination: {
|
|
583
|
-
maxPages: 500, // High limit
|
|
584
|
-
maxRecords: 50000, // High limit
|
|
585
|
-
timeoutMs: 600000, // 10 minutes
|
|
586
|
-
delayMs: 0 // No delays!
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
variables: {
|
|
590
|
-
first: 200 // Large pages
|
|
591
|
-
}
|
|
592
|
-
```
|
|
593
|
-
|
|
594
|
-
### Scenario 2: Maximum Safety
|
|
595
|
-
|
|
596
|
-
```typescript
|
|
597
|
-
// Goal: Conservative, fail-safe operation
|
|
598
|
-
pagination: {
|
|
599
|
-
maxPages: 20, // Low limit
|
|
600
|
-
maxRecords: 2000, // Low limit
|
|
601
|
-
timeoutMs: 30000, // 30 seconds
|
|
602
|
-
delayMs: 100, // Small delays
|
|
603
|
-
onWarning: (msg) => console.warn(msg)
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
variables: {
|
|
607
|
-
first: 50 // Small pages
|
|
608
|
-
}
|
|
609
|
-
```
|
|
610
|
-
|
|
611
|
-
### Scenario 3: Background Job
|
|
612
|
-
|
|
613
|
-
```typescript
|
|
614
|
-
// Goal: Thorough, scheduled task
|
|
615
|
-
pagination: {
|
|
616
|
-
maxPages: 200,
|
|
617
|
-
maxRecords: 20000,
|
|
618
|
-
timeoutMs: 600000, // 10 minutes
|
|
619
|
-
delayMs: 50,
|
|
620
|
-
onProgress: (page, records) => {
|
|
621
|
-
if (page % 25 === 0) {
|
|
622
|
-
console.log(`Progress: ${records} records`);
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
variables: {
|
|
628
|
-
first: 100
|
|
629
|
-
}
|
|
630
|
-
```
|
|
631
|
-
|
|
632
|
-
### Scenario 4: User-Facing API
|
|
633
|
-
|
|
634
|
-
```typescript
|
|
635
|
-
// Goal: Fast response for UI
|
|
636
|
-
pagination: {
|
|
637
|
-
maxPages: 10, // Quick return
|
|
638
|
-
maxRecords: 1000,
|
|
639
|
-
timeoutMs: 5000, // 5 seconds max
|
|
640
|
-
delayMs: 0
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
variables: {
|
|
644
|
-
first: 100
|
|
645
|
-
}
|
|
646
|
-
```
|
|
647
|
-
|
|
648
|
-
---
|
|
649
|
-
|
|
650
|
-
## Configuration Patterns
|
|
651
|
-
|
|
652
|
-
### Pattern 1: Progressive Loading with Checkpoints
|
|
653
|
-
|
|
654
|
-
```typescript
|
|
655
|
-
const checkpoint = { page: 0, records: 0 };
|
|
656
|
-
|
|
657
|
-
const result = await client.graphql({
|
|
658
|
-
query,
|
|
659
|
-
variables: { first: 100 },
|
|
660
|
-
pagination: {
|
|
661
|
-
maxPages: 100,
|
|
662
|
-
onProgress: (page, records) => {
|
|
663
|
-
checkpoint.page = page;
|
|
664
|
-
checkpoint.records = records;
|
|
665
|
-
|
|
666
|
-
// Save checkpoint every 10 pages
|
|
667
|
-
if (page % 10 === 0) {
|
|
668
|
-
fs.writeFileSync('checkpoint.json', JSON.stringify(checkpoint));
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
});
|
|
673
|
-
```
|
|
674
|
-
|
|
675
|
-
### Pattern 2: Adaptive Rate Limiting
|
|
676
|
-
|
|
677
|
-
```typescript
|
|
678
|
-
let delayMs = 0;
|
|
679
|
-
const warnings: string[] = [];
|
|
680
|
-
|
|
681
|
-
const result = await client.graphql({
|
|
682
|
-
query,
|
|
683
|
-
variables: { first: 100 },
|
|
684
|
-
pagination: {
|
|
685
|
-
maxPages: 100,
|
|
686
|
-
delayMs,
|
|
687
|
-
onWarning: (message) => {
|
|
688
|
-
warnings.push(message);
|
|
689
|
-
|
|
690
|
-
// Increase delay if getting warnings
|
|
691
|
-
if (warnings.length > 5) {
|
|
692
|
-
delayMs += 100;
|
|
693
|
-
console.log(`⚠️ Increasing delay to ${delayMs}ms due to warnings`);
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
});
|
|
698
|
-
```
|
|
699
|
-
|
|
700
|
-
### Pattern 3: Time-Budgeted Pagination
|
|
701
|
-
|
|
702
|
-
```typescript
|
|
703
|
-
const timeBudgetMs = 60000; // 1 minute budget
|
|
704
|
-
const startTime = Date.now();
|
|
705
|
-
|
|
706
|
-
const result = await client.graphql({
|
|
707
|
-
query,
|
|
708
|
-
variables: { first: 100 },
|
|
709
|
-
pagination: {
|
|
710
|
-
timeoutMs: timeBudgetMs,
|
|
711
|
-
maxRecords: 10000,
|
|
712
|
-
onProgress: (page, records) => {
|
|
713
|
-
const elapsed = Date.now() - startTime;
|
|
714
|
-
const remainingTime = timeBudgetMs - elapsed;
|
|
715
|
-
console.log(`⏱️ Remaining time: ${(remainingTime / 1000).toFixed(1)}s`);
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
});
|
|
719
|
-
|
|
720
|
-
if (result.extensions.autoPagination.truncated &&
|
|
721
|
-
result.extensions.autoPagination.truncationReason === 'timeout') {
|
|
722
|
-
console.log('⏰ Time budget exhausted - consider increasing timeout or page size');
|
|
723
|
-
}
|
|
724
|
-
```
|
|
725
|
-
|
|
726
|
-
---
|
|
727
|
-
|
|
728
|
-
## Summary: Quick Configuration Guide
|
|
729
|
-
|
|
730
|
-
| Entity Type | first | maxPages | maxRecords | timeoutMs | delayMs |
|
|
731
|
-
|-------------|-------|----------|------------|-----------|---------|
|
|
732
|
-
| Simple (positions, locations) | 150 | 100 | 15000 | 120000 | 0 |
|
|
733
|
-
| Medium (products, categories) | 75 | 50 | 5000 | 180000 | 0-50 |
|
|
734
|
-
| Complex (orders with items) | 20 | 30 | 1000 | 240000 | 100 |
|
|
735
|
-
| Testing/Dev | 50 | 5 | 500 | 10000 | 0 |
|
|
736
|
-
| Production Export | 100 | 100 | 10000 | 300000 | 0 |
|
|
737
|
-
| Background Job | 100 | 200 | 20000 | 600000 | 50 |
|
|
738
|
-
| User-Facing API | 100 | 10 | 1000 | 5000 | 0 |
|
|
739
|
-
|
|
740
|
-
---
|
|
741
|
-
|
|
742
|
-
## Next Steps
|
|
743
|
-
|
|
744
|
-
Now that you've mastered configuration, explore advanced query patterns:
|
|
745
|
-
|
|
746
|
-
**Continue to:** [Module 4: Advanced Patterns →](./auto-pagination-04-advanced-patterns.md)
|
|
747
|
-
|
|
748
|
-
Or dive deeper:
|
|
749
|
-
- [Module 5: SDK Integration](./auto-pagination-05-sdk-integration.md) - Combine with other services
|
|
750
|
-
- [Module 6: Troubleshooting](./auto-pagination-06-troubleshooting.md) - Fix common issues
|
|
751
|
-
|
|
752
|
-
---
|
|
753
|
-
|
|
754
|
-
[← Back to Index](../../advanced-services/advanced-services-readme.md) | [← Previous: Quick Start](./auto-pagination-02-quick-start.md) | [Next: Advanced Patterns →](./auto-pagination-04-advanced-patterns.md)
|
|
1
|
+
# Module 3: Configuration Mastery
|
|
2
|
+
|
|
3
|
+
> **Learning Objective:** Master all pagination configuration options and learn entity-specific performance tuning strategies.
|
|
4
|
+
>
|
|
5
|
+
> **Level:** Intermediate
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
1. [Complete Configuration Reference](#complete-configuration-reference)
|
|
10
|
+
2. `Safety Limits (OR-Logic)`
|
|
11
|
+
3. [Entity-Specific Recommendations](#entity-specific-recommendations)
|
|
12
|
+
4. [Progress Tracking](#progress-tracking)
|
|
13
|
+
5. [Pagination Direction](#pagination-direction)
|
|
14
|
+
6. [Delay and Rate Limiting](#delay-and-rate-limiting)
|
|
15
|
+
7. [Connection Path](#connection-path)
|
|
16
|
+
8. [Abort Signal](#abort-signal)
|
|
17
|
+
9. [Performance Tuning Guide](#performance-tuning-guide)
|
|
18
|
+
10. [Configuration Patterns](#configuration-patterns)
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Complete Configuration Reference
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
interface PaginationConfig {
|
|
26
|
+
/** Enable/disable auto-pagination (default: auto-detected) */
|
|
27
|
+
enabled?: boolean;
|
|
28
|
+
|
|
29
|
+
/** Maximum pages to fetch (default: 100) */
|
|
30
|
+
maxPages?: number;
|
|
31
|
+
|
|
32
|
+
/** Maximum total records (default: 10,000) */
|
|
33
|
+
maxRecords?: number;
|
|
34
|
+
|
|
35
|
+
/** Timeout in milliseconds (default: 300,000 = 5 minutes) */
|
|
36
|
+
timeoutMs?: number;
|
|
37
|
+
|
|
38
|
+
/** Delay between page fetches in ms (default: 0) */
|
|
39
|
+
delayMs?: number;
|
|
40
|
+
|
|
41
|
+
/** Pagination direction (default: auto-detected) */
|
|
42
|
+
direction?: 'forward' | 'backward';
|
|
43
|
+
|
|
44
|
+
/** Path to connection in response (e.g., "order.items") */
|
|
45
|
+
connectionPath?: string;
|
|
46
|
+
|
|
47
|
+
/** AbortSignal to cancel pagination */
|
|
48
|
+
abortSignal?: AbortSignal;
|
|
49
|
+
|
|
50
|
+
/** Progress callback after each page */
|
|
51
|
+
onProgress?: (page: number, totalRecords: number) => void;
|
|
52
|
+
|
|
53
|
+
/** Warning callback for approaching limits */
|
|
54
|
+
onWarning?: (message: string) => void;
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Safety Limits (OR-Logic)
|
|
61
|
+
|
|
62
|
+
**CRITICAL:** Pagination stops when **the first limit is reached** (OR-logic, not AND-logic).
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
pagination: {
|
|
66
|
+
maxPages: 50, // Stop after 50 pages
|
|
67
|
+
maxRecords: 5000, // OR stop after 5000 records
|
|
68
|
+
timeoutMs: 60000, // OR stop after 60 seconds
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Whichever limit is reached FIRST stops pagination!
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Example Scenarios
|
|
75
|
+
|
|
76
|
+
| Scenario | Result |
|
|
77
|
+
|----------|--------|
|
|
78
|
+
| Page 45 with 4800 records | Continue (no limit reached) |
|
|
79
|
+
| Page 50 with 4950 records | Stop (maxPages reached) |
|
|
80
|
+
| Page 48 with 5100 records | Stop (maxRecords reached) |
|
|
81
|
+
| 55 seconds elapsed, page 48 | Stop (timeoutMs reached) |
|
|
82
|
+
|
|
83
|
+
### Checking Truncation
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
const result = await client.graphql({
|
|
87
|
+
query,
|
|
88
|
+
variables: { first: 100 },
|
|
89
|
+
pagination: { maxPages: 50, maxRecords: 5000, timeoutMs: 60000 }
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
if (result.extensions.autoPagination.truncated) {
|
|
93
|
+
console.warn(`⚠️ Results truncated!`);
|
|
94
|
+
console.warn(`Reason: ${result.extensions.autoPagination.truncationReason}`);
|
|
95
|
+
// Possible values: "maxPages" | "maxRecords" | "timeout"
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Entity-Specific Recommendations
|
|
102
|
+
|
|
103
|
+
Different Fluent entities have different complexities. Page size should match entity complexity:
|
|
104
|
+
|
|
105
|
+
### Simple Entities (High Page Size)
|
|
106
|
+
|
|
107
|
+
**Entities:** `virtualPositions`, `locations`, `inventoryQuantities`
|
|
108
|
+
|
|
109
|
+
**Characteristics:**
|
|
110
|
+
- Few fields
|
|
111
|
+
- No nested connections
|
|
112
|
+
- Simple scalar types
|
|
113
|
+
|
|
114
|
+
**Recommended Configuration:**
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// ✅ OPTIMAL for simple entities
|
|
118
|
+
pagination: {
|
|
119
|
+
maxPages: 100,
|
|
120
|
+
maxRecords: 10000,
|
|
121
|
+
timeoutMs: 120000 // 2 minutes
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
variables: {
|
|
125
|
+
first: 150 // Large page size OK
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Example:**
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
const positions = await client.graphql({
|
|
133
|
+
query: `
|
|
134
|
+
query GetVirtualPositions($first: Int!, $after: String) {
|
|
135
|
+
virtualPositions(first: $first, after: $after) {
|
|
136
|
+
edges {
|
|
137
|
+
node { id ref productRef quantity groupRef }
|
|
138
|
+
cursor
|
|
139
|
+
}
|
|
140
|
+
pageInfo { hasNextPage }
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
`,
|
|
144
|
+
variables: { first: 150 }, // High page size
|
|
145
|
+
pagination: {
|
|
146
|
+
maxPages: 100,
|
|
147
|
+
maxRecords: 15000,
|
|
148
|
+
timeoutMs: 120000
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Medium Complexity Entities (Medium Page Size)
|
|
154
|
+
|
|
155
|
+
**Entities:** `products`, `categories`, `carriers`
|
|
156
|
+
|
|
157
|
+
**Characteristics:**
|
|
158
|
+
- Multiple nested objects
|
|
159
|
+
- Some arrays
|
|
160
|
+
- Rich attribute data
|
|
161
|
+
|
|
162
|
+
**Recommended Configuration:**
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
// ✅ OPTIMAL for medium complexity
|
|
166
|
+
pagination: {
|
|
167
|
+
maxPages: 50,
|
|
168
|
+
maxRecords: 5000,
|
|
169
|
+
timeoutMs: 180000 // 3 minutes
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
variables: {
|
|
173
|
+
first: 75 // Medium page size
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Example:**
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
const products = await client.graphql({
|
|
181
|
+
query: `
|
|
182
|
+
query GetProducts($first: Int!, $after: String) {
|
|
183
|
+
products(first: $first, after: $after) {
|
|
184
|
+
edges {
|
|
185
|
+
node {
|
|
186
|
+
id
|
|
187
|
+
ref
|
|
188
|
+
type
|
|
189
|
+
gtin
|
|
190
|
+
attributes { name type value }
|
|
191
|
+
}
|
|
192
|
+
cursor
|
|
193
|
+
}
|
|
194
|
+
pageInfo { hasNextPage }
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
`,
|
|
198
|
+
variables: { first: 75 }, // Medium page size
|
|
199
|
+
pagination: {
|
|
200
|
+
maxPages: 50,
|
|
201
|
+
maxRecords: 5000,
|
|
202
|
+
timeoutMs: 180000
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Complex Entities (Low Page Size)
|
|
208
|
+
|
|
209
|
+
**Entities:** `orders` (with items), `fulfilments` (with items), deeply nested queries
|
|
210
|
+
|
|
211
|
+
**Characteristics:**
|
|
212
|
+
- Multiple levels of nesting
|
|
213
|
+
- Large arrays (order items)
|
|
214
|
+
- Complex attribute structures
|
|
215
|
+
|
|
216
|
+
**Recommended Configuration:**
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
// ✅ OPTIMAL for complex entities
|
|
220
|
+
pagination: {
|
|
221
|
+
maxPages: 30,
|
|
222
|
+
maxRecords: 1000,
|
|
223
|
+
timeoutMs: 240000, // 4 minutes
|
|
224
|
+
delayMs: 100 // Rate limiting
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
variables: {
|
|
228
|
+
first: 20 // Small page size!
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**Example:**
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
const orders = await client.graphql({
|
|
236
|
+
query: `
|
|
237
|
+
query GetOrders($first: Int!, $after: String) {
|
|
238
|
+
orders(first: $first, after: $after) {
|
|
239
|
+
edges {
|
|
240
|
+
node {
|
|
241
|
+
id
|
|
242
|
+
ref
|
|
243
|
+
status
|
|
244
|
+
items {
|
|
245
|
+
edges {
|
|
246
|
+
node {
|
|
247
|
+
id
|
|
248
|
+
ref
|
|
249
|
+
productRef
|
|
250
|
+
quantity
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
cursor
|
|
256
|
+
}
|
|
257
|
+
pageInfo { hasNextPage }
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
`,
|
|
261
|
+
variables: { first: 20 }, // Small page size for nested data
|
|
262
|
+
pagination: {
|
|
263
|
+
maxPages: 30,
|
|
264
|
+
maxRecords: 1000,
|
|
265
|
+
timeoutMs: 240000,
|
|
266
|
+
delayMs: 100
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Progress Tracking
|
|
274
|
+
|
|
275
|
+
Monitor pagination progress with callbacks:
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
const result = await client.graphql({
|
|
279
|
+
query,
|
|
280
|
+
variables: { first: 100 },
|
|
281
|
+
pagination: {
|
|
282
|
+
maxRecords: 10000,
|
|
283
|
+
|
|
284
|
+
// Called after each page fetch
|
|
285
|
+
onProgress: (page, totalRecords) => {
|
|
286
|
+
console.log(`📄 Page ${page}: ${totalRecords} records fetched`);
|
|
287
|
+
|
|
288
|
+
// Custom logic
|
|
289
|
+
if (page % 10 === 0) {
|
|
290
|
+
console.log(`Checkpoint: ${page} pages completed`);
|
|
291
|
+
}
|
|
292
|
+
},
|
|
293
|
+
|
|
294
|
+
// Called when approaching limits
|
|
295
|
+
onWarning: (message) => {
|
|
296
|
+
console.warn(`⚠️ ${message}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Advanced Progress Example
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
let startTime = Date.now();
|
|
306
|
+
|
|
307
|
+
const result = await client.graphql({
|
|
308
|
+
query,
|
|
309
|
+
variables: { first: 100 },
|
|
310
|
+
pagination: {
|
|
311
|
+
maxPages: 100,
|
|
312
|
+
onProgress: (page, totalRecords) => {
|
|
313
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
314
|
+
const recordsPerSec = (totalRecords / (Date.now() - startTime) * 1000).toFixed(0);
|
|
315
|
+
|
|
316
|
+
process.stdout.write(
|
|
317
|
+
`\r📊 Page ${page} | Records: ${totalRecords} | ` +
|
|
318
|
+
`Time: ${elapsed}s | Rate: ${recordsPerSec} records/sec`
|
|
319
|
+
);
|
|
320
|
+
},
|
|
321
|
+
onWarning: (message) => {
|
|
322
|
+
console.warn(`\n⚠️ Warning: ${message}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
console.log('\n✅ Complete!');
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## Pagination Direction
|
|
333
|
+
|
|
334
|
+
### Forward Pagination (Default)
|
|
335
|
+
|
|
336
|
+
Most common: fetch from beginning to end using `first` and `after`.
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
// Forward pagination (default)
|
|
340
|
+
const result = await client.graphql({
|
|
341
|
+
query: `
|
|
342
|
+
query GetItems($first: Int!, $after: String) {
|
|
343
|
+
items(first: $first, after: $after) {
|
|
344
|
+
edges { node { id ref } cursor }
|
|
345
|
+
pageInfo { hasNextPage }
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
`,
|
|
349
|
+
variables: { first: 100 },
|
|
350
|
+
pagination: {
|
|
351
|
+
direction: 'forward' // Optional, auto-detected
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Backward Pagination
|
|
357
|
+
|
|
358
|
+
Fetch from end to beginning using `last` and `before`.
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
// Backward pagination
|
|
362
|
+
const result = await client.graphql({
|
|
363
|
+
query: `
|
|
364
|
+
query GetItems($last: Int!, $before: String) {
|
|
365
|
+
items(last: $last, before: $before) {
|
|
366
|
+
edges { node { id ref } cursor }
|
|
367
|
+
pageInfo { hasPreviousPage }
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
`,
|
|
371
|
+
variables: { last: 100 },
|
|
372
|
+
pagination: {
|
|
373
|
+
direction: 'backward', // Required for backward
|
|
374
|
+
maxPages: 50
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## Understanding Cursor Selection
|
|
382
|
+
|
|
383
|
+
The SDK automatically selects the correct cursor based on pagination direction:
|
|
384
|
+
|
|
385
|
+
### Forward Pagination (`first`/`after`)
|
|
386
|
+
|
|
387
|
+
Uses **last edge cursor** from each page:
|
|
388
|
+
|
|
389
|
+
```typescript
|
|
390
|
+
// SDK automatically does this:
|
|
391
|
+
const edges = result.data.items.edges;
|
|
392
|
+
const nextCursor = edges[edges.length - 1].cursor; // Last edge
|
|
393
|
+
// Next request: { first: 100, after: nextCursor }
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
**Why:** Next page starts AFTER the last item fetched, moving forward through the dataset.
|
|
397
|
+
|
|
398
|
+
### Backward Pagination (`last`/`before`)
|
|
399
|
+
|
|
400
|
+
Uses **first edge cursor** from each page:
|
|
401
|
+
|
|
402
|
+
```typescript
|
|
403
|
+
// SDK automatically does this:
|
|
404
|
+
const edges = result.data.items.edges;
|
|
405
|
+
const nextCursor = edges[0].cursor; // First edge
|
|
406
|
+
// Next request: { last: 100, before: nextCursor }
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**Why:** Previous page ends BEFORE the first item fetched, moving backward through the dataset.
|
|
410
|
+
|
|
411
|
+
### Key Differences
|
|
412
|
+
|
|
413
|
+
| Direction | Cursor Position | Traversal Direction | Use Case |
|
|
414
|
+
|-----------|----------------|-------------------|----------|
|
|
415
|
+
| **Forward** | Last edge | Start → End | Full dataset exports, chronological processing |
|
|
416
|
+
| **Backward** | First edge | End → Start | Recent records, reverse chronological feeds |
|
|
417
|
+
|
|
418
|
+
### Common Mistakes
|
|
419
|
+
|
|
420
|
+
```typescript
|
|
421
|
+
// ❌ WRONG: Using wrong cursor for direction
|
|
422
|
+
// Forward pagination with first cursor
|
|
423
|
+
const cursor = edges[0].cursor; // Wrong!
|
|
424
|
+
variables: { first: 100, after: cursor }
|
|
425
|
+
|
|
426
|
+
// ❌ WRONG: Backward pagination with last cursor
|
|
427
|
+
const cursor = edges[edges.length - 1].cursor; // Wrong!
|
|
428
|
+
variables: { last: 100, before: cursor }
|
|
429
|
+
|
|
430
|
+
// ✅ CORRECT: SDK handles this automatically
|
|
431
|
+
const result = await orchestrator.extract({
|
|
432
|
+
direction: 'forward', // or 'backward'
|
|
433
|
+
// SDK picks correct cursor based on direction
|
|
434
|
+
});
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## Delay and Rate Limiting
|
|
440
|
+
|
|
441
|
+
Add delays between page fetches to respect rate limits:
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
const result = await client.graphql({
|
|
445
|
+
query,
|
|
446
|
+
variables: { first: 100 },
|
|
447
|
+
pagination: {
|
|
448
|
+
maxPages: 100,
|
|
449
|
+
delayMs: 200 // Wait 200ms between each page
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
// Total time = (pages * delayMs) + (pages * requestTime)
|
|
454
|
+
// Example: 50 pages * 200ms = 10 seconds of delays
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
### Use Cases for Delays
|
|
458
|
+
|
|
459
|
+
| Use Case | delayMs | Reason |
|
|
460
|
+
|----------|---------|--------|
|
|
461
|
+
| **API Rate Limits** | 100-500 | Avoid 429 errors |
|
|
462
|
+
| **Database Protection** | 200-300 | Reduce DB load |
|
|
463
|
+
| **Concurrent Operations** | 100-200 | Prevent resource contention |
|
|
464
|
+
| **Testing** | 1000+ | Simulate slow connections |
|
|
465
|
+
| **No Rate Limits** | 0 | Maximum speed |
|
|
466
|
+
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
## Connection Path
|
|
470
|
+
|
|
471
|
+
Specify which connection to paginate when multiple exist:
|
|
472
|
+
|
|
473
|
+
### Auto-Detection (Default)
|
|
474
|
+
|
|
475
|
+
```typescript
|
|
476
|
+
// SDK automatically finds first connection
|
|
477
|
+
const result = await client.graphql({
|
|
478
|
+
query: `
|
|
479
|
+
query GetData($first: Int!, $after: String) {
|
|
480
|
+
items(first: $first, after: $after) {
|
|
481
|
+
edges { node { id ref } cursor }
|
|
482
|
+
pageInfo { hasNextPage }
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
`,
|
|
486
|
+
variables: { first: 100 }
|
|
487
|
+
// connectionPath not needed - only one connection
|
|
488
|
+
});
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
### Explicit Path (Multiple Connections)
|
|
492
|
+
|
|
493
|
+
```typescript
|
|
494
|
+
// Multiple connections - must specify which to paginate
|
|
495
|
+
const result = await client.graphql({
|
|
496
|
+
query: `
|
|
497
|
+
query GetMultiple($first: Int!, $after: String) {
|
|
498
|
+
locations(first: $first, after: $after) {
|
|
499
|
+
edges { node { id ref name type } cursor }
|
|
500
|
+
pageInfo { hasNextPage }
|
|
501
|
+
}
|
|
502
|
+
products(first: $first, after: $after) {
|
|
503
|
+
edges { node { id ref type gtin } cursor }
|
|
504
|
+
pageInfo { hasNextPage }
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
`,
|
|
508
|
+
variables: { first: 100 },
|
|
509
|
+
pagination: {
|
|
510
|
+
connectionPath: 'locations' // Paginate locations only
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
### Nested Connection Path
|
|
516
|
+
|
|
517
|
+
```typescript
|
|
518
|
+
// Paginate nested connection
|
|
519
|
+
const result = await client.graphql({
|
|
520
|
+
query: `
|
|
521
|
+
query GetOrder($orderId: ID!, $first: Int!, $after: String) {
|
|
522
|
+
order(id: $orderId) {
|
|
523
|
+
id
|
|
524
|
+
ref
|
|
525
|
+
items(first: $first, after: $after) {
|
|
526
|
+
edges { node { id ref productRef quantity } cursor }
|
|
527
|
+
pageInfo { hasNextPage }
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
`,
|
|
532
|
+
variables: { orderId: 'ORDER123', first: 50 },
|
|
533
|
+
pagination: {
|
|
534
|
+
connectionPath: 'order.items', // Dot notation for nested
|
|
535
|
+
maxPages: 20
|
|
536
|
+
}
|
|
537
|
+
});
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
---
|
|
541
|
+
|
|
542
|
+
## Abort Signal
|
|
543
|
+
|
|
544
|
+
Cancel pagination programmatically:
|
|
545
|
+
|
|
546
|
+
```typescript
|
|
547
|
+
const controller = new AbortController();
|
|
548
|
+
|
|
549
|
+
// Start pagination
|
|
550
|
+
const paginationPromise = client.graphql({
|
|
551
|
+
query,
|
|
552
|
+
variables: { first: 100 },
|
|
553
|
+
pagination: {
|
|
554
|
+
maxPages: 1000,
|
|
555
|
+
abortSignal: controller.signal
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
// Cancel after 10 seconds
|
|
560
|
+
setTimeout(() => {
|
|
561
|
+
console.log('⏱️ Timeout reached, aborting pagination...');
|
|
562
|
+
controller.abort();
|
|
563
|
+
}, 10000);
|
|
564
|
+
|
|
565
|
+
try {
|
|
566
|
+
const result = await paginationPromise;
|
|
567
|
+
} catch (error) {
|
|
568
|
+
if (error.name === 'AbortError') {
|
|
569
|
+
console.log('✅ Pagination aborted successfully');
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
---
|
|
575
|
+
|
|
576
|
+
## Performance Tuning Guide
|
|
577
|
+
|
|
578
|
+
### Scenario 1: Maximum Speed
|
|
579
|
+
|
|
580
|
+
```typescript
|
|
581
|
+
// Goal: Fetch as fast as possible
|
|
582
|
+
pagination: {
|
|
583
|
+
maxPages: 500, // High limit
|
|
584
|
+
maxRecords: 50000, // High limit
|
|
585
|
+
timeoutMs: 600000, // 10 minutes
|
|
586
|
+
delayMs: 0 // No delays!
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
variables: {
|
|
590
|
+
first: 200 // Large pages
|
|
591
|
+
}
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
### Scenario 2: Maximum Safety
|
|
595
|
+
|
|
596
|
+
```typescript
|
|
597
|
+
// Goal: Conservative, fail-safe operation
|
|
598
|
+
pagination: {
|
|
599
|
+
maxPages: 20, // Low limit
|
|
600
|
+
maxRecords: 2000, // Low limit
|
|
601
|
+
timeoutMs: 30000, // 30 seconds
|
|
602
|
+
delayMs: 100, // Small delays
|
|
603
|
+
onWarning: (msg) => console.warn(msg)
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
variables: {
|
|
607
|
+
first: 50 // Small pages
|
|
608
|
+
}
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
### Scenario 3: Background Job
|
|
612
|
+
|
|
613
|
+
```typescript
|
|
614
|
+
// Goal: Thorough, scheduled task
|
|
615
|
+
pagination: {
|
|
616
|
+
maxPages: 200,
|
|
617
|
+
maxRecords: 20000,
|
|
618
|
+
timeoutMs: 600000, // 10 minutes
|
|
619
|
+
delayMs: 50,
|
|
620
|
+
onProgress: (page, records) => {
|
|
621
|
+
if (page % 25 === 0) {
|
|
622
|
+
console.log(`Progress: ${records} records`);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
variables: {
|
|
628
|
+
first: 100
|
|
629
|
+
}
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
### Scenario 4: User-Facing API
|
|
633
|
+
|
|
634
|
+
```typescript
|
|
635
|
+
// Goal: Fast response for UI
|
|
636
|
+
pagination: {
|
|
637
|
+
maxPages: 10, // Quick return
|
|
638
|
+
maxRecords: 1000,
|
|
639
|
+
timeoutMs: 5000, // 5 seconds max
|
|
640
|
+
delayMs: 0
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
variables: {
|
|
644
|
+
first: 100
|
|
645
|
+
}
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
---
|
|
649
|
+
|
|
650
|
+
## Configuration Patterns
|
|
651
|
+
|
|
652
|
+
### Pattern 1: Progressive Loading with Checkpoints
|
|
653
|
+
|
|
654
|
+
```typescript
|
|
655
|
+
const checkpoint = { page: 0, records: 0 };
|
|
656
|
+
|
|
657
|
+
const result = await client.graphql({
|
|
658
|
+
query,
|
|
659
|
+
variables: { first: 100 },
|
|
660
|
+
pagination: {
|
|
661
|
+
maxPages: 100,
|
|
662
|
+
onProgress: (page, records) => {
|
|
663
|
+
checkpoint.page = page;
|
|
664
|
+
checkpoint.records = records;
|
|
665
|
+
|
|
666
|
+
// Save checkpoint every 10 pages
|
|
667
|
+
if (page % 10 === 0) {
|
|
668
|
+
fs.writeFileSync('checkpoint.json', JSON.stringify(checkpoint));
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
});
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
### Pattern 2: Adaptive Rate Limiting
|
|
676
|
+
|
|
677
|
+
```typescript
|
|
678
|
+
let delayMs = 0;
|
|
679
|
+
const warnings: string[] = [];
|
|
680
|
+
|
|
681
|
+
const result = await client.graphql({
|
|
682
|
+
query,
|
|
683
|
+
variables: { first: 100 },
|
|
684
|
+
pagination: {
|
|
685
|
+
maxPages: 100,
|
|
686
|
+
delayMs,
|
|
687
|
+
onWarning: (message) => {
|
|
688
|
+
warnings.push(message);
|
|
689
|
+
|
|
690
|
+
// Increase delay if getting warnings
|
|
691
|
+
if (warnings.length > 5) {
|
|
692
|
+
delayMs += 100;
|
|
693
|
+
console.log(`⚠️ Increasing delay to ${delayMs}ms due to warnings`);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
});
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
### Pattern 3: Time-Budgeted Pagination
|
|
701
|
+
|
|
702
|
+
```typescript
|
|
703
|
+
const timeBudgetMs = 60000; // 1 minute budget
|
|
704
|
+
const startTime = Date.now();
|
|
705
|
+
|
|
706
|
+
const result = await client.graphql({
|
|
707
|
+
query,
|
|
708
|
+
variables: { first: 100 },
|
|
709
|
+
pagination: {
|
|
710
|
+
timeoutMs: timeBudgetMs,
|
|
711
|
+
maxRecords: 10000,
|
|
712
|
+
onProgress: (page, records) => {
|
|
713
|
+
const elapsed = Date.now() - startTime;
|
|
714
|
+
const remainingTime = timeBudgetMs - elapsed;
|
|
715
|
+
console.log(`⏱️ Remaining time: ${(remainingTime / 1000).toFixed(1)}s`);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
});
|
|
719
|
+
|
|
720
|
+
if (result.extensions.autoPagination.truncated &&
|
|
721
|
+
result.extensions.autoPagination.truncationReason === 'timeout') {
|
|
722
|
+
console.log('⏰ Time budget exhausted - consider increasing timeout or page size');
|
|
723
|
+
}
|
|
724
|
+
```
|
|
725
|
+
|
|
726
|
+
---
|
|
727
|
+
|
|
728
|
+
## Summary: Quick Configuration Guide
|
|
729
|
+
|
|
730
|
+
| Entity Type | first | maxPages | maxRecords | timeoutMs | delayMs |
|
|
731
|
+
|-------------|-------|----------|------------|-----------|---------|
|
|
732
|
+
| Simple (positions, locations) | 150 | 100 | 15000 | 120000 | 0 |
|
|
733
|
+
| Medium (products, categories) | 75 | 50 | 5000 | 180000 | 0-50 |
|
|
734
|
+
| Complex (orders with items) | 20 | 30 | 1000 | 240000 | 100 |
|
|
735
|
+
| Testing/Dev | 50 | 5 | 500 | 10000 | 0 |
|
|
736
|
+
| Production Export | 100 | 100 | 10000 | 300000 | 0 |
|
|
737
|
+
| Background Job | 100 | 200 | 20000 | 600000 | 50 |
|
|
738
|
+
| User-Facing API | 100 | 10 | 1000 | 5000 | 0 |
|
|
739
|
+
|
|
740
|
+
---
|
|
741
|
+
|
|
742
|
+
## Next Steps
|
|
743
|
+
|
|
744
|
+
Now that you've mastered configuration, explore advanced query patterns:
|
|
745
|
+
|
|
746
|
+
**Continue to:** [Module 4: Advanced Patterns →](./auto-pagination-04-advanced-patterns.md)
|
|
747
|
+
|
|
748
|
+
Or dive deeper:
|
|
749
|
+
- [Module 5: SDK Integration](./auto-pagination-05-sdk-integration.md) - Combine with other services
|
|
750
|
+
- [Module 6: Troubleshooting](./auto-pagination-06-troubleshooting.md) - Fix common issues
|
|
751
|
+
|
|
752
|
+
---
|
|
753
|
+
|
|
754
|
+
[← Back to Index](../../advanced-services/advanced-services-readme.md) | [← Previous: Quick Start](./auto-pagination-02-quick-start.md) | [Next: Advanced Patterns →](./auto-pagination-04-advanced-patterns.md)
|