@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,513 +1,513 @@
|
|
|
1
|
-
# Module 08: Pagination
|
|
2
|
-
|
|
3
|
-
**Level:** Intermediate
|
|
4
|
-
**Category:** GraphQL Query Patterns
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
Cursor-based pagination is essential for efficiently querying large datasets from Fluent Commerce GraphQL API. This module covers auto-pagination configuration, cursor handling, pageInfo management, and best practices for processing millions of records without memory exhaustion or timeouts.
|
|
9
|
-
|
|
10
|
-
## Table of Contents
|
|
11
|
-
|
|
12
|
-
- [Why Pagination](#why-pagination)
|
|
13
|
-
- [Relay Connection Specification](#relay-connection-specification)
|
|
14
|
-
- [Auto-Pagination Configuration](#auto-pagination-configuration)
|
|
15
|
-
- [Manual Pagination](#manual-pagination)
|
|
16
|
-
- [Cursor Handling](#cursor-handling)
|
|
17
|
-
- [pageInfo Management](#pageinfo-management)
|
|
18
|
-
- [Performance Considerations](#performance-considerations)
|
|
19
|
-
- [Best Practices](#best-practices)
|
|
20
|
-
- [Common Patterns](#common-patterns)
|
|
21
|
-
- [Troubleshooting](#troubleshooting)
|
|
22
|
-
- [See Also](#see-also)
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## Why Pagination
|
|
27
|
-
|
|
28
|
-
Fluent Commerce APIs can return millions of records. Without pagination:
|
|
29
|
-
|
|
30
|
-
| Problem | Impact |
|
|
31
|
-
|---------|--------|
|
|
32
|
-
| API Timeouts | Requests fail after 30-60 seconds |
|
|
33
|
-
| Memory Exhaustion | Node.js/Deno runs out of memory |
|
|
34
|
-
| Slow Responses | Minutes to return data |
|
|
35
|
-
| Network Overhead | Multi-MB responses block network |
|
|
36
|
-
|
|
37
|
-
**With Pagination:**
|
|
38
|
-
- Fast response times (<1 second per page)
|
|
39
|
-
- Memory efficient (process chunks)
|
|
40
|
-
- Fault tolerant (resume from cursor)
|
|
41
|
-
- Rate limit friendly
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
## Relay Connection Specification
|
|
46
|
-
|
|
47
|
-
Fluent Commerce implements the Relay Connection Specification:
|
|
48
|
-
|
|
49
|
-
```graphql
|
|
50
|
-
type Query {
|
|
51
|
-
inventoryPositions(first: Int, after: String): InventoryPositionConnection
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
type InventoryPositionConnection {
|
|
55
|
-
edges: [InventoryPositionEdge!]!
|
|
56
|
-
pageInfo: PageInfo!
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
type InventoryPositionEdge {
|
|
60
|
-
node: InventoryPosition!
|
|
61
|
-
cursor: String!
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
type PageInfo {
|
|
65
|
-
hasNextPage: Boolean!
|
|
66
|
-
hasPreviousPage: Boolean!
|
|
67
|
-
startCursor: String
|
|
68
|
-
endCursor: String
|
|
69
|
-
}
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
**Key Concepts:**
|
|
73
|
-
- **edges**: Array of edge objects (each contains node + cursor)
|
|
74
|
-
- **node**: The actual data record
|
|
75
|
-
- **cursor**: Opaque string for resuming pagination
|
|
76
|
-
- **pageInfo**: Metadata about pagination state
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## Auto-Pagination Configuration
|
|
81
|
-
|
|
82
|
-
The SDK provides automatic pagination via `FluentClient.graphql()`:
|
|
83
|
-
|
|
84
|
-
```typescript
|
|
85
|
-
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
86
|
-
|
|
87
|
-
const client = await createClient({ config });
|
|
88
|
-
|
|
89
|
-
// Auto-paginate through all results
|
|
90
|
-
const results = await client.graphql({
|
|
91
|
-
query: `
|
|
92
|
-
query GetPositions($first: Int, $after: String) {
|
|
93
|
-
inventoryPositions(first: $first, after: $after) {
|
|
94
|
-
edges {
|
|
95
|
-
node {
|
|
96
|
-
id
|
|
97
|
-
ref
|
|
98
|
-
onHand
|
|
99
|
-
productRef
|
|
100
|
-
locationRef
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
pageInfo {
|
|
104
|
-
hasNextPage
|
|
105
|
-
endCursor
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
`,
|
|
110
|
-
pagination: {
|
|
111
|
-
pageSize: 100, // Records per page (default: 100)
|
|
112
|
-
maxPages: 50, // Stop after N pages (default: Infinity)
|
|
113
|
-
delayMs: 100 // Delay between pages (default: 0)
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
// Results automatically combined from all pages
|
|
118
|
-
console.log(`Fetched ${results.data.inventoryPositions.edges.length} positions`);
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
**Configuration Options:**
|
|
122
|
-
|
|
123
|
-
| Option | Type | Default | Description |
|
|
124
|
-
|--------|------|---------|-------------|
|
|
125
|
-
| `pageSize` | number | 100 | Number of records per page (max 250) |
|
|
126
|
-
| `maxPages` | number | Infinity | Stop after N pages |
|
|
127
|
-
| `delayMs` | number | 0 | Milliseconds to wait between pages |
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
## Manual Pagination
|
|
132
|
-
|
|
133
|
-
For more control, implement pagination manually:
|
|
134
|
-
|
|
135
|
-
```typescript
|
|
136
|
-
async function* paginateResults(client, query, variables = {}) {
|
|
137
|
-
let hasNextPage = true;
|
|
138
|
-
let cursor = null;
|
|
139
|
-
|
|
140
|
-
while (hasNextPage) {
|
|
141
|
-
const result = await client.graphql({
|
|
142
|
-
query,
|
|
143
|
-
variables: {
|
|
144
|
-
...variables,
|
|
145
|
-
first: 100,
|
|
146
|
-
after: cursor
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
const connection = result.data.inventoryPositions;
|
|
151
|
-
|
|
152
|
-
// Yield current page
|
|
153
|
-
yield connection.edges.map(e => e.node);
|
|
154
|
-
|
|
155
|
-
// Update pagination state
|
|
156
|
-
hasNextPage = connection.pageInfo.hasNextPage;
|
|
157
|
-
cursor = connection.pageInfo.endCursor;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Usage: Process one page at a time
|
|
162
|
-
for await (const page of paginateResults(client, query)) {
|
|
163
|
-
console.log(`Processing ${page.length} records`);
|
|
164
|
-
// Process records in chunks
|
|
165
|
-
}
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
**Benefits of Manual Pagination:**
|
|
169
|
-
- Process each page before fetching next
|
|
170
|
-
- Lower memory footprint
|
|
171
|
-
- Can pause/resume between pages
|
|
172
|
-
- Better error handling per page
|
|
173
|
-
|
|
174
|
-
---
|
|
175
|
-
|
|
176
|
-
## Cursor Handling
|
|
177
|
-
|
|
178
|
-
**Cursor Characteristics:**
|
|
179
|
-
- Opaque strings (do not parse)
|
|
180
|
-
- Base64-encoded (implementation detail)
|
|
181
|
-
- Connection-specific (don't reuse across queries)
|
|
182
|
-
- Stable (same cursor returns same position)
|
|
183
|
-
|
|
184
|
-
```typescript
|
|
185
|
-
// ✅ CORRECT: Use cursors as-is
|
|
186
|
-
let cursor = pageInfo.endCursor;
|
|
187
|
-
await client.graphql({
|
|
188
|
-
query,
|
|
189
|
-
variables: { first: 100, after: cursor }
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
// ❌ WRONG: Don't parse or manipulate
|
|
193
|
-
const decoded = Buffer.from(cursor, 'base64').toString(); // Don't do this!
|
|
194
|
-
cursor = cursor.substring(0, 10); // Don't truncate!
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
**Cursor Storage:**
|
|
198
|
-
|
|
199
|
-
```typescript
|
|
200
|
-
// Save cursor for resumability
|
|
201
|
-
const stateService = new StateService(kvAdapter);
|
|
202
|
-
|
|
203
|
-
let cursor = await stateService.get('last_cursor');
|
|
204
|
-
while (hasNextPage) {
|
|
205
|
-
const result = await client.graphql({
|
|
206
|
-
query,
|
|
207
|
-
variables: { first: 100, after: cursor }
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
// Process page...
|
|
211
|
-
|
|
212
|
-
cursor = result.data.inventoryPositions.pageInfo.endCursor;
|
|
213
|
-
await stateService.set('last_cursor', cursor); // Checkpoint
|
|
214
|
-
}
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
---
|
|
218
|
-
|
|
219
|
-
## pageInfo Management
|
|
220
|
-
|
|
221
|
-
The `pageInfo` object controls pagination flow:
|
|
222
|
-
|
|
223
|
-
```typescript
|
|
224
|
-
interface PageInfo {
|
|
225
|
-
hasNextPage: boolean; // More pages available?
|
|
226
|
-
hasPreviousPage: boolean; // Can paginate backwards?
|
|
227
|
-
startCursor: string | null; // First cursor in page
|
|
228
|
-
endCursor: string | null; // Last cursor in page
|
|
229
|
-
}
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
**Forward Pagination:**
|
|
233
|
-
```typescript
|
|
234
|
-
// Use endCursor + hasNextPage
|
|
235
|
-
while (pageInfo.hasNextPage) {
|
|
236
|
-
const result = await client.graphql({
|
|
237
|
-
query,
|
|
238
|
-
variables: { first: 100, after: pageInfo.endCursor }
|
|
239
|
-
});
|
|
240
|
-
pageInfo = result.data.connection.pageInfo;
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
**Backward Pagination:**
|
|
245
|
-
```typescript
|
|
246
|
-
// Use startCursor + hasPreviousPage
|
|
247
|
-
while (pageInfo.hasPreviousPage) {
|
|
248
|
-
const result = await client.graphql({
|
|
249
|
-
query,
|
|
250
|
-
variables: { last: 100, before: pageInfo.startCursor }
|
|
251
|
-
});
|
|
252
|
-
pageInfo = result.data.connection.pageInfo;
|
|
253
|
-
}
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
## Performance Considerations
|
|
259
|
-
|
|
260
|
-
### Page Size Selection
|
|
261
|
-
|
|
262
|
-
| Page Size | Use Case | Pros | Cons |
|
|
263
|
-
|-----------|----------|------|------|
|
|
264
|
-
| 25-50 | Real-time UI | Fast response | Many requests |
|
|
265
|
-
| 100 | Balanced (default) | Good throughput | Moderate memory |
|
|
266
|
-
| 250 | Batch processing | Fewer requests | Higher memory |
|
|
267
|
-
|
|
268
|
-
```typescript
|
|
269
|
-
// Small pages for UI responsiveness
|
|
270
|
-
const results = await client.graphql({
|
|
271
|
-
query,
|
|
272
|
-
pagination: { pageSize: 25 } // Fast initial render
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
// Large pages for bulk ETL
|
|
276
|
-
const results = await client.graphql({
|
|
277
|
-
query,
|
|
278
|
-
pagination: { pageSize: 250, delayMs: 500 } // Respect rate limits
|
|
279
|
-
});
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
### Rate Limiting
|
|
283
|
-
|
|
284
|
-
Add delays between pages to avoid rate limits:
|
|
285
|
-
|
|
286
|
-
```typescript
|
|
287
|
-
const results = await client.graphql({
|
|
288
|
-
query,
|
|
289
|
-
pagination: {
|
|
290
|
-
pageSize: 250,
|
|
291
|
-
delayMs: 500 // 500ms delay between pages
|
|
292
|
-
}
|
|
293
|
-
});
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
### Memory Management
|
|
297
|
-
|
|
298
|
-
Process pages individually for large datasets:
|
|
299
|
-
|
|
300
|
-
```typescript
|
|
301
|
-
async function processLargeDataset(client, query) {
|
|
302
|
-
for await (const page of paginateResults(client, query)) {
|
|
303
|
-
// Process and discard each page
|
|
304
|
-
await processBatch(page);
|
|
305
|
-
// page is garbage collected after iteration
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
---
|
|
311
|
-
|
|
312
|
-
## Best Practices
|
|
313
|
-
|
|
314
|
-
### 1. Always Include pageInfo
|
|
315
|
-
|
|
316
|
-
```typescript
|
|
317
|
-
// ✅ CORRECT: Include pageInfo
|
|
318
|
-
query GetPositions($first: Int, $after: String) {
|
|
319
|
-
inventoryPositions(first: $first, after: $after) {
|
|
320
|
-
edges { node { id ref } }
|
|
321
|
-
pageInfo { hasNextPage endCursor } # Required!
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
// ❌ WRONG: Missing pageInfo
|
|
326
|
-
query GetPositions {
|
|
327
|
-
inventoryPositions {
|
|
328
|
-
edges { node { id ref } }
|
|
329
|
-
# Can't paginate without pageInfo!
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
### 2. Use Variables for Pagination
|
|
335
|
-
|
|
336
|
-
```typescript
|
|
337
|
-
// ✅ CORRECT: Parameterized pagination
|
|
338
|
-
query GetPositions($first: Int, $after: String) {
|
|
339
|
-
inventoryPositions(first: $first, after: $after) { ... }
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// ❌ WRONG: Hardcoded values
|
|
343
|
-
query GetPositions {
|
|
344
|
-
inventoryPositions(first: 100, after: "xyz") { ... }
|
|
345
|
-
}
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
### 3. Handle Empty Pages
|
|
349
|
-
|
|
350
|
-
```typescript
|
|
351
|
-
const result = await client.graphql({ query, variables });
|
|
352
|
-
|
|
353
|
-
if (result.data.inventoryPositions.edges.length === 0) {
|
|
354
|
-
console.log('No results found');
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// Process results...
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
### 4. Implement Timeouts
|
|
362
|
-
|
|
363
|
-
```typescript
|
|
364
|
-
const TIMEOUT_MS = 30000; // 30 seconds
|
|
365
|
-
|
|
366
|
-
const controller = new AbortController();
|
|
367
|
-
const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
368
|
-
|
|
369
|
-
try {
|
|
370
|
-
const result = await client.graphql({
|
|
371
|
-
query,
|
|
372
|
-
variables,
|
|
373
|
-
signal: controller.signal
|
|
374
|
-
});
|
|
375
|
-
} finally {
|
|
376
|
-
clearTimeout(timeout);
|
|
377
|
-
}
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
---
|
|
381
|
-
|
|
382
|
-
## Common Patterns
|
|
383
|
-
|
|
384
|
-
### Pattern 1: Full Dataset Export
|
|
385
|
-
|
|
386
|
-
```typescript
|
|
387
|
-
async function exportAllPositions(client) {
|
|
388
|
-
const allRecords = [];
|
|
389
|
-
|
|
390
|
-
for await (const page of paginateResults(client, query)) {
|
|
391
|
-
allRecords.push(...page);
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
return allRecords;
|
|
395
|
-
}
|
|
396
|
-
```
|
|
397
|
-
|
|
398
|
-
### Pattern 2: Streaming to File
|
|
399
|
-
|
|
400
|
-
```typescript
|
|
401
|
-
import { createWriteStream } from 'fs';
|
|
402
|
-
|
|
403
|
-
async function streamToCSV(client, outputPath) {
|
|
404
|
-
const writer = createWriteStream(outputPath);
|
|
405
|
-
writer.write('ref,onHand,productRef,locationRef\n');
|
|
406
|
-
|
|
407
|
-
for await (const page of paginateResults(client, query)) {
|
|
408
|
-
for (const record of page) {
|
|
409
|
-
writer.write(`${record.ref},${record.onHand},${record.productRef},${record.locationRef}\n`);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
writer.end();
|
|
414
|
-
}
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
### Pattern 3: Progress Tracking
|
|
418
|
-
|
|
419
|
-
```typescript
|
|
420
|
-
async function fetchWithProgress(client, query) {
|
|
421
|
-
let totalFetched = 0;
|
|
422
|
-
let pageNum = 0;
|
|
423
|
-
|
|
424
|
-
for await (const page of paginateResults(client, query)) {
|
|
425
|
-
totalFetched += page.length;
|
|
426
|
-
pageNum++;
|
|
427
|
-
console.log(`Page ${pageNum}: ${totalFetched} records fetched`);
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
return totalFetched;
|
|
431
|
-
}
|
|
432
|
-
```
|
|
433
|
-
|
|
434
|
-
---
|
|
435
|
-
|
|
436
|
-
## Troubleshooting
|
|
437
|
-
|
|
438
|
-
### Issue 1: Pagination Never Stops
|
|
439
|
-
|
|
440
|
-
**Symptom:** Loop runs forever despite data being exhausted
|
|
441
|
-
|
|
442
|
-
**Cause:** Not checking `hasNextPage`
|
|
443
|
-
|
|
444
|
-
**Solution:**
|
|
445
|
-
```typescript
|
|
446
|
-
// ✅ Check hasNextPage
|
|
447
|
-
while (pageInfo.hasNextPage) {
|
|
448
|
-
// Fetch next page...
|
|
449
|
-
}
|
|
450
|
-
```
|
|
451
|
-
|
|
452
|
-
### Issue 2: Duplicate Records
|
|
453
|
-
|
|
454
|
-
**Symptom:** Same records appear multiple times
|
|
455
|
-
|
|
456
|
-
**Cause:** Not using cursor correctly
|
|
457
|
-
|
|
458
|
-
**Solution:**
|
|
459
|
-
```typescript
|
|
460
|
-
// ✅ Always pass endCursor from previous page
|
|
461
|
-
cursor = result.data.connection.pageInfo.endCursor;
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
### Issue 3: Missing Records
|
|
465
|
-
|
|
466
|
-
**Symptom:** Some records not fetched
|
|
467
|
-
|
|
468
|
-
**Cause:** Starting with wrong cursor
|
|
469
|
-
|
|
470
|
-
**Solution:**
|
|
471
|
-
```typescript
|
|
472
|
-
// ✅ Start with null cursor
|
|
473
|
-
let cursor = null; // Start from beginning
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
### Issue 4: Memory Leak
|
|
477
|
-
|
|
478
|
-
**Symptom:** Memory usage grows indefinitely
|
|
479
|
-
|
|
480
|
-
**Cause:** Accumulating all pages in memory
|
|
481
|
-
|
|
482
|
-
**Solution:**
|
|
483
|
-
```typescript
|
|
484
|
-
// ✅ Process pages individually
|
|
485
|
-
for await (const page of paginateResults(client, query)) {
|
|
486
|
-
await processBatch(page);
|
|
487
|
-
// page is discarded after iteration
|
|
488
|
-
}
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
---
|
|
492
|
-
|
|
493
|
-
## See Also
|
|
494
|
-
|
|
495
|
-
**Related Modules:**
|
|
496
|
-
- [Module 01: Client API](./api-reference-01-client-api.md) - FluentClient GraphQL methods
|
|
497
|
-
- [Module 05: Services](./api-reference-05-services.md) - ExtractionOrchestrator with auto-pagination
|
|
498
|
-
- [Auto-Pagination Guide](../../auto-pagination/modules/auto-pagination-01-foundations.md) - Deep dive into pagination
|
|
499
|
-
|
|
500
|
-
**Complete Guides:**
|
|
501
|
-
- [Auto-Pagination Module Series](../../auto-pagination/modules/readme.md) - 7-module learning path
|
|
502
|
-
- [Extraction Guide](../../extraction/extraction-readme.md) - Large dataset exports
|
|
503
|
-
- [GraphQL Best Practices](../../00-START-HERE/getting-started.md#graphql-queries)
|
|
504
|
-
|
|
505
|
-
**Templates:**
|
|
506
|
-
- [GraphQL Extraction Templates](../../../01-TEMPLATES/versori/workflows/extraction/graphql-queries/) - Production examples
|
|
507
|
-
|
|
508
|
-
---
|
|
509
|
-
|
|
510
|
-
**Navigation:**
|
|
511
|
-
- [Back to Module List](./readme.md)
|
|
512
|
-
- [Previous: Module 07 - Parsers](./api-reference-07-parsers.md)
|
|
513
|
-
- [Next: Module 09 - Webhook Validation](./api-reference-09-webhook-validation.md)
|
|
1
|
+
# Module 08: Pagination
|
|
2
|
+
|
|
3
|
+
**Level:** Intermediate
|
|
4
|
+
**Category:** GraphQL Query Patterns
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
Cursor-based pagination is essential for efficiently querying large datasets from Fluent Commerce GraphQL API. This module covers auto-pagination configuration, cursor handling, pageInfo management, and best practices for processing millions of records without memory exhaustion or timeouts.
|
|
9
|
+
|
|
10
|
+
## Table of Contents
|
|
11
|
+
|
|
12
|
+
- [Why Pagination](#why-pagination)
|
|
13
|
+
- [Relay Connection Specification](#relay-connection-specification)
|
|
14
|
+
- [Auto-Pagination Configuration](#auto-pagination-configuration)
|
|
15
|
+
- [Manual Pagination](#manual-pagination)
|
|
16
|
+
- [Cursor Handling](#cursor-handling)
|
|
17
|
+
- [pageInfo Management](#pageinfo-management)
|
|
18
|
+
- [Performance Considerations](#performance-considerations)
|
|
19
|
+
- [Best Practices](#best-practices)
|
|
20
|
+
- [Common Patterns](#common-patterns)
|
|
21
|
+
- [Troubleshooting](#troubleshooting)
|
|
22
|
+
- [See Also](#see-also)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Why Pagination
|
|
27
|
+
|
|
28
|
+
Fluent Commerce APIs can return millions of records. Without pagination:
|
|
29
|
+
|
|
30
|
+
| Problem | Impact |
|
|
31
|
+
|---------|--------|
|
|
32
|
+
| API Timeouts | Requests fail after 30-60 seconds |
|
|
33
|
+
| Memory Exhaustion | Node.js/Deno runs out of memory |
|
|
34
|
+
| Slow Responses | Minutes to return data |
|
|
35
|
+
| Network Overhead | Multi-MB responses block network |
|
|
36
|
+
|
|
37
|
+
**With Pagination:**
|
|
38
|
+
- Fast response times (<1 second per page)
|
|
39
|
+
- Memory efficient (process chunks)
|
|
40
|
+
- Fault tolerant (resume from cursor)
|
|
41
|
+
- Rate limit friendly
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Relay Connection Specification
|
|
46
|
+
|
|
47
|
+
Fluent Commerce implements the Relay Connection Specification:
|
|
48
|
+
|
|
49
|
+
```graphql
|
|
50
|
+
type Query {
|
|
51
|
+
inventoryPositions(first: Int, after: String): InventoryPositionConnection
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
type InventoryPositionConnection {
|
|
55
|
+
edges: [InventoryPositionEdge!]!
|
|
56
|
+
pageInfo: PageInfo!
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
type InventoryPositionEdge {
|
|
60
|
+
node: InventoryPosition!
|
|
61
|
+
cursor: String!
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
type PageInfo {
|
|
65
|
+
hasNextPage: Boolean!
|
|
66
|
+
hasPreviousPage: Boolean!
|
|
67
|
+
startCursor: String
|
|
68
|
+
endCursor: String
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Key Concepts:**
|
|
73
|
+
- **edges**: Array of edge objects (each contains node + cursor)
|
|
74
|
+
- **node**: The actual data record
|
|
75
|
+
- **cursor**: Opaque string for resuming pagination
|
|
76
|
+
- **pageInfo**: Metadata about pagination state
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Auto-Pagination Configuration
|
|
81
|
+
|
|
82
|
+
The SDK provides automatic pagination via `FluentClient.graphql()`:
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
86
|
+
|
|
87
|
+
const client = await createClient({ config });
|
|
88
|
+
|
|
89
|
+
// Auto-paginate through all results
|
|
90
|
+
const results = await client.graphql({
|
|
91
|
+
query: `
|
|
92
|
+
query GetPositions($first: Int, $after: String) {
|
|
93
|
+
inventoryPositions(first: $first, after: $after) {
|
|
94
|
+
edges {
|
|
95
|
+
node {
|
|
96
|
+
id
|
|
97
|
+
ref
|
|
98
|
+
onHand
|
|
99
|
+
productRef
|
|
100
|
+
locationRef
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
pageInfo {
|
|
104
|
+
hasNextPage
|
|
105
|
+
endCursor
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
`,
|
|
110
|
+
pagination: {
|
|
111
|
+
pageSize: 100, // Records per page (default: 100)
|
|
112
|
+
maxPages: 50, // Stop after N pages (default: Infinity)
|
|
113
|
+
delayMs: 100 // Delay between pages (default: 0)
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// Results automatically combined from all pages
|
|
118
|
+
console.log(`Fetched ${results.data.inventoryPositions.edges.length} positions`);
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Configuration Options:**
|
|
122
|
+
|
|
123
|
+
| Option | Type | Default | Description |
|
|
124
|
+
|--------|------|---------|-------------|
|
|
125
|
+
| `pageSize` | number | 100 | Number of records per page (max 250) |
|
|
126
|
+
| `maxPages` | number | Infinity | Stop after N pages |
|
|
127
|
+
| `delayMs` | number | 0 | Milliseconds to wait between pages |
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Manual Pagination
|
|
132
|
+
|
|
133
|
+
For more control, implement pagination manually:
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
async function* paginateResults(client, query, variables = {}) {
|
|
137
|
+
let hasNextPage = true;
|
|
138
|
+
let cursor = null;
|
|
139
|
+
|
|
140
|
+
while (hasNextPage) {
|
|
141
|
+
const result = await client.graphql({
|
|
142
|
+
query,
|
|
143
|
+
variables: {
|
|
144
|
+
...variables,
|
|
145
|
+
first: 100,
|
|
146
|
+
after: cursor
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
const connection = result.data.inventoryPositions;
|
|
151
|
+
|
|
152
|
+
// Yield current page
|
|
153
|
+
yield connection.edges.map(e => e.node);
|
|
154
|
+
|
|
155
|
+
// Update pagination state
|
|
156
|
+
hasNextPage = connection.pageInfo.hasNextPage;
|
|
157
|
+
cursor = connection.pageInfo.endCursor;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Usage: Process one page at a time
|
|
162
|
+
for await (const page of paginateResults(client, query)) {
|
|
163
|
+
console.log(`Processing ${page.length} records`);
|
|
164
|
+
// Process records in chunks
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**Benefits of Manual Pagination:**
|
|
169
|
+
- Process each page before fetching next
|
|
170
|
+
- Lower memory footprint
|
|
171
|
+
- Can pause/resume between pages
|
|
172
|
+
- Better error handling per page
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Cursor Handling
|
|
177
|
+
|
|
178
|
+
**Cursor Characteristics:**
|
|
179
|
+
- Opaque strings (do not parse)
|
|
180
|
+
- Base64-encoded (implementation detail)
|
|
181
|
+
- Connection-specific (don't reuse across queries)
|
|
182
|
+
- Stable (same cursor returns same position)
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
// ✅ CORRECT: Use cursors as-is
|
|
186
|
+
let cursor = pageInfo.endCursor;
|
|
187
|
+
await client.graphql({
|
|
188
|
+
query,
|
|
189
|
+
variables: { first: 100, after: cursor }
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
// ❌ WRONG: Don't parse or manipulate
|
|
193
|
+
const decoded = Buffer.from(cursor, 'base64').toString(); // Don't do this!
|
|
194
|
+
cursor = cursor.substring(0, 10); // Don't truncate!
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Cursor Storage:**
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
// Save cursor for resumability
|
|
201
|
+
const stateService = new StateService(kvAdapter);
|
|
202
|
+
|
|
203
|
+
let cursor = await stateService.get('last_cursor');
|
|
204
|
+
while (hasNextPage) {
|
|
205
|
+
const result = await client.graphql({
|
|
206
|
+
query,
|
|
207
|
+
variables: { first: 100, after: cursor }
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// Process page...
|
|
211
|
+
|
|
212
|
+
cursor = result.data.inventoryPositions.pageInfo.endCursor;
|
|
213
|
+
await stateService.set('last_cursor', cursor); // Checkpoint
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## pageInfo Management
|
|
220
|
+
|
|
221
|
+
The `pageInfo` object controls pagination flow:
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
interface PageInfo {
|
|
225
|
+
hasNextPage: boolean; // More pages available?
|
|
226
|
+
hasPreviousPage: boolean; // Can paginate backwards?
|
|
227
|
+
startCursor: string | null; // First cursor in page
|
|
228
|
+
endCursor: string | null; // Last cursor in page
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**Forward Pagination:**
|
|
233
|
+
```typescript
|
|
234
|
+
// Use endCursor + hasNextPage
|
|
235
|
+
while (pageInfo.hasNextPage) {
|
|
236
|
+
const result = await client.graphql({
|
|
237
|
+
query,
|
|
238
|
+
variables: { first: 100, after: pageInfo.endCursor }
|
|
239
|
+
});
|
|
240
|
+
pageInfo = result.data.connection.pageInfo;
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Backward Pagination:**
|
|
245
|
+
```typescript
|
|
246
|
+
// Use startCursor + hasPreviousPage
|
|
247
|
+
while (pageInfo.hasPreviousPage) {
|
|
248
|
+
const result = await client.graphql({
|
|
249
|
+
query,
|
|
250
|
+
variables: { last: 100, before: pageInfo.startCursor }
|
|
251
|
+
});
|
|
252
|
+
pageInfo = result.data.connection.pageInfo;
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Performance Considerations
|
|
259
|
+
|
|
260
|
+
### Page Size Selection
|
|
261
|
+
|
|
262
|
+
| Page Size | Use Case | Pros | Cons |
|
|
263
|
+
|-----------|----------|------|------|
|
|
264
|
+
| 25-50 | Real-time UI | Fast response | Many requests |
|
|
265
|
+
| 100 | Balanced (default) | Good throughput | Moderate memory |
|
|
266
|
+
| 250 | Batch processing | Fewer requests | Higher memory |
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
// Small pages for UI responsiveness
|
|
270
|
+
const results = await client.graphql({
|
|
271
|
+
query,
|
|
272
|
+
pagination: { pageSize: 25 } // Fast initial render
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
// Large pages for bulk ETL
|
|
276
|
+
const results = await client.graphql({
|
|
277
|
+
query,
|
|
278
|
+
pagination: { pageSize: 250, delayMs: 500 } // Respect rate limits
|
|
279
|
+
});
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Rate Limiting
|
|
283
|
+
|
|
284
|
+
Add delays between pages to avoid rate limits:
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
const results = await client.graphql({
|
|
288
|
+
query,
|
|
289
|
+
pagination: {
|
|
290
|
+
pageSize: 250,
|
|
291
|
+
delayMs: 500 // 500ms delay between pages
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Memory Management
|
|
297
|
+
|
|
298
|
+
Process pages individually for large datasets:
|
|
299
|
+
|
|
300
|
+
```typescript
|
|
301
|
+
async function processLargeDataset(client, query) {
|
|
302
|
+
for await (const page of paginateResults(client, query)) {
|
|
303
|
+
// Process and discard each page
|
|
304
|
+
await processBatch(page);
|
|
305
|
+
// page is garbage collected after iteration
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Best Practices
|
|
313
|
+
|
|
314
|
+
### 1. Always Include pageInfo
|
|
315
|
+
|
|
316
|
+
```typescript
|
|
317
|
+
// ✅ CORRECT: Include pageInfo
|
|
318
|
+
query GetPositions($first: Int, $after: String) {
|
|
319
|
+
inventoryPositions(first: $first, after: $after) {
|
|
320
|
+
edges { node { id ref } }
|
|
321
|
+
pageInfo { hasNextPage endCursor } # Required!
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// ❌ WRONG: Missing pageInfo
|
|
326
|
+
query GetPositions {
|
|
327
|
+
inventoryPositions {
|
|
328
|
+
edges { node { id ref } }
|
|
329
|
+
# Can't paginate without pageInfo!
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### 2. Use Variables for Pagination
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
// ✅ CORRECT: Parameterized pagination
|
|
338
|
+
query GetPositions($first: Int, $after: String) {
|
|
339
|
+
inventoryPositions(first: $first, after: $after) { ... }
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// ❌ WRONG: Hardcoded values
|
|
343
|
+
query GetPositions {
|
|
344
|
+
inventoryPositions(first: 100, after: "xyz") { ... }
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### 3. Handle Empty Pages
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
const result = await client.graphql({ query, variables });
|
|
352
|
+
|
|
353
|
+
if (result.data.inventoryPositions.edges.length === 0) {
|
|
354
|
+
console.log('No results found');
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Process results...
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### 4. Implement Timeouts
|
|
362
|
+
|
|
363
|
+
```typescript
|
|
364
|
+
const TIMEOUT_MS = 30000; // 30 seconds
|
|
365
|
+
|
|
366
|
+
const controller = new AbortController();
|
|
367
|
+
const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
368
|
+
|
|
369
|
+
try {
|
|
370
|
+
const result = await client.graphql({
|
|
371
|
+
query,
|
|
372
|
+
variables,
|
|
373
|
+
signal: controller.signal
|
|
374
|
+
});
|
|
375
|
+
} finally {
|
|
376
|
+
clearTimeout(timeout);
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## Common Patterns
|
|
383
|
+
|
|
384
|
+
### Pattern 1: Full Dataset Export
|
|
385
|
+
|
|
386
|
+
```typescript
|
|
387
|
+
async function exportAllPositions(client) {
|
|
388
|
+
const allRecords = [];
|
|
389
|
+
|
|
390
|
+
for await (const page of paginateResults(client, query)) {
|
|
391
|
+
allRecords.push(...page);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
return allRecords;
|
|
395
|
+
}
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### Pattern 2: Streaming to File
|
|
399
|
+
|
|
400
|
+
```typescript
|
|
401
|
+
import { createWriteStream } from 'fs';
|
|
402
|
+
|
|
403
|
+
async function streamToCSV(client, outputPath) {
|
|
404
|
+
const writer = createWriteStream(outputPath);
|
|
405
|
+
writer.write('ref,onHand,productRef,locationRef\n');
|
|
406
|
+
|
|
407
|
+
for await (const page of paginateResults(client, query)) {
|
|
408
|
+
for (const record of page) {
|
|
409
|
+
writer.write(`${record.ref},${record.onHand},${record.productRef},${record.locationRef}\n`);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
writer.end();
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Pattern 3: Progress Tracking
|
|
418
|
+
|
|
419
|
+
```typescript
|
|
420
|
+
async function fetchWithProgress(client, query) {
|
|
421
|
+
let totalFetched = 0;
|
|
422
|
+
let pageNum = 0;
|
|
423
|
+
|
|
424
|
+
for await (const page of paginateResults(client, query)) {
|
|
425
|
+
totalFetched += page.length;
|
|
426
|
+
pageNum++;
|
|
427
|
+
console.log(`Page ${pageNum}: ${totalFetched} records fetched`);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
return totalFetched;
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
---
|
|
435
|
+
|
|
436
|
+
## Troubleshooting
|
|
437
|
+
|
|
438
|
+
### Issue 1: Pagination Never Stops
|
|
439
|
+
|
|
440
|
+
**Symptom:** Loop runs forever despite data being exhausted
|
|
441
|
+
|
|
442
|
+
**Cause:** Not checking `hasNextPage`
|
|
443
|
+
|
|
444
|
+
**Solution:**
|
|
445
|
+
```typescript
|
|
446
|
+
// ✅ Check hasNextPage
|
|
447
|
+
while (pageInfo.hasNextPage) {
|
|
448
|
+
// Fetch next page...
|
|
449
|
+
}
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Issue 2: Duplicate Records
|
|
453
|
+
|
|
454
|
+
**Symptom:** Same records appear multiple times
|
|
455
|
+
|
|
456
|
+
**Cause:** Not using cursor correctly
|
|
457
|
+
|
|
458
|
+
**Solution:**
|
|
459
|
+
```typescript
|
|
460
|
+
// ✅ Always pass endCursor from previous page
|
|
461
|
+
cursor = result.data.connection.pageInfo.endCursor;
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### Issue 3: Missing Records
|
|
465
|
+
|
|
466
|
+
**Symptom:** Some records not fetched
|
|
467
|
+
|
|
468
|
+
**Cause:** Starting with wrong cursor
|
|
469
|
+
|
|
470
|
+
**Solution:**
|
|
471
|
+
```typescript
|
|
472
|
+
// ✅ Start with null cursor
|
|
473
|
+
let cursor = null; // Start from beginning
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
### Issue 4: Memory Leak
|
|
477
|
+
|
|
478
|
+
**Symptom:** Memory usage grows indefinitely
|
|
479
|
+
|
|
480
|
+
**Cause:** Accumulating all pages in memory
|
|
481
|
+
|
|
482
|
+
**Solution:**
|
|
483
|
+
```typescript
|
|
484
|
+
// ✅ Process pages individually
|
|
485
|
+
for await (const page of paginateResults(client, query)) {
|
|
486
|
+
await processBatch(page);
|
|
487
|
+
// page is discarded after iteration
|
|
488
|
+
}
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
---
|
|
492
|
+
|
|
493
|
+
## See Also
|
|
494
|
+
|
|
495
|
+
**Related Modules:**
|
|
496
|
+
- [Module 01: Client API](./api-reference-01-client-api.md) - FluentClient GraphQL methods
|
|
497
|
+
- [Module 05: Services](./api-reference-05-services.md) - ExtractionOrchestrator with auto-pagination
|
|
498
|
+
- [Auto-Pagination Guide](../../auto-pagination/modules/auto-pagination-01-foundations.md) - Deep dive into pagination
|
|
499
|
+
|
|
500
|
+
**Complete Guides:**
|
|
501
|
+
- [Auto-Pagination Module Series](../../auto-pagination/modules/readme.md) - 7-module learning path
|
|
502
|
+
- [Extraction Guide](../../extraction/extraction-readme.md) - Large dataset exports
|
|
503
|
+
- [GraphQL Best Practices](../../00-START-HERE/getting-started.md#graphql-queries)
|
|
504
|
+
|
|
505
|
+
**Templates:**
|
|
506
|
+
- [GraphQL Extraction Templates](../../../01-TEMPLATES/versori/workflows/extraction/graphql-queries/) - Production examples
|
|
507
|
+
|
|
508
|
+
---
|
|
509
|
+
|
|
510
|
+
**Navigation:**
|
|
511
|
+
- [Back to Module List](./readme.md)
|
|
512
|
+
- [Previous: Module 07 - Parsers](./api-reference-07-parsers.md)
|
|
513
|
+
- [Next: Module 09 - Webhook Validation](./api-reference-09-webhook-validation.md)
|