@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +11 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
package/docs/01-TEMPLATES/faq.md
CHANGED
|
@@ -1,686 +1,686 @@
|
|
|
1
|
-
# FC Connect SDK - Use Cases FAQ
|
|
2
|
-
|
|
3
|
-
**Consolidated troubleshooting guide from all use-case documentation**
|
|
4
|
-
|
|
5
|
-
Last Updated: 2025-01-18
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 📋 Table of Contents
|
|
10
|
-
|
|
11
|
-
- [File Processing Issues](#file-processing-issues)
|
|
12
|
-
- [State Management & Locking](#state-management-locking)
|
|
13
|
-
- [Mapping & Transformation Errors](#mapping-transformation-errors)
|
|
14
|
-
- [GraphQL & API Issues](#graphql-api-issues)
|
|
15
|
-
- [XML Processing](#xml-processing)
|
|
16
|
-
- [Versori Platform](#versori-platform)
|
|
17
|
-
- [Performance & Memory](#performance-memory)
|
|
18
|
-
- [Authentication & Security](#authentication-security)
|
|
19
|
-
- [Deployment & Configuration](#deployment-configuration)
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## File Processing Issues
|
|
24
|
-
|
|
25
|
-
### Q: How do I prevent processing the same file twice?
|
|
26
|
-
|
|
27
|
-
**Answer**: Use `VersoriFileTracker` (for Versori) or `StateService` (for standalone):
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
// Versori
|
|
31
|
-
import { VersoriFileTracker } from '@fluentcommerce/fc-connect-sdk';
|
|
32
|
-
const tracker = new VersoriFileTracker(openKv(), 'workflow-id');
|
|
33
|
-
|
|
34
|
-
if (await tracker.wasFileProcessed(fileName)) {
|
|
35
|
-
console.log('Already processed, skipping');
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
await processFile(fileName);
|
|
40
|
-
await tracker.markFileProcessed(fileName, { recordCount: 100 });
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
**Related Guides**:
|
|
44
|
-
|
|
45
|
-
- [State Management Pattern](patterns/state-duplicate-prevention.md)
|
|
46
|
-
- [Versori KV State Management](versori/patterns/kv-state-management.md)
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
### Q: Why are my CSV files failing to parse?
|
|
51
|
-
|
|
52
|
-
**Common Causes**:
|
|
53
|
-
|
|
54
|
-
1. **Wrong delimiter**
|
|
55
|
-
|
|
56
|
-
```typescript
|
|
57
|
-
// Solution: Specify correct delimiter
|
|
58
|
-
const records = await parser.parse(content, { delimiter: '|' }); // Not ','
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
2. **Missing header row**
|
|
62
|
-
|
|
63
|
-
```typescript
|
|
64
|
-
// Solution: Enable headerless mode
|
|
65
|
-
const records = await parser.parse(content, { header: false });
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
3. **Quoted fields with embedded commas**
|
|
69
|
-
```typescript
|
|
70
|
-
// Solution: Enable quote handling
|
|
71
|
-
const records = await parser.parse(content, { quote: '"', escape: '"' });
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
### Q: How do I handle large files that cause memory issues?
|
|
77
|
-
|
|
78
|
-
**Answer**: Use streaming mode:
|
|
79
|
-
|
|
80
|
-
```typescript
|
|
81
|
-
import { CSVParserService } from '@fluentcommerce/fc-connect-sdk';
|
|
82
|
-
|
|
83
|
-
const parser = new CSVParserService();
|
|
84
|
-
|
|
85
|
-
// Stream in chunks
|
|
86
|
-
for await (const chunk of parser.streamParse(fileStream, { chunkSize: 1000 })) {
|
|
87
|
-
await processBatch(chunk);
|
|
88
|
-
}
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
**Related Guides**:
|
|
92
|
-
|
|
93
|
-
- [Large File Splitting Pattern](patterns/large-file-splitting.md)
|
|
94
|
-
- [Pagination & Streaming](patterns/pagination-streaming.md)
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## State Management & Locking
|
|
99
|
-
|
|
100
|
-
### Q: My distributed lock is never released!
|
|
101
|
-
|
|
102
|
-
**Cause**: Workflow crashed before releasing lock.
|
|
103
|
-
|
|
104
|
-
**Solution**: Always release locks in `finally` blocks:
|
|
105
|
-
|
|
106
|
-
```typescript
|
|
107
|
-
const kvAdapter = new VersoriKVAdapter(openKv());
|
|
108
|
-
const stateService = new StateService(logger);
|
|
109
|
-
const lockName = 'my-lock';
|
|
110
|
-
|
|
111
|
-
try {
|
|
112
|
-
await stateService.acquireLock(lockName, kvAdapter, 15);
|
|
113
|
-
await doWork();
|
|
114
|
-
} finally {
|
|
115
|
-
// ALWAYS release, even on error
|
|
116
|
-
await stateService.releaseLock(lockName, kvAdapter);
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
**Lock Timeouts**: Stale locks auto-expire after timeout (e.g., 15 minutes).
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
### Q: How do I list all processed files in Versori?
|
|
125
|
-
|
|
126
|
-
**Answer**: Use `VersoriIndexedFileTracker` (not standard `VersoriFileTracker`):
|
|
127
|
-
|
|
128
|
-
```typescript
|
|
129
|
-
import { VersoriIndexedFileTracker } from '@fluentcommerce/fc-connect-sdk';
|
|
130
|
-
|
|
131
|
-
const tracker = new VersoriIndexedFileTracker(openKv(), 'workflow');
|
|
132
|
-
|
|
133
|
-
// List all processed files
|
|
134
|
-
const files = await tracker.listProcessedFiles();
|
|
135
|
-
console.log(`Processed ${files.length} files`);
|
|
136
|
-
|
|
137
|
-
// Get stats
|
|
138
|
-
const stats = await tracker.getStats();
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
**Why**: Standard Versori KV doesn't support list operations.
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
### Q: How do I implement checkpoint/resume for long workflows?
|
|
146
|
-
|
|
147
|
-
**Answer**: Save state periodically using `StateService`:
|
|
148
|
-
|
|
149
|
-
```typescript
|
|
150
|
-
const stateService = new StateService(logger);
|
|
151
|
-
const kvAdapter = new VersoriKVAdapter(openKv());
|
|
152
|
-
|
|
153
|
-
// Restore from checkpoint
|
|
154
|
-
const syncState = await stateService.getSyncState(kvAdapter, 'workflow-id');
|
|
155
|
-
const lastProcessed = syncState.lastProcessedTimestamp;
|
|
156
|
-
|
|
157
|
-
// Process batches
|
|
158
|
-
for (const batch of batches) {
|
|
159
|
-
await processBatch(batch);
|
|
160
|
-
|
|
161
|
-
// Save checkpoint every 10 batches
|
|
162
|
-
if (batchIndex % 10 === 0) {
|
|
163
|
-
await stateService.updateSyncState(
|
|
164
|
-
kvAdapter,
|
|
165
|
-
[
|
|
166
|
-
{
|
|
167
|
-
fileName: `batch-${batchIndex}`,
|
|
168
|
-
lastModified: new Date().toISOString(),
|
|
169
|
-
recordCount: batch.length,
|
|
170
|
-
},
|
|
171
|
-
],
|
|
172
|
-
'workflow-id'
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## Mapping & Transformation Errors
|
|
181
|
-
|
|
182
|
-
### Q: "Required field 'skuRef' is missing or empty"
|
|
183
|
-
|
|
184
|
-
**Cause**: Source field doesn't exist or mapping path is incorrect.
|
|
185
|
-
|
|
186
|
-
**Solution**: Debug the source data structure:
|
|
187
|
-
|
|
188
|
-
```typescript
|
|
189
|
-
console.log('Source data:', JSON.stringify(sourceData, null, 2));
|
|
190
|
-
|
|
191
|
-
// Verify source path matches actual structure
|
|
192
|
-
const config = {
|
|
193
|
-
fields: {
|
|
194
|
-
skuRef: { source: 'sku', required: true }, // Check if sourceData.sku exists
|
|
195
|
-
},
|
|
196
|
-
};
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
**Common Mistakes**:
|
|
200
|
-
|
|
201
|
-
- `snake_case` vs `camelCase` mismatch
|
|
202
|
-
- Nested path incorrect (`product.sku` vs `product.sku_id`)
|
|
203
|
-
- Array access (`items[0].sku` vs `items.sku`)
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
|
-
### Q: How do I map nested XML/JSON fields?
|
|
208
|
-
|
|
209
|
-
**Answer**: Use dot notation for nested paths:
|
|
210
|
-
|
|
211
|
-
```typescript
|
|
212
|
-
const mapping = {
|
|
213
|
-
fields: {
|
|
214
|
-
// Nested object
|
|
215
|
-
'customer.email': { source: 'order.customer.email_address' },
|
|
216
|
-
|
|
217
|
-
// Array of objects
|
|
218
|
-
items: {
|
|
219
|
-
source: 'order.line_items',
|
|
220
|
-
isArray: true,
|
|
221
|
-
fields: {
|
|
222
|
-
productRef: { source: 'sku' },
|
|
223
|
-
quantity: { source: 'qty', resolver: 'sdk.parseInt' },
|
|
224
|
-
},
|
|
225
|
-
},
|
|
226
|
-
|
|
227
|
-
// XML attribute (use @ prefix)
|
|
228
|
-
orderId: { source: 'order@id' },
|
|
229
|
-
},
|
|
230
|
-
};
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
**Related Guides**:
|
|
234
|
-
|
|
235
|
-
- [Field Mapping Universal](patterns/field-mapping-universal.md)
|
|
236
|
-
- [XML Order Ingestion](versori/webhooks/template-webhook-xml-order-ingestion.md)
|
|
237
|
-
|
|
238
|
-
---
|
|
239
|
-
|
|
240
|
-
### Q: My custom resolver returns undefined!
|
|
241
|
-
|
|
242
|
-
**Cause**: Incorrect resolver signature or accessing wrong data.
|
|
243
|
-
|
|
244
|
-
**Solution**: Use correct 4-parameter signature:
|
|
245
|
-
|
|
246
|
-
```typescript
|
|
247
|
-
const customResolvers = {
|
|
248
|
-
'custom.myResolver': (value, sourceData, config, helpers) => {
|
|
249
|
-
// value: the extracted field value
|
|
250
|
-
// sourceData: full source object (access sibling fields)
|
|
251
|
-
// config: resolver configuration passed to mapper
|
|
252
|
-
// helpers: SDK utilities (get, parseFloatSafe, logger, etc.)
|
|
253
|
-
|
|
254
|
-
const siblingField = helpers.get(sourceData, 'other.field');
|
|
255
|
-
return helpers.parseFloatSafe(value, 0) * siblingField;
|
|
256
|
-
},
|
|
257
|
-
};
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
**Related Guides**:
|
|
261
|
-
|
|
262
|
-
- [Custom Resolvers Pattern](patterns/custom-resolvers.md)
|
|
263
|
-
|
|
264
|
-
---
|
|
265
|
-
|
|
266
|
-
## GraphQL & API Issues
|
|
267
|
-
|
|
268
|
-
### Q: "GraphQL errors: Field 'customer' is required"
|
|
269
|
-
|
|
270
|
-
**Cause**: Missing required field in mutation input.
|
|
271
|
-
|
|
272
|
-
**Solution**: Check GraphQL schema requirements:
|
|
273
|
-
|
|
274
|
-
```typescript
|
|
275
|
-
// Use introspection tool to view schema
|
|
276
|
-
npx @fluentcommerce/fc-connect-sdk introspect-schema --url <graphql-url>
|
|
277
|
-
|
|
278
|
-
// Ensure all required fields are mapped
|
|
279
|
-
const mapping = {
|
|
280
|
-
mutation: 'createOrder',
|
|
281
|
-
fields: {
|
|
282
|
-
customer: {
|
|
283
|
-
id: { resolver: 'custom.lookupCustomer', required: true }, // REQUIRED
|
|
284
|
-
email: { source: 'email' }
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
};
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
---
|
|
291
|
-
|
|
292
|
-
### Q: "Cannot read property 'customerOrderId' of undefined"
|
|
293
|
-
|
|
294
|
-
**Cause**: Incorrect XML attribute access syntax.
|
|
295
|
-
|
|
296
|
-
**Solution**: Use `@` WITHOUT dot before it:
|
|
297
|
-
|
|
298
|
-
```typescript
|
|
299
|
-
// ❌ WRONG
|
|
300
|
-
"source": "$radial.OrderCreateRequest.Order.@customerOrderId"
|
|
301
|
-
|
|
302
|
-
// ✅ CORRECT
|
|
303
|
-
"source": "$radial.OrderCreateRequest.Order@customerOrderId"
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
**Why**: `@` is part of the path syntax, not a separate segment.
|
|
307
|
-
|
|
308
|
-
---
|
|
309
|
-
|
|
310
|
-
### Q: How do I handle pagination in GraphQL queries?
|
|
311
|
-
|
|
312
|
-
**Answer**: Use SDK's built-in auto-pagination:
|
|
313
|
-
|
|
314
|
-
```typescript
|
|
315
|
-
const result = await client.graphql({
|
|
316
|
-
query: inventoryQuery,
|
|
317
|
-
variables: { first: 50 },
|
|
318
|
-
pagination: {
|
|
319
|
-
maxPages: 100, // Limit total pages
|
|
320
|
-
onProgress: (page, total) => {
|
|
321
|
-
console.log(`Fetching page ${page}/${total}`);
|
|
322
|
-
},
|
|
323
|
-
},
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
// result.data contains ALL pages combined
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
**Related Guides**:
|
|
330
|
-
|
|
331
|
-
- [Pagination & Streaming](patterns/pagination-streaming.md)
|
|
332
|
-
- [GraphQL Query Export](standalone/graphql-query-export.md)
|
|
333
|
-
|
|
334
|
-
---
|
|
335
|
-
|
|
336
|
-
## XML Processing
|
|
337
|
-
|
|
338
|
-
### Q: "Expected array at path but got object"
|
|
339
|
-
|
|
340
|
-
**Cause**: XML parser doesn't create arrays for single items.
|
|
341
|
-
|
|
342
|
-
**Solution**: Use `helpers.ensureArray()` in resolvers:
|
|
343
|
-
|
|
344
|
-
```typescript
|
|
345
|
-
'custom.processItems': (value, sourceData, config, helpers) => {
|
|
346
|
-
// ❌ WRONG - assumes always array
|
|
347
|
-
const items = helpers.get(sourceData, 'OrderItems.OrderItem');
|
|
348
|
-
for (const item of items) { ... } // ERROR if single item
|
|
349
|
-
|
|
350
|
-
// ✅ CORRECT - wraps single items
|
|
351
|
-
const items = helpers.ensureArray(
|
|
352
|
-
helpers.get(sourceData, 'OrderItems.OrderItem')
|
|
353
|
-
);
|
|
354
|
-
for (const item of items) { ... } // Works for 1 or N items
|
|
355
|
-
}
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
---
|
|
359
|
-
|
|
360
|
-
### Q: How do I extract nested/escaped XML from another XML document?
|
|
361
|
-
|
|
362
|
-
**Answer**: Use `nodes` configuration in `GraphQLMutationMapper`:
|
|
363
|
-
|
|
364
|
-
```json
|
|
365
|
-
{
|
|
366
|
-
"nodes": {
|
|
367
|
-
"radial": {
|
|
368
|
-
"extract": "orders.order.custom-attributes.custom-attribute[attribute-id=CreateOrderServiceRequest]",
|
|
369
|
-
"parse": "xml"
|
|
370
|
-
}
|
|
371
|
-
},
|
|
372
|
-
"fields": {
|
|
373
|
-
"ref": {
|
|
374
|
-
"source": "$radial.OrderCreateRequest.Order@customerOrderId"
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
**How it works**:
|
|
381
|
-
|
|
382
|
-
1. **Extract**: Find nested XML string using path + attribute filter
|
|
383
|
-
2. **Parse**: Re-parse extracted string as XML
|
|
384
|
-
3. **Reference**: Use `$radial` prefix to access parsed node
|
|
385
|
-
|
|
386
|
-
**Related Guides**:
|
|
387
|
-
|
|
388
|
-
- [XML Order Ingestion](versori/webhooks/template-webhook-xml-order-ingestion.md)
|
|
389
|
-
|
|
390
|
-
---
|
|
391
|
-
|
|
392
|
-
## Versori Platform
|
|
393
|
-
|
|
394
|
-
### Q: How do I return non-JSON content (XML, HTML, CSV) from Versori webhooks?
|
|
395
|
-
|
|
396
|
-
**Answer**: Use custom `Response` objects with proper `Content-Type`:
|
|
397
|
-
|
|
398
|
-
```typescript
|
|
399
|
-
import { webhook, fn } from '@versori/run';
|
|
400
|
-
|
|
401
|
-
export const xmlResponse = webhook('xml-endpoint', {
|
|
402
|
-
response: {
|
|
403
|
-
mode: 'sync',
|
|
404
|
-
onSuccess: ctx =>
|
|
405
|
-
new Response(ctx.data, {
|
|
406
|
-
status: 200,
|
|
407
|
-
headers: { 'Content-Type': 'application/xml; charset=utf-8' },
|
|
408
|
-
}),
|
|
409
|
-
onError: ctx =>
|
|
410
|
-
new Response(ctx.data, {
|
|
411
|
-
status: 500,
|
|
412
|
-
headers: { 'Content-Type': 'application/xml; charset=utf-8' },
|
|
413
|
-
}),
|
|
414
|
-
},
|
|
415
|
-
})
|
|
416
|
-
.then(fn('generate-xml', () => '<order><id>123</id></order>'))
|
|
417
|
-
.catch(({ data }) => '<error>Failed</error>');
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
**Why**: Default Versori behavior JSON-encodes all responses.
|
|
421
|
-
|
|
422
|
-
**Related Guides**:
|
|
423
|
-
|
|
424
|
-
- [XML Response Patterns](versori/patterns/xml-response-patterns.md)
|
|
425
|
-
|
|
426
|
-
---
|
|
427
|
-
|
|
428
|
-
### Q: "Node 'radial' extraction returned null/undefined"
|
|
429
|
-
|
|
430
|
-
**Cause**: Path in nodes config doesn't match XML structure.
|
|
431
|
-
|
|
432
|
-
**Solution**: Check XML attribute syntax:
|
|
433
|
-
|
|
434
|
-
```json
|
|
435
|
-
// ❌ WRONG
|
|
436
|
-
"extract": "custom-attribute[@attribute-id=CreateOrderServiceRequest]"
|
|
437
|
-
|
|
438
|
-
// ✅ CORRECT
|
|
439
|
-
"extract": "orders.order.custom-attributes.custom-attribute[attribute-id=CreateOrderServiceRequest]"
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
**Debug**: Add logging to see extraction result:
|
|
443
|
-
|
|
444
|
-
```typescript
|
|
445
|
-
const extractedData = pathResolver.resolve(rootData, nodeConfig.extract);
|
|
446
|
-
console.log('Extracted data:', extractedData);
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
---
|
|
450
|
-
|
|
451
|
-
### Q: How do I reuse a single Fluent job for multiple batches?
|
|
452
|
-
|
|
453
|
-
**Answer**: Use daily job strategy with `StateService`:
|
|
454
|
-
|
|
455
|
-
```typescript
|
|
456
|
-
const stateService = new StateService(logger);
|
|
457
|
-
const kvAdapter = new VersoriKVAdapter(openKv());
|
|
458
|
-
|
|
459
|
-
// Check for existing daily job
|
|
460
|
-
let dailyJob = await stateService.getDailyJob(kvAdapter, 'workflow-id');
|
|
461
|
-
|
|
462
|
-
if (!dailyJob) {
|
|
463
|
-
// Create new job
|
|
464
|
-
const client = await createClient({
|
|
465
|
-
config: {
|
|
466
|
-
baseUrl: 'https://api.fluentcommerce.com', // ✅ Correct
|
|
467
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
468
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
469
|
-
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
470
|
-
},
|
|
471
|
-
logger: console,
|
|
472
|
-
});
|
|
473
|
-
const job = await client.createJob({ name: 'daily-job', retailerId: '1' });
|
|
474
|
-
await stateService.setDailyJob(kvAdapter, 'workflow-id', job.id, 24); // Expires in 24h
|
|
475
|
-
dailyJob = { jobId: job.id };
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
// Reuse job for all batches
|
|
479
|
-
await client.sendBatch(dailyJob.jobId, { entities: data });
|
|
480
|
-
```
|
|
481
|
-
|
|
482
|
-
---
|
|
483
|
-
|
|
484
|
-
## Performance & Memory
|
|
485
|
-
|
|
486
|
-
### Q: My workflow times out processing large files!
|
|
487
|
-
|
|
488
|
-
**Solutions**:
|
|
489
|
-
|
|
490
|
-
1. **Use streaming mode**:
|
|
491
|
-
|
|
492
|
-
```typescript
|
|
493
|
-
for await (const chunk of parser.streamParse(fileStream, { chunkSize: 1000 })) {
|
|
494
|
-
await processBatch(chunk);
|
|
495
|
-
}
|
|
496
|
-
```
|
|
497
|
-
|
|
498
|
-
2. **Split large files**:
|
|
499
|
-
|
|
500
|
-
```typescript
|
|
501
|
-
const chunks = splitFileIntoChunks(largeFile, 10000); // 10K records per chunk
|
|
502
|
-
for (const chunk of chunks) {
|
|
503
|
-
await processChunk(chunk);
|
|
504
|
-
}
|
|
505
|
-
```
|
|
506
|
-
|
|
507
|
-
3. **Increase batch size limits**:
|
|
508
|
-
```typescript
|
|
509
|
-
await client.sendBatch(jobId, {
|
|
510
|
-
entities: batchData,
|
|
511
|
-
batchSize: 5000, // Increase from default 2000
|
|
512
|
-
});
|
|
513
|
-
```
|
|
514
|
-
|
|
515
|
-
**Related Guides**:
|
|
516
|
-
|
|
517
|
-
- [Large File Splitting](patterns/large-file-splitting.md)
|
|
518
|
-
|
|
519
|
-
---
|
|
520
|
-
|
|
521
|
-
### Q: How do I optimize async resolver performance?
|
|
522
|
-
|
|
523
|
-
**Solution**: Pre-fetch lookup data and use memoization:
|
|
524
|
-
|
|
525
|
-
```typescript
|
|
526
|
-
// ❌ SLOW - queries customer for every item
|
|
527
|
-
'custom.getCustomerEmail': async (value, data, config, helpers) => {
|
|
528
|
-
const result = await helpers.fluentClient.graphql({ query });
|
|
529
|
-
return result.data?.customer?.email;
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
// ✅ FAST - cache customer lookup
|
|
533
|
-
const customerCache = new Map();
|
|
534
|
-
|
|
535
|
-
'custom.getCustomerEmail': async (value, data, config, helpers) => {
|
|
536
|
-
const customerId = data.customerId;
|
|
537
|
-
|
|
538
|
-
if (customerCache.has(customerId)) {
|
|
539
|
-
return customerCache.get(customerId).email;
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
const result = await helpers.fluentClient.graphql({ query });
|
|
543
|
-
customerCache.set(customerId, result.data?.customer);
|
|
544
|
-
return result.data?.customer?.email;
|
|
545
|
-
}
|
|
546
|
-
```
|
|
547
|
-
|
|
548
|
-
---
|
|
549
|
-
|
|
550
|
-
## Authentication & Security
|
|
551
|
-
|
|
552
|
-
### Q: "OAuth2 token refresh failed"
|
|
553
|
-
|
|
554
|
-
**Causes & Solutions**:
|
|
555
|
-
|
|
556
|
-
1. **Incorrect credentials**:
|
|
557
|
-
|
|
558
|
-
```bash
|
|
559
|
-
# Verify credentials
|
|
560
|
-
export FLUENT_CLIENT_ID=your-client-id
|
|
561
|
-
export FLUENT_CLIENT_SECRET=your-client-secret
|
|
562
|
-
```
|
|
563
|
-
|
|
564
|
-
2. **Token endpoint unreachable**:
|
|
565
|
-
|
|
566
|
-
```typescript
|
|
567
|
-
const client = await createClient({
|
|
568
|
-
config: {
|
|
569
|
-
baseUrl: 'https://api.fluentcommerce.com', // ✅ Correct
|
|
570
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
571
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
572
|
-
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
573
|
-
},
|
|
574
|
-
logger: console,
|
|
575
|
-
});
|
|
576
|
-
```
|
|
577
|
-
|
|
578
|
-
3. **Clock skew**:
|
|
579
|
-
```bash
|
|
580
|
-
# Ensure system time is synced
|
|
581
|
-
sudo ntpdate -s time.nist.gov
|
|
582
|
-
```
|
|
583
|
-
|
|
584
|
-
---
|
|
585
|
-
|
|
586
|
-
### Q: How do I validate webhook signatures?
|
|
587
|
-
|
|
588
|
-
**Answer**: Use `WebhookValidationService`:
|
|
589
|
-
|
|
590
|
-
```typescript
|
|
591
|
-
import { WebhookValidationService } from '@fluentcommerce/fc-connect-sdk';
|
|
592
|
-
|
|
593
|
-
const validator = new WebhookValidationService({ strictValidation: true }, logger);
|
|
594
|
-
|
|
595
|
-
const result = await validator.validateWebhook(
|
|
596
|
-
rawBody, // Raw webhook body (string)
|
|
597
|
-
headers, // HTTP headers with signature
|
|
598
|
-
publicKey // Public key from webhook provider
|
|
599
|
-
);
|
|
600
|
-
|
|
601
|
-
if (!result.isValid) {
|
|
602
|
-
throw new Error(`Validation failed: ${result.error}`);
|
|
603
|
-
}
|
|
604
|
-
```
|
|
605
|
-
|
|
606
|
-
**Supported Algorithms**: HMAC-SHA256, RSA-SHA256
|
|
607
|
-
|
|
608
|
-
---
|
|
609
|
-
|
|
610
|
-
## Deployment & Configuration
|
|
611
|
-
|
|
612
|
-
### Q: How do I set environment-specific behavior?
|
|
613
|
-
|
|
614
|
-
**Answer**: Use config parameter in resolvers:
|
|
615
|
-
|
|
616
|
-
```typescript
|
|
617
|
-
const mapper = new UniversalMapper(mapping, {
|
|
618
|
-
customResolvers,
|
|
619
|
-
context: {
|
|
620
|
-
environment: process.env.NODE_ENV, // 'production' or 'development'
|
|
621
|
-
retailerId: process.env.FLUENT_RETAILER_ID,
|
|
622
|
-
skuPrefix: process.env.SKU_PREFIX || 'PROD'
|
|
623
|
-
}
|
|
624
|
-
});
|
|
625
|
-
|
|
626
|
-
// In resolver
|
|
627
|
-
'custom.createOrderRef': (value, data, config, helpers) => {
|
|
628
|
-
const originalRef = String(value);
|
|
629
|
-
|
|
630
|
-
if (config.environment === 'production') {
|
|
631
|
-
return originalRef; // Production: use as-is
|
|
632
|
-
} else {
|
|
633
|
-
return `${originalRef}_test_${Date.now()}`; // Dev: add test suffix
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
```
|
|
637
|
-
|
|
638
|
-
---
|
|
639
|
-
|
|
640
|
-
### Q: My Docker container fails with "Cannot find module '@fluentcommerce/fc-connect-sdk'"
|
|
641
|
-
|
|
642
|
-
**Solution**: Ensure dependencies are installed in Docker:
|
|
643
|
-
|
|
644
|
-
```dockerfile
|
|
645
|
-
FROM node:18-alpine
|
|
646
|
-
|
|
647
|
-
WORKDIR /app
|
|
648
|
-
|
|
649
|
-
# Copy package files
|
|
650
|
-
COPY package*.json ./
|
|
651
|
-
|
|
652
|
-
# Install dependencies
|
|
653
|
-
RUN npm ci --only=production
|
|
654
|
-
|
|
655
|
-
# Copy source code
|
|
656
|
-
COPY . .
|
|
657
|
-
|
|
658
|
-
# Build TypeScript
|
|
659
|
-
RUN npm run build
|
|
660
|
-
|
|
661
|
-
CMD ["node", "dist/index.js"]
|
|
662
|
-
```
|
|
663
|
-
|
|
664
|
-
---
|
|
665
|
-
|
|
666
|
-
## Still Need Help?
|
|
667
|
-
|
|
668
|
-
### Resources
|
|
669
|
-
|
|
670
|
-
- **SDK Documentation**: [Complete Docs](../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|
|
671
|
-
- **API Reference**: [API Reference](../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|
|
672
|
-
- **GitHub Issues**: https://github.com/fluentcommerce/fc-connect-sdk/issues
|
|
673
|
-
- **Fluent Commerce Docs**: https://docs.fluentcommerce.com
|
|
674
|
-
|
|
675
|
-
### Reporting Issues
|
|
676
|
-
|
|
677
|
-
When reporting issues, include:
|
|
678
|
-
|
|
679
|
-
1. SDK version (`npm list @fluentcommerce/fc-connect-sdk`)
|
|
680
|
-
2. Runtime environment (Node.js version, Deno version, or Versori)
|
|
681
|
-
3. Minimal reproduction code
|
|
682
|
-
4. Error messages and stack traces
|
|
683
|
-
5. Sample data (anonymized)
|
|
684
|
-
|
|
685
|
-
---
|
|
686
|
-
|
|
1
|
+
# FC Connect SDK - Use Cases FAQ
|
|
2
|
+
|
|
3
|
+
**Consolidated troubleshooting guide from all use-case documentation**
|
|
4
|
+
|
|
5
|
+
Last Updated: 2025-01-18
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 📋 Table of Contents
|
|
10
|
+
|
|
11
|
+
- [File Processing Issues](#file-processing-issues)
|
|
12
|
+
- [State Management & Locking](#state-management-locking)
|
|
13
|
+
- [Mapping & Transformation Errors](#mapping-transformation-errors)
|
|
14
|
+
- [GraphQL & API Issues](#graphql-api-issues)
|
|
15
|
+
- [XML Processing](#xml-processing)
|
|
16
|
+
- [Versori Platform](#versori-platform)
|
|
17
|
+
- [Performance & Memory](#performance-memory)
|
|
18
|
+
- [Authentication & Security](#authentication-security)
|
|
19
|
+
- [Deployment & Configuration](#deployment-configuration)
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## File Processing Issues
|
|
24
|
+
|
|
25
|
+
### Q: How do I prevent processing the same file twice?
|
|
26
|
+
|
|
27
|
+
**Answer**: Use `VersoriFileTracker` (for Versori) or `StateService` (for standalone):
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
// Versori
|
|
31
|
+
import { VersoriFileTracker } from '@fluentcommerce/fc-connect-sdk';
|
|
32
|
+
const tracker = new VersoriFileTracker(openKv(), 'workflow-id');
|
|
33
|
+
|
|
34
|
+
if (await tracker.wasFileProcessed(fileName)) {
|
|
35
|
+
console.log('Already processed, skipping');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
await processFile(fileName);
|
|
40
|
+
await tracker.markFileProcessed(fileName, { recordCount: 100 });
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Related Guides**:
|
|
44
|
+
|
|
45
|
+
- [State Management Pattern](patterns/state-duplicate-prevention.md)
|
|
46
|
+
- [Versori KV State Management](versori/patterns/kv-state-management.md)
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
### Q: Why are my CSV files failing to parse?
|
|
51
|
+
|
|
52
|
+
**Common Causes**:
|
|
53
|
+
|
|
54
|
+
1. **Wrong delimiter**
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// Solution: Specify correct delimiter
|
|
58
|
+
const records = await parser.parse(content, { delimiter: '|' }); // Not ','
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
2. **Missing header row**
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
// Solution: Enable headerless mode
|
|
65
|
+
const records = await parser.parse(content, { header: false });
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
3. **Quoted fields with embedded commas**
|
|
69
|
+
```typescript
|
|
70
|
+
// Solution: Enable quote handling
|
|
71
|
+
const records = await parser.parse(content, { quote: '"', escape: '"' });
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
### Q: How do I handle large files that cause memory issues?
|
|
77
|
+
|
|
78
|
+
**Answer**: Use streaming mode:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
import { CSVParserService } from '@fluentcommerce/fc-connect-sdk';
|
|
82
|
+
|
|
83
|
+
const parser = new CSVParserService();
|
|
84
|
+
|
|
85
|
+
// Stream in chunks
|
|
86
|
+
for await (const chunk of parser.streamParse(fileStream, { chunkSize: 1000 })) {
|
|
87
|
+
await processBatch(chunk);
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Related Guides**:
|
|
92
|
+
|
|
93
|
+
- [Large File Splitting Pattern](patterns/large-file-splitting.md)
|
|
94
|
+
- [Pagination & Streaming](patterns/pagination-streaming.md)
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## State Management & Locking
|
|
99
|
+
|
|
100
|
+
### Q: My distributed lock is never released!
|
|
101
|
+
|
|
102
|
+
**Cause**: Workflow crashed before releasing lock.
|
|
103
|
+
|
|
104
|
+
**Solution**: Always release locks in `finally` blocks:
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
const kvAdapter = new VersoriKVAdapter(openKv());
|
|
108
|
+
const stateService = new StateService(logger);
|
|
109
|
+
const lockName = 'my-lock';
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
await stateService.acquireLock(lockName, kvAdapter, 15);
|
|
113
|
+
await doWork();
|
|
114
|
+
} finally {
|
|
115
|
+
// ALWAYS release, even on error
|
|
116
|
+
await stateService.releaseLock(lockName, kvAdapter);
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Lock Timeouts**: Stale locks auto-expire after timeout (e.g., 15 minutes).
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
### Q: How do I list all processed files in Versori?
|
|
125
|
+
|
|
126
|
+
**Answer**: Use `VersoriIndexedFileTracker` (not standard `VersoriFileTracker`):
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
import { VersoriIndexedFileTracker } from '@fluentcommerce/fc-connect-sdk';
|
|
130
|
+
|
|
131
|
+
const tracker = new VersoriIndexedFileTracker(openKv(), 'workflow');
|
|
132
|
+
|
|
133
|
+
// List all processed files
|
|
134
|
+
const files = await tracker.listProcessedFiles();
|
|
135
|
+
console.log(`Processed ${files.length} files`);
|
|
136
|
+
|
|
137
|
+
// Get stats
|
|
138
|
+
const stats = await tracker.getStats();
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Why**: Standard Versori KV doesn't support list operations.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
### Q: How do I implement checkpoint/resume for long workflows?
|
|
146
|
+
|
|
147
|
+
**Answer**: Save state periodically using `StateService`:
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
const stateService = new StateService(logger);
|
|
151
|
+
const kvAdapter = new VersoriKVAdapter(openKv());
|
|
152
|
+
|
|
153
|
+
// Restore from checkpoint
|
|
154
|
+
const syncState = await stateService.getSyncState(kvAdapter, 'workflow-id');
|
|
155
|
+
const lastProcessed = syncState.lastProcessedTimestamp;
|
|
156
|
+
|
|
157
|
+
// Process batches
|
|
158
|
+
for (const batch of batches) {
|
|
159
|
+
await processBatch(batch);
|
|
160
|
+
|
|
161
|
+
// Save checkpoint every 10 batches
|
|
162
|
+
if (batchIndex % 10 === 0) {
|
|
163
|
+
await stateService.updateSyncState(
|
|
164
|
+
kvAdapter,
|
|
165
|
+
[
|
|
166
|
+
{
|
|
167
|
+
fileName: `batch-${batchIndex}`,
|
|
168
|
+
lastModified: new Date().toISOString(),
|
|
169
|
+
recordCount: batch.length,
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
'workflow-id'
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Mapping & Transformation Errors
|
|
181
|
+
|
|
182
|
+
### Q: "Required field 'skuRef' is missing or empty"
|
|
183
|
+
|
|
184
|
+
**Cause**: Source field doesn't exist or mapping path is incorrect.
|
|
185
|
+
|
|
186
|
+
**Solution**: Debug the source data structure:
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
console.log('Source data:', JSON.stringify(sourceData, null, 2));
|
|
190
|
+
|
|
191
|
+
// Verify source path matches actual structure
|
|
192
|
+
const config = {
|
|
193
|
+
fields: {
|
|
194
|
+
skuRef: { source: 'sku', required: true }, // Check if sourceData.sku exists
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Common Mistakes**:
|
|
200
|
+
|
|
201
|
+
- `snake_case` vs `camelCase` mismatch
|
|
202
|
+
- Nested path incorrect (`product.sku` vs `product.sku_id`)
|
|
203
|
+
- Array access (`items[0].sku` vs `items.sku`)
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
### Q: How do I map nested XML/JSON fields?
|
|
208
|
+
|
|
209
|
+
**Answer**: Use dot notation for nested paths:
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
const mapping = {
|
|
213
|
+
fields: {
|
|
214
|
+
// Nested object
|
|
215
|
+
'customer.email': { source: 'order.customer.email_address' },
|
|
216
|
+
|
|
217
|
+
// Array of objects
|
|
218
|
+
items: {
|
|
219
|
+
source: 'order.line_items',
|
|
220
|
+
isArray: true,
|
|
221
|
+
fields: {
|
|
222
|
+
productRef: { source: 'sku' },
|
|
223
|
+
quantity: { source: 'qty', resolver: 'sdk.parseInt' },
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
|
|
227
|
+
// XML attribute (use @ prefix)
|
|
228
|
+
orderId: { source: 'order@id' },
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Related Guides**:
|
|
234
|
+
|
|
235
|
+
- [Field Mapping Universal](patterns/field-mapping-universal.md)
|
|
236
|
+
- [XML Order Ingestion](versori/webhooks/template-webhook-xml-order-ingestion.md)
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
### Q: My custom resolver returns undefined!
|
|
241
|
+
|
|
242
|
+
**Cause**: Incorrect resolver signature or accessing wrong data.
|
|
243
|
+
|
|
244
|
+
**Solution**: Use correct 4-parameter signature:
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
const customResolvers = {
|
|
248
|
+
'custom.myResolver': (value, sourceData, config, helpers) => {
|
|
249
|
+
// value: the extracted field value
|
|
250
|
+
// sourceData: full source object (access sibling fields)
|
|
251
|
+
// config: resolver configuration passed to mapper
|
|
252
|
+
// helpers: SDK utilities (get, parseFloatSafe, logger, etc.)
|
|
253
|
+
|
|
254
|
+
const siblingField = helpers.get(sourceData, 'other.field');
|
|
255
|
+
return helpers.parseFloatSafe(value, 0) * siblingField;
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**Related Guides**:
|
|
261
|
+
|
|
262
|
+
- [Custom Resolvers Pattern](patterns/custom-resolvers.md)
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## GraphQL & API Issues
|
|
267
|
+
|
|
268
|
+
### Q: "GraphQL errors: Field 'customer' is required"
|
|
269
|
+
|
|
270
|
+
**Cause**: Missing required field in mutation input.
|
|
271
|
+
|
|
272
|
+
**Solution**: Check GraphQL schema requirements:
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
// Use introspection tool to view schema
|
|
276
|
+
npx @fluentcommerce/fc-connect-sdk introspect-schema --url <graphql-url>
|
|
277
|
+
|
|
278
|
+
// Ensure all required fields are mapped
|
|
279
|
+
const mapping = {
|
|
280
|
+
mutation: 'createOrder',
|
|
281
|
+
fields: {
|
|
282
|
+
customer: {
|
|
283
|
+
id: { resolver: 'custom.lookupCustomer', required: true }, // REQUIRED
|
|
284
|
+
email: { source: 'email' }
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
### Q: "Cannot read property 'customerOrderId' of undefined"
|
|
293
|
+
|
|
294
|
+
**Cause**: Incorrect XML attribute access syntax.
|
|
295
|
+
|
|
296
|
+
**Solution**: Use `@` WITHOUT dot before it:
|
|
297
|
+
|
|
298
|
+
```typescript
|
|
299
|
+
// ❌ WRONG
|
|
300
|
+
"source": "$radial.OrderCreateRequest.Order.@customerOrderId"
|
|
301
|
+
|
|
302
|
+
// ✅ CORRECT
|
|
303
|
+
"source": "$radial.OrderCreateRequest.Order@customerOrderId"
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
**Why**: `@` is part of the path syntax, not a separate segment.
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
### Q: How do I handle pagination in GraphQL queries?
|
|
311
|
+
|
|
312
|
+
**Answer**: Use SDK's built-in auto-pagination:
|
|
313
|
+
|
|
314
|
+
```typescript
|
|
315
|
+
const result = await client.graphql({
|
|
316
|
+
query: inventoryQuery,
|
|
317
|
+
variables: { first: 50 },
|
|
318
|
+
pagination: {
|
|
319
|
+
maxPages: 100, // Limit total pages
|
|
320
|
+
onProgress: (page, total) => {
|
|
321
|
+
console.log(`Fetching page ${page}/${total}`);
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
// result.data contains ALL pages combined
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**Related Guides**:
|
|
330
|
+
|
|
331
|
+
- [Pagination & Streaming](patterns/pagination-streaming.md)
|
|
332
|
+
- [GraphQL Query Export](standalone/graphql-query-export.md)
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## XML Processing
|
|
337
|
+
|
|
338
|
+
### Q: "Expected array at path but got object"
|
|
339
|
+
|
|
340
|
+
**Cause**: XML parser doesn't create arrays for single items.
|
|
341
|
+
|
|
342
|
+
**Solution**: Use `helpers.ensureArray()` in resolvers:
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
'custom.processItems': (value, sourceData, config, helpers) => {
|
|
346
|
+
// ❌ WRONG - assumes always array
|
|
347
|
+
const items = helpers.get(sourceData, 'OrderItems.OrderItem');
|
|
348
|
+
for (const item of items) { ... } // ERROR if single item
|
|
349
|
+
|
|
350
|
+
// ✅ CORRECT - wraps single items
|
|
351
|
+
const items = helpers.ensureArray(
|
|
352
|
+
helpers.get(sourceData, 'OrderItems.OrderItem')
|
|
353
|
+
);
|
|
354
|
+
for (const item of items) { ... } // Works for 1 or N items
|
|
355
|
+
}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
### Q: How do I extract nested/escaped XML from another XML document?
|
|
361
|
+
|
|
362
|
+
**Answer**: Use `nodes` configuration in `GraphQLMutationMapper`:
|
|
363
|
+
|
|
364
|
+
```json
|
|
365
|
+
{
|
|
366
|
+
"nodes": {
|
|
367
|
+
"radial": {
|
|
368
|
+
"extract": "orders.order.custom-attributes.custom-attribute[attribute-id=CreateOrderServiceRequest]",
|
|
369
|
+
"parse": "xml"
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
"fields": {
|
|
373
|
+
"ref": {
|
|
374
|
+
"source": "$radial.OrderCreateRequest.Order@customerOrderId"
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
**How it works**:
|
|
381
|
+
|
|
382
|
+
1. **Extract**: Find nested XML string using path + attribute filter
|
|
383
|
+
2. **Parse**: Re-parse extracted string as XML
|
|
384
|
+
3. **Reference**: Use `$radial` prefix to access parsed node
|
|
385
|
+
|
|
386
|
+
**Related Guides**:
|
|
387
|
+
|
|
388
|
+
- [XML Order Ingestion](versori/webhooks/template-webhook-xml-order-ingestion.md)
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## Versori Platform
|
|
393
|
+
|
|
394
|
+
### Q: How do I return non-JSON content (XML, HTML, CSV) from Versori webhooks?
|
|
395
|
+
|
|
396
|
+
**Answer**: Use custom `Response` objects with proper `Content-Type`:
|
|
397
|
+
|
|
398
|
+
```typescript
|
|
399
|
+
import { webhook, fn } from '@versori/run';
|
|
400
|
+
|
|
401
|
+
export const xmlResponse = webhook('xml-endpoint', {
|
|
402
|
+
response: {
|
|
403
|
+
mode: 'sync',
|
|
404
|
+
onSuccess: ctx =>
|
|
405
|
+
new Response(ctx.data, {
|
|
406
|
+
status: 200,
|
|
407
|
+
headers: { 'Content-Type': 'application/xml; charset=utf-8' },
|
|
408
|
+
}),
|
|
409
|
+
onError: ctx =>
|
|
410
|
+
new Response(ctx.data, {
|
|
411
|
+
status: 500,
|
|
412
|
+
headers: { 'Content-Type': 'application/xml; charset=utf-8' },
|
|
413
|
+
}),
|
|
414
|
+
},
|
|
415
|
+
})
|
|
416
|
+
.then(fn('generate-xml', () => '<order><id>123</id></order>'))
|
|
417
|
+
.catch(({ data }) => '<error>Failed</error>');
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
**Why**: Default Versori behavior JSON-encodes all responses.
|
|
421
|
+
|
|
422
|
+
**Related Guides**:
|
|
423
|
+
|
|
424
|
+
- [XML Response Patterns](versori/patterns/xml-response-patterns.md)
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
### Q: "Node 'radial' extraction returned null/undefined"
|
|
429
|
+
|
|
430
|
+
**Cause**: Path in nodes config doesn't match XML structure.
|
|
431
|
+
|
|
432
|
+
**Solution**: Check XML attribute syntax:
|
|
433
|
+
|
|
434
|
+
```json
|
|
435
|
+
// ❌ WRONG
|
|
436
|
+
"extract": "custom-attribute[@attribute-id=CreateOrderServiceRequest]"
|
|
437
|
+
|
|
438
|
+
// ✅ CORRECT
|
|
439
|
+
"extract": "orders.order.custom-attributes.custom-attribute[attribute-id=CreateOrderServiceRequest]"
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
**Debug**: Add logging to see extraction result:
|
|
443
|
+
|
|
444
|
+
```typescript
|
|
445
|
+
const extractedData = pathResolver.resolve(rootData, nodeConfig.extract);
|
|
446
|
+
console.log('Extracted data:', extractedData);
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
---
|
|
450
|
+
|
|
451
|
+
### Q: How do I reuse a single Fluent job for multiple batches?
|
|
452
|
+
|
|
453
|
+
**Answer**: Use daily job strategy with `StateService`:
|
|
454
|
+
|
|
455
|
+
```typescript
|
|
456
|
+
const stateService = new StateService(logger);
|
|
457
|
+
const kvAdapter = new VersoriKVAdapter(openKv());
|
|
458
|
+
|
|
459
|
+
// Check for existing daily job
|
|
460
|
+
let dailyJob = await stateService.getDailyJob(kvAdapter, 'workflow-id');
|
|
461
|
+
|
|
462
|
+
if (!dailyJob) {
|
|
463
|
+
// Create new job
|
|
464
|
+
const client = await createClient({
|
|
465
|
+
config: {
|
|
466
|
+
baseUrl: 'https://api.fluentcommerce.com', // ✅ Correct
|
|
467
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
468
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
469
|
+
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
470
|
+
},
|
|
471
|
+
logger: console,
|
|
472
|
+
});
|
|
473
|
+
const job = await client.createJob({ name: 'daily-job', retailerId: '1' });
|
|
474
|
+
await stateService.setDailyJob(kvAdapter, 'workflow-id', job.id, 24); // Expires in 24h
|
|
475
|
+
dailyJob = { jobId: job.id };
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// Reuse job for all batches
|
|
479
|
+
await client.sendBatch(dailyJob.jobId, { entities: data });
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
## Performance & Memory
|
|
485
|
+
|
|
486
|
+
### Q: My workflow times out processing large files!
|
|
487
|
+
|
|
488
|
+
**Solutions**:
|
|
489
|
+
|
|
490
|
+
1. **Use streaming mode**:
|
|
491
|
+
|
|
492
|
+
```typescript
|
|
493
|
+
for await (const chunk of parser.streamParse(fileStream, { chunkSize: 1000 })) {
|
|
494
|
+
await processBatch(chunk);
|
|
495
|
+
}
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
2. **Split large files**:
|
|
499
|
+
|
|
500
|
+
```typescript
|
|
501
|
+
const chunks = splitFileIntoChunks(largeFile, 10000); // 10K records per chunk
|
|
502
|
+
for (const chunk of chunks) {
|
|
503
|
+
await processChunk(chunk);
|
|
504
|
+
}
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
3. **Increase batch size limits**:
|
|
508
|
+
```typescript
|
|
509
|
+
await client.sendBatch(jobId, {
|
|
510
|
+
entities: batchData,
|
|
511
|
+
batchSize: 5000, // Increase from default 2000
|
|
512
|
+
});
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
**Related Guides**:
|
|
516
|
+
|
|
517
|
+
- [Large File Splitting](patterns/large-file-splitting.md)
|
|
518
|
+
|
|
519
|
+
---
|
|
520
|
+
|
|
521
|
+
### Q: How do I optimize async resolver performance?
|
|
522
|
+
|
|
523
|
+
**Solution**: Pre-fetch lookup data and use memoization:
|
|
524
|
+
|
|
525
|
+
```typescript
|
|
526
|
+
// ❌ SLOW - queries customer for every item
|
|
527
|
+
'custom.getCustomerEmail': async (value, data, config, helpers) => {
|
|
528
|
+
const result = await helpers.fluentClient.graphql({ query });
|
|
529
|
+
return result.data?.customer?.email;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// ✅ FAST - cache customer lookup
|
|
533
|
+
const customerCache = new Map();
|
|
534
|
+
|
|
535
|
+
'custom.getCustomerEmail': async (value, data, config, helpers) => {
|
|
536
|
+
const customerId = data.customerId;
|
|
537
|
+
|
|
538
|
+
if (customerCache.has(customerId)) {
|
|
539
|
+
return customerCache.get(customerId).email;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
const result = await helpers.fluentClient.graphql({ query });
|
|
543
|
+
customerCache.set(customerId, result.data?.customer);
|
|
544
|
+
return result.data?.customer?.email;
|
|
545
|
+
}
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
---
|
|
549
|
+
|
|
550
|
+
## Authentication & Security
|
|
551
|
+
|
|
552
|
+
### Q: "OAuth2 token refresh failed"
|
|
553
|
+
|
|
554
|
+
**Causes & Solutions**:
|
|
555
|
+
|
|
556
|
+
1. **Incorrect credentials**:
|
|
557
|
+
|
|
558
|
+
```bash
|
|
559
|
+
# Verify credentials
|
|
560
|
+
export FLUENT_CLIENT_ID=your-client-id
|
|
561
|
+
export FLUENT_CLIENT_SECRET=your-client-secret
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
2. **Token endpoint unreachable**:
|
|
565
|
+
|
|
566
|
+
```typescript
|
|
567
|
+
const client = await createClient({
|
|
568
|
+
config: {
|
|
569
|
+
baseUrl: 'https://api.fluentcommerce.com', // ✅ Correct
|
|
570
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
571
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
572
|
+
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
573
|
+
},
|
|
574
|
+
logger: console,
|
|
575
|
+
});
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
3. **Clock skew**:
|
|
579
|
+
```bash
|
|
580
|
+
# Ensure system time is synced
|
|
581
|
+
sudo ntpdate -s time.nist.gov
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
---
|
|
585
|
+
|
|
586
|
+
### Q: How do I validate webhook signatures?
|
|
587
|
+
|
|
588
|
+
**Answer**: Use `WebhookValidationService`:
|
|
589
|
+
|
|
590
|
+
```typescript
|
|
591
|
+
import { WebhookValidationService } from '@fluentcommerce/fc-connect-sdk';
|
|
592
|
+
|
|
593
|
+
const validator = new WebhookValidationService({ strictValidation: true }, logger);
|
|
594
|
+
|
|
595
|
+
const result = await validator.validateWebhook(
|
|
596
|
+
rawBody, // Raw webhook body (string)
|
|
597
|
+
headers, // HTTP headers with signature
|
|
598
|
+
publicKey // Public key from webhook provider
|
|
599
|
+
);
|
|
600
|
+
|
|
601
|
+
if (!result.isValid) {
|
|
602
|
+
throw new Error(`Validation failed: ${result.error}`);
|
|
603
|
+
}
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
**Supported Algorithms**: HMAC-SHA256, RSA-SHA256
|
|
607
|
+
|
|
608
|
+
---
|
|
609
|
+
|
|
610
|
+
## Deployment & Configuration
|
|
611
|
+
|
|
612
|
+
### Q: How do I set environment-specific behavior?
|
|
613
|
+
|
|
614
|
+
**Answer**: Use config parameter in resolvers:
|
|
615
|
+
|
|
616
|
+
```typescript
|
|
617
|
+
const mapper = new UniversalMapper(mapping, {
|
|
618
|
+
customResolvers,
|
|
619
|
+
context: {
|
|
620
|
+
environment: process.env.NODE_ENV, // 'production' or 'development'
|
|
621
|
+
retailerId: process.env.FLUENT_RETAILER_ID,
|
|
622
|
+
skuPrefix: process.env.SKU_PREFIX || 'PROD'
|
|
623
|
+
}
|
|
624
|
+
});
|
|
625
|
+
|
|
626
|
+
// In resolver
|
|
627
|
+
'custom.createOrderRef': (value, data, config, helpers) => {
|
|
628
|
+
const originalRef = String(value);
|
|
629
|
+
|
|
630
|
+
if (config.environment === 'production') {
|
|
631
|
+
return originalRef; // Production: use as-is
|
|
632
|
+
} else {
|
|
633
|
+
return `${originalRef}_test_${Date.now()}`; // Dev: add test suffix
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
---
|
|
639
|
+
|
|
640
|
+
### Q: My Docker container fails with "Cannot find module '@fluentcommerce/fc-connect-sdk'"
|
|
641
|
+
|
|
642
|
+
**Solution**: Ensure dependencies are installed in Docker:
|
|
643
|
+
|
|
644
|
+
```dockerfile
|
|
645
|
+
FROM node:18-alpine
|
|
646
|
+
|
|
647
|
+
WORKDIR /app
|
|
648
|
+
|
|
649
|
+
# Copy package files
|
|
650
|
+
COPY package*.json ./
|
|
651
|
+
|
|
652
|
+
# Install dependencies
|
|
653
|
+
RUN npm ci --only=production
|
|
654
|
+
|
|
655
|
+
# Copy source code
|
|
656
|
+
COPY . .
|
|
657
|
+
|
|
658
|
+
# Build TypeScript
|
|
659
|
+
RUN npm run build
|
|
660
|
+
|
|
661
|
+
CMD ["node", "dist/index.js"]
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
---
|
|
665
|
+
|
|
666
|
+
## Still Need Help?
|
|
667
|
+
|
|
668
|
+
### Resources
|
|
669
|
+
|
|
670
|
+
- **SDK Documentation**: [Complete Docs](../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|
|
671
|
+
- **API Reference**: [API Reference](../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|
|
672
|
+
- **GitHub Issues**: https://github.com/fluentcommerce/fc-connect-sdk/issues
|
|
673
|
+
- **Fluent Commerce Docs**: https://docs.fluentcommerce.com
|
|
674
|
+
|
|
675
|
+
### Reporting Issues
|
|
676
|
+
|
|
677
|
+
When reporting issues, include:
|
|
678
|
+
|
|
679
|
+
1. SDK version (`npm list @fluentcommerce/fc-connect-sdk`)
|
|
680
|
+
2. Runtime environment (Node.js version, Deno version, or Versori)
|
|
681
|
+
3. Minimal reproduction code
|
|
682
|
+
4. Error messages and stack traces
|
|
683
|
+
5. Sample data (anonymized)
|
|
684
|
+
|
|
685
|
+
---
|
|
686
|
+
|