@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
|
@@ -1,794 +1,794 @@
|
|
|
1
|
-
# SDK Philosophy & Architecture
|
|
2
|
-
|
|
3
|
-
## Table of Contents
|
|
4
|
-
|
|
5
|
-
1. [Core Principle](#core-principle)
|
|
6
|
-
2. [What the SDK Provides](#what-the-sdk-provides)
|
|
7
|
-
3. [What YOU Build](#what-you-build)
|
|
8
|
-
4. [Platform Support](#platform-support)
|
|
9
|
-
5. [Common Patterns](#common-patterns)
|
|
10
|
-
6. [Special Case: Inventory Ingestion](#special-case-inventory-ingestion)
|
|
11
|
-
7. [SDK Architecture Diagram](#sdk-architecture-diagram)
|
|
12
|
-
8. [Guidelines](#guidelines)
|
|
13
|
-
9. [Decision Guide](#decision-guide)
|
|
14
|
-
10. [Documentation](#documentation)
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Core Principle
|
|
19
|
-
|
|
20
|
-
> **The SDK provides services with methods. YOU build the workflow.**
|
|
21
|
-
|
|
22
|
-
The SDK is **NOT** an opinionated framework. It's a **toolkit of composable services** that you combine however you want.
|
|
23
|
-
|
|
24
|
-
**Key Philosophy:**
|
|
25
|
-
|
|
26
|
-
- ✅ Provide building blocks (services, parsers, mappers)
|
|
27
|
-
- ✅ Let developers compose them into custom workflows
|
|
28
|
-
- ✅ Support multiple runtimes (Node.js, Deno, Versori)
|
|
29
|
-
- ✅ No imposed patterns or opinions
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## What the SDK Provides
|
|
34
|
-
|
|
35
|
-
### 1. Core Services (Building Blocks)
|
|
36
|
-
|
|
37
|
-
```typescript
|
|
38
|
-
// ============================================
|
|
39
|
-
// CLIENT & AUTHENTICATION
|
|
40
|
-
// ============================================
|
|
41
|
-
|
|
42
|
-
createClient(); // Universal client factory (auto-detects context)
|
|
43
|
-
FluentClient; // Standalone Node.js/Deno client (OAuth2)
|
|
44
|
-
FluentVersoriClient; // Versori platform client (connection-based)
|
|
45
|
-
|
|
46
|
-
// ============================================
|
|
47
|
-
// DATA SOURCES
|
|
48
|
-
// ============================================
|
|
49
|
-
|
|
50
|
-
S3DataSource; // Read/write S3 (streaming support)
|
|
51
|
-
SftpDataSource; // SFTP file operations
|
|
52
|
-
InventoryDataSource; // Base class for custom sources
|
|
53
|
-
|
|
54
|
-
// ============================================
|
|
55
|
-
// PARSERS
|
|
56
|
-
// ============================================
|
|
57
|
-
|
|
58
|
-
CSVParserService; // CSV with validation
|
|
59
|
-
JSONParserService; // JSON with streaming
|
|
60
|
-
XMLParserService; // XML with XPath-like selectors
|
|
61
|
-
ParquetParserService; // Parquet columnar format
|
|
62
|
-
|
|
63
|
-
// ============================================
|
|
64
|
-
// TRANSFORMATION & MAPPING
|
|
65
|
-
// ============================================
|
|
66
|
-
|
|
67
|
-
UniversalMapper; // Field mapping for ALL transformations
|
|
68
|
-
GraphQLMutationMapper; // XML/JSON → GraphQL mutations (schema-driven)
|
|
69
|
-
|
|
70
|
-
// ============================================
|
|
71
|
-
// ORCHESTRATORS (Optional)
|
|
72
|
-
// ============================================
|
|
73
|
-
|
|
74
|
-
ExtractionOrchestrator; // High-level extraction with auto-pagination
|
|
75
|
-
|
|
76
|
-
// ============================================
|
|
77
|
-
// BATCH & JOB MANAGEMENT
|
|
78
|
-
// ============================================
|
|
79
|
-
|
|
80
|
-
FluentBatchManager; // Batch operation orchestration
|
|
81
|
-
PartialBatchRecovery; // Handle partial batch failures gracefully
|
|
82
|
-
JobTracker; // Job lifecycle and state tracking
|
|
83
|
-
|
|
84
|
-
// ============================================
|
|
85
|
-
// VALIDATION SERVICES
|
|
86
|
-
// ============================================
|
|
87
|
-
|
|
88
|
-
PreflightValidator; // Pre-execution validation for connectors
|
|
89
|
-
SchemaValidationService; // Dynamic schema validation
|
|
90
|
-
WebhookValidationService; // Webhook signature validation
|
|
91
|
-
|
|
92
|
-
// ============================================
|
|
93
|
-
// STATE & UTILITIES
|
|
94
|
-
// ============================================
|
|
95
|
-
|
|
96
|
-
StateService; // Track processed files, prevent duplicates
|
|
97
|
-
createConsoleLogger; // Simple console logger
|
|
98
|
-
toStructuredLogger; // Add context to logger
|
|
99
|
-
createWorkflowLogger; // Pre-configured workflow logger
|
|
100
|
-
createServiceLogger; // Pre-configured service logger
|
|
101
|
-
VersoriKVAdapter; // Versori key-value storage adapter
|
|
102
|
-
S3PresignService; // S3 presigned URL generation
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### 2. Key Methods on Each Service
|
|
106
|
-
|
|
107
|
-
```typescript
|
|
108
|
-
// Client operations
|
|
109
|
-
client.graphql({ query, variables }); // ONE method for BOTH queries and mutations
|
|
110
|
-
client.sendEvent(event, mode);
|
|
111
|
-
client.createJob(jobConfig);
|
|
112
|
-
client.sendBatch(jobId, batchData);
|
|
113
|
-
client.getBatchStatus(jobId, batchId);
|
|
114
|
-
client.validateWebhook(payload, options); // Webhook signature validation
|
|
115
|
-
|
|
116
|
-
// Data sources
|
|
117
|
-
dataSource.listFiles({ prefix });
|
|
118
|
-
dataSource.downloadFile(key);
|
|
119
|
-
dataSource.uploadFile(key);
|
|
120
|
-
dataSource.streamFile(key);
|
|
121
|
-
|
|
122
|
-
// Parsers
|
|
123
|
-
parser.parse(content);
|
|
124
|
-
parser.parseStream(stream, options);
|
|
125
|
-
|
|
126
|
-
// Mapping
|
|
127
|
-
mapper.map(sourceData); // Returns { success, data, errors }
|
|
128
|
-
|
|
129
|
-
// State management
|
|
130
|
-
stateService.isFileProcessed(key);
|
|
131
|
-
stateService.markFileProcessed(key, metadata);
|
|
132
|
-
stateService.getCheckpoint(key);
|
|
133
|
-
stateService.setCheckpoint(key, value);
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
**That's it. The SDK provides services with methods. YOU decide how to use them.**
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## What YOU Build
|
|
141
|
-
|
|
142
|
-
### Your Application/Connector Logic
|
|
143
|
-
|
|
144
|
-
You control:
|
|
145
|
-
|
|
146
|
-
- ✅ **Which services to use** (S3 or SFTP? CSV or Parquet?)
|
|
147
|
-
- ✅ **Execution order** (parse first or download first?)
|
|
148
|
-
- ✅ **API choice** (GraphQL mutations, Batch API, or Events?)
|
|
149
|
-
- ✅ **Error handling** (retry? skip? log?)
|
|
150
|
-
- ✅ **Business rules** (filter records? validate data?)
|
|
151
|
-
- ✅ **File management** (archive? delete? rename?)
|
|
152
|
-
|
|
153
|
-
### Example: Custom Workflow
|
|
154
|
-
|
|
155
|
-
```typescript
|
|
156
|
-
import {
|
|
157
|
-
createClient,
|
|
158
|
-
S3DataSource,
|
|
159
|
-
CSVParserService,
|
|
160
|
-
UniversalMapper,
|
|
161
|
-
StateService,
|
|
162
|
-
VersoriKVAdapter,
|
|
163
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
164
|
-
|
|
165
|
-
async function myCustomWorkflow() {
|
|
166
|
-
// 1. Initialize SDK services
|
|
167
|
-
const client = await createClient({
|
|
168
|
-
config: {
|
|
169
|
-
baseUrl: 'https://api.fluentcommerce.com',
|
|
170
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
171
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
172
|
-
retailerId: '1',
|
|
173
|
-
},
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
const s3 = new S3DataSource(
|
|
177
|
-
{
|
|
178
|
-
type: 'S3_CSV',
|
|
179
|
-
s3Config: {
|
|
180
|
-
bucket: 'my-inventory-bucket',
|
|
181
|
-
region: 'us-east-1',
|
|
182
|
-
accessKeyId,
|
|
183
|
-
secretAccessKey,
|
|
184
|
-
},
|
|
185
|
-
},
|
|
186
|
-
logger
|
|
187
|
-
);
|
|
188
|
-
|
|
189
|
-
const parser = new CSVParserService();
|
|
190
|
-
|
|
191
|
-
const mapper = new UniversalMapper({
|
|
192
|
-
fields: {
|
|
193
|
-
ref: { source: 'product_id', required: true },
|
|
194
|
-
type: { source: 'product_type', resolver: 'sdk.uppercase' },
|
|
195
|
-
qty: { source: 'quantity', resolver: 'sdk.parseInt' },
|
|
196
|
-
},
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
// 2. YOUR CUSTOM LOGIC: List and filter files
|
|
200
|
-
const files = await s3.listFiles('inbound/');
|
|
201
|
-
const csvFiles = files.filter(f => f.name.endsWith('.csv'));
|
|
202
|
-
|
|
203
|
-
// 3. YOUR CUSTOM LOGIC: Process each file
|
|
204
|
-
for (const file of csvFiles) {
|
|
205
|
-
const content = await s3.downloadFile(file.name);
|
|
206
|
-
const records = await parser.parse(content);
|
|
207
|
-
|
|
208
|
-
// 4. YOUR CUSTOM LOGIC: Transform and validate
|
|
209
|
-
const validRecords = [];
|
|
210
|
-
for (const record of records) {
|
|
211
|
-
const result = await mapper.map(record);
|
|
212
|
-
|
|
213
|
-
if (result.success) {
|
|
214
|
-
validRecords.push(result.data);
|
|
215
|
-
} else {
|
|
216
|
-
logger.warn(`Skipping invalid record: ${result.errors}`);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// 5. YOUR CUSTOM LOGIC: Send to Fluent Commerce
|
|
221
|
-
for (const record of validRecords) {
|
|
222
|
-
await client.graphql({
|
|
223
|
-
query: `
|
|
224
|
-
mutation CreateProduct($input: CreateProductInput!) {
|
|
225
|
-
createProduct(input: $input) {
|
|
226
|
-
id
|
|
227
|
-
ref
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
`,
|
|
231
|
-
variables: { input: record },
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// 6. YOUR CUSTOM LOGIC: Archive processed file
|
|
236
|
-
await s3.moveFile(file.name, `archive/${file.name}`);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
---
|
|
242
|
-
|
|
243
|
-
## Platform Support
|
|
244
|
-
|
|
245
|
-
### Versori Platform (Primary)
|
|
246
|
-
|
|
247
|
-
The SDK is **optimized for Versori** - a serverless integration platform.
|
|
248
|
-
|
|
249
|
-
```typescript
|
|
250
|
-
// Versori webhook (automatic context detection)
|
|
251
|
-
import { webhook } from '@versori/run';
|
|
252
|
-
import { createClient, S3DataSource, CSVParserService } from '@fluentcommerce/fc-connect-sdk';
|
|
253
|
-
|
|
254
|
-
export const inventoryIngestion = webhook(
|
|
255
|
-
's3-event',
|
|
256
|
-
async (ctx) => {
|
|
257
|
-
const { log } = ctx;
|
|
258
|
-
// SDK automatically detects Versori context
|
|
259
|
-
const client = await createClient(ctx);
|
|
260
|
-
|
|
261
|
-
const s3 = new S3DataSource({ bucket: 'inventory' }, log);
|
|
262
|
-
const parser = new CSVParserService();
|
|
263
|
-
|
|
264
|
-
// Your workflow logic here...
|
|
265
|
-
|
|
266
|
-
return { success: true };
|
|
267
|
-
}
|
|
268
|
-
);
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
**Versori Benefits:**
|
|
272
|
-
|
|
273
|
-
- ✅ No server management
|
|
274
|
-
- ✅ Built-in OAuth2 connection management
|
|
275
|
-
- ✅ Key-value storage for state
|
|
276
|
-
- ✅ Automatic scaling
|
|
277
|
-
- ✅ Webhook triggers
|
|
278
|
-
|
|
279
|
-
### Node.js / Deno (Standalone)
|
|
280
|
-
|
|
281
|
-
The SDK also works standalone in Node.js or Deno:
|
|
282
|
-
|
|
283
|
-
```typescript
|
|
284
|
-
// Node.js or Deno
|
|
285
|
-
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
286
|
-
|
|
287
|
-
const client = await createClient({
|
|
288
|
-
config: {
|
|
289
|
-
baseUrl: 'https://api.fluentcommerce.com',
|
|
290
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
291
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
292
|
-
retailerId: process.env.FLUENT_RETAILER_ID,
|
|
293
|
-
},
|
|
294
|
-
});
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
**Cross-Runtime Support:**
|
|
298
|
-
|
|
299
|
-
- ✅ Node.js ≥18.0.0
|
|
300
|
-
- ✅ Deno ≥1.30.0
|
|
301
|
-
- ✅ Versori platform
|
|
302
|
-
|
|
303
|
-
---
|
|
304
|
-
|
|
305
|
-
## Common Patterns
|
|
306
|
-
|
|
307
|
-
### Pattern 1: CSV to GraphQL Mutations
|
|
308
|
-
|
|
309
|
-
```typescript
|
|
310
|
-
import {
|
|
311
|
-
S3DataSource,
|
|
312
|
-
CSVParserService,
|
|
313
|
-
UniversalMapper,
|
|
314
|
-
createClient,
|
|
315
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
316
|
-
|
|
317
|
-
// Read CSV from S3
|
|
318
|
-
const s3 = new S3DataSource({ bucket: 'products' }, logger);
|
|
319
|
-
const parser = new CSVParserService();
|
|
320
|
-
|
|
321
|
-
const content = await s3.downloadFile('products.csv');
|
|
322
|
-
const records = await parser.parse(content);
|
|
323
|
-
|
|
324
|
-
// Map CSV fields to GraphQL input
|
|
325
|
-
const mapper = new UniversalMapper({
|
|
326
|
-
fields: {
|
|
327
|
-
ref: { source: 'sku' },
|
|
328
|
-
name: { source: 'product_name' },
|
|
329
|
-
price: { source: 'price', resolver: 'sdk.parseFloat' },
|
|
330
|
-
},
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
// Send to Fluent Commerce
|
|
334
|
-
const client = await createClient({ config });
|
|
335
|
-
|
|
336
|
-
for (const record of records) {
|
|
337
|
-
const result = await mapper.map(record);
|
|
338
|
-
if (result.success) {
|
|
339
|
-
await client.graphql({
|
|
340
|
-
query: `
|
|
341
|
-
mutation CreateProduct($input: CreateProductInput!) {
|
|
342
|
-
createProduct(input: $input) { id }
|
|
343
|
-
}
|
|
344
|
-
`,
|
|
345
|
-
variables: { input: result.data },
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
### Pattern 2: XML to GraphQL (SFCC Orders)
|
|
352
|
-
|
|
353
|
-
```typescript
|
|
354
|
-
import {
|
|
355
|
-
XMLParserService,
|
|
356
|
-
GraphQLMutationMapper,
|
|
357
|
-
createClient,
|
|
358
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
359
|
-
|
|
360
|
-
const xmlParser = new XMLParserService();
|
|
361
|
-
const orderXml = await fetchSFCCOrder();
|
|
362
|
-
|
|
363
|
-
// Parse XML
|
|
364
|
-
const orderData = await xmlParser.parse(orderXml);
|
|
365
|
-
|
|
366
|
-
// Map XML → GraphQL using schema-driven mapping
|
|
367
|
-
const mapper = new GraphQLMutationMapper(
|
|
368
|
-
{
|
|
369
|
-
mutation: {
|
|
370
|
-
name: 'createOrder',
|
|
371
|
-
operation: `mutation CreateOrder($input: CreateOrderInput!) { ... }`,
|
|
372
|
-
},
|
|
373
|
-
fields: {
|
|
374
|
-
'input.ref': { source: 'order.@order-no' },
|
|
375
|
-
'input.type': { source: 'order.@type' },
|
|
376
|
-
'input.customer.firstName': { source: 'order.customer.customer-name' },
|
|
377
|
-
},
|
|
378
|
-
},
|
|
379
|
-
client,
|
|
380
|
-
logger
|
|
381
|
-
);
|
|
382
|
-
|
|
383
|
-
const result = await mapper.map(orderData);
|
|
384
|
-
// Automatically executes GraphQL mutation
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
### Pattern 3: State Management (Prevent Duplicates)
|
|
388
|
-
|
|
389
|
-
```typescript
|
|
390
|
-
import { StateService, VersoriKVAdapter } from '@fluentcommerce/fc-connect-sdk';
|
|
391
|
-
|
|
392
|
-
// In Versori
|
|
393
|
-
const kvAdapter = new VersoriKVAdapter(openKv());
|
|
394
|
-
const stateService = new StateService(kvAdapter);
|
|
395
|
-
|
|
396
|
-
// Check if file already processed
|
|
397
|
-
const fileKey = 'inventory-2024-01-15.csv';
|
|
398
|
-
const processed = await stateService.isFileProcessed(fileKey);
|
|
399
|
-
|
|
400
|
-
if (!processed) {
|
|
401
|
-
// Process file...
|
|
402
|
-
await processFile(fileKey);
|
|
403
|
-
|
|
404
|
-
// Mark as processed
|
|
405
|
-
await stateService.markFileProcessed(fileKey, {
|
|
406
|
-
processedAt: new Date().toISOString(),
|
|
407
|
-
recordCount: 1000,
|
|
408
|
-
});
|
|
409
|
-
}
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
### Pattern 4: Parquet to Batch API (High-Volume Inventory)
|
|
413
|
-
|
|
414
|
-
```typescript
|
|
415
|
-
import { S3DataSource, ParquetParserService, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
416
|
-
|
|
417
|
-
const s3 = new S3DataSource({ bucket: 'inventory' }, logger);
|
|
418
|
-
const parser = new ParquetParserService(logger);
|
|
419
|
-
const client = await createClient({ config });
|
|
420
|
-
|
|
421
|
-
// Read Parquet (compressed columnar format)
|
|
422
|
-
const buffer = await s3.downloadFile('inventory.parquet');
|
|
423
|
-
const records = await parser.parse(buffer);
|
|
424
|
-
|
|
425
|
-
// Create Batch API job (INVENTORY only)
|
|
426
|
-
const job = await client.createJob({
|
|
427
|
-
name: 'Inventory Update',
|
|
428
|
-
retailerId: '1',
|
|
429
|
-
});
|
|
430
|
-
|
|
431
|
-
// Send in batches of 1000
|
|
432
|
-
const batches = chunkArray(records, 1000);
|
|
433
|
-
for (const batch of batches) {
|
|
434
|
-
await client.sendBatch(job.id, {
|
|
435
|
-
action: 'UPSERT',
|
|
436
|
-
entityType: 'INVENTORY',
|
|
437
|
-
entities: batch,
|
|
438
|
-
});
|
|
439
|
-
}
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
---
|
|
443
|
-
|
|
444
|
-
## Special Case: Inventory Ingestion
|
|
445
|
-
|
|
446
|
-
### Why Inventory is Different
|
|
447
|
-
|
|
448
|
-
**Fluent Commerce has a specialized Batch API for inventory:**
|
|
449
|
-
|
|
450
|
-
- ⚡ High-volume optimization (millions of records)
|
|
451
|
-
- 📦 Job + Batches pattern
|
|
452
|
-
- ⚠️ **ONLY works for INVENTORY entity**
|
|
453
|
-
- 🚫 NOT for products, orders, locations, etc.
|
|
454
|
-
|
|
455
|
-
### Use Building Blocks (Full Control)
|
|
456
|
-
|
|
457
|
-
```typescript
|
|
458
|
-
import {
|
|
459
|
-
S3DataSource,
|
|
460
|
-
CSVParserService,
|
|
461
|
-
UniversalMapper,
|
|
462
|
-
createClient,
|
|
463
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
464
|
-
|
|
465
|
-
const s3 = new S3DataSource(config, logger);
|
|
466
|
-
const parser = new CSVParserService();
|
|
467
|
-
const mapper = new UniversalMapper(mappingConfig);
|
|
468
|
-
const client = await createClient({ config: clientConfig });
|
|
469
|
-
|
|
470
|
-
const files = await s3.listFiles('inventory/');
|
|
471
|
-
|
|
472
|
-
for (const file of files) {
|
|
473
|
-
const content = await s3.downloadFile(file.name);
|
|
474
|
-
const records = await parser.parse(content);
|
|
475
|
-
|
|
476
|
-
// Map records
|
|
477
|
-
const inventory = [];
|
|
478
|
-
for (const record of records) {
|
|
479
|
-
const result = await mapper.map(record);
|
|
480
|
-
if (result.success) inventory.push(result.data);
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
// Create job (INVENTORY only)
|
|
484
|
-
const job = await client.createJob({
|
|
485
|
-
name: `Inventory - ${file.name}`,
|
|
486
|
-
retailerId: '1',
|
|
487
|
-
entity: 'INVENTORY',
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
// Send batches
|
|
491
|
-
const batches = chunkArray(inventory, 1000);
|
|
492
|
-
for (const batch of batches) {
|
|
493
|
-
await client.sendBatch(job.id, {
|
|
494
|
-
action: 'UPSERT',
|
|
495
|
-
entityType: 'INVENTORY',
|
|
496
|
-
entities: batch,
|
|
497
|
-
});
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
await s3.moveFile(file.name, `archive/${file.name}`);
|
|
501
|
-
}
|
|
502
|
-
```
|
|
503
|
-
|
|
504
|
-
### For ALL Entities
|
|
505
|
-
|
|
506
|
-
**All entities (Products, Locations, Orders, Customers, Fulfillments, Inventory, etc.) can use:**
|
|
507
|
-
|
|
508
|
-
**GraphQL Mutations** (recommended for flexibility):
|
|
509
|
-
```typescript
|
|
510
|
-
for (const entity of entities) {
|
|
511
|
-
await client.graphql({
|
|
512
|
-
query: `
|
|
513
|
-
mutation CreateEntity($input: CreateEntityInput!) {
|
|
514
|
-
createEntity(input: $input) {
|
|
515
|
-
id
|
|
516
|
-
ref
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
`,
|
|
520
|
-
variables: { input: entity },
|
|
521
|
-
});
|
|
522
|
-
}
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
**Batch API** (for high-volume inventory only):
|
|
526
|
-
```typescript
|
|
527
|
-
// Create job
|
|
528
|
-
const job = await client.createJob({
|
|
529
|
-
name: 'Inventory Update',
|
|
530
|
-
retailerId: '1',
|
|
531
|
-
});
|
|
532
|
-
|
|
533
|
-
// Send in batches
|
|
534
|
-
const batches = chunkArray(records, 1000);
|
|
535
|
-
for (const batch of batches) {
|
|
536
|
-
await client.sendBatch(job.id, {
|
|
537
|
-
action: 'UPSERT',
|
|
538
|
-
entityType: 'INVENTORY',
|
|
539
|
-
entities: batch,
|
|
540
|
-
});
|
|
541
|
-
}
|
|
542
|
-
```
|
|
543
|
-
|
|
544
|
-
---
|
|
545
|
-
|
|
546
|
-
## SDK Architecture Diagram
|
|
547
|
-
|
|
548
|
-
### High-Level Architecture
|
|
549
|
-
|
|
550
|
-
```mermaid
|
|
551
|
-
graph TB
|
|
552
|
-
subgraph app["YOUR APPLICATION<br/>(Custom Workflow Logic)"]
|
|
553
|
-
workflow["When to run: webhook/cron/manual<br/>What to process: files/entities<br/>How to execute: GraphQL/Batch/Events<br/>Error handling: retry/skip/alert<br/>Business rules: validation/filtering"]
|
|
554
|
-
end
|
|
555
|
-
|
|
556
|
-
subgraph sdk["SDK BUILDING BLOCKS<br/>(Services with Methods)"]
|
|
557
|
-
direction TB
|
|
558
|
-
|
|
559
|
-
subgraph data["Data Layer"]
|
|
560
|
-
sources["Data Sources<br/>• S3DataSource<br/>• SftpDataSource<br/>• InventoryDataSource"]
|
|
561
|
-
parsers["Parsers<br/>• CSVParserService<br/>• JSONParserService<br/>• XMLParserService<br/>• ParquetParserService"]
|
|
562
|
-
end
|
|
563
|
-
|
|
564
|
-
subgraph transform["Transformation Layer"]
|
|
565
|
-
mapper["UniversalMapper<br/>(Field Mapping)"]
|
|
566
|
-
gqlmapper["GraphQLMutationMapper<br/>(XML/JSON → GraphQL)"]
|
|
567
|
-
end
|
|
568
|
-
|
|
569
|
-
subgraph client["API Client Layer"]
|
|
570
|
-
api["FluentClient<br/>• graphql()<br/>• sendEvent()<br/>• createJob()<br/>• sendBatch()"]
|
|
571
|
-
end
|
|
572
|
-
|
|
573
|
-
subgraph support["Support Services"]
|
|
574
|
-
state["StateService<br/>(Prevent duplicates)"]
|
|
575
|
-
logging["createConsoleLogger<br/>toStructuredLogger<br/>createWorkflowLogger<br/>(Function-based logging)"]
|
|
576
|
-
end
|
|
577
|
-
|
|
578
|
-
subgraph orch["OPTIONAL: Orchestrators"]
|
|
579
|
-
exorch["ExtractionOrchestrator<br/>(Extraction with auto-pagination)"]
|
|
580
|
-
end
|
|
581
|
-
end
|
|
582
|
-
|
|
583
|
-
subgraph platforms["PLATFORM SUPPORT"]
|
|
584
|
-
versori["Versori<br/>(Primary)"]
|
|
585
|
-
nodejs["Node.js<br/>≥18.0.0"]
|
|
586
|
-
deno["Deno<br/>≥1.30.0"]
|
|
587
|
-
end
|
|
588
|
-
|
|
589
|
-
workflow --> sdk
|
|
590
|
-
sdk --> platforms
|
|
591
|
-
|
|
592
|
-
style app fill:#e1f5ff
|
|
593
|
-
style sdk fill:#fff4e6
|
|
594
|
-
style platforms fill:#f0f0f0
|
|
595
|
-
style orch fill:#ffe6e6
|
|
596
|
-
```
|
|
597
|
-
|
|
598
|
-
### Data Flow Patterns
|
|
599
|
-
|
|
600
|
-
```mermaid
|
|
601
|
-
graph LR
|
|
602
|
-
subgraph pattern1["Pattern 1: CSV to GraphQL"]
|
|
603
|
-
s3_1["S3 CSV File"]
|
|
604
|
-
parse_1["CSVParserService"]
|
|
605
|
-
map_1["UniversalMapper"]
|
|
606
|
-
gql_1["client.graphql()"]
|
|
607
|
-
fluent_1["Fluent Commerce"]
|
|
608
|
-
|
|
609
|
-
s3_1 --> parse_1
|
|
610
|
-
parse_1 --> map_1
|
|
611
|
-
map_1 --> gql_1
|
|
612
|
-
gql_1 --> fluent_1
|
|
613
|
-
end
|
|
614
|
-
|
|
615
|
-
subgraph pattern2["Pattern 2: XML to GraphQL (SFCC)"]
|
|
616
|
-
xml_2["SFCC XML"]
|
|
617
|
-
parse_2["XMLParserService"]
|
|
618
|
-
map_2["GraphQLMutationMapper"]
|
|
619
|
-
auto_2["Auto-executes<br/>mutation"]
|
|
620
|
-
fluent_2["Fluent Commerce"]
|
|
621
|
-
|
|
622
|
-
xml_2 --> parse_2
|
|
623
|
-
parse_2 --> map_2
|
|
624
|
-
map_2 --> auto_2
|
|
625
|
-
auto_2 --> fluent_2
|
|
626
|
-
end
|
|
627
|
-
|
|
628
|
-
subgraph pattern3["Pattern 3: Inventory (Batch API)"]
|
|
629
|
-
parquet_3["Parquet File"]
|
|
630
|
-
parse_3["ParquetParser"]
|
|
631
|
-
job_3["createJob()"]
|
|
632
|
-
batch_3["sendBatch()"]
|
|
633
|
-
fluent_3["Fluent Commerce<br/>(INVENTORY only)"]
|
|
634
|
-
|
|
635
|
-
parquet_3 --> parse_3
|
|
636
|
-
parse_3 --> job_3
|
|
637
|
-
job_3 --> batch_3
|
|
638
|
-
batch_3 --> fluent_3
|
|
639
|
-
end
|
|
640
|
-
|
|
641
|
-
style pattern1 fill:#e8f5e9
|
|
642
|
-
style pattern2 fill:#e3f2fd
|
|
643
|
-
style pattern3 fill:#fff3e0
|
|
644
|
-
```
|
|
645
|
-
|
|
646
|
-
---
|
|
647
|
-
|
|
648
|
-
## Guidelines
|
|
649
|
-
|
|
650
|
-
### ✅ SDK Provides
|
|
651
|
-
|
|
652
|
-
- **Services**: Classes with methods (composable building blocks)
|
|
653
|
-
- **Methods**: Async functions returning Promises
|
|
654
|
-
- **Types**: Complete TypeScript type definitions
|
|
655
|
-
- **Utilities**: Helper functions and adapters
|
|
656
|
-
- **Platform adapters**: Versori KV, S3 presign, etc.
|
|
657
|
-
- **Cross-runtime support**: Node.js, Deno, Versori
|
|
658
|
-
|
|
659
|
-
### ❌ SDK Does NOT Provide
|
|
660
|
-
|
|
661
|
-
- **Workflow orchestration** (except optional inventory orchestrators)
|
|
662
|
-
- **Opinionated patterns** (you decide the flow)
|
|
663
|
-
- **Business logic** (you implement validation, filtering, etc.)
|
|
664
|
-
- **Execution schedules** (use Versori webhooks, cron, etc.)
|
|
665
|
-
- **UI/Dashboard** (use Versori platform or build your own)
|
|
666
|
-
|
|
667
|
-
---
|
|
668
|
-
|
|
669
|
-
## Decision Guide
|
|
670
|
-
|
|
671
|
-
```mermaid
|
|
672
|
-
graph TD
|
|
673
|
-
start["What are you building?"]
|
|
674
|
-
approach["Choose SDK Approach"]
|
|
675
|
-
|
|
676
|
-
start --> approach
|
|
677
|
-
|
|
678
|
-
approach --> building_blocks["✅ Use Building Blocks<br/>(Recommended)"]
|
|
679
|
-
|
|
680
|
-
building_blocks --> bb_benefits["Benefits:<br/>• Full control<br/>• Better testability<br/>• Easier debugging<br/>• Complex workflows<br/>• Multi-system integration<br/>• Works for ALL entities"]
|
|
681
|
-
|
|
682
|
-
style building_blocks fill:#c8e6c9,stroke:#4caf50,stroke-width:3px
|
|
683
|
-
```
|
|
684
|
-
|
|
685
|
-
### Use Building Blocks (Recommended):
|
|
686
|
-
|
|
687
|
-
- ✅ Works for **ALL** entities (Inventory, Products, Orders, Locations, etc.)
|
|
688
|
-
- ✅ Custom workflow logic
|
|
689
|
-
- ✅ Multi-step processes (validate → transform → enrich → send)
|
|
690
|
-
- ✅ Integration with multiple systems
|
|
691
|
-
- ✅ Production connectors (recommended for maintainability)
|
|
692
|
-
- ✅ Full control over error handling and retries
|
|
693
|
-
- ✅ Complex business rules or data validation
|
|
694
|
-
- ✅ Better testability and debugging
|
|
695
|
-
|
|
696
|
-
### Recommendation:
|
|
697
|
-
|
|
698
|
-
**Always use building blocks for production connectors.** They provide:
|
|
699
|
-
|
|
700
|
-
- Better testability
|
|
701
|
-
- Easier debugging
|
|
702
|
-
- Full control over execution
|
|
703
|
-
- Better error handling
|
|
704
|
-
- Easier to maintain and extend
|
|
705
|
-
- Works consistently across all entity types
|
|
706
|
-
|
|
707
|
-
---
|
|
708
|
-
|
|
709
|
-
## Documentation
|
|
710
|
-
|
|
711
|
-
The SDK documentation follows the same philosophy - **modular building blocks you can navigate however you want**.
|
|
712
|
-
|
|
713
|
-
### Modular Documentation Structure
|
|
714
|
-
|
|
715
|
-
```
|
|
716
|
-
docs/
|
|
717
|
-
├── 00-START-HERE/ # Essential docs - read first
|
|
718
|
-
├── 01-TEMPLATES/ # Complete working examples
|
|
719
|
-
├── 02-CORE-GUIDES/ # Progressive learning paths
|
|
720
|
-
│ ├── api-reference/ # Complete API documentation (13 modules)
|
|
721
|
-
│ ├── ingestion/ # Data into Fluent
|
|
722
|
-
│ ├── extraction/ # Data from Fluent
|
|
723
|
-
│ ├── auto-pagination/ # Cursor pagination guide
|
|
724
|
-
│ ├── data-sources/ # S3, SFTP guides
|
|
725
|
-
│ ├── parsers/ # CSV, JSON, XML, Parquet
|
|
726
|
-
│ ├── webhook-validation/# Webhook security
|
|
727
|
-
│ └── mapping/ # Field transformation
|
|
728
|
-
├── 03-PATTERN-GUIDES/ # Reusable patterns
|
|
729
|
-
└── 04-REFERENCE/ # Deep dives & platform docs
|
|
730
|
-
├── architecture/ # System design
|
|
731
|
-
├── testing/ # Test utilities
|
|
732
|
-
├── platforms/versori/ # Versori integration
|
|
733
|
-
└── resolver-signature/# Resolver details
|
|
734
|
-
```
|
|
735
|
-
|
|
736
|
-
### Navigate by Your Needs
|
|
737
|
-
|
|
738
|
-
**Learning Path** (Beginner → Advanced):
|
|
739
|
-
|
|
740
|
-
1. [Client API](../02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md) - Create clients, basic operations
|
|
741
|
-
2. [Parsers](../02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md) - CSV, JSON, XML, Parquet
|
|
742
|
-
3. [Data Sources](../02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md) - S3, SFTP integration
|
|
743
|
-
4. [Services](../02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md) - UniversalMapper, StateService
|
|
744
|
-
5. [Extraction](../02-CORE-GUIDES/extraction/extraction-readme.md) - ExtractionOrchestrator for data export
|
|
745
|
-
|
|
746
|
-
**Quick Reference**: [One-page API cheat sheet](../02-CORE-GUIDES/api-reference/api-reference-quick-reference.md)
|
|
747
|
-
|
|
748
|
-
**By Use Case**: See [API Reference](../02-CORE-GUIDES/api-reference/api-reference-readme.md) or [Getting Started](./getting-started.md)
|
|
749
|
-
|
|
750
|
-
**Just like the SDK provides services you compose, the documentation provides modules you navigate however you need!**
|
|
751
|
-
|
|
752
|
-
---
|
|
753
|
-
|
|
754
|
-
## Summary
|
|
755
|
-
|
|
756
|
-
**The SDK Philosophy in 3 Points:**
|
|
757
|
-
|
|
758
|
-
1. **Provide Building Blocks** - Services with methods you can compose
|
|
759
|
-
2. **You Control the Workflow** - Decide how to use them
|
|
760
|
-
3. **Platform Flexibility** - Works on Versori, Node.js, and Deno
|
|
761
|
-
|
|
762
|
-
**Example:**
|
|
763
|
-
|
|
764
|
-
```typescript
|
|
765
|
-
// SDK gives you these tools:
|
|
766
|
-
const client = await createClient({ config });
|
|
767
|
-
const s3 = new S3DataSource({ bucket: 'data' }, logger);
|
|
768
|
-
const parser = new CSVParserService();
|
|
769
|
-
const mapper = new UniversalMapper(mappingConfig);
|
|
770
|
-
|
|
771
|
-
// YOU build the workflow:
|
|
772
|
-
async function myWorkflow() {
|
|
773
|
-
const files = await s3.listFiles(); // SDK method
|
|
774
|
-
const content = await s3.downloadFile(file); // SDK method
|
|
775
|
-
const records = await parser.parse(content); // SDK method
|
|
776
|
-
|
|
777
|
-
// Map records
|
|
778
|
-
const mapped = [];
|
|
779
|
-
for (const record of records) {
|
|
780
|
-
const result = await mapper.map(record); // SDK method
|
|
781
|
-
if (result.success) mapped.push(result.data);
|
|
782
|
-
}
|
|
783
|
-
|
|
784
|
-
// YOUR CUSTOM LOGIC HERE
|
|
785
|
-
for (const record of mapped) {
|
|
786
|
-
await client.graphql({ query: /* ... */, variables: /* ... */ }); // SDK method
|
|
787
|
-
// or Batch API, or Events, or external API, or Database, or Whatever!
|
|
788
|
-
}
|
|
789
|
-
|
|
790
|
-
await s3.moveFile(file, `archive/${file}`); // SDK method
|
|
791
|
-
}
|
|
792
|
-
```
|
|
793
|
-
|
|
794
|
-
**As long as the SDK provides the services with methods, developers can build anything!**
|
|
1
|
+
# SDK Philosophy & Architecture
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
1. [Core Principle](#core-principle)
|
|
6
|
+
2. [What the SDK Provides](#what-the-sdk-provides)
|
|
7
|
+
3. [What YOU Build](#what-you-build)
|
|
8
|
+
4. [Platform Support](#platform-support)
|
|
9
|
+
5. [Common Patterns](#common-patterns)
|
|
10
|
+
6. [Special Case: Inventory Ingestion](#special-case-inventory-ingestion)
|
|
11
|
+
7. [SDK Architecture Diagram](#sdk-architecture-diagram)
|
|
12
|
+
8. [Guidelines](#guidelines)
|
|
13
|
+
9. [Decision Guide](#decision-guide)
|
|
14
|
+
10. [Documentation](#documentation)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Core Principle
|
|
19
|
+
|
|
20
|
+
> **The SDK provides services with methods. YOU build the workflow.**
|
|
21
|
+
|
|
22
|
+
The SDK is **NOT** an opinionated framework. It's a **toolkit of composable services** that you combine however you want.
|
|
23
|
+
|
|
24
|
+
**Key Philosophy:**
|
|
25
|
+
|
|
26
|
+
- ✅ Provide building blocks (services, parsers, mappers)
|
|
27
|
+
- ✅ Let developers compose them into custom workflows
|
|
28
|
+
- ✅ Support multiple runtimes (Node.js, Deno, Versori)
|
|
29
|
+
- ✅ No imposed patterns or opinions
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## What the SDK Provides
|
|
34
|
+
|
|
35
|
+
### 1. Core Services (Building Blocks)
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// ============================================
|
|
39
|
+
// CLIENT & AUTHENTICATION
|
|
40
|
+
// ============================================
|
|
41
|
+
|
|
42
|
+
createClient(); // Universal client factory (auto-detects context)
|
|
43
|
+
FluentClient; // Standalone Node.js/Deno client (OAuth2)
|
|
44
|
+
FluentVersoriClient; // Versori platform client (connection-based)
|
|
45
|
+
|
|
46
|
+
// ============================================
|
|
47
|
+
// DATA SOURCES
|
|
48
|
+
// ============================================
|
|
49
|
+
|
|
50
|
+
S3DataSource; // Read/write S3 (streaming support)
|
|
51
|
+
SftpDataSource; // SFTP file operations
|
|
52
|
+
InventoryDataSource; // Base class for custom sources
|
|
53
|
+
|
|
54
|
+
// ============================================
|
|
55
|
+
// PARSERS
|
|
56
|
+
// ============================================
|
|
57
|
+
|
|
58
|
+
CSVParserService; // CSV with validation
|
|
59
|
+
JSONParserService; // JSON with streaming
|
|
60
|
+
XMLParserService; // XML with XPath-like selectors
|
|
61
|
+
ParquetParserService; // Parquet columnar format
|
|
62
|
+
|
|
63
|
+
// ============================================
|
|
64
|
+
// TRANSFORMATION & MAPPING
|
|
65
|
+
// ============================================
|
|
66
|
+
|
|
67
|
+
UniversalMapper; // Field mapping for ALL transformations
|
|
68
|
+
GraphQLMutationMapper; // XML/JSON → GraphQL mutations (schema-driven)
|
|
69
|
+
|
|
70
|
+
// ============================================
|
|
71
|
+
// ORCHESTRATORS (Optional)
|
|
72
|
+
// ============================================
|
|
73
|
+
|
|
74
|
+
ExtractionOrchestrator; // High-level extraction with auto-pagination
|
|
75
|
+
|
|
76
|
+
// ============================================
|
|
77
|
+
// BATCH & JOB MANAGEMENT
|
|
78
|
+
// ============================================
|
|
79
|
+
|
|
80
|
+
FluentBatchManager; // Batch operation orchestration
|
|
81
|
+
PartialBatchRecovery; // Handle partial batch failures gracefully
|
|
82
|
+
JobTracker; // Job lifecycle and state tracking
|
|
83
|
+
|
|
84
|
+
// ============================================
|
|
85
|
+
// VALIDATION SERVICES
|
|
86
|
+
// ============================================
|
|
87
|
+
|
|
88
|
+
PreflightValidator; // Pre-execution validation for connectors
|
|
89
|
+
SchemaValidationService; // Dynamic schema validation
|
|
90
|
+
WebhookValidationService; // Webhook signature validation
|
|
91
|
+
|
|
92
|
+
// ============================================
|
|
93
|
+
// STATE & UTILITIES
|
|
94
|
+
// ============================================
|
|
95
|
+
|
|
96
|
+
StateService; // Track processed files, prevent duplicates
|
|
97
|
+
createConsoleLogger; // Simple console logger
|
|
98
|
+
toStructuredLogger; // Add context to logger
|
|
99
|
+
createWorkflowLogger; // Pre-configured workflow logger
|
|
100
|
+
createServiceLogger; // Pre-configured service logger
|
|
101
|
+
VersoriKVAdapter; // Versori key-value storage adapter
|
|
102
|
+
S3PresignService; // S3 presigned URL generation
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 2. Key Methods on Each Service
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// Client operations
|
|
109
|
+
client.graphql({ query, variables }); // ONE method for BOTH queries and mutations
|
|
110
|
+
client.sendEvent(event, mode);
|
|
111
|
+
client.createJob(jobConfig);
|
|
112
|
+
client.sendBatch(jobId, batchData);
|
|
113
|
+
client.getBatchStatus(jobId, batchId);
|
|
114
|
+
client.validateWebhook(payload, options); // Webhook signature validation
|
|
115
|
+
|
|
116
|
+
// Data sources
|
|
117
|
+
dataSource.listFiles({ prefix });
|
|
118
|
+
dataSource.downloadFile(key);
|
|
119
|
+
dataSource.uploadFile(key);
|
|
120
|
+
dataSource.streamFile(key);
|
|
121
|
+
|
|
122
|
+
// Parsers
|
|
123
|
+
parser.parse(content);
|
|
124
|
+
parser.parseStream(stream, options);
|
|
125
|
+
|
|
126
|
+
// Mapping
|
|
127
|
+
mapper.map(sourceData); // Returns { success, data, errors }
|
|
128
|
+
|
|
129
|
+
// State management
|
|
130
|
+
stateService.isFileProcessed(key);
|
|
131
|
+
stateService.markFileProcessed(key, metadata);
|
|
132
|
+
stateService.getCheckpoint(key);
|
|
133
|
+
stateService.setCheckpoint(key, value);
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**That's it. The SDK provides services with methods. YOU decide how to use them.**
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## What YOU Build
|
|
141
|
+
|
|
142
|
+
### Your Application/Connector Logic
|
|
143
|
+
|
|
144
|
+
You control:
|
|
145
|
+
|
|
146
|
+
- ✅ **Which services to use** (S3 or SFTP? CSV or Parquet?)
|
|
147
|
+
- ✅ **Execution order** (parse first or download first?)
|
|
148
|
+
- ✅ **API choice** (GraphQL mutations, Batch API, or Events?)
|
|
149
|
+
- ✅ **Error handling** (retry? skip? log?)
|
|
150
|
+
- ✅ **Business rules** (filter records? validate data?)
|
|
151
|
+
- ✅ **File management** (archive? delete? rename?)
|
|
152
|
+
|
|
153
|
+
### Example: Custom Workflow
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
import {
|
|
157
|
+
createClient,
|
|
158
|
+
S3DataSource,
|
|
159
|
+
CSVParserService,
|
|
160
|
+
UniversalMapper,
|
|
161
|
+
StateService,
|
|
162
|
+
VersoriKVAdapter,
|
|
163
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
164
|
+
|
|
165
|
+
async function myCustomWorkflow() {
|
|
166
|
+
// 1. Initialize SDK services
|
|
167
|
+
const client = await createClient({
|
|
168
|
+
config: {
|
|
169
|
+
baseUrl: 'https://api.fluentcommerce.com',
|
|
170
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
171
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
172
|
+
retailerId: '1',
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const s3 = new S3DataSource(
|
|
177
|
+
{
|
|
178
|
+
type: 'S3_CSV',
|
|
179
|
+
s3Config: {
|
|
180
|
+
bucket: 'my-inventory-bucket',
|
|
181
|
+
region: 'us-east-1',
|
|
182
|
+
accessKeyId,
|
|
183
|
+
secretAccessKey,
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
logger
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
const parser = new CSVParserService();
|
|
190
|
+
|
|
191
|
+
const mapper = new UniversalMapper({
|
|
192
|
+
fields: {
|
|
193
|
+
ref: { source: 'product_id', required: true },
|
|
194
|
+
type: { source: 'product_type', resolver: 'sdk.uppercase' },
|
|
195
|
+
qty: { source: 'quantity', resolver: 'sdk.parseInt' },
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// 2. YOUR CUSTOM LOGIC: List and filter files
|
|
200
|
+
const files = await s3.listFiles('inbound/');
|
|
201
|
+
const csvFiles = files.filter(f => f.name.endsWith('.csv'));
|
|
202
|
+
|
|
203
|
+
// 3. YOUR CUSTOM LOGIC: Process each file
|
|
204
|
+
for (const file of csvFiles) {
|
|
205
|
+
const content = await s3.downloadFile(file.name);
|
|
206
|
+
const records = await parser.parse(content);
|
|
207
|
+
|
|
208
|
+
// 4. YOUR CUSTOM LOGIC: Transform and validate
|
|
209
|
+
const validRecords = [];
|
|
210
|
+
for (const record of records) {
|
|
211
|
+
const result = await mapper.map(record);
|
|
212
|
+
|
|
213
|
+
if (result.success) {
|
|
214
|
+
validRecords.push(result.data);
|
|
215
|
+
} else {
|
|
216
|
+
logger.warn(`Skipping invalid record: ${result.errors}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// 5. YOUR CUSTOM LOGIC: Send to Fluent Commerce
|
|
221
|
+
for (const record of validRecords) {
|
|
222
|
+
await client.graphql({
|
|
223
|
+
query: `
|
|
224
|
+
mutation CreateProduct($input: CreateProductInput!) {
|
|
225
|
+
createProduct(input: $input) {
|
|
226
|
+
id
|
|
227
|
+
ref
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
`,
|
|
231
|
+
variables: { input: record },
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// 6. YOUR CUSTOM LOGIC: Archive processed file
|
|
236
|
+
await s3.moveFile(file.name, `archive/${file.name}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Platform Support
|
|
244
|
+
|
|
245
|
+
### Versori Platform (Primary)
|
|
246
|
+
|
|
247
|
+
The SDK is **optimized for Versori** - a serverless integration platform.
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
// Versori webhook (automatic context detection)
|
|
251
|
+
import { webhook } from '@versori/run';
|
|
252
|
+
import { createClient, S3DataSource, CSVParserService } from '@fluentcommerce/fc-connect-sdk';
|
|
253
|
+
|
|
254
|
+
export const inventoryIngestion = webhook(
|
|
255
|
+
's3-event',
|
|
256
|
+
async (ctx) => {
|
|
257
|
+
const { log } = ctx;
|
|
258
|
+
// SDK automatically detects Versori context
|
|
259
|
+
const client = await createClient(ctx);
|
|
260
|
+
|
|
261
|
+
const s3 = new S3DataSource({ bucket: 'inventory' }, log);
|
|
262
|
+
const parser = new CSVParserService();
|
|
263
|
+
|
|
264
|
+
// Your workflow logic here...
|
|
265
|
+
|
|
266
|
+
return { success: true };
|
|
267
|
+
}
|
|
268
|
+
);
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**Versori Benefits:**
|
|
272
|
+
|
|
273
|
+
- ✅ No server management
|
|
274
|
+
- ✅ Built-in OAuth2 connection management
|
|
275
|
+
- ✅ Key-value storage for state
|
|
276
|
+
- ✅ Automatic scaling
|
|
277
|
+
- ✅ Webhook triggers
|
|
278
|
+
|
|
279
|
+
### Node.js / Deno (Standalone)
|
|
280
|
+
|
|
281
|
+
The SDK also works standalone in Node.js or Deno:
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
// Node.js or Deno
|
|
285
|
+
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
286
|
+
|
|
287
|
+
const client = await createClient({
|
|
288
|
+
config: {
|
|
289
|
+
baseUrl: 'https://api.fluentcommerce.com',
|
|
290
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
291
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
292
|
+
retailerId: process.env.FLUENT_RETAILER_ID,
|
|
293
|
+
},
|
|
294
|
+
});
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**Cross-Runtime Support:**
|
|
298
|
+
|
|
299
|
+
- ✅ Node.js ≥18.0.0
|
|
300
|
+
- ✅ Deno ≥1.30.0
|
|
301
|
+
- ✅ Versori platform
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## Common Patterns
|
|
306
|
+
|
|
307
|
+
### Pattern 1: CSV to GraphQL Mutations
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
import {
|
|
311
|
+
S3DataSource,
|
|
312
|
+
CSVParserService,
|
|
313
|
+
UniversalMapper,
|
|
314
|
+
createClient,
|
|
315
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
316
|
+
|
|
317
|
+
// Read CSV from S3
|
|
318
|
+
const s3 = new S3DataSource({ bucket: 'products' }, logger);
|
|
319
|
+
const parser = new CSVParserService();
|
|
320
|
+
|
|
321
|
+
const content = await s3.downloadFile('products.csv');
|
|
322
|
+
const records = await parser.parse(content);
|
|
323
|
+
|
|
324
|
+
// Map CSV fields to GraphQL input
|
|
325
|
+
const mapper = new UniversalMapper({
|
|
326
|
+
fields: {
|
|
327
|
+
ref: { source: 'sku' },
|
|
328
|
+
name: { source: 'product_name' },
|
|
329
|
+
price: { source: 'price', resolver: 'sdk.parseFloat' },
|
|
330
|
+
},
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
// Send to Fluent Commerce
|
|
334
|
+
const client = await createClient({ config });
|
|
335
|
+
|
|
336
|
+
for (const record of records) {
|
|
337
|
+
const result = await mapper.map(record);
|
|
338
|
+
if (result.success) {
|
|
339
|
+
await client.graphql({
|
|
340
|
+
query: `
|
|
341
|
+
mutation CreateProduct($input: CreateProductInput!) {
|
|
342
|
+
createProduct(input: $input) { id }
|
|
343
|
+
}
|
|
344
|
+
`,
|
|
345
|
+
variables: { input: result.data },
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### Pattern 2: XML to GraphQL (SFCC Orders)
|
|
352
|
+
|
|
353
|
+
```typescript
|
|
354
|
+
import {
|
|
355
|
+
XMLParserService,
|
|
356
|
+
GraphQLMutationMapper,
|
|
357
|
+
createClient,
|
|
358
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
359
|
+
|
|
360
|
+
const xmlParser = new XMLParserService();
|
|
361
|
+
const orderXml = await fetchSFCCOrder();
|
|
362
|
+
|
|
363
|
+
// Parse XML
|
|
364
|
+
const orderData = await xmlParser.parse(orderXml);
|
|
365
|
+
|
|
366
|
+
// Map XML → GraphQL using schema-driven mapping
|
|
367
|
+
const mapper = new GraphQLMutationMapper(
|
|
368
|
+
{
|
|
369
|
+
mutation: {
|
|
370
|
+
name: 'createOrder',
|
|
371
|
+
operation: `mutation CreateOrder($input: CreateOrderInput!) { ... }`,
|
|
372
|
+
},
|
|
373
|
+
fields: {
|
|
374
|
+
'input.ref': { source: 'order.@order-no' },
|
|
375
|
+
'input.type': { source: 'order.@type' },
|
|
376
|
+
'input.customer.firstName': { source: 'order.customer.customer-name' },
|
|
377
|
+
},
|
|
378
|
+
},
|
|
379
|
+
client,
|
|
380
|
+
logger
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
const result = await mapper.map(orderData);
|
|
384
|
+
// Automatically executes GraphQL mutation
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### Pattern 3: State Management (Prevent Duplicates)
|
|
388
|
+
|
|
389
|
+
```typescript
|
|
390
|
+
import { StateService, VersoriKVAdapter } from '@fluentcommerce/fc-connect-sdk';
|
|
391
|
+
|
|
392
|
+
// In Versori
|
|
393
|
+
const kvAdapter = new VersoriKVAdapter(openKv());
|
|
394
|
+
const stateService = new StateService(kvAdapter);
|
|
395
|
+
|
|
396
|
+
// Check if file already processed
|
|
397
|
+
const fileKey = 'inventory-2024-01-15.csv';
|
|
398
|
+
const processed = await stateService.isFileProcessed(fileKey);
|
|
399
|
+
|
|
400
|
+
if (!processed) {
|
|
401
|
+
// Process file...
|
|
402
|
+
await processFile(fileKey);
|
|
403
|
+
|
|
404
|
+
// Mark as processed
|
|
405
|
+
await stateService.markFileProcessed(fileKey, {
|
|
406
|
+
processedAt: new Date().toISOString(),
|
|
407
|
+
recordCount: 1000,
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### Pattern 4: Parquet to Batch API (High-Volume Inventory)
|
|
413
|
+
|
|
414
|
+
```typescript
|
|
415
|
+
import { S3DataSource, ParquetParserService, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
416
|
+
|
|
417
|
+
const s3 = new S3DataSource({ bucket: 'inventory' }, logger);
|
|
418
|
+
const parser = new ParquetParserService(logger);
|
|
419
|
+
const client = await createClient({ config });
|
|
420
|
+
|
|
421
|
+
// Read Parquet (compressed columnar format)
|
|
422
|
+
const buffer = await s3.downloadFile('inventory.parquet');
|
|
423
|
+
const records = await parser.parse(buffer);
|
|
424
|
+
|
|
425
|
+
// Create Batch API job (INVENTORY only)
|
|
426
|
+
const job = await client.createJob({
|
|
427
|
+
name: 'Inventory Update',
|
|
428
|
+
retailerId: '1',
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
// Send in batches of 1000
|
|
432
|
+
const batches = chunkArray(records, 1000);
|
|
433
|
+
for (const batch of batches) {
|
|
434
|
+
await client.sendBatch(job.id, {
|
|
435
|
+
action: 'UPSERT',
|
|
436
|
+
entityType: 'INVENTORY',
|
|
437
|
+
entities: batch,
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
---
|
|
443
|
+
|
|
444
|
+
## Special Case: Inventory Ingestion
|
|
445
|
+
|
|
446
|
+
### Why Inventory is Different
|
|
447
|
+
|
|
448
|
+
**Fluent Commerce has a specialized Batch API for inventory:**
|
|
449
|
+
|
|
450
|
+
- ⚡ High-volume optimization (millions of records)
|
|
451
|
+
- 📦 Job + Batches pattern
|
|
452
|
+
- ⚠️ **ONLY works for INVENTORY entity**
|
|
453
|
+
- 🚫 NOT for products, orders, locations, etc.
|
|
454
|
+
|
|
455
|
+
### Use Building Blocks (Full Control)
|
|
456
|
+
|
|
457
|
+
```typescript
|
|
458
|
+
import {
|
|
459
|
+
S3DataSource,
|
|
460
|
+
CSVParserService,
|
|
461
|
+
UniversalMapper,
|
|
462
|
+
createClient,
|
|
463
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
464
|
+
|
|
465
|
+
const s3 = new S3DataSource(config, logger);
|
|
466
|
+
const parser = new CSVParserService();
|
|
467
|
+
const mapper = new UniversalMapper(mappingConfig);
|
|
468
|
+
const client = await createClient({ config: clientConfig });
|
|
469
|
+
|
|
470
|
+
const files = await s3.listFiles('inventory/');
|
|
471
|
+
|
|
472
|
+
for (const file of files) {
|
|
473
|
+
const content = await s3.downloadFile(file.name);
|
|
474
|
+
const records = await parser.parse(content);
|
|
475
|
+
|
|
476
|
+
// Map records
|
|
477
|
+
const inventory = [];
|
|
478
|
+
for (const record of records) {
|
|
479
|
+
const result = await mapper.map(record);
|
|
480
|
+
if (result.success) inventory.push(result.data);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// Create job (INVENTORY only)
|
|
484
|
+
const job = await client.createJob({
|
|
485
|
+
name: `Inventory - ${file.name}`,
|
|
486
|
+
retailerId: '1',
|
|
487
|
+
entity: 'INVENTORY',
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
// Send batches
|
|
491
|
+
const batches = chunkArray(inventory, 1000);
|
|
492
|
+
for (const batch of batches) {
|
|
493
|
+
await client.sendBatch(job.id, {
|
|
494
|
+
action: 'UPSERT',
|
|
495
|
+
entityType: 'INVENTORY',
|
|
496
|
+
entities: batch,
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
await s3.moveFile(file.name, `archive/${file.name}`);
|
|
501
|
+
}
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
### For ALL Entities
|
|
505
|
+
|
|
506
|
+
**All entities (Products, Locations, Orders, Customers, Fulfillments, Inventory, etc.) can use:**
|
|
507
|
+
|
|
508
|
+
**GraphQL Mutations** (recommended for flexibility):
|
|
509
|
+
```typescript
|
|
510
|
+
for (const entity of entities) {
|
|
511
|
+
await client.graphql({
|
|
512
|
+
query: `
|
|
513
|
+
mutation CreateEntity($input: CreateEntityInput!) {
|
|
514
|
+
createEntity(input: $input) {
|
|
515
|
+
id
|
|
516
|
+
ref
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
`,
|
|
520
|
+
variables: { input: entity },
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
**Batch API** (for high-volume inventory only):
|
|
526
|
+
```typescript
|
|
527
|
+
// Create job
|
|
528
|
+
const job = await client.createJob({
|
|
529
|
+
name: 'Inventory Update',
|
|
530
|
+
retailerId: '1',
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
// Send in batches
|
|
534
|
+
const batches = chunkArray(records, 1000);
|
|
535
|
+
for (const batch of batches) {
|
|
536
|
+
await client.sendBatch(job.id, {
|
|
537
|
+
action: 'UPSERT',
|
|
538
|
+
entityType: 'INVENTORY',
|
|
539
|
+
entities: batch,
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
---
|
|
545
|
+
|
|
546
|
+
## SDK Architecture Diagram
|
|
547
|
+
|
|
548
|
+
### High-Level Architecture
|
|
549
|
+
|
|
550
|
+
```mermaid
|
|
551
|
+
graph TB
|
|
552
|
+
subgraph app["YOUR APPLICATION<br/>(Custom Workflow Logic)"]
|
|
553
|
+
workflow["When to run: webhook/cron/manual<br/>What to process: files/entities<br/>How to execute: GraphQL/Batch/Events<br/>Error handling: retry/skip/alert<br/>Business rules: validation/filtering"]
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
subgraph sdk["SDK BUILDING BLOCKS<br/>(Services with Methods)"]
|
|
557
|
+
direction TB
|
|
558
|
+
|
|
559
|
+
subgraph data["Data Layer"]
|
|
560
|
+
sources["Data Sources<br/>• S3DataSource<br/>• SftpDataSource<br/>• InventoryDataSource"]
|
|
561
|
+
parsers["Parsers<br/>• CSVParserService<br/>• JSONParserService<br/>• XMLParserService<br/>• ParquetParserService"]
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
subgraph transform["Transformation Layer"]
|
|
565
|
+
mapper["UniversalMapper<br/>(Field Mapping)"]
|
|
566
|
+
gqlmapper["GraphQLMutationMapper<br/>(XML/JSON → GraphQL)"]
|
|
567
|
+
end
|
|
568
|
+
|
|
569
|
+
subgraph client["API Client Layer"]
|
|
570
|
+
api["FluentClient<br/>• graphql()<br/>• sendEvent()<br/>• createJob()<br/>• sendBatch()"]
|
|
571
|
+
end
|
|
572
|
+
|
|
573
|
+
subgraph support["Support Services"]
|
|
574
|
+
state["StateService<br/>(Prevent duplicates)"]
|
|
575
|
+
logging["createConsoleLogger<br/>toStructuredLogger<br/>createWorkflowLogger<br/>(Function-based logging)"]
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
subgraph orch["OPTIONAL: Orchestrators"]
|
|
579
|
+
exorch["ExtractionOrchestrator<br/>(Extraction with auto-pagination)"]
|
|
580
|
+
end
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
subgraph platforms["PLATFORM SUPPORT"]
|
|
584
|
+
versori["Versori<br/>(Primary)"]
|
|
585
|
+
nodejs["Node.js<br/>≥18.0.0"]
|
|
586
|
+
deno["Deno<br/>≥1.30.0"]
|
|
587
|
+
end
|
|
588
|
+
|
|
589
|
+
workflow --> sdk
|
|
590
|
+
sdk --> platforms
|
|
591
|
+
|
|
592
|
+
style app fill:#e1f5ff
|
|
593
|
+
style sdk fill:#fff4e6
|
|
594
|
+
style platforms fill:#f0f0f0
|
|
595
|
+
style orch fill:#ffe6e6
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
### Data Flow Patterns
|
|
599
|
+
|
|
600
|
+
```mermaid
|
|
601
|
+
graph LR
|
|
602
|
+
subgraph pattern1["Pattern 1: CSV to GraphQL"]
|
|
603
|
+
s3_1["S3 CSV File"]
|
|
604
|
+
parse_1["CSVParserService"]
|
|
605
|
+
map_1["UniversalMapper"]
|
|
606
|
+
gql_1["client.graphql()"]
|
|
607
|
+
fluent_1["Fluent Commerce"]
|
|
608
|
+
|
|
609
|
+
s3_1 --> parse_1
|
|
610
|
+
parse_1 --> map_1
|
|
611
|
+
map_1 --> gql_1
|
|
612
|
+
gql_1 --> fluent_1
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
subgraph pattern2["Pattern 2: XML to GraphQL (SFCC)"]
|
|
616
|
+
xml_2["SFCC XML"]
|
|
617
|
+
parse_2["XMLParserService"]
|
|
618
|
+
map_2["GraphQLMutationMapper"]
|
|
619
|
+
auto_2["Auto-executes<br/>mutation"]
|
|
620
|
+
fluent_2["Fluent Commerce"]
|
|
621
|
+
|
|
622
|
+
xml_2 --> parse_2
|
|
623
|
+
parse_2 --> map_2
|
|
624
|
+
map_2 --> auto_2
|
|
625
|
+
auto_2 --> fluent_2
|
|
626
|
+
end
|
|
627
|
+
|
|
628
|
+
subgraph pattern3["Pattern 3: Inventory (Batch API)"]
|
|
629
|
+
parquet_3["Parquet File"]
|
|
630
|
+
parse_3["ParquetParser"]
|
|
631
|
+
job_3["createJob()"]
|
|
632
|
+
batch_3["sendBatch()"]
|
|
633
|
+
fluent_3["Fluent Commerce<br/>(INVENTORY only)"]
|
|
634
|
+
|
|
635
|
+
parquet_3 --> parse_3
|
|
636
|
+
parse_3 --> job_3
|
|
637
|
+
job_3 --> batch_3
|
|
638
|
+
batch_3 --> fluent_3
|
|
639
|
+
end
|
|
640
|
+
|
|
641
|
+
style pattern1 fill:#e8f5e9
|
|
642
|
+
style pattern2 fill:#e3f2fd
|
|
643
|
+
style pattern3 fill:#fff3e0
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
---
|
|
647
|
+
|
|
648
|
+
## Guidelines
|
|
649
|
+
|
|
650
|
+
### ✅ SDK Provides
|
|
651
|
+
|
|
652
|
+
- **Services**: Classes with methods (composable building blocks)
|
|
653
|
+
- **Methods**: Async functions returning Promises
|
|
654
|
+
- **Types**: Complete TypeScript type definitions
|
|
655
|
+
- **Utilities**: Helper functions and adapters
|
|
656
|
+
- **Platform adapters**: Versori KV, S3 presign, etc.
|
|
657
|
+
- **Cross-runtime support**: Node.js, Deno, Versori
|
|
658
|
+
|
|
659
|
+
### ❌ SDK Does NOT Provide
|
|
660
|
+
|
|
661
|
+
- **Workflow orchestration** (except optional inventory orchestrators)
|
|
662
|
+
- **Opinionated patterns** (you decide the flow)
|
|
663
|
+
- **Business logic** (you implement validation, filtering, etc.)
|
|
664
|
+
- **Execution schedules** (use Versori webhooks, cron, etc.)
|
|
665
|
+
- **UI/Dashboard** (use Versori platform or build your own)
|
|
666
|
+
|
|
667
|
+
---
|
|
668
|
+
|
|
669
|
+
## Decision Guide
|
|
670
|
+
|
|
671
|
+
```mermaid
|
|
672
|
+
graph TD
|
|
673
|
+
start["What are you building?"]
|
|
674
|
+
approach["Choose SDK Approach"]
|
|
675
|
+
|
|
676
|
+
start --> approach
|
|
677
|
+
|
|
678
|
+
approach --> building_blocks["✅ Use Building Blocks<br/>(Recommended)"]
|
|
679
|
+
|
|
680
|
+
building_blocks --> bb_benefits["Benefits:<br/>• Full control<br/>• Better testability<br/>• Easier debugging<br/>• Complex workflows<br/>• Multi-system integration<br/>• Works for ALL entities"]
|
|
681
|
+
|
|
682
|
+
style building_blocks fill:#c8e6c9,stroke:#4caf50,stroke-width:3px
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
### Use Building Blocks (Recommended):
|
|
686
|
+
|
|
687
|
+
- ✅ Works for **ALL** entities (Inventory, Products, Orders, Locations, etc.)
|
|
688
|
+
- ✅ Custom workflow logic
|
|
689
|
+
- ✅ Multi-step processes (validate → transform → enrich → send)
|
|
690
|
+
- ✅ Integration with multiple systems
|
|
691
|
+
- ✅ Production connectors (recommended for maintainability)
|
|
692
|
+
- ✅ Full control over error handling and retries
|
|
693
|
+
- ✅ Complex business rules or data validation
|
|
694
|
+
- ✅ Better testability and debugging
|
|
695
|
+
|
|
696
|
+
### Recommendation:
|
|
697
|
+
|
|
698
|
+
**Always use building blocks for production connectors.** They provide:
|
|
699
|
+
|
|
700
|
+
- Better testability
|
|
701
|
+
- Easier debugging
|
|
702
|
+
- Full control over execution
|
|
703
|
+
- Better error handling
|
|
704
|
+
- Easier to maintain and extend
|
|
705
|
+
- Works consistently across all entity types
|
|
706
|
+
|
|
707
|
+
---
|
|
708
|
+
|
|
709
|
+
## Documentation
|
|
710
|
+
|
|
711
|
+
The SDK documentation follows the same philosophy - **modular building blocks you can navigate however you want**.
|
|
712
|
+
|
|
713
|
+
### Modular Documentation Structure
|
|
714
|
+
|
|
715
|
+
```
|
|
716
|
+
docs/
|
|
717
|
+
├── 00-START-HERE/ # Essential docs - read first
|
|
718
|
+
├── 01-TEMPLATES/ # Complete working examples
|
|
719
|
+
├── 02-CORE-GUIDES/ # Progressive learning paths
|
|
720
|
+
│ ├── api-reference/ # Complete API documentation (13 modules)
|
|
721
|
+
│ ├── ingestion/ # Data into Fluent
|
|
722
|
+
│ ├── extraction/ # Data from Fluent
|
|
723
|
+
│ ├── auto-pagination/ # Cursor pagination guide
|
|
724
|
+
│ ├── data-sources/ # S3, SFTP guides
|
|
725
|
+
│ ├── parsers/ # CSV, JSON, XML, Parquet
|
|
726
|
+
│ ├── webhook-validation/# Webhook security
|
|
727
|
+
│ └── mapping/ # Field transformation
|
|
728
|
+
├── 03-PATTERN-GUIDES/ # Reusable patterns
|
|
729
|
+
└── 04-REFERENCE/ # Deep dives & platform docs
|
|
730
|
+
├── architecture/ # System design
|
|
731
|
+
├── testing/ # Test utilities
|
|
732
|
+
├── platforms/versori/ # Versori integration
|
|
733
|
+
└── resolver-signature/# Resolver details
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
### Navigate by Your Needs
|
|
737
|
+
|
|
738
|
+
**Learning Path** (Beginner → Advanced):
|
|
739
|
+
|
|
740
|
+
1. [Client API](../02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md) - Create clients, basic operations
|
|
741
|
+
2. [Parsers](../02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md) - CSV, JSON, XML, Parquet
|
|
742
|
+
3. [Data Sources](../02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md) - S3, SFTP integration
|
|
743
|
+
4. [Services](../02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md) - UniversalMapper, StateService
|
|
744
|
+
5. [Extraction](../02-CORE-GUIDES/extraction/extraction-readme.md) - ExtractionOrchestrator for data export
|
|
745
|
+
|
|
746
|
+
**Quick Reference**: [One-page API cheat sheet](../02-CORE-GUIDES/api-reference/api-reference-quick-reference.md)
|
|
747
|
+
|
|
748
|
+
**By Use Case**: See [API Reference](../02-CORE-GUIDES/api-reference/api-reference-readme.md) or [Getting Started](./getting-started.md)
|
|
749
|
+
|
|
750
|
+
**Just like the SDK provides services you compose, the documentation provides modules you navigate however you need!**
|
|
751
|
+
|
|
752
|
+
---
|
|
753
|
+
|
|
754
|
+
## Summary
|
|
755
|
+
|
|
756
|
+
**The SDK Philosophy in 3 Points:**
|
|
757
|
+
|
|
758
|
+
1. **Provide Building Blocks** - Services with methods you can compose
|
|
759
|
+
2. **You Control the Workflow** - Decide how to use them
|
|
760
|
+
3. **Platform Flexibility** - Works on Versori, Node.js, and Deno
|
|
761
|
+
|
|
762
|
+
**Example:**
|
|
763
|
+
|
|
764
|
+
```typescript
|
|
765
|
+
// SDK gives you these tools:
|
|
766
|
+
const client = await createClient({ config });
|
|
767
|
+
const s3 = new S3DataSource({ bucket: 'data' }, logger);
|
|
768
|
+
const parser = new CSVParserService();
|
|
769
|
+
const mapper = new UniversalMapper(mappingConfig);
|
|
770
|
+
|
|
771
|
+
// YOU build the workflow:
|
|
772
|
+
async function myWorkflow() {
|
|
773
|
+
const files = await s3.listFiles(); // SDK method
|
|
774
|
+
const content = await s3.downloadFile(file); // SDK method
|
|
775
|
+
const records = await parser.parse(content); // SDK method
|
|
776
|
+
|
|
777
|
+
// Map records
|
|
778
|
+
const mapped = [];
|
|
779
|
+
for (const record of records) {
|
|
780
|
+
const result = await mapper.map(record); // SDK method
|
|
781
|
+
if (result.success) mapped.push(result.data);
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
// YOUR CUSTOM LOGIC HERE
|
|
785
|
+
for (const record of mapped) {
|
|
786
|
+
await client.graphql({ query: /* ... */, variables: /* ... */ }); // SDK method
|
|
787
|
+
// or Batch API, or Events, or external API, or Database, or Whatever!
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
await s3.moveFile(file, `archive/${file}`); // SDK method
|
|
791
|
+
}
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
**As long as the SDK provides the services with methods, developers can build anything!**
|