@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,659 +1,659 @@
|
|
|
1
|
-
# Module 3: Targeting Connections
|
|
2
|
-
|
|
3
|
-
**Level:** Intermediate
|
|
4
|
-
**Estimated Time:** 25 minutes
|
|
5
|
-
|
|
6
|
-
**SDK Version:** Use latest - `npm install @fluentcommerce/fc-connect-sdk@latest`
|
|
7
|
-
|
|
8
|
-
## Overview
|
|
9
|
-
|
|
10
|
-
This module dives deep into the `connectionPath` configuration option, teaching you how to precisely target connections in simple and complex query structures.
|
|
11
|
-
|
|
12
|
-
## Learning Objectives
|
|
13
|
-
|
|
14
|
-
By the end of this module, you will:
|
|
15
|
-
- ✅ Master `connectionPath` syntax for all scenarios
|
|
16
|
-
- ✅ Understand dot notation for nested connections
|
|
17
|
-
- ✅ Know when auto-detection works vs when it fails
|
|
18
|
-
- ✅ Handle edge cases with complex query structures
|
|
19
|
-
- ✅ Debug connection path issues effectively
|
|
20
|
-
|
|
21
|
-
## The connectionPath Option
|
|
22
|
-
|
|
23
|
-
### Basic Syntax
|
|
24
|
-
|
|
25
|
-
```typescript
|
|
26
|
-
pagination: {
|
|
27
|
-
connectionPath: string, // Path to target connection
|
|
28
|
-
// ... other options
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Value Types
|
|
33
|
-
|
|
34
|
-
| Type | Example | Use Case |
|
|
35
|
-
|------|---------|----------|
|
|
36
|
-
| Simple string | `'products'` | Root-level connection |
|
|
37
|
-
| Dot notation | `'order.items'` | Nested connection |
|
|
38
|
-
| Deep nesting | `'order.fulfilments.items'` | Multiple levels deep |
|
|
39
|
-
|
|
40
|
-
## Root-Level Connections
|
|
41
|
-
|
|
42
|
-
### Single Root Connection
|
|
43
|
-
|
|
44
|
-
When query has one root connection, `connectionPath` is optional:
|
|
45
|
-
|
|
46
|
-
```typescript
|
|
47
|
-
const query = `
|
|
48
|
-
query GetProducts($first: Int!, $after: String) {
|
|
49
|
-
products(first: $first, after: $after) {
|
|
50
|
-
edges { node { id } cursor }
|
|
51
|
-
pageInfo { hasNextPage }
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
`;
|
|
55
|
-
|
|
56
|
-
// ✅ Auto-detection works
|
|
57
|
-
const result = await client.graphql({
|
|
58
|
-
query,
|
|
59
|
-
variables: { first: 100 },
|
|
60
|
-
// No connectionPath needed - only one connection
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
// ✅ Explicit also works
|
|
64
|
-
const result = await client.graphql({
|
|
65
|
-
query,
|
|
66
|
-
variables: { first: 100 },
|
|
67
|
-
pagination: { connectionPath: 'products' }
|
|
68
|
-
});
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Multiple Root Connections
|
|
72
|
-
|
|
73
|
-
When query has multiple root connections, **always use `connectionPath`**:
|
|
74
|
-
|
|
75
|
-
```typescript
|
|
76
|
-
const query = `
|
|
77
|
-
query GetMultiple($first: Int!, $after: String) {
|
|
78
|
-
products(first: $first, after: $after) {
|
|
79
|
-
edges { node { id } cursor }
|
|
80
|
-
pageInfo { hasNextPage }
|
|
81
|
-
}
|
|
82
|
-
locations(first: $first, after: $after) {
|
|
83
|
-
edges { node { id } cursor }
|
|
84
|
-
pageInfo { hasNextPage }
|
|
85
|
-
}
|
|
86
|
-
virtualPositions(first: $first, after: $after) {
|
|
87
|
-
edges { node { id } cursor }
|
|
88
|
-
pageInfo { hasNextPage }
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
`;
|
|
92
|
-
|
|
93
|
-
// ✅ Explicit - paginate products
|
|
94
|
-
const result = await client.graphql({
|
|
95
|
-
query,
|
|
96
|
-
variables: { first: 100 },
|
|
97
|
-
pagination: { connectionPath: 'products', maxPages: 10 }
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
// ✅ Explicit - paginate locations
|
|
101
|
-
const result = await client.graphql({
|
|
102
|
-
query,
|
|
103
|
-
variables: { first: 100 },
|
|
104
|
-
pagination: { connectionPath: 'locations', maxPages: 5 }
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
// ⚠️ Risky - auto-detection picks first connection
|
|
108
|
-
const result = await client.graphql({
|
|
109
|
-
query,
|
|
110
|
-
variables: { first: 100 },
|
|
111
|
-
// Which connection? Unpredictable!
|
|
112
|
-
});
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
## Nested Connections
|
|
116
|
-
|
|
117
|
-
### One Level Deep
|
|
118
|
-
|
|
119
|
-
```typescript
|
|
120
|
-
const query = `
|
|
121
|
-
query GetOrderItems($orderId: ID!, $first: Int!, $after: String) {
|
|
122
|
-
order(id: $orderId) {
|
|
123
|
-
id
|
|
124
|
-
ref
|
|
125
|
-
items(first: $first, after: $after) {
|
|
126
|
-
edges {
|
|
127
|
-
node { id sku quantity }
|
|
128
|
-
cursor
|
|
129
|
-
}
|
|
130
|
-
pageInfo { hasNextPage }
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
`;
|
|
135
|
-
|
|
136
|
-
const result = await client.graphql({
|
|
137
|
-
query,
|
|
138
|
-
variables: { orderId: '123', first: 25 },
|
|
139
|
-
pagination: {
|
|
140
|
-
connectionPath: 'order.items', // ← Dot notation
|
|
141
|
-
maxPages: 10
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
console.log(`Order has ${result.data.order.items.edges.length} items`);
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### Multiple Levels Deep
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
const query = `
|
|
152
|
-
query GetFulfilmentItems(
|
|
153
|
-
$orderId: ID!,
|
|
154
|
-
$fulfilmentId: ID!,
|
|
155
|
-
$first: Int!,
|
|
156
|
-
$after: String
|
|
157
|
-
) {
|
|
158
|
-
order(id: $orderId) {
|
|
159
|
-
id
|
|
160
|
-
ref
|
|
161
|
-
fulfilments(first: 10) {
|
|
162
|
-
edges {
|
|
163
|
-
node {
|
|
164
|
-
id
|
|
165
|
-
ref
|
|
166
|
-
items(first: $first, after: $after) {
|
|
167
|
-
edges {
|
|
168
|
-
node { id sku quantity }
|
|
169
|
-
cursor
|
|
170
|
-
}
|
|
171
|
-
pageInfo { hasNextPage }
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
`;
|
|
179
|
-
|
|
180
|
-
const result = await client.graphql({
|
|
181
|
-
query,
|
|
182
|
-
variables: { orderId: '123', fulfilmentId: '456', first: 20 },
|
|
183
|
-
pagination: {
|
|
184
|
-
connectionPath: 'order.fulfilments.edges.node.items', // ← Deep path
|
|
185
|
-
maxPages: 5
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
**Note:** You may need to include `edges.node` in the path depending on the query structure.
|
|
191
|
-
|
|
192
|
-
### Simplified Deep Path
|
|
193
|
-
|
|
194
|
-
The SDK is smart about traversing edges and nodes:
|
|
195
|
-
|
|
196
|
-
```typescript
|
|
197
|
-
// These are equivalent:
|
|
198
|
-
connectionPath: 'order.fulfilments.edges.node.items'
|
|
199
|
-
connectionPath: 'order.fulfilments.items' // SDK infers edges/node
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
**Best Practice:** Use the **simplified form** unless you encounter issues.
|
|
203
|
-
|
|
204
|
-
## Auto-Detection Behavior
|
|
205
|
-
|
|
206
|
-
### How Auto-Detection Works
|
|
207
|
-
|
|
208
|
-
When `connectionPath` is **not specified**, the SDK:
|
|
209
|
-
|
|
210
|
-
1. Receives GraphQL response
|
|
211
|
-
2. Recursively searches for connection structure
|
|
212
|
-
3. Looks for objects with: `edges`, `pageInfo.hasNextPage`
|
|
213
|
-
4. Uses **first match found**
|
|
214
|
-
|
|
215
|
-
### Auto-Detection Search Order
|
|
216
|
-
|
|
217
|
-
```typescript
|
|
218
|
-
const query = `
|
|
219
|
-
query MultiLevel {
|
|
220
|
-
products { ... } # ← Checked first
|
|
221
|
-
locations { ... } # ← Checked second
|
|
222
|
-
nested {
|
|
223
|
-
items { ... } # ← Checked third
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
`;
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
**Order:** Depth-first search, typically matches query field order.
|
|
230
|
-
|
|
231
|
-
### When Auto-Detection Fails
|
|
232
|
-
|
|
233
|
-
#### Case 1: No Connection Structure
|
|
234
|
-
|
|
235
|
-
```typescript
|
|
236
|
-
const query = `
|
|
237
|
-
query GetProduct($id: ID!) {
|
|
238
|
-
product(id: $id) {
|
|
239
|
-
id
|
|
240
|
-
ref
|
|
241
|
-
name
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
`;
|
|
245
|
-
|
|
246
|
-
// ❌ No edges/pageInfo - auto-detection finds nothing
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
#### Case 2: Non-Standard Structure
|
|
250
|
-
|
|
251
|
-
```typescript
|
|
252
|
-
const query = `
|
|
253
|
-
query CustomStructure {
|
|
254
|
-
products {
|
|
255
|
-
items { # ← Not 'edges'
|
|
256
|
-
data { id } # ← Not 'node'
|
|
257
|
-
}
|
|
258
|
-
pagination { # ← Not 'pageInfo'
|
|
259
|
-
hasMore
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
`;
|
|
264
|
-
|
|
265
|
-
// ❌ Doesn't match Relay spec - auto-detection fails
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
#### Case 3: Multiple Connections (Ambiguous)
|
|
269
|
-
|
|
270
|
-
```typescript
|
|
271
|
-
const query = `
|
|
272
|
-
query GetMultiple {
|
|
273
|
-
products { edges { ... } pageInfo { ... } }
|
|
274
|
-
locations { edges { ... } pageInfo { ... } }
|
|
275
|
-
}
|
|
276
|
-
`;
|
|
277
|
-
|
|
278
|
-
// ⚠️ Auto-detection picks 'products' (first found)
|
|
279
|
-
// But which did you intend? Ambiguous!
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
## Advanced Targeting Scenarios
|
|
283
|
-
|
|
284
|
-
### Scenario 1: Pagination Variables Don't Match Connection
|
|
285
|
-
|
|
286
|
-
```typescript
|
|
287
|
-
const query = `
|
|
288
|
-
query GetProductsAndLocations(
|
|
289
|
-
$pFirst: Int!, # ← Different variable names
|
|
290
|
-
$pAfter: String,
|
|
291
|
-
$lFirst: Int!,
|
|
292
|
-
$lAfter: String
|
|
293
|
-
) {
|
|
294
|
-
products(first: $pFirst, after: $pAfter) {
|
|
295
|
-
edges { node { id } cursor }
|
|
296
|
-
pageInfo { hasNextPage }
|
|
297
|
-
}
|
|
298
|
-
locations(first: $lFirst, after: $lAfter) {
|
|
299
|
-
edges { node { id } cursor }
|
|
300
|
-
pageInfo { hasNextPage }
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
`;
|
|
304
|
-
|
|
305
|
-
// ✅ connectionPath still works - it targets response structure
|
|
306
|
-
const result = await client.graphql({
|
|
307
|
-
query,
|
|
308
|
-
variables: { pFirst: 50, lFirst: 20 },
|
|
309
|
-
pagination: {
|
|
310
|
-
connectionPath: 'products', // Works regardless of variable names
|
|
311
|
-
maxPages: 5
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
### Scenario 2: Aliased Fields
|
|
317
|
-
|
|
318
|
-
```typescript
|
|
319
|
-
const query = `
|
|
320
|
-
query GetAliased($first: Int!, $after: String) {
|
|
321
|
-
allProducts: products(first: $first, after: $after) {
|
|
322
|
-
edges { node { id } cursor }
|
|
323
|
-
pageInfo { hasNextPage }
|
|
324
|
-
}
|
|
325
|
-
allLocations: locations(first: $first) {
|
|
326
|
-
edges { node { id } cursor }
|
|
327
|
-
pageInfo { hasNextPage }
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
`;
|
|
331
|
-
|
|
332
|
-
// ✅ Use the ALIAS name in connectionPath
|
|
333
|
-
const result = await client.graphql({
|
|
334
|
-
query,
|
|
335
|
-
variables: { first: 100 },
|
|
336
|
-
pagination: {
|
|
337
|
-
connectionPath: 'allProducts', // ← Use alias, not 'products'
|
|
338
|
-
maxPages: 10
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
console.log(result.data.allProducts.edges.length); // Access via alias
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
### Scenario 3: Mixed Paginated and Non-Paginated
|
|
346
|
-
|
|
347
|
-
```typescript
|
|
348
|
-
const query = `
|
|
349
|
-
query GetMixed($first: Int!, $after: String) {
|
|
350
|
-
# Paginated connection
|
|
351
|
-
products(first: $first, after: $after) {
|
|
352
|
-
edges { node { id } cursor }
|
|
353
|
-
pageInfo { hasNextPage }
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
# Non-paginated scalar
|
|
357
|
-
totalProductCount
|
|
358
|
-
|
|
359
|
-
# Non-paginated object
|
|
360
|
-
retailer {
|
|
361
|
-
id
|
|
362
|
-
name
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
# Another paginated connection
|
|
366
|
-
locations(first: $first, after: $after) {
|
|
367
|
-
edges { node { id } cursor }
|
|
368
|
-
pageInfo { hasNextPage }
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
`;
|
|
372
|
-
|
|
373
|
-
// ✅ SDK only looks at connections, ignores scalars/objects
|
|
374
|
-
const result = await client.graphql({
|
|
375
|
-
query,
|
|
376
|
-
variables: { first: 100 },
|
|
377
|
-
pagination: {
|
|
378
|
-
connectionPath: 'products', // Targets products, ignores non-connections
|
|
379
|
-
maxPages: 5
|
|
380
|
-
}
|
|
381
|
-
});
|
|
382
|
-
```
|
|
383
|
-
|
|
384
|
-
### Scenario 4: Fragments
|
|
385
|
-
|
|
386
|
-
```typescript
|
|
387
|
-
const query = `
|
|
388
|
-
fragment ProductFields on Product {
|
|
389
|
-
id
|
|
390
|
-
ref
|
|
391
|
-
type
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
query GetProducts($first: Int!, $after: String) {
|
|
395
|
-
products(first: $first, after: $after) {
|
|
396
|
-
edges {
|
|
397
|
-
node {
|
|
398
|
-
...ProductFields
|
|
399
|
-
}
|
|
400
|
-
cursor
|
|
401
|
-
}
|
|
402
|
-
pageInfo { hasNextPage }
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
`;
|
|
406
|
-
|
|
407
|
-
// ✅ Fragments don't affect connectionPath
|
|
408
|
-
const result = await client.graphql({
|
|
409
|
-
query,
|
|
410
|
-
variables: { first: 100 },
|
|
411
|
-
pagination: {
|
|
412
|
-
connectionPath: 'products', // Works normally
|
|
413
|
-
maxPages: 10
|
|
414
|
-
}
|
|
415
|
-
});
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
## Debugging Connection Paths
|
|
419
|
-
|
|
420
|
-
### Technique 1: Enable Debug Logging
|
|
421
|
-
|
|
422
|
-
```typescript
|
|
423
|
-
const result = await client.graphql({
|
|
424
|
-
query,
|
|
425
|
-
variables: { first: 100 },
|
|
426
|
-
pagination: {
|
|
427
|
-
connectionPath: 'products',
|
|
428
|
-
maxPages: 2,
|
|
429
|
-
onProgress: (page, records) => {
|
|
430
|
-
console.log(`[DEBUG] Page ${page}: ${records} records`);
|
|
431
|
-
// If this fires, connectionPath is working
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
});
|
|
435
|
-
```
|
|
436
|
-
|
|
437
|
-
### Technique 2: Inspect Response Structure
|
|
438
|
-
|
|
439
|
-
```typescript
|
|
440
|
-
const result = await client.graphql({
|
|
441
|
-
query,
|
|
442
|
-
variables: { first: 100 }
|
|
443
|
-
// No pagination first - see structure
|
|
444
|
-
});
|
|
445
|
-
|
|
446
|
-
console.log('Response keys:', Object.keys(result.data));
|
|
447
|
-
// Output: ['products', 'locations']
|
|
448
|
-
|
|
449
|
-
console.log('Products structure:', {
|
|
450
|
-
hasEdges: !!result.data.products.edges,
|
|
451
|
-
hasPageInfo: !!result.data.products.pageInfo,
|
|
452
|
-
edgesCount: result.data.products.edges?.length
|
|
453
|
-
});
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
### Technique 3: Test with Small Limits
|
|
457
|
-
|
|
458
|
-
```typescript
|
|
459
|
-
// Start with maxPages: 2 to verify behavior
|
|
460
|
-
const result = await client.graphql({
|
|
461
|
-
query,
|
|
462
|
-
variables: { first: 10 },
|
|
463
|
-
pagination: {
|
|
464
|
-
connectionPath: 'products',
|
|
465
|
-
maxPages: 2 // ← Small limit for testing
|
|
466
|
-
}
|
|
467
|
-
});
|
|
468
|
-
|
|
469
|
-
// Expected: 20 records (2 pages × 10 per page)
|
|
470
|
-
console.assert(
|
|
471
|
-
result.data.products.edges.length === 20,
|
|
472
|
-
'Expected 20 records'
|
|
473
|
-
);
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
### Technique 4: Try Auto-Detection First
|
|
477
|
-
|
|
478
|
-
```typescript
|
|
479
|
-
// Remove connectionPath to see what SDK finds
|
|
480
|
-
const result = await client.graphql({
|
|
481
|
-
query,
|
|
482
|
-
variables: { first: 100 },
|
|
483
|
-
pagination: { maxPages: 2 }
|
|
484
|
-
// Let SDK auto-detect
|
|
485
|
-
});
|
|
486
|
-
|
|
487
|
-
// Check which connection has 200 records
|
|
488
|
-
console.log('Products:', result.data.products?.edges?.length);
|
|
489
|
-
console.log('Locations:', result.data.locations?.edges?.length);
|
|
490
|
-
// Whichever has 200 was auto-detected
|
|
491
|
-
```
|
|
492
|
-
|
|
493
|
-
## Common Mistakes and Fixes
|
|
494
|
-
|
|
495
|
-
### Mistake 1: Wrong Path Depth
|
|
496
|
-
|
|
497
|
-
```typescript
|
|
498
|
-
// ❌ Wrong - too shallow
|
|
499
|
-
connectionPath: 'order'
|
|
500
|
-
|
|
501
|
-
// ✅ Correct - include full path to connection
|
|
502
|
-
connectionPath: 'order.items'
|
|
503
|
-
```
|
|
504
|
-
|
|
505
|
-
### Mistake 2: Using Field Name Instead of Alias
|
|
506
|
-
|
|
507
|
-
```typescript
|
|
508
|
-
const query = `
|
|
509
|
-
query {
|
|
510
|
-
myProducts: products(...) { ... }
|
|
511
|
-
}
|
|
512
|
-
`;
|
|
513
|
-
|
|
514
|
-
// ❌ Wrong
|
|
515
|
-
connectionPath: 'products'
|
|
516
|
-
|
|
517
|
-
// ✅ Correct
|
|
518
|
-
connectionPath: 'myProducts'
|
|
519
|
-
```
|
|
520
|
-
|
|
521
|
-
### Mistake 3: Including edges/node When Not Needed
|
|
522
|
-
|
|
523
|
-
```typescript
|
|
524
|
-
// ❌ Overly verbose
|
|
525
|
-
connectionPath: 'products.edges.node'
|
|
526
|
-
|
|
527
|
-
// ✅ Simplified (SDK handles it)
|
|
528
|
-
connectionPath: 'products'
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
### Mistake 4: Array Syntax (Not Supported)
|
|
532
|
-
|
|
533
|
-
```typescript
|
|
534
|
-
// ❌ Wrong - arrays not supported
|
|
535
|
-
connectionPath: ['products', 'locations']
|
|
536
|
-
|
|
537
|
-
// ✅ Correct - target one
|
|
538
|
-
connectionPath: 'products'
|
|
539
|
-
```
|
|
540
|
-
|
|
541
|
-
## Best Practices
|
|
542
|
-
|
|
543
|
-
### ✅ DO: Always Be Explicit
|
|
544
|
-
|
|
545
|
-
```typescript
|
|
546
|
-
// ✅ Good
|
|
547
|
-
pagination: {
|
|
548
|
-
connectionPath: 'products',
|
|
549
|
-
maxPages: 10
|
|
550
|
-
}
|
|
551
|
-
```
|
|
552
|
-
|
|
553
|
-
### ✅ DO: Use Simplified Paths
|
|
554
|
-
|
|
555
|
-
```typescript
|
|
556
|
-
// ✅ Good
|
|
557
|
-
connectionPath: 'order.items'
|
|
558
|
-
|
|
559
|
-
// ❌ Overly complex
|
|
560
|
-
connectionPath: 'order.edges.node.items.edges.node'
|
|
561
|
-
```
|
|
562
|
-
|
|
563
|
-
### ✅ DO: Match Aliases Exactly
|
|
564
|
-
|
|
565
|
-
```typescript
|
|
566
|
-
const query = `myProducts: products(...) { ... }`;
|
|
567
|
-
|
|
568
|
-
// ✅ Good
|
|
569
|
-
connectionPath: 'myProducts'
|
|
570
|
-
```
|
|
571
|
-
|
|
572
|
-
### ❌ DON'T: Rely on Auto-Detection for Multiple Connections
|
|
573
|
-
|
|
574
|
-
```typescript
|
|
575
|
-
// ❌ Bad - which connection?
|
|
576
|
-
const result = await client.graphql({
|
|
577
|
-
query: multiConnectionQuery,
|
|
578
|
-
pagination: { maxPages: 5 }
|
|
579
|
-
});
|
|
580
|
-
|
|
581
|
-
// ✅ Good - explicit
|
|
582
|
-
const result = await client.graphql({
|
|
583
|
-
query: multiConnectionQuery,
|
|
584
|
-
pagination: {
|
|
585
|
-
connectionPath: 'products',
|
|
586
|
-
maxPages: 5
|
|
587
|
-
}
|
|
588
|
-
});
|
|
589
|
-
```
|
|
590
|
-
|
|
591
|
-
## Key Takeaways
|
|
592
|
-
|
|
593
|
-
- 🎯 **Use `connectionPath`** - Always for multiple connections
|
|
594
|
-
- 🎯 **Dot notation for nesting** - `'order.items'` works
|
|
595
|
-
- 🎯 **Simplified paths** - SDK infers `edges` and `node`
|
|
596
|
-
- 🎯 **Match aliases** - Use alias names, not original field names
|
|
597
|
-
- 🎯 **Test small first** - Verify with `maxPages: 2` before production
|
|
598
|
-
|
|
599
|
-
## Practice Exercise
|
|
600
|
-
|
|
601
|
-
Given this query, write the correct `connectionPath` for each scenario:
|
|
602
|
-
|
|
603
|
-
```graphql
|
|
604
|
-
query ComplexQuery {
|
|
605
|
-
retailer {
|
|
606
|
-
id
|
|
607
|
-
name
|
|
608
|
-
}
|
|
609
|
-
allProducts: products(first: 50, after: $cursor) {
|
|
610
|
-
edges {
|
|
611
|
-
node { id ref }
|
|
612
|
-
cursor
|
|
613
|
-
}
|
|
614
|
-
pageInfo { hasNextPage }
|
|
615
|
-
}
|
|
616
|
-
order(id: "123") {
|
|
617
|
-
id
|
|
618
|
-
ref
|
|
619
|
-
fulfilments {
|
|
620
|
-
edges {
|
|
621
|
-
node {
|
|
622
|
-
id
|
|
623
|
-
items(first: 20) {
|
|
624
|
-
edges {
|
|
625
|
-
node { id sku }
|
|
626
|
-
cursor
|
|
627
|
-
}
|
|
628
|
-
pageInfo { hasNextPage }
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
```
|
|
636
|
-
|
|
637
|
-
**Questions:**
|
|
638
|
-
1. Paginate the products connection
|
|
639
|
-
2. Paginate the fulfilment items
|
|
640
|
-
|
|
641
|
-
<details>
|
|
642
|
-
<summary>Answers</summary>
|
|
643
|
-
|
|
644
|
-
1. **Paginate products:**
|
|
645
|
-
```typescript
|
|
646
|
-
connectionPath: 'allProducts' // Use alias name
|
|
647
|
-
```
|
|
648
|
-
|
|
649
|
-
2. **Paginate fulfilment items:**
|
|
650
|
-
```typescript
|
|
651
|
-
connectionPath: 'order.fulfilments.items' // Simplified path
|
|
652
|
-
// OR
|
|
653
|
-
connectionPath: 'order.fulfilments.edges.node.items' // Explicit path
|
|
654
|
-
```
|
|
655
|
-
</details>
|
|
656
|
-
|
|
657
|
-
## Next Steps
|
|
658
|
-
|
|
659
|
-
Continue to [Module 4: Parallel Queries](./multiple-connections-04-parallel-queries.md) to learn how to paginate multiple connections simultaneously using `Promise.all()`.
|
|
1
|
+
# Module 3: Targeting Connections
|
|
2
|
+
|
|
3
|
+
**Level:** Intermediate
|
|
4
|
+
**Estimated Time:** 25 minutes
|
|
5
|
+
|
|
6
|
+
**SDK Version:** Use latest - `npm install @fluentcommerce/fc-connect-sdk@latest`
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
This module dives deep into the `connectionPath` configuration option, teaching you how to precisely target connections in simple and complex query structures.
|
|
11
|
+
|
|
12
|
+
## Learning Objectives
|
|
13
|
+
|
|
14
|
+
By the end of this module, you will:
|
|
15
|
+
- ✅ Master `connectionPath` syntax for all scenarios
|
|
16
|
+
- ✅ Understand dot notation for nested connections
|
|
17
|
+
- ✅ Know when auto-detection works vs when it fails
|
|
18
|
+
- ✅ Handle edge cases with complex query structures
|
|
19
|
+
- ✅ Debug connection path issues effectively
|
|
20
|
+
|
|
21
|
+
## The connectionPath Option
|
|
22
|
+
|
|
23
|
+
### Basic Syntax
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
pagination: {
|
|
27
|
+
connectionPath: string, // Path to target connection
|
|
28
|
+
// ... other options
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Value Types
|
|
33
|
+
|
|
34
|
+
| Type | Example | Use Case |
|
|
35
|
+
|------|---------|----------|
|
|
36
|
+
| Simple string | `'products'` | Root-level connection |
|
|
37
|
+
| Dot notation | `'order.items'` | Nested connection |
|
|
38
|
+
| Deep nesting | `'order.fulfilments.items'` | Multiple levels deep |
|
|
39
|
+
|
|
40
|
+
## Root-Level Connections
|
|
41
|
+
|
|
42
|
+
### Single Root Connection
|
|
43
|
+
|
|
44
|
+
When query has one root connection, `connectionPath` is optional:
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
const query = `
|
|
48
|
+
query GetProducts($first: Int!, $after: String) {
|
|
49
|
+
products(first: $first, after: $after) {
|
|
50
|
+
edges { node { id } cursor }
|
|
51
|
+
pageInfo { hasNextPage }
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
`;
|
|
55
|
+
|
|
56
|
+
// ✅ Auto-detection works
|
|
57
|
+
const result = await client.graphql({
|
|
58
|
+
query,
|
|
59
|
+
variables: { first: 100 },
|
|
60
|
+
// No connectionPath needed - only one connection
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// ✅ Explicit also works
|
|
64
|
+
const result = await client.graphql({
|
|
65
|
+
query,
|
|
66
|
+
variables: { first: 100 },
|
|
67
|
+
pagination: { connectionPath: 'products' }
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Multiple Root Connections
|
|
72
|
+
|
|
73
|
+
When query has multiple root connections, **always use `connectionPath`**:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
const query = `
|
|
77
|
+
query GetMultiple($first: Int!, $after: String) {
|
|
78
|
+
products(first: $first, after: $after) {
|
|
79
|
+
edges { node { id } cursor }
|
|
80
|
+
pageInfo { hasNextPage }
|
|
81
|
+
}
|
|
82
|
+
locations(first: $first, after: $after) {
|
|
83
|
+
edges { node { id } cursor }
|
|
84
|
+
pageInfo { hasNextPage }
|
|
85
|
+
}
|
|
86
|
+
virtualPositions(first: $first, after: $after) {
|
|
87
|
+
edges { node { id } cursor }
|
|
88
|
+
pageInfo { hasNextPage }
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
`;
|
|
92
|
+
|
|
93
|
+
// ✅ Explicit - paginate products
|
|
94
|
+
const result = await client.graphql({
|
|
95
|
+
query,
|
|
96
|
+
variables: { first: 100 },
|
|
97
|
+
pagination: { connectionPath: 'products', maxPages: 10 }
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// ✅ Explicit - paginate locations
|
|
101
|
+
const result = await client.graphql({
|
|
102
|
+
query,
|
|
103
|
+
variables: { first: 100 },
|
|
104
|
+
pagination: { connectionPath: 'locations', maxPages: 5 }
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// ⚠️ Risky - auto-detection picks first connection
|
|
108
|
+
const result = await client.graphql({
|
|
109
|
+
query,
|
|
110
|
+
variables: { first: 100 },
|
|
111
|
+
// Which connection? Unpredictable!
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Nested Connections
|
|
116
|
+
|
|
117
|
+
### One Level Deep
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const query = `
|
|
121
|
+
query GetOrderItems($orderId: ID!, $first: Int!, $after: String) {
|
|
122
|
+
order(id: $orderId) {
|
|
123
|
+
id
|
|
124
|
+
ref
|
|
125
|
+
items(first: $first, after: $after) {
|
|
126
|
+
edges {
|
|
127
|
+
node { id sku quantity }
|
|
128
|
+
cursor
|
|
129
|
+
}
|
|
130
|
+
pageInfo { hasNextPage }
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
`;
|
|
135
|
+
|
|
136
|
+
const result = await client.graphql({
|
|
137
|
+
query,
|
|
138
|
+
variables: { orderId: '123', first: 25 },
|
|
139
|
+
pagination: {
|
|
140
|
+
connectionPath: 'order.items', // ← Dot notation
|
|
141
|
+
maxPages: 10
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
console.log(`Order has ${result.data.order.items.edges.length} items`);
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Multiple Levels Deep
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
const query = `
|
|
152
|
+
query GetFulfilmentItems(
|
|
153
|
+
$orderId: ID!,
|
|
154
|
+
$fulfilmentId: ID!,
|
|
155
|
+
$first: Int!,
|
|
156
|
+
$after: String
|
|
157
|
+
) {
|
|
158
|
+
order(id: $orderId) {
|
|
159
|
+
id
|
|
160
|
+
ref
|
|
161
|
+
fulfilments(first: 10) {
|
|
162
|
+
edges {
|
|
163
|
+
node {
|
|
164
|
+
id
|
|
165
|
+
ref
|
|
166
|
+
items(first: $first, after: $after) {
|
|
167
|
+
edges {
|
|
168
|
+
node { id sku quantity }
|
|
169
|
+
cursor
|
|
170
|
+
}
|
|
171
|
+
pageInfo { hasNextPage }
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
`;
|
|
179
|
+
|
|
180
|
+
const result = await client.graphql({
|
|
181
|
+
query,
|
|
182
|
+
variables: { orderId: '123', fulfilmentId: '456', first: 20 },
|
|
183
|
+
pagination: {
|
|
184
|
+
connectionPath: 'order.fulfilments.edges.node.items', // ← Deep path
|
|
185
|
+
maxPages: 5
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Note:** You may need to include `edges.node` in the path depending on the query structure.
|
|
191
|
+
|
|
192
|
+
### Simplified Deep Path
|
|
193
|
+
|
|
194
|
+
The SDK is smart about traversing edges and nodes:
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
// These are equivalent:
|
|
198
|
+
connectionPath: 'order.fulfilments.edges.node.items'
|
|
199
|
+
connectionPath: 'order.fulfilments.items' // SDK infers edges/node
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Best Practice:** Use the **simplified form** unless you encounter issues.
|
|
203
|
+
|
|
204
|
+
## Auto-Detection Behavior
|
|
205
|
+
|
|
206
|
+
### How Auto-Detection Works
|
|
207
|
+
|
|
208
|
+
When `connectionPath` is **not specified**, the SDK:
|
|
209
|
+
|
|
210
|
+
1. Receives GraphQL response
|
|
211
|
+
2. Recursively searches for connection structure
|
|
212
|
+
3. Looks for objects with: `edges`, `pageInfo.hasNextPage`
|
|
213
|
+
4. Uses **first match found**
|
|
214
|
+
|
|
215
|
+
### Auto-Detection Search Order
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
const query = `
|
|
219
|
+
query MultiLevel {
|
|
220
|
+
products { ... } # ← Checked first
|
|
221
|
+
locations { ... } # ← Checked second
|
|
222
|
+
nested {
|
|
223
|
+
items { ... } # ← Checked third
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
`;
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**Order:** Depth-first search, typically matches query field order.
|
|
230
|
+
|
|
231
|
+
### When Auto-Detection Fails
|
|
232
|
+
|
|
233
|
+
#### Case 1: No Connection Structure
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
const query = `
|
|
237
|
+
query GetProduct($id: ID!) {
|
|
238
|
+
product(id: $id) {
|
|
239
|
+
id
|
|
240
|
+
ref
|
|
241
|
+
name
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
`;
|
|
245
|
+
|
|
246
|
+
// ❌ No edges/pageInfo - auto-detection finds nothing
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
#### Case 2: Non-Standard Structure
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
const query = `
|
|
253
|
+
query CustomStructure {
|
|
254
|
+
products {
|
|
255
|
+
items { # ← Not 'edges'
|
|
256
|
+
data { id } # ← Not 'node'
|
|
257
|
+
}
|
|
258
|
+
pagination { # ← Not 'pageInfo'
|
|
259
|
+
hasMore
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
`;
|
|
264
|
+
|
|
265
|
+
// ❌ Doesn't match Relay spec - auto-detection fails
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
#### Case 3: Multiple Connections (Ambiguous)
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
const query = `
|
|
272
|
+
query GetMultiple {
|
|
273
|
+
products { edges { ... } pageInfo { ... } }
|
|
274
|
+
locations { edges { ... } pageInfo { ... } }
|
|
275
|
+
}
|
|
276
|
+
`;
|
|
277
|
+
|
|
278
|
+
// ⚠️ Auto-detection picks 'products' (first found)
|
|
279
|
+
// But which did you intend? Ambiguous!
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
## Advanced Targeting Scenarios
|
|
283
|
+
|
|
284
|
+
### Scenario 1: Pagination Variables Don't Match Connection
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
const query = `
|
|
288
|
+
query GetProductsAndLocations(
|
|
289
|
+
$pFirst: Int!, # ← Different variable names
|
|
290
|
+
$pAfter: String,
|
|
291
|
+
$lFirst: Int!,
|
|
292
|
+
$lAfter: String
|
|
293
|
+
) {
|
|
294
|
+
products(first: $pFirst, after: $pAfter) {
|
|
295
|
+
edges { node { id } cursor }
|
|
296
|
+
pageInfo { hasNextPage }
|
|
297
|
+
}
|
|
298
|
+
locations(first: $lFirst, after: $lAfter) {
|
|
299
|
+
edges { node { id } cursor }
|
|
300
|
+
pageInfo { hasNextPage }
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
`;
|
|
304
|
+
|
|
305
|
+
// ✅ connectionPath still works - it targets response structure
|
|
306
|
+
const result = await client.graphql({
|
|
307
|
+
query,
|
|
308
|
+
variables: { pFirst: 50, lFirst: 20 },
|
|
309
|
+
pagination: {
|
|
310
|
+
connectionPath: 'products', // Works regardless of variable names
|
|
311
|
+
maxPages: 5
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### Scenario 2: Aliased Fields
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
const query = `
|
|
320
|
+
query GetAliased($first: Int!, $after: String) {
|
|
321
|
+
allProducts: products(first: $first, after: $after) {
|
|
322
|
+
edges { node { id } cursor }
|
|
323
|
+
pageInfo { hasNextPage }
|
|
324
|
+
}
|
|
325
|
+
allLocations: locations(first: $first) {
|
|
326
|
+
edges { node { id } cursor }
|
|
327
|
+
pageInfo { hasNextPage }
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
`;
|
|
331
|
+
|
|
332
|
+
// ✅ Use the ALIAS name in connectionPath
|
|
333
|
+
const result = await client.graphql({
|
|
334
|
+
query,
|
|
335
|
+
variables: { first: 100 },
|
|
336
|
+
pagination: {
|
|
337
|
+
connectionPath: 'allProducts', // ← Use alias, not 'products'
|
|
338
|
+
maxPages: 10
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
console.log(result.data.allProducts.edges.length); // Access via alias
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### Scenario 3: Mixed Paginated and Non-Paginated
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
const query = `
|
|
349
|
+
query GetMixed($first: Int!, $after: String) {
|
|
350
|
+
# Paginated connection
|
|
351
|
+
products(first: $first, after: $after) {
|
|
352
|
+
edges { node { id } cursor }
|
|
353
|
+
pageInfo { hasNextPage }
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
# Non-paginated scalar
|
|
357
|
+
totalProductCount
|
|
358
|
+
|
|
359
|
+
# Non-paginated object
|
|
360
|
+
retailer {
|
|
361
|
+
id
|
|
362
|
+
name
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
# Another paginated connection
|
|
366
|
+
locations(first: $first, after: $after) {
|
|
367
|
+
edges { node { id } cursor }
|
|
368
|
+
pageInfo { hasNextPage }
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
`;
|
|
372
|
+
|
|
373
|
+
// ✅ SDK only looks at connections, ignores scalars/objects
|
|
374
|
+
const result = await client.graphql({
|
|
375
|
+
query,
|
|
376
|
+
variables: { first: 100 },
|
|
377
|
+
pagination: {
|
|
378
|
+
connectionPath: 'products', // Targets products, ignores non-connections
|
|
379
|
+
maxPages: 5
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### Scenario 4: Fragments
|
|
385
|
+
|
|
386
|
+
```typescript
|
|
387
|
+
const query = `
|
|
388
|
+
fragment ProductFields on Product {
|
|
389
|
+
id
|
|
390
|
+
ref
|
|
391
|
+
type
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
query GetProducts($first: Int!, $after: String) {
|
|
395
|
+
products(first: $first, after: $after) {
|
|
396
|
+
edges {
|
|
397
|
+
node {
|
|
398
|
+
...ProductFields
|
|
399
|
+
}
|
|
400
|
+
cursor
|
|
401
|
+
}
|
|
402
|
+
pageInfo { hasNextPage }
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
`;
|
|
406
|
+
|
|
407
|
+
// ✅ Fragments don't affect connectionPath
|
|
408
|
+
const result = await client.graphql({
|
|
409
|
+
query,
|
|
410
|
+
variables: { first: 100 },
|
|
411
|
+
pagination: {
|
|
412
|
+
connectionPath: 'products', // Works normally
|
|
413
|
+
maxPages: 10
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
## Debugging Connection Paths
|
|
419
|
+
|
|
420
|
+
### Technique 1: Enable Debug Logging
|
|
421
|
+
|
|
422
|
+
```typescript
|
|
423
|
+
const result = await client.graphql({
|
|
424
|
+
query,
|
|
425
|
+
variables: { first: 100 },
|
|
426
|
+
pagination: {
|
|
427
|
+
connectionPath: 'products',
|
|
428
|
+
maxPages: 2,
|
|
429
|
+
onProgress: (page, records) => {
|
|
430
|
+
console.log(`[DEBUG] Page ${page}: ${records} records`);
|
|
431
|
+
// If this fires, connectionPath is working
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### Technique 2: Inspect Response Structure
|
|
438
|
+
|
|
439
|
+
```typescript
|
|
440
|
+
const result = await client.graphql({
|
|
441
|
+
query,
|
|
442
|
+
variables: { first: 100 }
|
|
443
|
+
// No pagination first - see structure
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
console.log('Response keys:', Object.keys(result.data));
|
|
447
|
+
// Output: ['products', 'locations']
|
|
448
|
+
|
|
449
|
+
console.log('Products structure:', {
|
|
450
|
+
hasEdges: !!result.data.products.edges,
|
|
451
|
+
hasPageInfo: !!result.data.products.pageInfo,
|
|
452
|
+
edgesCount: result.data.products.edges?.length
|
|
453
|
+
});
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
### Technique 3: Test with Small Limits
|
|
457
|
+
|
|
458
|
+
```typescript
|
|
459
|
+
// Start with maxPages: 2 to verify behavior
|
|
460
|
+
const result = await client.graphql({
|
|
461
|
+
query,
|
|
462
|
+
variables: { first: 10 },
|
|
463
|
+
pagination: {
|
|
464
|
+
connectionPath: 'products',
|
|
465
|
+
maxPages: 2 // ← Small limit for testing
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
// Expected: 20 records (2 pages × 10 per page)
|
|
470
|
+
console.assert(
|
|
471
|
+
result.data.products.edges.length === 20,
|
|
472
|
+
'Expected 20 records'
|
|
473
|
+
);
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
### Technique 4: Try Auto-Detection First
|
|
477
|
+
|
|
478
|
+
```typescript
|
|
479
|
+
// Remove connectionPath to see what SDK finds
|
|
480
|
+
const result = await client.graphql({
|
|
481
|
+
query,
|
|
482
|
+
variables: { first: 100 },
|
|
483
|
+
pagination: { maxPages: 2 }
|
|
484
|
+
// Let SDK auto-detect
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
// Check which connection has 200 records
|
|
488
|
+
console.log('Products:', result.data.products?.edges?.length);
|
|
489
|
+
console.log('Locations:', result.data.locations?.edges?.length);
|
|
490
|
+
// Whichever has 200 was auto-detected
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
## Common Mistakes and Fixes
|
|
494
|
+
|
|
495
|
+
### Mistake 1: Wrong Path Depth
|
|
496
|
+
|
|
497
|
+
```typescript
|
|
498
|
+
// ❌ Wrong - too shallow
|
|
499
|
+
connectionPath: 'order'
|
|
500
|
+
|
|
501
|
+
// ✅ Correct - include full path to connection
|
|
502
|
+
connectionPath: 'order.items'
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
### Mistake 2: Using Field Name Instead of Alias
|
|
506
|
+
|
|
507
|
+
```typescript
|
|
508
|
+
const query = `
|
|
509
|
+
query {
|
|
510
|
+
myProducts: products(...) { ... }
|
|
511
|
+
}
|
|
512
|
+
`;
|
|
513
|
+
|
|
514
|
+
// ❌ Wrong
|
|
515
|
+
connectionPath: 'products'
|
|
516
|
+
|
|
517
|
+
// ✅ Correct
|
|
518
|
+
connectionPath: 'myProducts'
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
### Mistake 3: Including edges/node When Not Needed
|
|
522
|
+
|
|
523
|
+
```typescript
|
|
524
|
+
// ❌ Overly verbose
|
|
525
|
+
connectionPath: 'products.edges.node'
|
|
526
|
+
|
|
527
|
+
// ✅ Simplified (SDK handles it)
|
|
528
|
+
connectionPath: 'products'
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
### Mistake 4: Array Syntax (Not Supported)
|
|
532
|
+
|
|
533
|
+
```typescript
|
|
534
|
+
// ❌ Wrong - arrays not supported
|
|
535
|
+
connectionPath: ['products', 'locations']
|
|
536
|
+
|
|
537
|
+
// ✅ Correct - target one
|
|
538
|
+
connectionPath: 'products'
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
## Best Practices
|
|
542
|
+
|
|
543
|
+
### ✅ DO: Always Be Explicit
|
|
544
|
+
|
|
545
|
+
```typescript
|
|
546
|
+
// ✅ Good
|
|
547
|
+
pagination: {
|
|
548
|
+
connectionPath: 'products',
|
|
549
|
+
maxPages: 10
|
|
550
|
+
}
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
### ✅ DO: Use Simplified Paths
|
|
554
|
+
|
|
555
|
+
```typescript
|
|
556
|
+
// ✅ Good
|
|
557
|
+
connectionPath: 'order.items'
|
|
558
|
+
|
|
559
|
+
// ❌ Overly complex
|
|
560
|
+
connectionPath: 'order.edges.node.items.edges.node'
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
### ✅ DO: Match Aliases Exactly
|
|
564
|
+
|
|
565
|
+
```typescript
|
|
566
|
+
const query = `myProducts: products(...) { ... }`;
|
|
567
|
+
|
|
568
|
+
// ✅ Good
|
|
569
|
+
connectionPath: 'myProducts'
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
### ❌ DON'T: Rely on Auto-Detection for Multiple Connections
|
|
573
|
+
|
|
574
|
+
```typescript
|
|
575
|
+
// ❌ Bad - which connection?
|
|
576
|
+
const result = await client.graphql({
|
|
577
|
+
query: multiConnectionQuery,
|
|
578
|
+
pagination: { maxPages: 5 }
|
|
579
|
+
});
|
|
580
|
+
|
|
581
|
+
// ✅ Good - explicit
|
|
582
|
+
const result = await client.graphql({
|
|
583
|
+
query: multiConnectionQuery,
|
|
584
|
+
pagination: {
|
|
585
|
+
connectionPath: 'products',
|
|
586
|
+
maxPages: 5
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
## Key Takeaways
|
|
592
|
+
|
|
593
|
+
- 🎯 **Use `connectionPath`** - Always for multiple connections
|
|
594
|
+
- 🎯 **Dot notation for nesting** - `'order.items'` works
|
|
595
|
+
- 🎯 **Simplified paths** - SDK infers `edges` and `node`
|
|
596
|
+
- 🎯 **Match aliases** - Use alias names, not original field names
|
|
597
|
+
- 🎯 **Test small first** - Verify with `maxPages: 2` before production
|
|
598
|
+
|
|
599
|
+
## Practice Exercise
|
|
600
|
+
|
|
601
|
+
Given this query, write the correct `connectionPath` for each scenario:
|
|
602
|
+
|
|
603
|
+
```graphql
|
|
604
|
+
query ComplexQuery {
|
|
605
|
+
retailer {
|
|
606
|
+
id
|
|
607
|
+
name
|
|
608
|
+
}
|
|
609
|
+
allProducts: products(first: 50, after: $cursor) {
|
|
610
|
+
edges {
|
|
611
|
+
node { id ref }
|
|
612
|
+
cursor
|
|
613
|
+
}
|
|
614
|
+
pageInfo { hasNextPage }
|
|
615
|
+
}
|
|
616
|
+
order(id: "123") {
|
|
617
|
+
id
|
|
618
|
+
ref
|
|
619
|
+
fulfilments {
|
|
620
|
+
edges {
|
|
621
|
+
node {
|
|
622
|
+
id
|
|
623
|
+
items(first: 20) {
|
|
624
|
+
edges {
|
|
625
|
+
node { id sku }
|
|
626
|
+
cursor
|
|
627
|
+
}
|
|
628
|
+
pageInfo { hasNextPage }
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
```
|
|
636
|
+
|
|
637
|
+
**Questions:**
|
|
638
|
+
1. Paginate the products connection
|
|
639
|
+
2. Paginate the fulfilment items
|
|
640
|
+
|
|
641
|
+
<details>
|
|
642
|
+
<summary>Answers</summary>
|
|
643
|
+
|
|
644
|
+
1. **Paginate products:**
|
|
645
|
+
```typescript
|
|
646
|
+
connectionPath: 'allProducts' // Use alias name
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
2. **Paginate fulfilment items:**
|
|
650
|
+
```typescript
|
|
651
|
+
connectionPath: 'order.fulfilments.items' // Simplified path
|
|
652
|
+
// OR
|
|
653
|
+
connectionPath: 'order.fulfilments.edges.node.items' // Explicit path
|
|
654
|
+
```
|
|
655
|
+
</details>
|
|
656
|
+
|
|
657
|
+
## Next Steps
|
|
658
|
+
|
|
659
|
+
Continue to [Module 4: Parallel Queries](./multiple-connections-04-parallel-queries.md) to learn how to paginate multiple connections simultaneously using `Promise.all()`.
|