@fluentcommerce/fc-connect-sdk 0.1.54 → 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 +12 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
|
@@ -1,1070 +1,1070 @@
|
|
|
1
|
-
# Getting Started Guide
|
|
2
|
-
|
|
3
|
-
Get up and running with the Fluent Commerce Connect SDK quickly and efficiently.
|
|
4
|
-
|
|
5
|
-
## Table of Contents
|
|
6
|
-
|
|
7
|
-
- [Prerequisites](#prerequisites)
|
|
8
|
-
- [Installation](#installation)
|
|
9
|
-
- [Configuration](#configuration)
|
|
10
|
-
- [Quick Example](#quick-example)
|
|
11
|
-
- [Common Use Cases](#common-use-cases)
|
|
12
|
-
- [Platform-Specific Setup](#platform-specific-setup)
|
|
13
|
-
- [Error Handling](#error-handling)
|
|
14
|
-
- [Best Practices](#best-practices)
|
|
15
|
-
- [Troubleshooting](#troubleshooting)
|
|
16
|
-
|
|
17
|
-
## Prerequisites
|
|
18
|
-
|
|
19
|
-
Before installing the Fluent Commerce Connect SDK, ensure you have:
|
|
20
|
-
|
|
21
|
-
- **Node.js** >= 18.0.0
|
|
22
|
-
- **npm** >= 8.0.0 or **yarn** >= 1.22.0
|
|
23
|
-
- **TypeScript** >= 5.0.0 (for TypeScript projects)
|
|
24
|
-
- **Fluent Commerce Account** with API credentials
|
|
25
|
-
- **AWS Credentials** (if using S3 operations)
|
|
26
|
-
|
|
27
|
-
## Installation
|
|
28
|
-
|
|
29
|
-
### Using NPM
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
npm install @fluentcommerce/fc-connect-sdk
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Using Yarn
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
yarn add @fluentcommerce/fc-connect-sdk
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Using PNPM
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
pnpm add @fluentcommerce/fc-connect-sdk
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### Version Information
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
# Check latest version
|
|
51
|
-
npm view @fluentcommerce/fc-connect-sdk version
|
|
52
|
-
|
|
53
|
-
# View all available versions
|
|
54
|
-
npm view @fluentcommerce/fc-connect-sdk versions
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### Module Formats
|
|
58
|
-
|
|
59
|
-
The SDK is distributed in multiple formats:
|
|
60
|
-
|
|
61
|
-
- **CommonJS** (CJS) - For Node.js applications using `require()`
|
|
62
|
-
- **ES Modules** (ESM) - For modern JavaScript/TypeScript applications using `import`
|
|
63
|
-
- **TypeScript Definitions** - Full type definitions included
|
|
64
|
-
|
|
65
|
-
### Importing from the SDK
|
|
66
|
-
|
|
67
|
-
**⚠️ IMPORTANT: Always import from the main entry point**
|
|
68
|
-
|
|
69
|
-
The SDK exports all public APIs from the main entry point. Do NOT use subpath imports.
|
|
70
|
-
|
|
71
|
-
```typescript
|
|
72
|
-
// ✅ CORRECT - Import from main entry
|
|
73
|
-
import {
|
|
74
|
-
createClient,
|
|
75
|
-
FluentClient,
|
|
76
|
-
FluentVersoriClient,
|
|
77
|
-
FluentBatchManager,
|
|
78
|
-
UniversalMapper,
|
|
79
|
-
VersoriKVAdapter,
|
|
80
|
-
S3DataSource,
|
|
81
|
-
SftpDataSource,
|
|
82
|
-
CSVParserService,
|
|
83
|
-
XMLParserService,
|
|
84
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
85
|
-
|
|
86
|
-
// ❌ WRONG - Subpath imports are NOT supported
|
|
87
|
-
import { VersoriKVAdapter } from '@fluentcommerce/fc-connect-sdk/versori';
|
|
88
|
-
import { S3DataSource } from '@fluentcommerce/fc-connect-sdk/data-sources';
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
**Why main entry only?**
|
|
92
|
-
|
|
93
|
-
- ✅ Simpler and more maintainable
|
|
94
|
-
- ✅ Standard npm package pattern
|
|
95
|
-
- ✅ Better tree-shaking
|
|
96
|
-
- ✅ Consistent with most npm packages (React, Lodash, etc.)
|
|
97
|
-
- ✅ All public APIs are intentionally exported
|
|
98
|
-
|
|
99
|
-
**All Available Exports:**
|
|
100
|
-
|
|
101
|
-
- Clients: `createClient`, `FluentClient`, `FluentVersoriClient`
|
|
102
|
-
- Services: `FluentBatchManager`, `UniversalMapper`, `StateService`
|
|
103
|
-
- Orchestrators: `ExtractionOrchestrator`, `JobTracker`, `PartialBatchRecovery`, `PreflightValidator`
|
|
104
|
-
- Data Sources: `S3DataSource`, `SftpDataSource`, `InventoryDataSource`
|
|
105
|
-
- Parsers: `CSVParserService`, `XMLParserService`, `JSONParserService`, `ParquetParserService`
|
|
106
|
-
- Builders: `XMLBuilder`, `CSVBuilder`, `JSONBuilder`
|
|
107
|
-
- Logging Utilities: `createConsoleLogger`, `toStructuredLogger`, `createWorkflowLogger`, `createServiceLogger`
|
|
108
|
-
- Versori: `VersoriKVAdapter`, `VersoriFileTracker`
|
|
109
|
-
- Testing: `S3SDKTester`, `S3PresignedTester`, `FluentConnectionTester`
|
|
110
|
-
- Utilities: `parseWebhookRequest`, `validateFluentEvent`, `validateGraphQLPayload`, and file naming utilities
|
|
111
|
-
- All TypeScript types and interfaces
|
|
112
|
-
|
|
113
|
-
See [API Reference](../02-CORE-GUIDES/api-reference/api-reference-readme.md) for complete list of exports.
|
|
114
|
-
|
|
115
|
-
### TypeScript Configuration
|
|
116
|
-
|
|
117
|
-
Add to your `tsconfig.json`:
|
|
118
|
-
|
|
119
|
-
```json
|
|
120
|
-
{
|
|
121
|
-
"compilerOptions": {
|
|
122
|
-
"module": "ES2022",
|
|
123
|
-
"target": "ES2024",
|
|
124
|
-
"moduleResolution": "node"
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## Logging Approach
|
|
130
|
-
|
|
131
|
-
The SDK provides minimal logging utilities for standalone environments. **Versori users should always use native platform logs.**
|
|
132
|
-
|
|
133
|
-
### Versori Platform (Recommended)
|
|
134
|
-
|
|
135
|
-
Use native `log` from context - no imports needed:
|
|
136
|
-
|
|
137
|
-
```typescript
|
|
138
|
-
import { schedule, http } from '@versori/run';
|
|
139
|
-
import { createClient, SftpDataSource } from '@fluentcommerce/fc-connect-sdk';
|
|
140
|
-
|
|
141
|
-
export const myWorkflow = schedule('my-workflow', '0 * * * *')
|
|
142
|
-
.then(http('process', { connection: 'fluent' }, async (ctx) => {
|
|
143
|
-
const { log, openKv, activation } = ctx;
|
|
144
|
-
|
|
145
|
-
// Pass native log directly to SDK services
|
|
146
|
-
const client = await createClient({ ...ctx, log });
|
|
147
|
-
const sftp = new SftpDataSource(config, log);
|
|
148
|
-
|
|
149
|
-
log.info('Processing started');
|
|
150
|
-
}));
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### Standalone Node.js/Deno
|
|
154
|
-
|
|
155
|
-
Use function-based logging utilities:
|
|
156
|
-
|
|
157
|
-
```typescript
|
|
158
|
-
import {
|
|
159
|
-
createConsoleLogger,
|
|
160
|
-
toStructuredLogger,
|
|
161
|
-
generateCorrelationId,
|
|
162
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
163
|
-
|
|
164
|
-
// Simple console logger
|
|
165
|
-
const logger = createConsoleLogger();
|
|
166
|
-
|
|
167
|
-
// Or with context (adds metadata to all logs)
|
|
168
|
-
const contextLogger = toStructuredLogger(logger, {
|
|
169
|
-
service: 'InventorySync',
|
|
170
|
-
correlationId: generateCorrelationId(),
|
|
171
|
-
logLevel: 'debug',
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
const client = await createClient({ config: { ...config, logger: contextLogger } });
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
**See**: [Logging Guide](../02-CORE-GUIDES/logging-guide.md) for complete logging documentation.
|
|
178
|
-
|
|
179
|
-
## Configuration
|
|
180
|
-
|
|
181
|
-
### Environment Variables
|
|
182
|
-
|
|
183
|
-
Create a `.env` file in your project root:
|
|
184
|
-
|
|
185
|
-
```bash
|
|
186
|
-
# Fluent Commerce Configuration
|
|
187
|
-
FLUENT_BASE_URL=https://api.fluentcommerce.com
|
|
188
|
-
FLUENT_RETAILER_ID=your-retailer-id
|
|
189
|
-
FLUENT_CLIENT_ID=your-client-id
|
|
190
|
-
FLUENT_CLIENT_SECRET=your-client-secret
|
|
191
|
-
FLUENT_USERNAME=your-username
|
|
192
|
-
FLUENT_PASSWORD=your-password
|
|
193
|
-
|
|
194
|
-
# AWS Configuration (for S3 operations)
|
|
195
|
-
AWS_ACCESS_KEY_ID=your-access-key
|
|
196
|
-
AWS_SECRET_ACCESS_KEY=your-secret-key
|
|
197
|
-
AWS_REGION=us-east-1
|
|
198
|
-
|
|
199
|
-
# SFTP Configuration (for SFTP operations)
|
|
200
|
-
SFTP_HOST=sftp.yourcompany.com
|
|
201
|
-
SFTP_PORT=22
|
|
202
|
-
SFTP_USERNAME=your-sftp-username
|
|
203
|
-
SFTP_PASSWORD=your-sftp-password
|
|
204
|
-
# Alternative: Use private key authentication
|
|
205
|
-
# SFTP_PRIVATE_KEY=/path/to/private/key
|
|
206
|
-
# SFTP_PASSPHRASE=key-passphrase
|
|
207
|
-
|
|
208
|
-
# Target AWS Configuration (for extraction)
|
|
209
|
-
TARGET_AWS_ACCESS_KEY_ID=target-access-key
|
|
210
|
-
TARGET_AWS_SECRET_ACCESS_KEY=target-secret-key
|
|
211
|
-
TARGET_AWS_REGION=us-west-2
|
|
212
|
-
|
|
213
|
-
# Webhook Validation (Fluent Commerce Rubix workflows only)
|
|
214
|
-
FLUENT_WEBHOOK_PUBLIC_KEY=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
|
|
215
|
-
|
|
216
|
-
# Optional: Processing Configuration
|
|
217
|
-
FLUENT_TIMEOUT=30000
|
|
218
|
-
FLUENT_RETRY_ATTEMPTS=3
|
|
219
|
-
FLUENT_RETRY_DELAY=1000
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
### Client Configuration Options
|
|
223
|
-
|
|
224
|
-
```typescript
|
|
225
|
-
interface FluentConfig {
|
|
226
|
-
// Required
|
|
227
|
-
baseUrl: string; // Fluent Commerce API endpoint
|
|
228
|
-
|
|
229
|
-
// Optional - only required for Job/Event APIs (NOT for GraphQL queries)
|
|
230
|
-
retailerId?: string; // See retailerid-configuration.md for all options
|
|
231
|
-
|
|
232
|
-
// OAuth2 Client Credentials (always required)
|
|
233
|
-
clientId?: string; // OAuth2 client ID
|
|
234
|
-
clientSecret?: string; // OAuth2 client secret
|
|
235
|
-
|
|
236
|
-
// OAuth2 Password Grant (optional - for user-specific operations)
|
|
237
|
-
username?: string; // OAuth2 username
|
|
238
|
-
password?: string; // OAuth2 password
|
|
239
|
-
|
|
240
|
-
// Optional Settings
|
|
241
|
-
timeout?: number; // Request timeout (ms), default: 30000
|
|
242
|
-
retryAttempts?: number; // Number of retries, default: 3
|
|
243
|
-
retryDelay?: number; // Delay between retries (ms), default: 1000
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Retry configuration with sensible defaults
|
|
247
|
-
* Override specific values as needed for fine-grained control
|
|
248
|
-
*/
|
|
249
|
-
retryConfig?: {
|
|
250
|
-
/** Maximum number of retry attempts for general requests (default: 3) */
|
|
251
|
-
maxRetries?: number;
|
|
252
|
-
/** Maximum number of retry attempts for authentication failures (default: 3) */
|
|
253
|
-
maxAuthRetries?: number;
|
|
254
|
-
/** Base delay in milliseconds before first retry (default: 1000) */
|
|
255
|
-
baseRetryDelayMs?: number;
|
|
256
|
-
/** Maximum delay in milliseconds for general retries (default: 10000) */
|
|
257
|
-
maxRetryDelayMs?: number;
|
|
258
|
-
/** Maximum delay in milliseconds for authentication retries (default: 5000) */
|
|
259
|
-
maxAuthRetryDelayMs?: number;
|
|
260
|
-
/** Token expiry buffer in seconds (default: 60) */
|
|
261
|
-
tokenExpiryBufferSeconds?: number;
|
|
262
|
-
};
|
|
263
|
-
|
|
264
|
-
// Optional Advanced
|
|
265
|
-
headers?: Record<string, string>; // Custom headers
|
|
266
|
-
proxy?: ProxyConfig; // Proxy configuration
|
|
267
|
-
}
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
### Configuration Methods
|
|
271
|
-
|
|
272
|
-
#### 1. Direct Configuration
|
|
273
|
-
|
|
274
|
-
```typescript
|
|
275
|
-
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
276
|
-
|
|
277
|
-
const client = await createClient({
|
|
278
|
-
config: {
|
|
279
|
-
baseUrl: 'https://api.fluentcommerce.com',
|
|
280
|
-
clientId: 'your-client-id',
|
|
281
|
-
clientSecret: 'your-client-secret',
|
|
282
|
-
// retailerId optional - only needed for Job/Event APIs
|
|
283
|
-
// retailerId: 'your-retailer-id',
|
|
284
|
-
username: 'your-username', // For password grant (optional)
|
|
285
|
-
password: 'your-password', // For password grant (optional)
|
|
286
|
-
timeout: 60000,
|
|
287
|
-
retryAttempts: 5, // Simple retry configuration
|
|
288
|
-
// Or use retryConfig for fine-grained control:
|
|
289
|
-
retryConfig: {
|
|
290
|
-
maxRetries: 5,
|
|
291
|
-
baseRetryDelayMs: 2000,
|
|
292
|
-
tokenExpiryBufferSeconds: 120,
|
|
293
|
-
},
|
|
294
|
-
},
|
|
295
|
-
});
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
#### 2. Using Environment Variables
|
|
299
|
-
|
|
300
|
-
```typescript
|
|
301
|
-
import dotenv from 'dotenv';
|
|
302
|
-
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
303
|
-
|
|
304
|
-
dotenv.config();
|
|
305
|
-
|
|
306
|
-
const client = await createClient({
|
|
307
|
-
config: {
|
|
308
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
309
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
310
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
311
|
-
username: process.env.FLUENT_USERNAME!,
|
|
312
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
313
|
-
// retailerId optional - only for Job/Event APIs
|
|
314
|
-
// retailerId: process.env.FLUENT_RETAILER_ID,
|
|
315
|
-
},
|
|
316
|
-
});
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
#### 3. Configuration File
|
|
320
|
-
|
|
321
|
-
Create `config.json`:
|
|
322
|
-
|
|
323
|
-
```json
|
|
324
|
-
{
|
|
325
|
-
"fluent": {
|
|
326
|
-
"baseUrl": "https://api.fluentcommerce.com",
|
|
327
|
-
"retailerId": "your-retailer-id",
|
|
328
|
-
"timeout": 30000,
|
|
329
|
-
"retryAttempts": 3
|
|
330
|
-
},
|
|
331
|
-
"aws": {
|
|
332
|
-
"region": "us-east-1"
|
|
333
|
-
},
|
|
334
|
-
"processing": {
|
|
335
|
-
"batchSize": 1000,
|
|
336
|
-
"parallelJobs": 5
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
Load configuration:
|
|
342
|
-
|
|
343
|
-
```typescript
|
|
344
|
-
import config from './config.json';
|
|
345
|
-
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
346
|
-
|
|
347
|
-
const client = await createClient({ config: config.fluent });
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
## Quick Example
|
|
351
|
-
|
|
352
|
-
### 1. Initialize the Client
|
|
353
|
-
|
|
354
|
-
```typescript
|
|
355
|
-
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
356
|
-
|
|
357
|
-
const client = await createClient({
|
|
358
|
-
config: {
|
|
359
|
-
baseUrl: 'https://api.fluentcommerce.com',
|
|
360
|
-
clientId: 'your-client-id',
|
|
361
|
-
clientSecret: 'your-client-secret',
|
|
362
|
-
},
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
// Set retailer ID when needed for Job/Batch operations
|
|
366
|
-
client.setRetailerId('your-retailer-id');
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
### 2. Execute a GraphQL Query
|
|
370
|
-
|
|
371
|
-
#### Single Page Query (Without Pagination Variables)
|
|
372
|
-
|
|
373
|
-
```typescript
|
|
374
|
-
// Query without pagination variables - returns ONE page only
|
|
375
|
-
// Note: InventoryPosition uses 'onHand' field (VirtualPosition uses 'quantity')
|
|
376
|
-
const query = `
|
|
377
|
-
query GetInventoryPositions {
|
|
378
|
-
inventoryPositions(first: 10) {
|
|
379
|
-
edges {
|
|
380
|
-
node {
|
|
381
|
-
ref
|
|
382
|
-
productRef
|
|
383
|
-
locationRef
|
|
384
|
-
onHand
|
|
385
|
-
status
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
`;
|
|
391
|
-
|
|
392
|
-
const result = await client.graphql({ query });
|
|
393
|
-
console.log('Inventory positions:', result.data.inventoryPositions);
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
#### Understanding Auto-Pagination
|
|
397
|
-
|
|
398
|
-
> **Auto-Pagination**: `client.graphql()` automatically fetches all pages when pagination variables are present. Disable with `pagination: { enabled: false }`.
|
|
399
|
-
|
|
400
|
-
```typescript
|
|
401
|
-
// Auto-pagination when pagination variables are present
|
|
402
|
-
const result = await client.graphql({
|
|
403
|
-
query: `
|
|
404
|
-
query GetAllInventory($first: Int!, $after: String) {
|
|
405
|
-
inventoryPositions(first: $first, after: $after) {
|
|
406
|
-
edges { cursor node { ref productRef locationRef qty status } }
|
|
407
|
-
pageInfo { hasNextPage }
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
`,
|
|
411
|
-
variables: { first: 100 },
|
|
412
|
-
pagination: { maxPages: 50 },
|
|
413
|
-
});
|
|
414
|
-
const allInventory = result.data?.inventoryPositions?.edges?.map(e => e.node) || [];
|
|
415
|
-
console.log(`Fetched ${allInventory.length} total inventory positions`);
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
**See**: [Auto-Pagination Guide](../02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md) for complete documentation.
|
|
419
|
-
|
|
420
|
-
### 3. Send a Batch Update
|
|
421
|
-
|
|
422
|
-
```typescript
|
|
423
|
-
import { BatchAction, EntityType } from '@fluentcommerce/fc-connect-sdk';
|
|
424
|
-
|
|
425
|
-
// Create a job (retailerId required for Job API)
|
|
426
|
-
const job = await client.createJob({
|
|
427
|
-
name: 'Inventory Update',
|
|
428
|
-
retailerId: 'your-retailer-id', // Required for createJob()
|
|
429
|
-
});
|
|
430
|
-
|
|
431
|
-
// Send batch data
|
|
432
|
-
const batchResult = await client.sendBatch(job.id, {
|
|
433
|
-
action: BatchAction.UPSERT,
|
|
434
|
-
entityType: EntityType.INVENTORY,
|
|
435
|
-
entities: [
|
|
436
|
-
{
|
|
437
|
-
ref: 'SKU001',
|
|
438
|
-
productRef: 'PROD001',
|
|
439
|
-
locationRef: 'LOC001',
|
|
440
|
-
qty: 100,
|
|
441
|
-
status: 'AVAILABLE',
|
|
442
|
-
},
|
|
443
|
-
{
|
|
444
|
-
ref: 'SKU002',
|
|
445
|
-
productRef: 'PROD002',
|
|
446
|
-
locationRef: 'LOC001',
|
|
447
|
-
qty: 50,
|
|
448
|
-
status: 'AVAILABLE',
|
|
449
|
-
},
|
|
450
|
-
],
|
|
451
|
-
});
|
|
452
|
-
|
|
453
|
-
console.log('Batch sent:', batchResult);
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
## Common Use Cases
|
|
457
|
-
|
|
458
|
-
### Inventory Ingestion from CSV
|
|
459
|
-
|
|
460
|
-
```typescript
|
|
461
|
-
import {
|
|
462
|
-
createClient,
|
|
463
|
-
S3DataSource,
|
|
464
|
-
CSVParserService,
|
|
465
|
-
UniversalMapper,
|
|
466
|
-
BatchAction,
|
|
467
|
-
EntityType,
|
|
468
|
-
createConsoleLogger,
|
|
469
|
-
toStructuredLogger,
|
|
470
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
471
|
-
|
|
472
|
-
async function ingestInventoryFromCSV() {
|
|
473
|
-
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
474
|
-
logLevel: 'info',
|
|
475
|
-
});
|
|
476
|
-
|
|
477
|
-
// Initialize client
|
|
478
|
-
const client = await createClient({
|
|
479
|
-
config: {
|
|
480
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
481
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
482
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
483
|
-
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
484
|
-
},
|
|
485
|
-
});
|
|
486
|
-
|
|
487
|
-
// Configure data source
|
|
488
|
-
const s3Source = new S3DataSource(
|
|
489
|
-
{
|
|
490
|
-
type: 'S3_CSV',
|
|
491
|
-
s3Config: {
|
|
492
|
-
bucket: 'my-inventory-bucket',
|
|
493
|
-
region: 'us-east-1',
|
|
494
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
495
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
496
|
-
},
|
|
497
|
-
},
|
|
498
|
-
logger
|
|
499
|
-
);
|
|
500
|
-
|
|
501
|
-
// Read CSV file
|
|
502
|
-
const csvData = await s3Source.downloadFile('inventory/products.csv');
|
|
503
|
-
|
|
504
|
-
// Parse CSV
|
|
505
|
-
const parser = new CSVParserService({ delimiter: ',', headers: true });
|
|
506
|
-
const records = await parser.parse(csvData);
|
|
507
|
-
|
|
508
|
-
// Map fields with UniversalMapper
|
|
509
|
-
const mapper = new UniversalMapper({
|
|
510
|
-
fields: {
|
|
511
|
-
ref: { source: 'sku', required: true },
|
|
512
|
-
productRef: { source: 'product_id', required: true },
|
|
513
|
-
locationRef: { source: 'location_code', required: true },
|
|
514
|
-
qty: { source: 'quantity', resolver: 'sdk.parseInt' },
|
|
515
|
-
status: { source: 'status', resolver: 'sdk.uppercase' },
|
|
516
|
-
},
|
|
517
|
-
});
|
|
518
|
-
|
|
519
|
-
const mappedData: any[] = [];
|
|
520
|
-
for (const record of records) {
|
|
521
|
-
const result = await mapper.map(record);
|
|
522
|
-
if (result.success) {
|
|
523
|
-
mappedData.push(result.data);
|
|
524
|
-
} else {
|
|
525
|
-
logger.warn('Mapping failed', { record, errors: result.errors });
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
// Send to Fluent
|
|
530
|
-
const job = await client.createJob({
|
|
531
|
-
name: 'CSV Inventory Import',
|
|
532
|
-
retailerId: client.getRetailerId(),
|
|
533
|
-
});
|
|
534
|
-
|
|
535
|
-
await client.sendBatch(job.id, {
|
|
536
|
-
action: BatchAction.UPSERT,
|
|
537
|
-
entityType: EntityType.INVENTORY,
|
|
538
|
-
entities: mappedData,
|
|
539
|
-
});
|
|
540
|
-
|
|
541
|
-
logger.info('Ingestion complete', { count: mappedData.length });
|
|
542
|
-
}
|
|
543
|
-
```
|
|
544
|
-
|
|
545
|
-
### Data Extraction to S3 (High-Level)
|
|
546
|
-
|
|
547
|
-
```typescript
|
|
548
|
-
import {
|
|
549
|
-
createClient,
|
|
550
|
-
ExtractionOrchestrator,
|
|
551
|
-
createConsoleLogger,
|
|
552
|
-
toStructuredLogger,
|
|
553
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
554
|
-
|
|
555
|
-
async function extractInventoryToS3() {
|
|
556
|
-
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
557
|
-
logLevel: 'info',
|
|
558
|
-
});
|
|
559
|
-
|
|
560
|
-
// Initialize client
|
|
561
|
-
const client = await createClient({
|
|
562
|
-
config: {
|
|
563
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
564
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
565
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
566
|
-
},
|
|
567
|
-
});
|
|
568
|
-
|
|
569
|
-
// Extract with ExtractionOrchestrator (handles pagination + export)
|
|
570
|
-
const orchestrator = new ExtractionOrchestrator(client, logger);
|
|
571
|
-
|
|
572
|
-
const result = await orchestrator.extract({
|
|
573
|
-
query: `
|
|
574
|
-
query GetInventory($first: Int!, $after: String) {
|
|
575
|
-
inventoryPositions(first: $first, after: $after) {
|
|
576
|
-
edges {
|
|
577
|
-
node {
|
|
578
|
-
ref
|
|
579
|
-
productRef
|
|
580
|
-
locationRef
|
|
581
|
-
onHand
|
|
582
|
-
status
|
|
583
|
-
updatedOn
|
|
584
|
-
}
|
|
585
|
-
cursor
|
|
586
|
-
}
|
|
587
|
-
pageInfo {
|
|
588
|
-
hasNextPage
|
|
589
|
-
# Note: Fluent doesn't return endCursor/startCursor - cursors are in edges[].cursor
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
`,
|
|
594
|
-
resultPath: 'inventoryPositions.edges.node', // Path to nodes for extraction
|
|
595
|
-
pageSize: 100,
|
|
596
|
-
maxRecords: 10000,
|
|
597
|
-
maxPages: 100,
|
|
598
|
-
direction: 'forward',
|
|
599
|
-
onProgress: (stats) => {
|
|
600
|
-
logger.info('Extraction progress', {
|
|
601
|
-
pagesProcessed: stats.pagesProcessed,
|
|
602
|
-
recordCount: stats.recordCount,
|
|
603
|
-
});
|
|
604
|
-
},
|
|
605
|
-
});
|
|
606
|
-
|
|
607
|
-
logger.info('Extraction complete', {
|
|
608
|
-
recordCount: result.stats.recordCount,
|
|
609
|
-
pagesProcessed: result.stats.pagesProcessed,
|
|
610
|
-
});
|
|
611
|
-
}
|
|
612
|
-
```
|
|
613
|
-
|
|
614
|
-
### Data Extraction to S3 (Manual Composition)
|
|
615
|
-
|
|
616
|
-
For more control, you can manually compose SDK services:
|
|
617
|
-
|
|
618
|
-
```typescript
|
|
619
|
-
import {
|
|
620
|
-
createClient,
|
|
621
|
-
S3DataSource,
|
|
622
|
-
UniversalMapper,
|
|
623
|
-
createConsoleLogger,
|
|
624
|
-
toStructuredLogger,
|
|
625
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
626
|
-
|
|
627
|
-
async function extractInventoryManual() {
|
|
628
|
-
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
629
|
-
logLevel: 'info',
|
|
630
|
-
});
|
|
631
|
-
|
|
632
|
-
// Initialize client
|
|
633
|
-
const client = await createClient({
|
|
634
|
-
config: {
|
|
635
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
636
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
637
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
638
|
-
},
|
|
639
|
-
});
|
|
640
|
-
|
|
641
|
-
// Query inventory with auto-pagination
|
|
642
|
-
const result = await client.graphql({
|
|
643
|
-
query: `
|
|
644
|
-
query GetInventory($first: Int!, $after: String) {
|
|
645
|
-
inventoryPositions(first: $first, after: $after) {
|
|
646
|
-
edges {
|
|
647
|
-
node {
|
|
648
|
-
ref
|
|
649
|
-
productRef
|
|
650
|
-
locationRef
|
|
651
|
-
onHand
|
|
652
|
-
status
|
|
653
|
-
updatedOn
|
|
654
|
-
}
|
|
655
|
-
cursor
|
|
656
|
-
}
|
|
657
|
-
pageInfo {
|
|
658
|
-
hasNextPage
|
|
659
|
-
# Note: Fluent doesn't return endCursor/startCursor - cursors are in edges[].cursor
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
`,
|
|
664
|
-
variables: { first: 100 },
|
|
665
|
-
pagination: { maxRecords: 10000 },
|
|
666
|
-
});
|
|
667
|
-
|
|
668
|
-
const inventory = result.data?.inventoryPositions?.edges?.map(e => e.node) || [];
|
|
669
|
-
|
|
670
|
-
// Transform for export
|
|
671
|
-
const mapper = new UniversalMapper({
|
|
672
|
-
fields: {
|
|
673
|
-
sku: { source: 'ref', resolver: 'sdk.toString' },
|
|
674
|
-
product_id: { source: 'productRef', resolver: 'sdk.toString' },
|
|
675
|
-
location: { source: 'locationRef', resolver: 'sdk.toString' },
|
|
676
|
-
quantity: { source: 'onHand', resolver: 'sdk.parseInt' },
|
|
677
|
-
status: { source: 'status', resolver: 'sdk.lowercase' },
|
|
678
|
-
last_updated: { source: 'updatedOn', resolver: 'sdk.formatDate' },
|
|
679
|
-
},
|
|
680
|
-
});
|
|
681
|
-
|
|
682
|
-
const transformed: any[] = [];
|
|
683
|
-
for (const item of inventory) {
|
|
684
|
-
const result = await mapper.map(item);
|
|
685
|
-
if (result.success) {
|
|
686
|
-
transformed.push(result.data);
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
// Upload to S3
|
|
691
|
-
const s3Target = new S3DataSource(
|
|
692
|
-
{
|
|
693
|
-
type: 'S3_JSON',
|
|
694
|
-
connectionId: 's3-target',
|
|
695
|
-
name: 'Export S3',
|
|
696
|
-
s3Config: {
|
|
697
|
-
bucket: 'my-export-bucket',
|
|
698
|
-
region: 'us-west-2',
|
|
699
|
-
accessKeyId: process.env.TARGET_AWS_ACCESS_KEY_ID!,
|
|
700
|
-
secretAccessKey: process.env.TARGET_AWS_SECRET_ACCESS_KEY!,
|
|
701
|
-
},
|
|
702
|
-
},
|
|
703
|
-
logger
|
|
704
|
-
);
|
|
705
|
-
|
|
706
|
-
await s3Target.uploadFile('exports/inventory-export.json', JSON.stringify(transformed, null, 2), {
|
|
707
|
-
contentType: 'application/json',
|
|
708
|
-
});
|
|
709
|
-
|
|
710
|
-
logger.info('Extraction complete', { count: transformed.length });
|
|
711
|
-
}
|
|
712
|
-
```
|
|
713
|
-
|
|
714
|
-
### Backward Pagination (Reverse Order)
|
|
715
|
-
|
|
716
|
-
Fetch records in reverse chronological order (from end to start):
|
|
717
|
-
|
|
718
|
-
```typescript
|
|
719
|
-
import { ExtractionOrchestrator } from '@fluentcommerce/fc-connect-sdk';
|
|
720
|
-
|
|
721
|
-
const orchestrator = new ExtractionOrchestrator(client, logger);
|
|
722
|
-
|
|
723
|
-
const result = await orchestrator.extract({
|
|
724
|
-
query: `
|
|
725
|
-
query GetRecentOrders($last: Int!, $before: String) {
|
|
726
|
-
orders(last: $last, before: $before) {
|
|
727
|
-
edges {
|
|
728
|
-
node { id ref status createdOn }
|
|
729
|
-
cursor
|
|
730
|
-
}
|
|
731
|
-
pageInfo { hasPreviousPage }
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
`,
|
|
735
|
-
resultPath: 'orders.edges.node',
|
|
736
|
-
variables: { last: 100 },
|
|
737
|
-
direction: 'backward', // Fetch from end to start
|
|
738
|
-
maxRecords: 1000,
|
|
739
|
-
});
|
|
740
|
-
|
|
741
|
-
console.log(`Extracted ${result.stats.totalRecords} orders`);
|
|
742
|
-
```
|
|
743
|
-
|
|
744
|
-
**When to use backward pagination:**
|
|
745
|
-
|
|
746
|
-
- Fetching most recent records (latest orders, recent events)
|
|
747
|
-
- Reverse chronological feeds
|
|
748
|
-
- "Show last N items" scenarios
|
|
749
|
-
|
|
750
|
-
### Processing with State Management
|
|
751
|
-
|
|
752
|
-
```typescript
|
|
753
|
-
import {
|
|
754
|
-
createClient,
|
|
755
|
-
S3DataSource,
|
|
756
|
-
StateService,
|
|
757
|
-
VersoriKVAdapter,
|
|
758
|
-
createConsoleLogger,
|
|
759
|
-
toStructuredLogger,
|
|
760
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
761
|
-
|
|
762
|
-
async function processFilesWithStateTracking(context) {
|
|
763
|
-
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
764
|
-
logLevel: 'info',
|
|
765
|
-
});
|
|
766
|
-
|
|
767
|
-
// Initialize state service (Versori example)
|
|
768
|
-
const kvAdapter = new VersoriKVAdapter(context.openKv(':project:'));
|
|
769
|
-
const stateService = new StateService(kvAdapter);
|
|
770
|
-
|
|
771
|
-
// Initialize S3
|
|
772
|
-
const s3 = new S3DataSource(s3Config, logger);
|
|
773
|
-
|
|
774
|
-
// List files
|
|
775
|
-
const files = await s3.listFiles({ prefix: 'inbox/' });
|
|
776
|
-
|
|
777
|
-
for (const file of files) {
|
|
778
|
-
// Check if already processed
|
|
779
|
-
if (await stateService.isFileProcessed(file.path)) {
|
|
780
|
-
logger.info('File already processed', { file: file.name });
|
|
781
|
-
continue;
|
|
782
|
-
}
|
|
783
|
-
|
|
784
|
-
try {
|
|
785
|
-
// Process file
|
|
786
|
-
const content = await s3.downloadFile(file.path);
|
|
787
|
-
await processFileContent(content);
|
|
788
|
-
|
|
789
|
-
// Mark as processed
|
|
790
|
-
await stateService.markFileProcessed(file.path, {
|
|
791
|
-
processedAt: new Date().toISOString(),
|
|
792
|
-
size: file.size,
|
|
793
|
-
});
|
|
794
|
-
|
|
795
|
-
logger.info('File processed successfully', { file: file.name });
|
|
796
|
-
} catch (error) {
|
|
797
|
-
logger.error('Failed to process file', error as Error, { file: file.name });
|
|
798
|
-
throw error;
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
}
|
|
802
|
-
```
|
|
803
|
-
|
|
804
|
-
## Platform-Specific Setup
|
|
805
|
-
|
|
806
|
-
### Node.js Applications
|
|
807
|
-
|
|
808
|
-
No additional configuration needed. The SDK works out of the box with Node.js 18+.
|
|
809
|
-
|
|
810
|
-
```typescript
|
|
811
|
-
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
812
|
-
|
|
813
|
-
async function main() {
|
|
814
|
-
const client = await createClient({
|
|
815
|
-
config: {
|
|
816
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
817
|
-
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
818
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
819
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
820
|
-
},
|
|
821
|
-
});
|
|
822
|
-
|
|
823
|
-
// Use client...
|
|
824
|
-
}
|
|
825
|
-
```
|
|
826
|
-
|
|
827
|
-
### Versori Platform
|
|
828
|
-
|
|
829
|
-
For Versori platform applications, the SDK automatically detects and uses the Versori context:
|
|
830
|
-
|
|
831
|
-
```typescript
|
|
832
|
-
import { http } from '@versori/run';
|
|
833
|
-
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
834
|
-
|
|
835
|
-
export const handler = http(
|
|
836
|
-
'handler',
|
|
837
|
-
{
|
|
838
|
-
connection: 'fluent_commerce',
|
|
839
|
-
},
|
|
840
|
-
async ctx => {
|
|
841
|
-
// Auto-detects Versori context
|
|
842
|
-
const client = await createClient(ctx);
|
|
843
|
-
|
|
844
|
-
// Use the same API
|
|
845
|
-
const result = await client.graphql({
|
|
846
|
-
query: `query { locations { edges { node { id ref } } } }`,
|
|
847
|
-
});
|
|
848
|
-
|
|
849
|
-
return {
|
|
850
|
-
statusCode: 200,
|
|
851
|
-
body: JSON.stringify(result),
|
|
852
|
-
};
|
|
853
|
-
}
|
|
854
|
-
);
|
|
855
|
-
```
|
|
856
|
-
|
|
857
|
-
**See**: [Versori Platform Guide](../04-REFERENCE/platforms/versori/) for complete Versori documentation.
|
|
858
|
-
|
|
859
|
-
### Deno Support
|
|
860
|
-
|
|
861
|
-
The SDK is compatible with Deno runtime. See the [Deno Platform Guide](../04-REFERENCE/platforms/deno/) for details.
|
|
862
|
-
|
|
863
|
-
## Error Handling
|
|
864
|
-
|
|
865
|
-
```typescript
|
|
866
|
-
import { IngestionError, IngestionErrorCode } from '@fluentcommerce/fc-connect-sdk';
|
|
867
|
-
|
|
868
|
-
try {
|
|
869
|
-
await client.sendBatch(jobId, batchData);
|
|
870
|
-
} catch (error) {
|
|
871
|
-
if (error instanceof IngestionError) {
|
|
872
|
-
console.error('Ingestion failed:', {
|
|
873
|
-
code: error.code,
|
|
874
|
-
message: error.message,
|
|
875
|
-
context: error.context,
|
|
876
|
-
});
|
|
877
|
-
|
|
878
|
-
// Handle specific errors
|
|
879
|
-
switch (error.code) {
|
|
880
|
-
case IngestionErrorCode.VALIDATION_ERROR:
|
|
881
|
-
// Handle validation errors
|
|
882
|
-
await logValidationError(error.context);
|
|
883
|
-
break;
|
|
884
|
-
|
|
885
|
-
case IngestionErrorCode.RATE_LIMIT_ERROR:
|
|
886
|
-
// Retry with exponential backoff
|
|
887
|
-
await retryWithBackoff(() => client.sendBatch(jobId, batchData));
|
|
888
|
-
break;
|
|
889
|
-
|
|
890
|
-
case IngestionErrorCode.JOB_CREATION_ERROR:
|
|
891
|
-
// Create new job and retry
|
|
892
|
-
const newJob = await client.createJob({
|
|
893
|
-
name: 'Retry Job',
|
|
894
|
-
retailerId: client.getRetailerId(),
|
|
895
|
-
});
|
|
896
|
-
await client.sendBatch(newJob.id, batchData);
|
|
897
|
-
break;
|
|
898
|
-
|
|
899
|
-
case IngestionErrorCode.NETWORK_ERROR:
|
|
900
|
-
// Check network and retry
|
|
901
|
-
await checkNetworkConnectivity();
|
|
902
|
-
break;
|
|
903
|
-
}
|
|
904
|
-
} else {
|
|
905
|
-
// Handle unexpected errors
|
|
906
|
-
console.error('Unexpected error:', error);
|
|
907
|
-
throw error;
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
```
|
|
911
|
-
|
|
912
|
-
**See**: [Error Handling Guide](../03-PATTERN-GUIDES/error-handling/error-handling-readme.md) for comprehensive error handling patterns.
|
|
913
|
-
|
|
914
|
-
## Best Practices
|
|
915
|
-
|
|
916
|
-
### 1. Security
|
|
917
|
-
|
|
918
|
-
- **Store credentials securely** using environment variables or secret managers
|
|
919
|
-
- **Never commit credentials** to version control
|
|
920
|
-
- **Validate webhook signatures** (for Fluent Rubix webhooks only)
|
|
921
|
-
- **Use least privilege** AWS IAM policies
|
|
922
|
-
|
|
923
|
-
### 2. Performance
|
|
924
|
-
|
|
925
|
-
- **Use streaming parsers** for large files to minimize memory usage
|
|
926
|
-
- **Batch operations** to reduce API calls
|
|
927
|
-
- **Use auto-pagination** for large result sets - See [Auto-Pagination Guide](../02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md)
|
|
928
|
-
- **Configure appropriate timeouts** based on operation types
|
|
929
|
-
|
|
930
|
-
### 3. Reliability
|
|
931
|
-
|
|
932
|
-
- **Implement retry logic** with exponential backoff for transient failures
|
|
933
|
-
- **Track processing state** to prevent duplicate processing
|
|
934
|
-
- **Use distributed locking** for concurrent workflows
|
|
935
|
-
- **Monitor job status** and handle failures gracefully
|
|
936
|
-
|
|
937
|
-
### 4. Data Quality
|
|
938
|
-
|
|
939
|
-
- **Validate data** before sending to Fluent
|
|
940
|
-
- **Use UniversalMapper** for consistent field transformations
|
|
941
|
-
- **Handle missing data** with default values
|
|
942
|
-
- **Log transformation errors** for debugging
|
|
943
|
-
|
|
944
|
-
### 5. Monitoring
|
|
945
|
-
|
|
946
|
-
- **Log all operations** with structured logging
|
|
947
|
-
- **Track metrics** like processing time and record counts
|
|
948
|
-
- **Set up alerts** for failures and anomalies
|
|
949
|
-
- **Monitor API rate limits** and adjust accordingly
|
|
950
|
-
|
|
951
|
-
## Troubleshooting
|
|
952
|
-
|
|
953
|
-
### Common Installation Issues
|
|
954
|
-
|
|
955
|
-
#### Module Resolution Errors
|
|
956
|
-
|
|
957
|
-
```bash
|
|
958
|
-
npm cache clean --force
|
|
959
|
-
rm -rf node_modules package-lock.json
|
|
960
|
-
npm install
|
|
961
|
-
```
|
|
962
|
-
|
|
963
|
-
#### TypeScript Errors
|
|
964
|
-
|
|
965
|
-
- Ensure TypeScript version is >= 5.0.0
|
|
966
|
-
- Add `"skipLibCheck": true` to tsconfig.json
|
|
967
|
-
- Check for type definition conflicts
|
|
968
|
-
|
|
969
|
-
#### Version Conflicts
|
|
970
|
-
|
|
971
|
-
```bash
|
|
972
|
-
# Check installed version
|
|
973
|
-
npm ls @fluentcommerce/fc-connect-sdk
|
|
974
|
-
|
|
975
|
-
# Update to latest
|
|
976
|
-
npm update @fluentcommerce/fc-connect-sdk
|
|
977
|
-
```
|
|
978
|
-
|
|
979
|
-
### Runtime Issues
|
|
980
|
-
|
|
981
|
-
#### Authentication Failures
|
|
982
|
-
|
|
983
|
-
- Verify API credentials are correct
|
|
984
|
-
- Check base URL matches your environment
|
|
985
|
-
- Ensure retailer ID is valid (for Job/Batch operations)
|
|
986
|
-
|
|
987
|
-
#### Network Timeouts
|
|
988
|
-
|
|
989
|
-
- Increase timeout configuration
|
|
990
|
-
- Check network connectivity
|
|
991
|
-
- Verify firewall rules
|
|
992
|
-
|
|
993
|
-
#### Memory Issues
|
|
994
|
-
|
|
995
|
-
- Use streaming for large files
|
|
996
|
-
- Process data in chunks
|
|
997
|
-
- Monitor memory usage
|
|
998
|
-
|
|
999
|
-
### Debugging Tips
|
|
1000
|
-
|
|
1001
|
-
```typescript
|
|
1002
|
-
import { createConsoleLogger, toStructuredLogger } from '@fluentcommerce/fc-connect-sdk';
|
|
1003
|
-
|
|
1004
|
-
// Use structured logging
|
|
1005
|
-
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
1006
|
-
logLevel: 'debug',
|
|
1007
|
-
});
|
|
1008
|
-
|
|
1009
|
-
const client = await createClient({
|
|
1010
|
-
config: {
|
|
1011
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
1012
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
1013
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
1014
|
-
timeout: 60000,
|
|
1015
|
-
retryAttempts: 3,
|
|
1016
|
-
},
|
|
1017
|
-
});
|
|
1018
|
-
|
|
1019
|
-
// Log GraphQL operations
|
|
1020
|
-
const query = `query { products { edges { node { ref } } } }`;
|
|
1021
|
-
logger.debug('Executing GraphQL query', { query });
|
|
1022
|
-
const result = await client.graphql({ query });
|
|
1023
|
-
logger.debug('Query result', {
|
|
1024
|
-
recordCount: result.data?.products?.edges?.length,
|
|
1025
|
-
});
|
|
1026
|
-
|
|
1027
|
-
// Log batch operations
|
|
1028
|
-
logger.info('Sending batch', {
|
|
1029
|
-
jobId,
|
|
1030
|
-
recordCount: batchData.entities.length,
|
|
1031
|
-
});
|
|
1032
|
-
await client.sendBatch(jobId, batchData);
|
|
1033
|
-
logger.info('Batch sent successfully');
|
|
1034
|
-
```
|
|
1035
|
-
|
|
1036
|
-
## Next Steps
|
|
1037
|
-
|
|
1038
|
-
Now that you're set up, explore:
|
|
1039
|
-
|
|
1040
|
-
- **[API Reference](../02-CORE-GUIDES/api-reference/api-reference-readme.md)** - Complete API documentation
|
|
1041
|
-
- **[Universal Mapping Guide](../02-CORE-GUIDES/mapping/mapping-readme.md)** - Field mapping and transformations
|
|
1042
|
-
- **[Auto-Pagination Guide](../02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md)** - Automatic GraphQL pagination
|
|
1043
|
-
- **[Ingestion Guide](../02-CORE-GUIDES/ingestion/)** - Inventory ingestion workflows
|
|
1044
|
-
- **[Extraction Guide](../02-CORE-GUIDES/extraction/)** - Data extraction patterns
|
|
1045
|
-
- **[Use Cases](../01-TEMPLATES/readme.md)** - Real-world examples and patterns
|
|
1046
|
-
|
|
1047
|
-
## CLI Tools
|
|
1048
|
-
|
|
1049
|
-
The SDK provides command-line tools for working with GraphQL schemas and mappings:
|
|
1050
|
-
|
|
1051
|
-
```bash
|
|
1052
|
-
# Show available commands
|
|
1053
|
-
npx fc-connect help
|
|
1054
|
-
|
|
1055
|
-
# Check SDK version
|
|
1056
|
-
npx fc-connect version
|
|
1057
|
-
|
|
1058
|
-
# Generate mutation mapping template
|
|
1059
|
-
npx fc-connect generate-mutation-mapping \
|
|
1060
|
-
--file ./mutations/createOrder.graphql \
|
|
1061
|
-
--endpoint https://api.fluentcommerce.com/graphql \
|
|
1062
|
-
--output ./mappings/createOrder.json
|
|
1063
|
-
|
|
1064
|
-
# Introspect and cache schema
|
|
1065
|
-
npx fc-connect introspect-schema \
|
|
1066
|
-
--endpoint https://api.fluentcommerce.com/graphql \
|
|
1067
|
-
--output ./schema/fluent-schema.json
|
|
1068
|
-
```
|
|
1069
|
-
|
|
1070
|
-
**See**: [API Reference - CLI Tools](../02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md) for complete CLI documentation.
|
|
1
|
+
# Getting Started Guide
|
|
2
|
+
|
|
3
|
+
Get up and running with the Fluent Commerce Connect SDK quickly and efficiently.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Prerequisites](#prerequisites)
|
|
8
|
+
- [Installation](#installation)
|
|
9
|
+
- [Configuration](#configuration)
|
|
10
|
+
- [Quick Example](#quick-example)
|
|
11
|
+
- [Common Use Cases](#common-use-cases)
|
|
12
|
+
- [Platform-Specific Setup](#platform-specific-setup)
|
|
13
|
+
- [Error Handling](#error-handling)
|
|
14
|
+
- [Best Practices](#best-practices)
|
|
15
|
+
- [Troubleshooting](#troubleshooting)
|
|
16
|
+
|
|
17
|
+
## Prerequisites
|
|
18
|
+
|
|
19
|
+
Before installing the Fluent Commerce Connect SDK, ensure you have:
|
|
20
|
+
|
|
21
|
+
- **Node.js** >= 18.0.0
|
|
22
|
+
- **npm** >= 8.0.0 or **yarn** >= 1.22.0
|
|
23
|
+
- **TypeScript** >= 5.0.0 (for TypeScript projects)
|
|
24
|
+
- **Fluent Commerce Account** with API credentials
|
|
25
|
+
- **AWS Credentials** (if using S3 operations)
|
|
26
|
+
|
|
27
|
+
## Installation
|
|
28
|
+
|
|
29
|
+
### Using NPM
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm install @fluentcommerce/fc-connect-sdk
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Using Yarn
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
yarn add @fluentcommerce/fc-connect-sdk
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Using PNPM
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pnpm add @fluentcommerce/fc-connect-sdk
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Version Information
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# Check latest version
|
|
51
|
+
npm view @fluentcommerce/fc-connect-sdk version
|
|
52
|
+
|
|
53
|
+
# View all available versions
|
|
54
|
+
npm view @fluentcommerce/fc-connect-sdk versions
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Module Formats
|
|
58
|
+
|
|
59
|
+
The SDK is distributed in multiple formats:
|
|
60
|
+
|
|
61
|
+
- **CommonJS** (CJS) - For Node.js applications using `require()`
|
|
62
|
+
- **ES Modules** (ESM) - For modern JavaScript/TypeScript applications using `import`
|
|
63
|
+
- **TypeScript Definitions** - Full type definitions included
|
|
64
|
+
|
|
65
|
+
### Importing from the SDK
|
|
66
|
+
|
|
67
|
+
**⚠️ IMPORTANT: Always import from the main entry point**
|
|
68
|
+
|
|
69
|
+
The SDK exports all public APIs from the main entry point. Do NOT use subpath imports.
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
// ✅ CORRECT - Import from main entry
|
|
73
|
+
import {
|
|
74
|
+
createClient,
|
|
75
|
+
FluentClient,
|
|
76
|
+
FluentVersoriClient,
|
|
77
|
+
FluentBatchManager,
|
|
78
|
+
UniversalMapper,
|
|
79
|
+
VersoriKVAdapter,
|
|
80
|
+
S3DataSource,
|
|
81
|
+
SftpDataSource,
|
|
82
|
+
CSVParserService,
|
|
83
|
+
XMLParserService,
|
|
84
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
85
|
+
|
|
86
|
+
// ❌ WRONG - Subpath imports are NOT supported
|
|
87
|
+
import { VersoriKVAdapter } from '@fluentcommerce/fc-connect-sdk/versori';
|
|
88
|
+
import { S3DataSource } from '@fluentcommerce/fc-connect-sdk/data-sources';
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Why main entry only?**
|
|
92
|
+
|
|
93
|
+
- ✅ Simpler and more maintainable
|
|
94
|
+
- ✅ Standard npm package pattern
|
|
95
|
+
- ✅ Better tree-shaking
|
|
96
|
+
- ✅ Consistent with most npm packages (React, Lodash, etc.)
|
|
97
|
+
- ✅ All public APIs are intentionally exported
|
|
98
|
+
|
|
99
|
+
**All Available Exports:**
|
|
100
|
+
|
|
101
|
+
- Clients: `createClient`, `FluentClient`, `FluentVersoriClient`
|
|
102
|
+
- Services: `FluentBatchManager`, `UniversalMapper`, `StateService`
|
|
103
|
+
- Orchestrators: `ExtractionOrchestrator`, `JobTracker`, `PartialBatchRecovery`, `PreflightValidator`
|
|
104
|
+
- Data Sources: `S3DataSource`, `SftpDataSource`, `InventoryDataSource`
|
|
105
|
+
- Parsers: `CSVParserService`, `XMLParserService`, `JSONParserService`, `ParquetParserService`
|
|
106
|
+
- Builders: `XMLBuilder`, `CSVBuilder`, `JSONBuilder`
|
|
107
|
+
- Logging Utilities: `createConsoleLogger`, `toStructuredLogger`, `createWorkflowLogger`, `createServiceLogger`
|
|
108
|
+
- Versori: `VersoriKVAdapter`, `VersoriFileTracker`
|
|
109
|
+
- Testing: `S3SDKTester`, `S3PresignedTester`, `FluentConnectionTester`
|
|
110
|
+
- Utilities: `parseWebhookRequest`, `validateFluentEvent`, `validateGraphQLPayload`, and file naming utilities
|
|
111
|
+
- All TypeScript types and interfaces
|
|
112
|
+
|
|
113
|
+
See [API Reference](../02-CORE-GUIDES/api-reference/api-reference-readme.md) for complete list of exports.
|
|
114
|
+
|
|
115
|
+
### TypeScript Configuration
|
|
116
|
+
|
|
117
|
+
Add to your `tsconfig.json`:
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"compilerOptions": {
|
|
122
|
+
"module": "ES2022",
|
|
123
|
+
"target": "ES2024",
|
|
124
|
+
"moduleResolution": "node"
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Logging Approach
|
|
130
|
+
|
|
131
|
+
The SDK provides minimal logging utilities for standalone environments. **Versori users should always use native platform logs.**
|
|
132
|
+
|
|
133
|
+
### Versori Platform (Recommended)
|
|
134
|
+
|
|
135
|
+
Use native `log` from context - no imports needed:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
import { schedule, http } from '@versori/run';
|
|
139
|
+
import { createClient, SftpDataSource } from '@fluentcommerce/fc-connect-sdk';
|
|
140
|
+
|
|
141
|
+
export const myWorkflow = schedule('my-workflow', '0 * * * *')
|
|
142
|
+
.then(http('process', { connection: 'fluent' }, async (ctx) => {
|
|
143
|
+
const { log, openKv, activation } = ctx;
|
|
144
|
+
|
|
145
|
+
// Pass native log directly to SDK services
|
|
146
|
+
const client = await createClient({ ...ctx, log });
|
|
147
|
+
const sftp = new SftpDataSource(config, log);
|
|
148
|
+
|
|
149
|
+
log.info('Processing started');
|
|
150
|
+
}));
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Standalone Node.js/Deno
|
|
154
|
+
|
|
155
|
+
Use function-based logging utilities:
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import {
|
|
159
|
+
createConsoleLogger,
|
|
160
|
+
toStructuredLogger,
|
|
161
|
+
generateCorrelationId,
|
|
162
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
163
|
+
|
|
164
|
+
// Simple console logger
|
|
165
|
+
const logger = createConsoleLogger();
|
|
166
|
+
|
|
167
|
+
// Or with context (adds metadata to all logs)
|
|
168
|
+
const contextLogger = toStructuredLogger(logger, {
|
|
169
|
+
service: 'InventorySync',
|
|
170
|
+
correlationId: generateCorrelationId(),
|
|
171
|
+
logLevel: 'debug',
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
const client = await createClient({ config: { ...config, logger: contextLogger } });
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**See**: [Logging Guide](../02-CORE-GUIDES/logging-guide.md) for complete logging documentation.
|
|
178
|
+
|
|
179
|
+
## Configuration
|
|
180
|
+
|
|
181
|
+
### Environment Variables
|
|
182
|
+
|
|
183
|
+
Create a `.env` file in your project root:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# Fluent Commerce Configuration
|
|
187
|
+
FLUENT_BASE_URL=https://api.fluentcommerce.com
|
|
188
|
+
FLUENT_RETAILER_ID=your-retailer-id
|
|
189
|
+
FLUENT_CLIENT_ID=your-client-id
|
|
190
|
+
FLUENT_CLIENT_SECRET=your-client-secret
|
|
191
|
+
FLUENT_USERNAME=your-username
|
|
192
|
+
FLUENT_PASSWORD=your-password
|
|
193
|
+
|
|
194
|
+
# AWS Configuration (for S3 operations)
|
|
195
|
+
AWS_ACCESS_KEY_ID=your-access-key
|
|
196
|
+
AWS_SECRET_ACCESS_KEY=your-secret-key
|
|
197
|
+
AWS_REGION=us-east-1
|
|
198
|
+
|
|
199
|
+
# SFTP Configuration (for SFTP operations)
|
|
200
|
+
SFTP_HOST=sftp.yourcompany.com
|
|
201
|
+
SFTP_PORT=22
|
|
202
|
+
SFTP_USERNAME=your-sftp-username
|
|
203
|
+
SFTP_PASSWORD=your-sftp-password
|
|
204
|
+
# Alternative: Use private key authentication
|
|
205
|
+
# SFTP_PRIVATE_KEY=/path/to/private/key
|
|
206
|
+
# SFTP_PASSPHRASE=key-passphrase
|
|
207
|
+
|
|
208
|
+
# Target AWS Configuration (for extraction)
|
|
209
|
+
TARGET_AWS_ACCESS_KEY_ID=target-access-key
|
|
210
|
+
TARGET_AWS_SECRET_ACCESS_KEY=target-secret-key
|
|
211
|
+
TARGET_AWS_REGION=us-west-2
|
|
212
|
+
|
|
213
|
+
# Webhook Validation (Fluent Commerce Rubix workflows only)
|
|
214
|
+
FLUENT_WEBHOOK_PUBLIC_KEY=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
|
|
215
|
+
|
|
216
|
+
# Optional: Processing Configuration
|
|
217
|
+
FLUENT_TIMEOUT=30000
|
|
218
|
+
FLUENT_RETRY_ATTEMPTS=3
|
|
219
|
+
FLUENT_RETRY_DELAY=1000
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Client Configuration Options
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
interface FluentConfig {
|
|
226
|
+
// Required
|
|
227
|
+
baseUrl: string; // Fluent Commerce API endpoint
|
|
228
|
+
|
|
229
|
+
// Optional - only required for Job/Event APIs (NOT for GraphQL queries)
|
|
230
|
+
retailerId?: string; // See retailerid-configuration.md for all options
|
|
231
|
+
|
|
232
|
+
// OAuth2 Client Credentials (always required)
|
|
233
|
+
clientId?: string; // OAuth2 client ID
|
|
234
|
+
clientSecret?: string; // OAuth2 client secret
|
|
235
|
+
|
|
236
|
+
// OAuth2 Password Grant (optional - for user-specific operations)
|
|
237
|
+
username?: string; // OAuth2 username
|
|
238
|
+
password?: string; // OAuth2 password
|
|
239
|
+
|
|
240
|
+
// Optional Settings
|
|
241
|
+
timeout?: number; // Request timeout (ms), default: 30000
|
|
242
|
+
retryAttempts?: number; // Number of retries, default: 3
|
|
243
|
+
retryDelay?: number; // Delay between retries (ms), default: 1000
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Retry configuration with sensible defaults
|
|
247
|
+
* Override specific values as needed for fine-grained control
|
|
248
|
+
*/
|
|
249
|
+
retryConfig?: {
|
|
250
|
+
/** Maximum number of retry attempts for general requests (default: 3) */
|
|
251
|
+
maxRetries?: number;
|
|
252
|
+
/** Maximum number of retry attempts for authentication failures (default: 3) */
|
|
253
|
+
maxAuthRetries?: number;
|
|
254
|
+
/** Base delay in milliseconds before first retry (default: 1000) */
|
|
255
|
+
baseRetryDelayMs?: number;
|
|
256
|
+
/** Maximum delay in milliseconds for general retries (default: 10000) */
|
|
257
|
+
maxRetryDelayMs?: number;
|
|
258
|
+
/** Maximum delay in milliseconds for authentication retries (default: 5000) */
|
|
259
|
+
maxAuthRetryDelayMs?: number;
|
|
260
|
+
/** Token expiry buffer in seconds (default: 60) */
|
|
261
|
+
tokenExpiryBufferSeconds?: number;
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
// Optional Advanced
|
|
265
|
+
headers?: Record<string, string>; // Custom headers
|
|
266
|
+
proxy?: ProxyConfig; // Proxy configuration
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Configuration Methods
|
|
271
|
+
|
|
272
|
+
#### 1. Direct Configuration
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
276
|
+
|
|
277
|
+
const client = await createClient({
|
|
278
|
+
config: {
|
|
279
|
+
baseUrl: 'https://api.fluentcommerce.com',
|
|
280
|
+
clientId: 'your-client-id',
|
|
281
|
+
clientSecret: 'your-client-secret',
|
|
282
|
+
// retailerId optional - only needed for Job/Event APIs
|
|
283
|
+
// retailerId: 'your-retailer-id',
|
|
284
|
+
username: 'your-username', // For password grant (optional)
|
|
285
|
+
password: 'your-password', // For password grant (optional)
|
|
286
|
+
timeout: 60000,
|
|
287
|
+
retryAttempts: 5, // Simple retry configuration
|
|
288
|
+
// Or use retryConfig for fine-grained control:
|
|
289
|
+
retryConfig: {
|
|
290
|
+
maxRetries: 5,
|
|
291
|
+
baseRetryDelayMs: 2000,
|
|
292
|
+
tokenExpiryBufferSeconds: 120,
|
|
293
|
+
},
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
#### 2. Using Environment Variables
|
|
299
|
+
|
|
300
|
+
```typescript
|
|
301
|
+
import dotenv from 'dotenv';
|
|
302
|
+
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
303
|
+
|
|
304
|
+
dotenv.config();
|
|
305
|
+
|
|
306
|
+
const client = await createClient({
|
|
307
|
+
config: {
|
|
308
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
309
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
310
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
311
|
+
username: process.env.FLUENT_USERNAME!,
|
|
312
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
313
|
+
// retailerId optional - only for Job/Event APIs
|
|
314
|
+
// retailerId: process.env.FLUENT_RETAILER_ID,
|
|
315
|
+
},
|
|
316
|
+
});
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
#### 3. Configuration File
|
|
320
|
+
|
|
321
|
+
Create `config.json`:
|
|
322
|
+
|
|
323
|
+
```json
|
|
324
|
+
{
|
|
325
|
+
"fluent": {
|
|
326
|
+
"baseUrl": "https://api.fluentcommerce.com",
|
|
327
|
+
"retailerId": "your-retailer-id",
|
|
328
|
+
"timeout": 30000,
|
|
329
|
+
"retryAttempts": 3
|
|
330
|
+
},
|
|
331
|
+
"aws": {
|
|
332
|
+
"region": "us-east-1"
|
|
333
|
+
},
|
|
334
|
+
"processing": {
|
|
335
|
+
"batchSize": 1000,
|
|
336
|
+
"parallelJobs": 5
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
Load configuration:
|
|
342
|
+
|
|
343
|
+
```typescript
|
|
344
|
+
import config from './config.json';
|
|
345
|
+
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
346
|
+
|
|
347
|
+
const client = await createClient({ config: config.fluent });
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
## Quick Example
|
|
351
|
+
|
|
352
|
+
### 1. Initialize the Client
|
|
353
|
+
|
|
354
|
+
```typescript
|
|
355
|
+
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
356
|
+
|
|
357
|
+
const client = await createClient({
|
|
358
|
+
config: {
|
|
359
|
+
baseUrl: 'https://api.fluentcommerce.com',
|
|
360
|
+
clientId: 'your-client-id',
|
|
361
|
+
clientSecret: 'your-client-secret',
|
|
362
|
+
},
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
// Set retailer ID when needed for Job/Batch operations
|
|
366
|
+
client.setRetailerId('your-retailer-id');
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### 2. Execute a GraphQL Query
|
|
370
|
+
|
|
371
|
+
#### Single Page Query (Without Pagination Variables)
|
|
372
|
+
|
|
373
|
+
```typescript
|
|
374
|
+
// Query without pagination variables - returns ONE page only
|
|
375
|
+
// Note: InventoryPosition uses 'onHand' field (VirtualPosition uses 'quantity')
|
|
376
|
+
const query = `
|
|
377
|
+
query GetInventoryPositions {
|
|
378
|
+
inventoryPositions(first: 10) {
|
|
379
|
+
edges {
|
|
380
|
+
node {
|
|
381
|
+
ref
|
|
382
|
+
productRef
|
|
383
|
+
locationRef
|
|
384
|
+
onHand
|
|
385
|
+
status
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
`;
|
|
391
|
+
|
|
392
|
+
const result = await client.graphql({ query });
|
|
393
|
+
console.log('Inventory positions:', result.data.inventoryPositions);
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
#### Understanding Auto-Pagination
|
|
397
|
+
|
|
398
|
+
> **Auto-Pagination**: `client.graphql()` automatically fetches all pages when pagination variables are present. Disable with `pagination: { enabled: false }`.
|
|
399
|
+
|
|
400
|
+
```typescript
|
|
401
|
+
// Auto-pagination when pagination variables are present
|
|
402
|
+
const result = await client.graphql({
|
|
403
|
+
query: `
|
|
404
|
+
query GetAllInventory($first: Int!, $after: String) {
|
|
405
|
+
inventoryPositions(first: $first, after: $after) {
|
|
406
|
+
edges { cursor node { ref productRef locationRef qty status } }
|
|
407
|
+
pageInfo { hasNextPage }
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
`,
|
|
411
|
+
variables: { first: 100 },
|
|
412
|
+
pagination: { maxPages: 50 },
|
|
413
|
+
});
|
|
414
|
+
const allInventory = result.data?.inventoryPositions?.edges?.map(e => e.node) || [];
|
|
415
|
+
console.log(`Fetched ${allInventory.length} total inventory positions`);
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
**See**: [Auto-Pagination Guide](../02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md) for complete documentation.
|
|
419
|
+
|
|
420
|
+
### 3. Send a Batch Update
|
|
421
|
+
|
|
422
|
+
```typescript
|
|
423
|
+
import { BatchAction, EntityType } from '@fluentcommerce/fc-connect-sdk';
|
|
424
|
+
|
|
425
|
+
// Create a job (retailerId required for Job API)
|
|
426
|
+
const job = await client.createJob({
|
|
427
|
+
name: 'Inventory Update',
|
|
428
|
+
retailerId: 'your-retailer-id', // Required for createJob()
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
// Send batch data
|
|
432
|
+
const batchResult = await client.sendBatch(job.id, {
|
|
433
|
+
action: BatchAction.UPSERT,
|
|
434
|
+
entityType: EntityType.INVENTORY,
|
|
435
|
+
entities: [
|
|
436
|
+
{
|
|
437
|
+
ref: 'SKU001',
|
|
438
|
+
productRef: 'PROD001',
|
|
439
|
+
locationRef: 'LOC001',
|
|
440
|
+
qty: 100,
|
|
441
|
+
status: 'AVAILABLE',
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
ref: 'SKU002',
|
|
445
|
+
productRef: 'PROD002',
|
|
446
|
+
locationRef: 'LOC001',
|
|
447
|
+
qty: 50,
|
|
448
|
+
status: 'AVAILABLE',
|
|
449
|
+
},
|
|
450
|
+
],
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
console.log('Batch sent:', batchResult);
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
## Common Use Cases
|
|
457
|
+
|
|
458
|
+
### Inventory Ingestion from CSV
|
|
459
|
+
|
|
460
|
+
```typescript
|
|
461
|
+
import {
|
|
462
|
+
createClient,
|
|
463
|
+
S3DataSource,
|
|
464
|
+
CSVParserService,
|
|
465
|
+
UniversalMapper,
|
|
466
|
+
BatchAction,
|
|
467
|
+
EntityType,
|
|
468
|
+
createConsoleLogger,
|
|
469
|
+
toStructuredLogger,
|
|
470
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
471
|
+
|
|
472
|
+
async function ingestInventoryFromCSV() {
|
|
473
|
+
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
474
|
+
logLevel: 'info',
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
// Initialize client
|
|
478
|
+
const client = await createClient({
|
|
479
|
+
config: {
|
|
480
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
481
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
482
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
483
|
+
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
484
|
+
},
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
// Configure data source
|
|
488
|
+
const s3Source = new S3DataSource(
|
|
489
|
+
{
|
|
490
|
+
type: 'S3_CSV',
|
|
491
|
+
s3Config: {
|
|
492
|
+
bucket: 'my-inventory-bucket',
|
|
493
|
+
region: 'us-east-1',
|
|
494
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
495
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
496
|
+
},
|
|
497
|
+
},
|
|
498
|
+
logger
|
|
499
|
+
);
|
|
500
|
+
|
|
501
|
+
// Read CSV file
|
|
502
|
+
const csvData = await s3Source.downloadFile('inventory/products.csv');
|
|
503
|
+
|
|
504
|
+
// Parse CSV
|
|
505
|
+
const parser = new CSVParserService({ delimiter: ',', headers: true });
|
|
506
|
+
const records = await parser.parse(csvData);
|
|
507
|
+
|
|
508
|
+
// Map fields with UniversalMapper
|
|
509
|
+
const mapper = new UniversalMapper({
|
|
510
|
+
fields: {
|
|
511
|
+
ref: { source: 'sku', required: true },
|
|
512
|
+
productRef: { source: 'product_id', required: true },
|
|
513
|
+
locationRef: { source: 'location_code', required: true },
|
|
514
|
+
qty: { source: 'quantity', resolver: 'sdk.parseInt' },
|
|
515
|
+
status: { source: 'status', resolver: 'sdk.uppercase' },
|
|
516
|
+
},
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
const mappedData: any[] = [];
|
|
520
|
+
for (const record of records) {
|
|
521
|
+
const result = await mapper.map(record);
|
|
522
|
+
if (result.success) {
|
|
523
|
+
mappedData.push(result.data);
|
|
524
|
+
} else {
|
|
525
|
+
logger.warn('Mapping failed', { record, errors: result.errors });
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// Send to Fluent
|
|
530
|
+
const job = await client.createJob({
|
|
531
|
+
name: 'CSV Inventory Import',
|
|
532
|
+
retailerId: client.getRetailerId(),
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
await client.sendBatch(job.id, {
|
|
536
|
+
action: BatchAction.UPSERT,
|
|
537
|
+
entityType: EntityType.INVENTORY,
|
|
538
|
+
entities: mappedData,
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
logger.info('Ingestion complete', { count: mappedData.length });
|
|
542
|
+
}
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### Data Extraction to S3 (High-Level)
|
|
546
|
+
|
|
547
|
+
```typescript
|
|
548
|
+
import {
|
|
549
|
+
createClient,
|
|
550
|
+
ExtractionOrchestrator,
|
|
551
|
+
createConsoleLogger,
|
|
552
|
+
toStructuredLogger,
|
|
553
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
554
|
+
|
|
555
|
+
async function extractInventoryToS3() {
|
|
556
|
+
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
557
|
+
logLevel: 'info',
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
// Initialize client
|
|
561
|
+
const client = await createClient({
|
|
562
|
+
config: {
|
|
563
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
564
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
565
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
566
|
+
},
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
// Extract with ExtractionOrchestrator (handles pagination + export)
|
|
570
|
+
const orchestrator = new ExtractionOrchestrator(client, logger);
|
|
571
|
+
|
|
572
|
+
const result = await orchestrator.extract({
|
|
573
|
+
query: `
|
|
574
|
+
query GetInventory($first: Int!, $after: String) {
|
|
575
|
+
inventoryPositions(first: $first, after: $after) {
|
|
576
|
+
edges {
|
|
577
|
+
node {
|
|
578
|
+
ref
|
|
579
|
+
productRef
|
|
580
|
+
locationRef
|
|
581
|
+
onHand
|
|
582
|
+
status
|
|
583
|
+
updatedOn
|
|
584
|
+
}
|
|
585
|
+
cursor
|
|
586
|
+
}
|
|
587
|
+
pageInfo {
|
|
588
|
+
hasNextPage
|
|
589
|
+
# Note: Fluent doesn't return endCursor/startCursor - cursors are in edges[].cursor
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
`,
|
|
594
|
+
resultPath: 'inventoryPositions.edges.node', // Path to nodes for extraction
|
|
595
|
+
pageSize: 100,
|
|
596
|
+
maxRecords: 10000,
|
|
597
|
+
maxPages: 100,
|
|
598
|
+
direction: 'forward',
|
|
599
|
+
onProgress: (stats) => {
|
|
600
|
+
logger.info('Extraction progress', {
|
|
601
|
+
pagesProcessed: stats.pagesProcessed,
|
|
602
|
+
recordCount: stats.recordCount,
|
|
603
|
+
});
|
|
604
|
+
},
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
logger.info('Extraction complete', {
|
|
608
|
+
recordCount: result.stats.recordCount,
|
|
609
|
+
pagesProcessed: result.stats.pagesProcessed,
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
### Data Extraction to S3 (Manual Composition)
|
|
615
|
+
|
|
616
|
+
For more control, you can manually compose SDK services:
|
|
617
|
+
|
|
618
|
+
```typescript
|
|
619
|
+
import {
|
|
620
|
+
createClient,
|
|
621
|
+
S3DataSource,
|
|
622
|
+
UniversalMapper,
|
|
623
|
+
createConsoleLogger,
|
|
624
|
+
toStructuredLogger,
|
|
625
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
626
|
+
|
|
627
|
+
async function extractInventoryManual() {
|
|
628
|
+
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
629
|
+
logLevel: 'info',
|
|
630
|
+
});
|
|
631
|
+
|
|
632
|
+
// Initialize client
|
|
633
|
+
const client = await createClient({
|
|
634
|
+
config: {
|
|
635
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
636
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
637
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
638
|
+
},
|
|
639
|
+
});
|
|
640
|
+
|
|
641
|
+
// Query inventory with auto-pagination
|
|
642
|
+
const result = await client.graphql({
|
|
643
|
+
query: `
|
|
644
|
+
query GetInventory($first: Int!, $after: String) {
|
|
645
|
+
inventoryPositions(first: $first, after: $after) {
|
|
646
|
+
edges {
|
|
647
|
+
node {
|
|
648
|
+
ref
|
|
649
|
+
productRef
|
|
650
|
+
locationRef
|
|
651
|
+
onHand
|
|
652
|
+
status
|
|
653
|
+
updatedOn
|
|
654
|
+
}
|
|
655
|
+
cursor
|
|
656
|
+
}
|
|
657
|
+
pageInfo {
|
|
658
|
+
hasNextPage
|
|
659
|
+
# Note: Fluent doesn't return endCursor/startCursor - cursors are in edges[].cursor
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
`,
|
|
664
|
+
variables: { first: 100 },
|
|
665
|
+
pagination: { maxRecords: 10000 },
|
|
666
|
+
});
|
|
667
|
+
|
|
668
|
+
const inventory = result.data?.inventoryPositions?.edges?.map(e => e.node) || [];
|
|
669
|
+
|
|
670
|
+
// Transform for export
|
|
671
|
+
const mapper = new UniversalMapper({
|
|
672
|
+
fields: {
|
|
673
|
+
sku: { source: 'ref', resolver: 'sdk.toString' },
|
|
674
|
+
product_id: { source: 'productRef', resolver: 'sdk.toString' },
|
|
675
|
+
location: { source: 'locationRef', resolver: 'sdk.toString' },
|
|
676
|
+
quantity: { source: 'onHand', resolver: 'sdk.parseInt' },
|
|
677
|
+
status: { source: 'status', resolver: 'sdk.lowercase' },
|
|
678
|
+
last_updated: { source: 'updatedOn', resolver: 'sdk.formatDate' },
|
|
679
|
+
},
|
|
680
|
+
});
|
|
681
|
+
|
|
682
|
+
const transformed: any[] = [];
|
|
683
|
+
for (const item of inventory) {
|
|
684
|
+
const result = await mapper.map(item);
|
|
685
|
+
if (result.success) {
|
|
686
|
+
transformed.push(result.data);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
// Upload to S3
|
|
691
|
+
const s3Target = new S3DataSource(
|
|
692
|
+
{
|
|
693
|
+
type: 'S3_JSON',
|
|
694
|
+
connectionId: 's3-target',
|
|
695
|
+
name: 'Export S3',
|
|
696
|
+
s3Config: {
|
|
697
|
+
bucket: 'my-export-bucket',
|
|
698
|
+
region: 'us-west-2',
|
|
699
|
+
accessKeyId: process.env.TARGET_AWS_ACCESS_KEY_ID!,
|
|
700
|
+
secretAccessKey: process.env.TARGET_AWS_SECRET_ACCESS_KEY!,
|
|
701
|
+
},
|
|
702
|
+
},
|
|
703
|
+
logger
|
|
704
|
+
);
|
|
705
|
+
|
|
706
|
+
await s3Target.uploadFile('exports/inventory-export.json', JSON.stringify(transformed, null, 2), {
|
|
707
|
+
contentType: 'application/json',
|
|
708
|
+
});
|
|
709
|
+
|
|
710
|
+
logger.info('Extraction complete', { count: transformed.length });
|
|
711
|
+
}
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
### Backward Pagination (Reverse Order)
|
|
715
|
+
|
|
716
|
+
Fetch records in reverse chronological order (from end to start):
|
|
717
|
+
|
|
718
|
+
```typescript
|
|
719
|
+
import { ExtractionOrchestrator } from '@fluentcommerce/fc-connect-sdk';
|
|
720
|
+
|
|
721
|
+
const orchestrator = new ExtractionOrchestrator(client, logger);
|
|
722
|
+
|
|
723
|
+
const result = await orchestrator.extract({
|
|
724
|
+
query: `
|
|
725
|
+
query GetRecentOrders($last: Int!, $before: String) {
|
|
726
|
+
orders(last: $last, before: $before) {
|
|
727
|
+
edges {
|
|
728
|
+
node { id ref status createdOn }
|
|
729
|
+
cursor
|
|
730
|
+
}
|
|
731
|
+
pageInfo { hasPreviousPage }
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
`,
|
|
735
|
+
resultPath: 'orders.edges.node',
|
|
736
|
+
variables: { last: 100 },
|
|
737
|
+
direction: 'backward', // Fetch from end to start
|
|
738
|
+
maxRecords: 1000,
|
|
739
|
+
});
|
|
740
|
+
|
|
741
|
+
console.log(`Extracted ${result.stats.totalRecords} orders`);
|
|
742
|
+
```
|
|
743
|
+
|
|
744
|
+
**When to use backward pagination:**
|
|
745
|
+
|
|
746
|
+
- Fetching most recent records (latest orders, recent events)
|
|
747
|
+
- Reverse chronological feeds
|
|
748
|
+
- "Show last N items" scenarios
|
|
749
|
+
|
|
750
|
+
### Processing with State Management
|
|
751
|
+
|
|
752
|
+
```typescript
|
|
753
|
+
import {
|
|
754
|
+
createClient,
|
|
755
|
+
S3DataSource,
|
|
756
|
+
StateService,
|
|
757
|
+
VersoriKVAdapter,
|
|
758
|
+
createConsoleLogger,
|
|
759
|
+
toStructuredLogger,
|
|
760
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
761
|
+
|
|
762
|
+
async function processFilesWithStateTracking(context) {
|
|
763
|
+
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
764
|
+
logLevel: 'info',
|
|
765
|
+
});
|
|
766
|
+
|
|
767
|
+
// Initialize state service (Versori example)
|
|
768
|
+
const kvAdapter = new VersoriKVAdapter(context.openKv(':project:'));
|
|
769
|
+
const stateService = new StateService(kvAdapter);
|
|
770
|
+
|
|
771
|
+
// Initialize S3
|
|
772
|
+
const s3 = new S3DataSource(s3Config, logger);
|
|
773
|
+
|
|
774
|
+
// List files
|
|
775
|
+
const files = await s3.listFiles({ prefix: 'inbox/' });
|
|
776
|
+
|
|
777
|
+
for (const file of files) {
|
|
778
|
+
// Check if already processed
|
|
779
|
+
if (await stateService.isFileProcessed(file.path)) {
|
|
780
|
+
logger.info('File already processed', { file: file.name });
|
|
781
|
+
continue;
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
try {
|
|
785
|
+
// Process file
|
|
786
|
+
const content = await s3.downloadFile(file.path);
|
|
787
|
+
await processFileContent(content);
|
|
788
|
+
|
|
789
|
+
// Mark as processed
|
|
790
|
+
await stateService.markFileProcessed(file.path, {
|
|
791
|
+
processedAt: new Date().toISOString(),
|
|
792
|
+
size: file.size,
|
|
793
|
+
});
|
|
794
|
+
|
|
795
|
+
logger.info('File processed successfully', { file: file.name });
|
|
796
|
+
} catch (error) {
|
|
797
|
+
logger.error('Failed to process file', error as Error, { file: file.name });
|
|
798
|
+
throw error;
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
```
|
|
803
|
+
|
|
804
|
+
## Platform-Specific Setup
|
|
805
|
+
|
|
806
|
+
### Node.js Applications
|
|
807
|
+
|
|
808
|
+
No additional configuration needed. The SDK works out of the box with Node.js 18+.
|
|
809
|
+
|
|
810
|
+
```typescript
|
|
811
|
+
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
812
|
+
|
|
813
|
+
async function main() {
|
|
814
|
+
const client = await createClient({
|
|
815
|
+
config: {
|
|
816
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
817
|
+
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
818
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
819
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
820
|
+
},
|
|
821
|
+
});
|
|
822
|
+
|
|
823
|
+
// Use client...
|
|
824
|
+
}
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
### Versori Platform
|
|
828
|
+
|
|
829
|
+
For Versori platform applications, the SDK automatically detects and uses the Versori context:
|
|
830
|
+
|
|
831
|
+
```typescript
|
|
832
|
+
import { http } from '@versori/run';
|
|
833
|
+
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
834
|
+
|
|
835
|
+
export const handler = http(
|
|
836
|
+
'handler',
|
|
837
|
+
{
|
|
838
|
+
connection: 'fluent_commerce',
|
|
839
|
+
},
|
|
840
|
+
async ctx => {
|
|
841
|
+
// Auto-detects Versori context
|
|
842
|
+
const client = await createClient(ctx);
|
|
843
|
+
|
|
844
|
+
// Use the same API
|
|
845
|
+
const result = await client.graphql({
|
|
846
|
+
query: `query { locations { edges { node { id ref } } } }`,
|
|
847
|
+
});
|
|
848
|
+
|
|
849
|
+
return {
|
|
850
|
+
statusCode: 200,
|
|
851
|
+
body: JSON.stringify(result),
|
|
852
|
+
};
|
|
853
|
+
}
|
|
854
|
+
);
|
|
855
|
+
```
|
|
856
|
+
|
|
857
|
+
**See**: [Versori Platform Guide](../04-REFERENCE/platforms/versori/) for complete Versori documentation.
|
|
858
|
+
|
|
859
|
+
### Deno Support
|
|
860
|
+
|
|
861
|
+
The SDK is compatible with Deno runtime. See the [Deno Platform Guide](../04-REFERENCE/platforms/deno/) for details.
|
|
862
|
+
|
|
863
|
+
## Error Handling
|
|
864
|
+
|
|
865
|
+
```typescript
|
|
866
|
+
import { IngestionError, IngestionErrorCode } from '@fluentcommerce/fc-connect-sdk';
|
|
867
|
+
|
|
868
|
+
try {
|
|
869
|
+
await client.sendBatch(jobId, batchData);
|
|
870
|
+
} catch (error) {
|
|
871
|
+
if (error instanceof IngestionError) {
|
|
872
|
+
console.error('Ingestion failed:', {
|
|
873
|
+
code: error.code,
|
|
874
|
+
message: error.message,
|
|
875
|
+
context: error.context,
|
|
876
|
+
});
|
|
877
|
+
|
|
878
|
+
// Handle specific errors
|
|
879
|
+
switch (error.code) {
|
|
880
|
+
case IngestionErrorCode.VALIDATION_ERROR:
|
|
881
|
+
// Handle validation errors
|
|
882
|
+
await logValidationError(error.context);
|
|
883
|
+
break;
|
|
884
|
+
|
|
885
|
+
case IngestionErrorCode.RATE_LIMIT_ERROR:
|
|
886
|
+
// Retry with exponential backoff
|
|
887
|
+
await retryWithBackoff(() => client.sendBatch(jobId, batchData));
|
|
888
|
+
break;
|
|
889
|
+
|
|
890
|
+
case IngestionErrorCode.JOB_CREATION_ERROR:
|
|
891
|
+
// Create new job and retry
|
|
892
|
+
const newJob = await client.createJob({
|
|
893
|
+
name: 'Retry Job',
|
|
894
|
+
retailerId: client.getRetailerId(),
|
|
895
|
+
});
|
|
896
|
+
await client.sendBatch(newJob.id, batchData);
|
|
897
|
+
break;
|
|
898
|
+
|
|
899
|
+
case IngestionErrorCode.NETWORK_ERROR:
|
|
900
|
+
// Check network and retry
|
|
901
|
+
await checkNetworkConnectivity();
|
|
902
|
+
break;
|
|
903
|
+
}
|
|
904
|
+
} else {
|
|
905
|
+
// Handle unexpected errors
|
|
906
|
+
console.error('Unexpected error:', error);
|
|
907
|
+
throw error;
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
```
|
|
911
|
+
|
|
912
|
+
**See**: [Error Handling Guide](../03-PATTERN-GUIDES/error-handling/error-handling-readme.md) for comprehensive error handling patterns.
|
|
913
|
+
|
|
914
|
+
## Best Practices
|
|
915
|
+
|
|
916
|
+
### 1. Security
|
|
917
|
+
|
|
918
|
+
- **Store credentials securely** using environment variables or secret managers
|
|
919
|
+
- **Never commit credentials** to version control
|
|
920
|
+
- **Validate webhook signatures** (for Fluent Rubix webhooks only)
|
|
921
|
+
- **Use least privilege** AWS IAM policies
|
|
922
|
+
|
|
923
|
+
### 2. Performance
|
|
924
|
+
|
|
925
|
+
- **Use streaming parsers** for large files to minimize memory usage
|
|
926
|
+
- **Batch operations** to reduce API calls
|
|
927
|
+
- **Use auto-pagination** for large result sets - See [Auto-Pagination Guide](../02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md)
|
|
928
|
+
- **Configure appropriate timeouts** based on operation types
|
|
929
|
+
|
|
930
|
+
### 3. Reliability
|
|
931
|
+
|
|
932
|
+
- **Implement retry logic** with exponential backoff for transient failures
|
|
933
|
+
- **Track processing state** to prevent duplicate processing
|
|
934
|
+
- **Use distributed locking** for concurrent workflows
|
|
935
|
+
- **Monitor job status** and handle failures gracefully
|
|
936
|
+
|
|
937
|
+
### 4. Data Quality
|
|
938
|
+
|
|
939
|
+
- **Validate data** before sending to Fluent
|
|
940
|
+
- **Use UniversalMapper** for consistent field transformations
|
|
941
|
+
- **Handle missing data** with default values
|
|
942
|
+
- **Log transformation errors** for debugging
|
|
943
|
+
|
|
944
|
+
### 5. Monitoring
|
|
945
|
+
|
|
946
|
+
- **Log all operations** with structured logging
|
|
947
|
+
- **Track metrics** like processing time and record counts
|
|
948
|
+
- **Set up alerts** for failures and anomalies
|
|
949
|
+
- **Monitor API rate limits** and adjust accordingly
|
|
950
|
+
|
|
951
|
+
## Troubleshooting
|
|
952
|
+
|
|
953
|
+
### Common Installation Issues
|
|
954
|
+
|
|
955
|
+
#### Module Resolution Errors
|
|
956
|
+
|
|
957
|
+
```bash
|
|
958
|
+
npm cache clean --force
|
|
959
|
+
rm -rf node_modules package-lock.json
|
|
960
|
+
npm install
|
|
961
|
+
```
|
|
962
|
+
|
|
963
|
+
#### TypeScript Errors
|
|
964
|
+
|
|
965
|
+
- Ensure TypeScript version is >= 5.0.0
|
|
966
|
+
- Add `"skipLibCheck": true` to tsconfig.json
|
|
967
|
+
- Check for type definition conflicts
|
|
968
|
+
|
|
969
|
+
#### Version Conflicts
|
|
970
|
+
|
|
971
|
+
```bash
|
|
972
|
+
# Check installed version
|
|
973
|
+
npm ls @fluentcommerce/fc-connect-sdk
|
|
974
|
+
|
|
975
|
+
# Update to latest
|
|
976
|
+
npm update @fluentcommerce/fc-connect-sdk
|
|
977
|
+
```
|
|
978
|
+
|
|
979
|
+
### Runtime Issues
|
|
980
|
+
|
|
981
|
+
#### Authentication Failures
|
|
982
|
+
|
|
983
|
+
- Verify API credentials are correct
|
|
984
|
+
- Check base URL matches your environment
|
|
985
|
+
- Ensure retailer ID is valid (for Job/Batch operations)
|
|
986
|
+
|
|
987
|
+
#### Network Timeouts
|
|
988
|
+
|
|
989
|
+
- Increase timeout configuration
|
|
990
|
+
- Check network connectivity
|
|
991
|
+
- Verify firewall rules
|
|
992
|
+
|
|
993
|
+
#### Memory Issues
|
|
994
|
+
|
|
995
|
+
- Use streaming for large files
|
|
996
|
+
- Process data in chunks
|
|
997
|
+
- Monitor memory usage
|
|
998
|
+
|
|
999
|
+
### Debugging Tips
|
|
1000
|
+
|
|
1001
|
+
```typescript
|
|
1002
|
+
import { createConsoleLogger, toStructuredLogger } from '@fluentcommerce/fc-connect-sdk';
|
|
1003
|
+
|
|
1004
|
+
// Use structured logging
|
|
1005
|
+
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
1006
|
+
logLevel: 'debug',
|
|
1007
|
+
});
|
|
1008
|
+
|
|
1009
|
+
const client = await createClient({
|
|
1010
|
+
config: {
|
|
1011
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
1012
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
1013
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
1014
|
+
timeout: 60000,
|
|
1015
|
+
retryAttempts: 3,
|
|
1016
|
+
},
|
|
1017
|
+
});
|
|
1018
|
+
|
|
1019
|
+
// Log GraphQL operations
|
|
1020
|
+
const query = `query { products { edges { node { ref } } } }`;
|
|
1021
|
+
logger.debug('Executing GraphQL query', { query });
|
|
1022
|
+
const result = await client.graphql({ query });
|
|
1023
|
+
logger.debug('Query result', {
|
|
1024
|
+
recordCount: result.data?.products?.edges?.length,
|
|
1025
|
+
});
|
|
1026
|
+
|
|
1027
|
+
// Log batch operations
|
|
1028
|
+
logger.info('Sending batch', {
|
|
1029
|
+
jobId,
|
|
1030
|
+
recordCount: batchData.entities.length,
|
|
1031
|
+
});
|
|
1032
|
+
await client.sendBatch(jobId, batchData);
|
|
1033
|
+
logger.info('Batch sent successfully');
|
|
1034
|
+
```
|
|
1035
|
+
|
|
1036
|
+
## Next Steps
|
|
1037
|
+
|
|
1038
|
+
Now that you're set up, explore:
|
|
1039
|
+
|
|
1040
|
+
- **[API Reference](../02-CORE-GUIDES/api-reference/api-reference-readme.md)** - Complete API documentation
|
|
1041
|
+
- **[Universal Mapping Guide](../02-CORE-GUIDES/mapping/mapping-readme.md)** - Field mapping and transformations
|
|
1042
|
+
- **[Auto-Pagination Guide](../02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md)** - Automatic GraphQL pagination
|
|
1043
|
+
- **[Ingestion Guide](../02-CORE-GUIDES/ingestion/)** - Inventory ingestion workflows
|
|
1044
|
+
- **[Extraction Guide](../02-CORE-GUIDES/extraction/)** - Data extraction patterns
|
|
1045
|
+
- **[Use Cases](../01-TEMPLATES/readme.md)** - Real-world examples and patterns
|
|
1046
|
+
|
|
1047
|
+
## CLI Tools
|
|
1048
|
+
|
|
1049
|
+
The SDK provides command-line tools for working with GraphQL schemas and mappings:
|
|
1050
|
+
|
|
1051
|
+
```bash
|
|
1052
|
+
# Show available commands
|
|
1053
|
+
npx fc-connect help
|
|
1054
|
+
|
|
1055
|
+
# Check SDK version
|
|
1056
|
+
npx fc-connect version
|
|
1057
|
+
|
|
1058
|
+
# Generate mutation mapping template
|
|
1059
|
+
npx fc-connect generate-mutation-mapping \
|
|
1060
|
+
--file ./mutations/createOrder.graphql \
|
|
1061
|
+
--endpoint https://api.fluentcommerce.com/graphql \
|
|
1062
|
+
--output ./mappings/createOrder.json
|
|
1063
|
+
|
|
1064
|
+
# Introspect and cache schema
|
|
1065
|
+
npx fc-connect introspect-schema \
|
|
1066
|
+
--endpoint https://api.fluentcommerce.com/graphql \
|
|
1067
|
+
--output ./schema/fluent-schema.json
|
|
1068
|
+
```
|
|
1069
|
+
|
|
1070
|
+
**See**: [API Reference - CLI Tools](../02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md) for complete CLI documentation.
|