@fluentcommerce/fc-connect-sdk 0.1.53 → 0.1.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -2
- package/README.md +39 -0
- package/dist/cjs/auth/index.d.ts +3 -0
- package/dist/cjs/auth/index.js +13 -0
- package/dist/cjs/auth/profile-loader.d.ts +18 -0
- package/dist/cjs/auth/profile-loader.js +208 -0
- package/dist/cjs/client-factory.d.ts +4 -0
- package/dist/cjs/client-factory.js +10 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/auth/index.d.ts +3 -0
- package/dist/esm/auth/index.js +2 -0
- package/dist/esm/auth/profile-loader.d.ts +18 -0
- package/dist/esm/auth/profile-loader.js +169 -0
- package/dist/esm/client-factory.d.ts +4 -0
- package/dist/esm/client-factory.js +9 -0
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/dist/types/auth/index.d.ts +3 -0
- package/dist/types/auth/profile-loader.d.ts +18 -0
- package/dist/types/client-factory.d.ts +4 -0
- package/dist/types/index.d.ts +3 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -482
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md
CHANGED
|
@@ -1,650 +1,650 @@
|
|
|
1
|
-
# Module 6: Migration Guide
|
|
2
|
-
|
|
3
|
-
**Level:** Intermediate
|
|
4
|
-
**Estimated Time:** 20 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module provides a complete guide for migrating from the old 3-parameter resolver signature to the new standard 4-parameter signature. You'll learn what changed, why it changed, and how to update your resolvers safely.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
- ✅ Understand the differences between 3-arg and 4-arg signatures
|
|
14
|
-
- ✅ Know how to identify resolvers that need migration
|
|
15
|
-
- ✅ Follow a step-by-step migration process
|
|
16
|
-
- ✅ Test migrated resolvers for correctness
|
|
17
|
-
- ✅ Apply best practices for future resolver development
|
|
18
|
-
|
|
19
|
-
## What Changed?
|
|
20
|
-
|
|
21
|
-
### Old Signature (3 Parameters)
|
|
22
|
-
|
|
23
|
-
```typescript
|
|
24
|
-
// ❌ OLD: 3 parameters
|
|
25
|
-
type OldResolverFunction = (
|
|
26
|
-
value: any,
|
|
27
|
-
sourceData: any,
|
|
28
|
-
helpers: ResolverHelpers
|
|
29
|
-
) => any | Promise<any>;
|
|
30
|
-
|
|
31
|
-
// Configuration accessed via helpers.context
|
|
32
|
-
'custom.addTax': (value, sourceData, helpers) => {
|
|
33
|
-
const taxRate = helpers.context?.taxRate || 0.1;
|
|
34
|
-
return value * (1 + taxRate);
|
|
35
|
-
}
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
### New Signature (4 Parameters)
|
|
39
|
-
|
|
40
|
-
```typescript
|
|
41
|
-
// ✅ NEW: 4 parameters
|
|
42
|
-
type ResolverFunction = (
|
|
43
|
-
value: any,
|
|
44
|
-
sourceData: any,
|
|
45
|
-
config: any, // ← NEW: Dedicated config parameter
|
|
46
|
-
helpers: ResolverHelpers
|
|
47
|
-
) => any | Promise<any>;
|
|
48
|
-
|
|
49
|
-
// Configuration accessed via config parameter
|
|
50
|
-
'custom.addTax': (value, sourceData, config, helpers) => {
|
|
51
|
-
const taxRate = config.taxRate || 0.1;
|
|
52
|
-
return value * (1 + taxRate);
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## Why the Change?
|
|
57
|
-
|
|
58
|
-
### 1. Separation of Concerns
|
|
59
|
-
|
|
60
|
-
**Before:**
|
|
61
|
-
```typescript
|
|
62
|
-
// ❌ Mixed: Configuration and utilities in same object
|
|
63
|
-
(value, sourceData, helpers) => {
|
|
64
|
-
const config = helpers.context; // Configuration
|
|
65
|
-
const parsed = helpers.parseFloat(value); // Utility
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
**After:**
|
|
70
|
-
```typescript
|
|
71
|
-
// ✅ Separated: Clear distinction
|
|
72
|
-
(value, sourceData, config, helpers) => {
|
|
73
|
-
const rate = config.taxRate; // Configuration
|
|
74
|
-
const parsed = helpers.parseFloat(value); // Utility
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### 2. Better Type Safety
|
|
79
|
-
|
|
80
|
-
```typescript
|
|
81
|
-
// ❌ OLD: helpers.context is loosely typed
|
|
82
|
-
interface ResolverHelpers {
|
|
83
|
-
context?: any; // Could be anything
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// ✅ NEW: config has dedicated type
|
|
87
|
-
type ResolverFunction = (
|
|
88
|
-
value: any,
|
|
89
|
-
sourceData: any,
|
|
90
|
-
config: MyConfigType, // Can be strongly typed
|
|
91
|
-
helpers: ResolverHelpers
|
|
92
|
-
) => any;
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### 3. Consistency with Mappers
|
|
96
|
-
|
|
97
|
-
Both UniversalMapper and GraphQLMutationMapper now use the same pattern:
|
|
98
|
-
|
|
99
|
-
```typescript
|
|
100
|
-
// UniversalMapper
|
|
101
|
-
const mapper1 = new UniversalMapper(mapping, {
|
|
102
|
-
customResolvers,
|
|
103
|
-
context: { ... } // → config parameter
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
// GraphQLMutationMapper
|
|
107
|
-
const mapper2 = new GraphQLMutationMapper(mapping, {
|
|
108
|
-
customResolvers,
|
|
109
|
-
context: { ... } // → config parameter
|
|
110
|
-
});
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
## Migration Process
|
|
114
|
-
|
|
115
|
-
### Step 1: Identify Resolvers to Migrate
|
|
116
|
-
|
|
117
|
-
Look for resolvers with 3 parameters:
|
|
118
|
-
|
|
119
|
-
```typescript
|
|
120
|
-
// ❌ NEEDS MIGRATION
|
|
121
|
-
const oldResolvers = {
|
|
122
|
-
'custom.transform': (value, sourceData, helpers) => {
|
|
123
|
-
// ...
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
### Step 2: Add Config Parameter
|
|
129
|
-
|
|
130
|
-
Add `config` as the third parameter:
|
|
131
|
-
|
|
132
|
-
```typescript
|
|
133
|
-
// ✅ SIGNATURE UPDATED
|
|
134
|
-
const newResolvers = {
|
|
135
|
-
'custom.transform': (value, sourceData, config, helpers) => {
|
|
136
|
-
// ...
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
### Step 3: Update Context Access
|
|
142
|
-
|
|
143
|
-
Change `helpers.context` to `config`:
|
|
144
|
-
|
|
145
|
-
```typescript
|
|
146
|
-
// ❌ OLD
|
|
147
|
-
'custom.addPrefix': (value, sourceData, helpers) => {
|
|
148
|
-
const prefix = helpers.context?.prefix || 'SKU';
|
|
149
|
-
return `${prefix}-${value}`;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// ✅ NEW
|
|
153
|
-
'custom.addPrefix': (value, sourceData, config, helpers) => {
|
|
154
|
-
const prefix = config.prefix || 'SKU';
|
|
155
|
-
return `${prefix}-${value}`;
|
|
156
|
-
}
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
### Step 4: Test Migration
|
|
160
|
-
|
|
161
|
-
Write tests to verify behavior is unchanged:
|
|
162
|
-
|
|
163
|
-
```typescript
|
|
164
|
-
import { UniversalMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
165
|
-
|
|
166
|
-
describe('Migrated Resolvers', () => {
|
|
167
|
-
it('should work with new signature', async () => {
|
|
168
|
-
const newResolvers = {
|
|
169
|
-
'custom.addPrefix': (value, sourceData, config, helpers) => {
|
|
170
|
-
const prefix = config.prefix || 'SKU';
|
|
171
|
-
return `${prefix}-${value}`;
|
|
172
|
-
}
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
const mapper = new UniversalMapper(
|
|
176
|
-
{
|
|
177
|
-
fields: {
|
|
178
|
-
sku: { source: 'id', resolver: 'custom.addPrefix' }
|
|
179
|
-
}
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
customResolvers: newResolvers,
|
|
183
|
-
context: { prefix: 'PROD' }
|
|
184
|
-
}
|
|
185
|
-
);
|
|
186
|
-
|
|
187
|
-
const result = await mapper.map({ id: '12345' });
|
|
188
|
-
|
|
189
|
-
expect(result.success).toBe(true);
|
|
190
|
-
expect(result.data.sku).toBe('PROD-12345');
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
## Common Migration Scenarios
|
|
196
|
-
|
|
197
|
-
### Scenario 1: Simple Context Access
|
|
198
|
-
|
|
199
|
-
```typescript
|
|
200
|
-
// ❌ BEFORE
|
|
201
|
-
'custom.formatDate': (value, sourceData, helpers) => {
|
|
202
|
-
const format = helpers.context?.dateFormat || 'YYYY-MM-DD';
|
|
203
|
-
return helpers.formatDate(value, format);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// ✅ AFTER
|
|
207
|
-
'custom.formatDate': (value, sourceData, config, helpers) => {
|
|
208
|
-
const format = config.dateFormat || 'YYYY-MM-DD';
|
|
209
|
-
return helpers.formatDate(value, format);
|
|
210
|
-
}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
### Scenario 2: Nested Context Access
|
|
214
|
-
|
|
215
|
-
```typescript
|
|
216
|
-
// ❌ BEFORE
|
|
217
|
-
'custom.calculateTax': (value, sourceData, helpers) => {
|
|
218
|
-
const region = helpers.get(sourceData, 'customer.region');
|
|
219
|
-
const taxRates = helpers.context?.taxRates || {};
|
|
220
|
-
return value * (taxRates[region] || 0.08);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// ✅ AFTER
|
|
224
|
-
'custom.calculateTax': (value, sourceData, config, helpers) => {
|
|
225
|
-
const region = helpers.get(sourceData, 'customer.region');
|
|
226
|
-
const taxRates = config.taxRates || {};
|
|
227
|
-
return value * (taxRates[region] || 0.08);
|
|
228
|
-
}
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
### Scenario 3: Multiple Context Values
|
|
232
|
-
|
|
233
|
-
```typescript
|
|
234
|
-
// ❌ BEFORE
|
|
235
|
-
'custom.formatSKU': (value, sourceData, helpers) => {
|
|
236
|
-
const prefix = helpers.context?.skuPrefix || 'SKU';
|
|
237
|
-
const separator = helpers.context?.separator || '-';
|
|
238
|
-
const includeTimestamp = helpers.context?.includeTimestamp || false;
|
|
239
|
-
|
|
240
|
-
let result = `${prefix}${separator}${value}`;
|
|
241
|
-
|
|
242
|
-
if (includeTimestamp) {
|
|
243
|
-
const timestamp = helpers.formatDate(new Date(), 'YYYYMMDD');
|
|
244
|
-
result += `${separator}${timestamp}`;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
return result;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// ✅ AFTER
|
|
251
|
-
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
252
|
-
const prefix = config.skuPrefix || 'SKU';
|
|
253
|
-
const separator = config.separator || '-';
|
|
254
|
-
const includeTimestamp = config.includeTimestamp || false;
|
|
255
|
-
|
|
256
|
-
let result = `${prefix}${separator}${value}`;
|
|
257
|
-
|
|
258
|
-
if (includeTimestamp) {
|
|
259
|
-
const timestamp = helpers.formatDate(new Date(), 'YYYYMMDD');
|
|
260
|
-
result += `${separator}${timestamp}`;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
return result;
|
|
264
|
-
}
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
### Scenario 4: Async Resolvers
|
|
268
|
-
|
|
269
|
-
```typescript
|
|
270
|
-
// ❌ BEFORE
|
|
271
|
-
'custom.enrichData': async (value, sourceData, helpers) => {
|
|
272
|
-
if (!helpers.fluentClient) {
|
|
273
|
-
return value;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
const enableEnrichment = helpers.context?.enableEnrichment;
|
|
277
|
-
if (!enableEnrichment) {
|
|
278
|
-
return value;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
const result = await helpers.fluentClient.graphql({ ... });
|
|
282
|
-
return result.data;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// ✅ AFTER
|
|
286
|
-
'custom.enrichData': async (value, sourceData, config, helpers) => {
|
|
287
|
-
if (!helpers.fluentClient) {
|
|
288
|
-
return value;
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
const enableEnrichment = config.enableEnrichment;
|
|
292
|
-
if (!enableEnrichment) {
|
|
293
|
-
return value;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
const result = await helpers.fluentClient.graphql({ ... });
|
|
297
|
-
return result.data;
|
|
298
|
-
}
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
### Scenario 5: No Context Used
|
|
302
|
-
|
|
303
|
-
```typescript
|
|
304
|
-
// ❌ BEFORE (3 parameters)
|
|
305
|
-
'custom.uppercase': (value, sourceData, helpers) => {
|
|
306
|
-
return String(value).toUpperCase();
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
// ✅ AFTER (4 parameters, even if config unused)
|
|
310
|
-
'custom.uppercase': (value, sourceData, config, helpers) => {
|
|
311
|
-
return String(value).toUpperCase();
|
|
312
|
-
}
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
## Migration Checklist
|
|
316
|
-
|
|
317
|
-
Use this checklist for each resolver:
|
|
318
|
-
|
|
319
|
-
- [ ] **Add config parameter** as 3rd parameter
|
|
320
|
-
- [ ] **Replace `helpers.context`** with `config`
|
|
321
|
-
- [ ] **Update parameter names** (no underscores: `config` not `_config`)
|
|
322
|
-
- [ ] **Test with sample data** to verify behavior
|
|
323
|
-
- [ ] **Update TypeScript types** if using typed resolvers
|
|
324
|
-
- [ ] **Check for any remaining `helpers.context` references**
|
|
325
|
-
- [ ] **Run lint and type checks**
|
|
326
|
-
- [ ] **Update documentation/comments**
|
|
327
|
-
|
|
328
|
-
## Automated Migration Script
|
|
329
|
-
|
|
330
|
-
You can use this script to help identify resolvers needing migration:
|
|
331
|
-
|
|
332
|
-
```bash
|
|
333
|
-
#!/bin/bash
|
|
334
|
-
# find-old-resolvers.sh
|
|
335
|
-
|
|
336
|
-
# Find files with potential 3-arg resolvers
|
|
337
|
-
grep -r "=> {" src/ | \
|
|
338
|
-
grep -E "\(value,.*sourceData,.*helpers\)" | \
|
|
339
|
-
grep -v "config," | \
|
|
340
|
-
while read -r line; do
|
|
341
|
-
echo "Potential 3-arg resolver: $line"
|
|
342
|
-
done
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
## Testing Strategy
|
|
346
|
-
|
|
347
|
-
### Unit Tests
|
|
348
|
-
|
|
349
|
-
```typescript
|
|
350
|
-
describe('Resolver Migration', () => {
|
|
351
|
-
const helpers = createMockHelpers();
|
|
352
|
-
|
|
353
|
-
it('should use config instead of helpers.context', () => {
|
|
354
|
-
const resolver = (value, sourceData, config, helpers) => {
|
|
355
|
-
const prefix = config.prefix || 'DEFAULT';
|
|
356
|
-
return `${prefix}-${value}`;
|
|
357
|
-
};
|
|
358
|
-
|
|
359
|
-
const result = resolver(
|
|
360
|
-
'test',
|
|
361
|
-
{},
|
|
362
|
-
{ prefix: 'PROD' },
|
|
363
|
-
helpers
|
|
364
|
-
);
|
|
365
|
-
|
|
366
|
-
expect(result).toBe('PROD-test');
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
it('should handle missing config gracefully', () => {
|
|
370
|
-
const resolver = (value, sourceData, config, helpers) => {
|
|
371
|
-
const prefix = config?.prefix || 'DEFAULT';
|
|
372
|
-
return `${prefix}-${value}`;
|
|
373
|
-
};
|
|
374
|
-
|
|
375
|
-
const result = resolver('test', {}, {}, helpers);
|
|
376
|
-
|
|
377
|
-
expect(result).toBe('DEFAULT-test');
|
|
378
|
-
});
|
|
379
|
-
});
|
|
380
|
-
```
|
|
381
|
-
|
|
382
|
-
### Integration Tests
|
|
383
|
-
|
|
384
|
-
```typescript
|
|
385
|
-
describe('Resolver Integration', () => {
|
|
386
|
-
it('should work with UniversalMapper', async () => {
|
|
387
|
-
const customResolvers = {
|
|
388
|
-
'custom.format': (value, sourceData, config, helpers) => {
|
|
389
|
-
return `${config.prefix || 'X'}-${value}`;
|
|
390
|
-
}
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
const mapper = new UniversalMapper(
|
|
394
|
-
{
|
|
395
|
-
fields: {
|
|
396
|
-
result: { source: 'input', resolver: 'custom.format' }
|
|
397
|
-
}
|
|
398
|
-
},
|
|
399
|
-
{
|
|
400
|
-
customResolvers,
|
|
401
|
-
context: { prefix: 'TEST' }
|
|
402
|
-
}
|
|
403
|
-
);
|
|
404
|
-
|
|
405
|
-
const result = await mapper.map({ input: 'value' });
|
|
406
|
-
|
|
407
|
-
expect(result.success).toBe(true);
|
|
408
|
-
expect(result.data.result).toBe('TEST-value');
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
it('should work with GraphQLMutationMapper', async () => {
|
|
412
|
-
const customResolvers = {
|
|
413
|
-
'custom.format': (value, sourceData, config, helpers) => {
|
|
414
|
-
return `${config.prefix || 'X'}-${value}`;
|
|
415
|
-
}
|
|
416
|
-
};
|
|
417
|
-
|
|
418
|
-
const mapper = new GraphQLMutationMapper(
|
|
419
|
-
{
|
|
420
|
-
mutation: 'createOrder',
|
|
421
|
-
fields: {
|
|
422
|
-
ref: { source: 'orderId', resolver: 'custom.format' }
|
|
423
|
-
}
|
|
424
|
-
},
|
|
425
|
-
{
|
|
426
|
-
customResolvers,
|
|
427
|
-
context: { prefix: 'ORD' }
|
|
428
|
-
}
|
|
429
|
-
);
|
|
430
|
-
|
|
431
|
-
const result = await mapper.mapWithNodes({ orderId: '12345' });
|
|
432
|
-
|
|
433
|
-
expect(result.success).toBe(true);
|
|
434
|
-
expect(result.data.ref).toBe('ORD-12345');
|
|
435
|
-
});
|
|
436
|
-
});
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
## Common Pitfalls
|
|
440
|
-
|
|
441
|
-
### Pitfall 1: Forgetting to Add Parameter
|
|
442
|
-
|
|
443
|
-
```typescript
|
|
444
|
-
// ❌ WRONG: Still 3 parameters
|
|
445
|
-
'custom.resolver': (value, sourceData, helpers) => {
|
|
446
|
-
const rate = config.taxRate; // ← ReferenceError: config is not defined
|
|
447
|
-
return value * rate;
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
// ✅ CORRECT: 4 parameters
|
|
451
|
-
'custom.resolver': (value, sourceData, config, helpers) => {
|
|
452
|
-
const rate = config.taxRate;
|
|
453
|
-
return value * rate;
|
|
454
|
-
}
|
|
455
|
-
```
|
|
456
|
-
|
|
457
|
-
### Pitfall 2: Wrong Parameter Order
|
|
458
|
-
|
|
459
|
-
```typescript
|
|
460
|
-
// ❌ WRONG: config and helpers swapped
|
|
461
|
-
'custom.resolver': (value, sourceData, helpers, config) => {
|
|
462
|
-
return value * config.rate;
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
// ✅ CORRECT: Standard order
|
|
466
|
-
'custom.resolver': (value, sourceData, config, helpers) => {
|
|
467
|
-
return value * config.rate;
|
|
468
|
-
}
|
|
469
|
-
```
|
|
470
|
-
|
|
471
|
-
### Pitfall 3: Still Using helpers.context
|
|
472
|
-
|
|
473
|
-
```typescript
|
|
474
|
-
// ❌ WRONG: Using old pattern
|
|
475
|
-
'custom.resolver': (value, sourceData, config, helpers) => {
|
|
476
|
-
const rate = helpers.context?.taxRate || 0.1; // ← Old pattern
|
|
477
|
-
return value * rate;
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
// ✅ CORRECT: Use config parameter
|
|
481
|
-
'custom.resolver': (value, sourceData, config, helpers) => {
|
|
482
|
-
const rate = config.taxRate || 0.1;
|
|
483
|
-
return value * rate;
|
|
484
|
-
}
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
### Pitfall 4: Not Handling Undefined Config
|
|
488
|
-
|
|
489
|
-
```typescript
|
|
490
|
-
// ❌ RISKY: May throw if config is undefined
|
|
491
|
-
'custom.resolver': (value, sourceData, config, helpers) => {
|
|
492
|
-
return value * config.taxRate; // ← Error if config is undefined
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
// ✅ SAFE: Handle undefined config
|
|
496
|
-
'custom.resolver': (value, sourceData, config, helpers) => {
|
|
497
|
-
return value * (config?.taxRate || 0.1);
|
|
498
|
-
}
|
|
499
|
-
```
|
|
500
|
-
|
|
501
|
-
## Best Practices After Migration
|
|
502
|
-
|
|
503
|
-
### 1. Always Use All 4 Parameters
|
|
504
|
-
|
|
505
|
-
```typescript
|
|
506
|
-
// ✅ GOOD: Include all 4 even if unused
|
|
507
|
-
'custom.simple': (value, sourceData, config, helpers) => {
|
|
508
|
-
return String(value).toUpperCase();
|
|
509
|
-
}
|
|
510
|
-
```
|
|
511
|
-
|
|
512
|
-
### 2. Use Standard Parameter Names
|
|
513
|
-
|
|
514
|
-
```typescript
|
|
515
|
-
// ✅ GOOD: Standard names
|
|
516
|
-
(value, sourceData, config, helpers) => { ... }
|
|
517
|
-
|
|
518
|
-
// ❌ BAD: Non-standard names
|
|
519
|
-
(val, src, cfg, hlp) => { ... }
|
|
520
|
-
```
|
|
521
|
-
|
|
522
|
-
### 3. Provide Safe Defaults
|
|
523
|
-
|
|
524
|
-
```typescript
|
|
525
|
-
// ✅ GOOD: Safe defaults for config
|
|
526
|
-
'custom.format': (value, sourceData, config, helpers) => {
|
|
527
|
-
const prefix = config?.prefix || 'DEFAULT';
|
|
528
|
-
const separator = config?.separator || '-';
|
|
529
|
-
return `${prefix}${separator}${value}`;
|
|
530
|
-
}
|
|
531
|
-
```
|
|
532
|
-
|
|
533
|
-
### 4. Document Config Requirements
|
|
534
|
-
|
|
535
|
-
```typescript
|
|
536
|
-
/**
|
|
537
|
-
* Formats SKU with configurable prefix and separator
|
|
538
|
-
*
|
|
539
|
-
* @param value - SKU value to format
|
|
540
|
-
* @param sourceData - Full source object
|
|
541
|
-
* @param config - Configuration object
|
|
542
|
-
* @param config.prefix - SKU prefix (default: 'SKU')
|
|
543
|
-
* @param config.separator - Separator character (default: '-')
|
|
544
|
-
* @param helpers - SDK utilities
|
|
545
|
-
*/
|
|
546
|
-
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
547
|
-
const prefix = config?.prefix || 'SKU';
|
|
548
|
-
const separator = config?.separator || '-';
|
|
549
|
-
return `${prefix}${separator}${value}`;
|
|
550
|
-
}
|
|
551
|
-
```
|
|
552
|
-
|
|
553
|
-
### 5. Type Your Resolvers
|
|
554
|
-
|
|
555
|
-
```typescript
|
|
556
|
-
import type { FieldResolverFunction } from '@fluentcommerce/fc-connect-sdk';
|
|
557
|
-
|
|
558
|
-
interface MyConfig {
|
|
559
|
-
prefix?: string;
|
|
560
|
-
separator?: string;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
const resolver: FieldResolverFunction = (
|
|
564
|
-
value: any,
|
|
565
|
-
sourceData: any,
|
|
566
|
-
config: MyConfig,
|
|
567
|
-
helpers: any
|
|
568
|
-
) => {
|
|
569
|
-
const prefix = config?.prefix || 'SKU';
|
|
570
|
-
return `${prefix}-${value}`;
|
|
571
|
-
};
|
|
572
|
-
```
|
|
573
|
-
|
|
574
|
-
## Complete Migration Example
|
|
575
|
-
|
|
576
|
-
### Before
|
|
577
|
-
|
|
578
|
-
```typescript
|
|
579
|
-
// old-resolvers.ts (3-parameter signature)
|
|
580
|
-
export const oldResolvers = {
|
|
581
|
-
'custom.formatSKU': (value, sourceData, helpers) => {
|
|
582
|
-
const prefix = helpers.context?.skuPrefix || 'SKU';
|
|
583
|
-
return `${prefix}-${String(value).toUpperCase()}`;
|
|
584
|
-
},
|
|
585
|
-
|
|
586
|
-
'custom.calculateTax': (value, sourceData, helpers) => {
|
|
587
|
-
const region = helpers.get(sourceData, 'customer.region');
|
|
588
|
-
const taxRates = helpers.context?.taxRates || {};
|
|
589
|
-
return value * (taxRates[region] || 0.08);
|
|
590
|
-
},
|
|
591
|
-
|
|
592
|
-
'custom.enrichProduct': async (sku, sourceData, helpers) => {
|
|
593
|
-
if (!helpers.fluentClient || !helpers.context?.enableEnrichment) {
|
|
594
|
-
return { sku };
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
const result = await helpers.fluentClient.graphql({ ... });
|
|
598
|
-
return result.data.product;
|
|
599
|
-
}
|
|
600
|
-
};
|
|
601
|
-
```
|
|
602
|
-
|
|
603
|
-
### After
|
|
604
|
-
|
|
605
|
-
```typescript
|
|
606
|
-
// new-resolvers.ts (4-parameter signature)
|
|
607
|
-
export const newResolvers = {
|
|
608
|
-
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
609
|
-
const prefix = config.skuPrefix || 'SKU';
|
|
610
|
-
return `${prefix}-${String(value).toUpperCase()}`;
|
|
611
|
-
},
|
|
612
|
-
|
|
613
|
-
'custom.calculateTax': (value, sourceData, config, helpers) => {
|
|
614
|
-
const region = helpers.get(sourceData, 'customer.region');
|
|
615
|
-
const taxRates = config.taxRates || {};
|
|
616
|
-
return value * (taxRates[region] || 0.08);
|
|
617
|
-
},
|
|
618
|
-
|
|
619
|
-
'custom.enrichProduct': async (sku, sourceData, config, helpers) => {
|
|
620
|
-
if (!helpers.fluentClient || !config.enableEnrichment) {
|
|
621
|
-
return { sku };
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
const result = await helpers.fluentClient.graphql({ ... });
|
|
625
|
-
return result.data.product;
|
|
626
|
-
}
|
|
627
|
-
};
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
## Key Takeaways
|
|
631
|
-
|
|
632
|
-
- 🎯 **Add config parameter** - Always include it as 3rd parameter
|
|
633
|
-
- 🎯 **Replace helpers.context** - Use config instead
|
|
634
|
-
- 🎯 **Test thoroughly** - Verify behavior unchanged
|
|
635
|
-
- 🎯 **Use standard names** - value, sourceData, config, helpers
|
|
636
|
-
- 🎯 **Handle undefined** - Use safe defaults (config?.prop || default)
|
|
637
|
-
|
|
638
|
-
## Migration Completion
|
|
639
|
-
|
|
640
|
-
You've successfully migrated when:
|
|
641
|
-
|
|
642
|
-
- ✅ All resolvers have 4 parameters
|
|
643
|
-
- ✅ No references to `helpers.context` remain
|
|
644
|
-
- ✅ All tests pass
|
|
645
|
-
- ✅ TypeScript type checks pass
|
|
646
|
-
- ✅ Lint checks pass
|
|
647
|
-
|
|
648
|
-
## Next Steps
|
|
649
|
-
|
|
650
|
-
Continue to [Module 7: API Reference](../../../02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md) for complete TypeScript types, interfaces, and testing utilities.
|
|
1
|
+
# Module 6: Migration Guide
|
|
2
|
+
|
|
3
|
+
**Level:** Intermediate
|
|
4
|
+
**Estimated Time:** 20 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module provides a complete guide for migrating from the old 3-parameter resolver signature to the new standard 4-parameter signature. You'll learn what changed, why it changed, and how to update your resolvers safely.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
- ✅ Understand the differences between 3-arg and 4-arg signatures
|
|
14
|
+
- ✅ Know how to identify resolvers that need migration
|
|
15
|
+
- ✅ Follow a step-by-step migration process
|
|
16
|
+
- ✅ Test migrated resolvers for correctness
|
|
17
|
+
- ✅ Apply best practices for future resolver development
|
|
18
|
+
|
|
19
|
+
## What Changed?
|
|
20
|
+
|
|
21
|
+
### Old Signature (3 Parameters)
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// ❌ OLD: 3 parameters
|
|
25
|
+
type OldResolverFunction = (
|
|
26
|
+
value: any,
|
|
27
|
+
sourceData: any,
|
|
28
|
+
helpers: ResolverHelpers
|
|
29
|
+
) => any | Promise<any>;
|
|
30
|
+
|
|
31
|
+
// Configuration accessed via helpers.context
|
|
32
|
+
'custom.addTax': (value, sourceData, helpers) => {
|
|
33
|
+
const taxRate = helpers.context?.taxRate || 0.1;
|
|
34
|
+
return value * (1 + taxRate);
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### New Signature (4 Parameters)
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
// ✅ NEW: 4 parameters
|
|
42
|
+
type ResolverFunction = (
|
|
43
|
+
value: any,
|
|
44
|
+
sourceData: any,
|
|
45
|
+
config: any, // ← NEW: Dedicated config parameter
|
|
46
|
+
helpers: ResolverHelpers
|
|
47
|
+
) => any | Promise<any>;
|
|
48
|
+
|
|
49
|
+
// Configuration accessed via config parameter
|
|
50
|
+
'custom.addTax': (value, sourceData, config, helpers) => {
|
|
51
|
+
const taxRate = config.taxRate || 0.1;
|
|
52
|
+
return value * (1 + taxRate);
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Why the Change?
|
|
57
|
+
|
|
58
|
+
### 1. Separation of Concerns
|
|
59
|
+
|
|
60
|
+
**Before:**
|
|
61
|
+
```typescript
|
|
62
|
+
// ❌ Mixed: Configuration and utilities in same object
|
|
63
|
+
(value, sourceData, helpers) => {
|
|
64
|
+
const config = helpers.context; // Configuration
|
|
65
|
+
const parsed = helpers.parseFloat(value); // Utility
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**After:**
|
|
70
|
+
```typescript
|
|
71
|
+
// ✅ Separated: Clear distinction
|
|
72
|
+
(value, sourceData, config, helpers) => {
|
|
73
|
+
const rate = config.taxRate; // Configuration
|
|
74
|
+
const parsed = helpers.parseFloat(value); // Utility
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 2. Better Type Safety
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// ❌ OLD: helpers.context is loosely typed
|
|
82
|
+
interface ResolverHelpers {
|
|
83
|
+
context?: any; // Could be anything
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ✅ NEW: config has dedicated type
|
|
87
|
+
type ResolverFunction = (
|
|
88
|
+
value: any,
|
|
89
|
+
sourceData: any,
|
|
90
|
+
config: MyConfigType, // Can be strongly typed
|
|
91
|
+
helpers: ResolverHelpers
|
|
92
|
+
) => any;
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 3. Consistency with Mappers
|
|
96
|
+
|
|
97
|
+
Both UniversalMapper and GraphQLMutationMapper now use the same pattern:
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
// UniversalMapper
|
|
101
|
+
const mapper1 = new UniversalMapper(mapping, {
|
|
102
|
+
customResolvers,
|
|
103
|
+
context: { ... } // → config parameter
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// GraphQLMutationMapper
|
|
107
|
+
const mapper2 = new GraphQLMutationMapper(mapping, {
|
|
108
|
+
customResolvers,
|
|
109
|
+
context: { ... } // → config parameter
|
|
110
|
+
});
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Migration Process
|
|
114
|
+
|
|
115
|
+
### Step 1: Identify Resolvers to Migrate
|
|
116
|
+
|
|
117
|
+
Look for resolvers with 3 parameters:
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
// ❌ NEEDS MIGRATION
|
|
121
|
+
const oldResolvers = {
|
|
122
|
+
'custom.transform': (value, sourceData, helpers) => {
|
|
123
|
+
// ...
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Step 2: Add Config Parameter
|
|
129
|
+
|
|
130
|
+
Add `config` as the third parameter:
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
// ✅ SIGNATURE UPDATED
|
|
134
|
+
const newResolvers = {
|
|
135
|
+
'custom.transform': (value, sourceData, config, helpers) => {
|
|
136
|
+
// ...
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Step 3: Update Context Access
|
|
142
|
+
|
|
143
|
+
Change `helpers.context` to `config`:
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
// ❌ OLD
|
|
147
|
+
'custom.addPrefix': (value, sourceData, helpers) => {
|
|
148
|
+
const prefix = helpers.context?.prefix || 'SKU';
|
|
149
|
+
return `${prefix}-${value}`;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// ✅ NEW
|
|
153
|
+
'custom.addPrefix': (value, sourceData, config, helpers) => {
|
|
154
|
+
const prefix = config.prefix || 'SKU';
|
|
155
|
+
return `${prefix}-${value}`;
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Step 4: Test Migration
|
|
160
|
+
|
|
161
|
+
Write tests to verify behavior is unchanged:
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
import { UniversalMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
165
|
+
|
|
166
|
+
describe('Migrated Resolvers', () => {
|
|
167
|
+
it('should work with new signature', async () => {
|
|
168
|
+
const newResolvers = {
|
|
169
|
+
'custom.addPrefix': (value, sourceData, config, helpers) => {
|
|
170
|
+
const prefix = config.prefix || 'SKU';
|
|
171
|
+
return `${prefix}-${value}`;
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const mapper = new UniversalMapper(
|
|
176
|
+
{
|
|
177
|
+
fields: {
|
|
178
|
+
sku: { source: 'id', resolver: 'custom.addPrefix' }
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
customResolvers: newResolvers,
|
|
183
|
+
context: { prefix: 'PROD' }
|
|
184
|
+
}
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
const result = await mapper.map({ id: '12345' });
|
|
188
|
+
|
|
189
|
+
expect(result.success).toBe(true);
|
|
190
|
+
expect(result.data.sku).toBe('PROD-12345');
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## Common Migration Scenarios
|
|
196
|
+
|
|
197
|
+
### Scenario 1: Simple Context Access
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
// ❌ BEFORE
|
|
201
|
+
'custom.formatDate': (value, sourceData, helpers) => {
|
|
202
|
+
const format = helpers.context?.dateFormat || 'YYYY-MM-DD';
|
|
203
|
+
return helpers.formatDate(value, format);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// ✅ AFTER
|
|
207
|
+
'custom.formatDate': (value, sourceData, config, helpers) => {
|
|
208
|
+
const format = config.dateFormat || 'YYYY-MM-DD';
|
|
209
|
+
return helpers.formatDate(value, format);
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Scenario 2: Nested Context Access
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
// ❌ BEFORE
|
|
217
|
+
'custom.calculateTax': (value, sourceData, helpers) => {
|
|
218
|
+
const region = helpers.get(sourceData, 'customer.region');
|
|
219
|
+
const taxRates = helpers.context?.taxRates || {};
|
|
220
|
+
return value * (taxRates[region] || 0.08);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// ✅ AFTER
|
|
224
|
+
'custom.calculateTax': (value, sourceData, config, helpers) => {
|
|
225
|
+
const region = helpers.get(sourceData, 'customer.region');
|
|
226
|
+
const taxRates = config.taxRates || {};
|
|
227
|
+
return value * (taxRates[region] || 0.08);
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Scenario 3: Multiple Context Values
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
// ❌ BEFORE
|
|
235
|
+
'custom.formatSKU': (value, sourceData, helpers) => {
|
|
236
|
+
const prefix = helpers.context?.skuPrefix || 'SKU';
|
|
237
|
+
const separator = helpers.context?.separator || '-';
|
|
238
|
+
const includeTimestamp = helpers.context?.includeTimestamp || false;
|
|
239
|
+
|
|
240
|
+
let result = `${prefix}${separator}${value}`;
|
|
241
|
+
|
|
242
|
+
if (includeTimestamp) {
|
|
243
|
+
const timestamp = helpers.formatDate(new Date(), 'YYYYMMDD');
|
|
244
|
+
result += `${separator}${timestamp}`;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return result;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// ✅ AFTER
|
|
251
|
+
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
252
|
+
const prefix = config.skuPrefix || 'SKU';
|
|
253
|
+
const separator = config.separator || '-';
|
|
254
|
+
const includeTimestamp = config.includeTimestamp || false;
|
|
255
|
+
|
|
256
|
+
let result = `${prefix}${separator}${value}`;
|
|
257
|
+
|
|
258
|
+
if (includeTimestamp) {
|
|
259
|
+
const timestamp = helpers.formatDate(new Date(), 'YYYYMMDD');
|
|
260
|
+
result += `${separator}${timestamp}`;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return result;
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Scenario 4: Async Resolvers
|
|
268
|
+
|
|
269
|
+
```typescript
|
|
270
|
+
// ❌ BEFORE
|
|
271
|
+
'custom.enrichData': async (value, sourceData, helpers) => {
|
|
272
|
+
if (!helpers.fluentClient) {
|
|
273
|
+
return value;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const enableEnrichment = helpers.context?.enableEnrichment;
|
|
277
|
+
if (!enableEnrichment) {
|
|
278
|
+
return value;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const result = await helpers.fluentClient.graphql({ ... });
|
|
282
|
+
return result.data;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// ✅ AFTER
|
|
286
|
+
'custom.enrichData': async (value, sourceData, config, helpers) => {
|
|
287
|
+
if (!helpers.fluentClient) {
|
|
288
|
+
return value;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const enableEnrichment = config.enableEnrichment;
|
|
292
|
+
if (!enableEnrichment) {
|
|
293
|
+
return value;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const result = await helpers.fluentClient.graphql({ ... });
|
|
297
|
+
return result.data;
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Scenario 5: No Context Used
|
|
302
|
+
|
|
303
|
+
```typescript
|
|
304
|
+
// ❌ BEFORE (3 parameters)
|
|
305
|
+
'custom.uppercase': (value, sourceData, helpers) => {
|
|
306
|
+
return String(value).toUpperCase();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// ✅ AFTER (4 parameters, even if config unused)
|
|
310
|
+
'custom.uppercase': (value, sourceData, config, helpers) => {
|
|
311
|
+
return String(value).toUpperCase();
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Migration Checklist
|
|
316
|
+
|
|
317
|
+
Use this checklist for each resolver:
|
|
318
|
+
|
|
319
|
+
- [ ] **Add config parameter** as 3rd parameter
|
|
320
|
+
- [ ] **Replace `helpers.context`** with `config`
|
|
321
|
+
- [ ] **Update parameter names** (no underscores: `config` not `_config`)
|
|
322
|
+
- [ ] **Test with sample data** to verify behavior
|
|
323
|
+
- [ ] **Update TypeScript types** if using typed resolvers
|
|
324
|
+
- [ ] **Check for any remaining `helpers.context` references**
|
|
325
|
+
- [ ] **Run lint and type checks**
|
|
326
|
+
- [ ] **Update documentation/comments**
|
|
327
|
+
|
|
328
|
+
## Automated Migration Script
|
|
329
|
+
|
|
330
|
+
You can use this script to help identify resolvers needing migration:
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
#!/bin/bash
|
|
334
|
+
# find-old-resolvers.sh
|
|
335
|
+
|
|
336
|
+
# Find files with potential 3-arg resolvers
|
|
337
|
+
grep -r "=> {" src/ | \
|
|
338
|
+
grep -E "\(value,.*sourceData,.*helpers\)" | \
|
|
339
|
+
grep -v "config," | \
|
|
340
|
+
while read -r line; do
|
|
341
|
+
echo "Potential 3-arg resolver: $line"
|
|
342
|
+
done
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## Testing Strategy
|
|
346
|
+
|
|
347
|
+
### Unit Tests
|
|
348
|
+
|
|
349
|
+
```typescript
|
|
350
|
+
describe('Resolver Migration', () => {
|
|
351
|
+
const helpers = createMockHelpers();
|
|
352
|
+
|
|
353
|
+
it('should use config instead of helpers.context', () => {
|
|
354
|
+
const resolver = (value, sourceData, config, helpers) => {
|
|
355
|
+
const prefix = config.prefix || 'DEFAULT';
|
|
356
|
+
return `${prefix}-${value}`;
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
const result = resolver(
|
|
360
|
+
'test',
|
|
361
|
+
{},
|
|
362
|
+
{ prefix: 'PROD' },
|
|
363
|
+
helpers
|
|
364
|
+
);
|
|
365
|
+
|
|
366
|
+
expect(result).toBe('PROD-test');
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
it('should handle missing config gracefully', () => {
|
|
370
|
+
const resolver = (value, sourceData, config, helpers) => {
|
|
371
|
+
const prefix = config?.prefix || 'DEFAULT';
|
|
372
|
+
return `${prefix}-${value}`;
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
const result = resolver('test', {}, {}, helpers);
|
|
376
|
+
|
|
377
|
+
expect(result).toBe('DEFAULT-test');
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### Integration Tests
|
|
383
|
+
|
|
384
|
+
```typescript
|
|
385
|
+
describe('Resolver Integration', () => {
|
|
386
|
+
it('should work with UniversalMapper', async () => {
|
|
387
|
+
const customResolvers = {
|
|
388
|
+
'custom.format': (value, sourceData, config, helpers) => {
|
|
389
|
+
return `${config.prefix || 'X'}-${value}`;
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
const mapper = new UniversalMapper(
|
|
394
|
+
{
|
|
395
|
+
fields: {
|
|
396
|
+
result: { source: 'input', resolver: 'custom.format' }
|
|
397
|
+
}
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
customResolvers,
|
|
401
|
+
context: { prefix: 'TEST' }
|
|
402
|
+
}
|
|
403
|
+
);
|
|
404
|
+
|
|
405
|
+
const result = await mapper.map({ input: 'value' });
|
|
406
|
+
|
|
407
|
+
expect(result.success).toBe(true);
|
|
408
|
+
expect(result.data.result).toBe('TEST-value');
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
it('should work with GraphQLMutationMapper', async () => {
|
|
412
|
+
const customResolvers = {
|
|
413
|
+
'custom.format': (value, sourceData, config, helpers) => {
|
|
414
|
+
return `${config.prefix || 'X'}-${value}`;
|
|
415
|
+
}
|
|
416
|
+
};
|
|
417
|
+
|
|
418
|
+
const mapper = new GraphQLMutationMapper(
|
|
419
|
+
{
|
|
420
|
+
mutation: 'createOrder',
|
|
421
|
+
fields: {
|
|
422
|
+
ref: { source: 'orderId', resolver: 'custom.format' }
|
|
423
|
+
}
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
customResolvers,
|
|
427
|
+
context: { prefix: 'ORD' }
|
|
428
|
+
}
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
const result = await mapper.mapWithNodes({ orderId: '12345' });
|
|
432
|
+
|
|
433
|
+
expect(result.success).toBe(true);
|
|
434
|
+
expect(result.data.ref).toBe('ORD-12345');
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
## Common Pitfalls
|
|
440
|
+
|
|
441
|
+
### Pitfall 1: Forgetting to Add Parameter
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
// ❌ WRONG: Still 3 parameters
|
|
445
|
+
'custom.resolver': (value, sourceData, helpers) => {
|
|
446
|
+
const rate = config.taxRate; // ← ReferenceError: config is not defined
|
|
447
|
+
return value * rate;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// ✅ CORRECT: 4 parameters
|
|
451
|
+
'custom.resolver': (value, sourceData, config, helpers) => {
|
|
452
|
+
const rate = config.taxRate;
|
|
453
|
+
return value * rate;
|
|
454
|
+
}
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
### Pitfall 2: Wrong Parameter Order
|
|
458
|
+
|
|
459
|
+
```typescript
|
|
460
|
+
// ❌ WRONG: config and helpers swapped
|
|
461
|
+
'custom.resolver': (value, sourceData, helpers, config) => {
|
|
462
|
+
return value * config.rate;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// ✅ CORRECT: Standard order
|
|
466
|
+
'custom.resolver': (value, sourceData, config, helpers) => {
|
|
467
|
+
return value * config.rate;
|
|
468
|
+
}
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
### Pitfall 3: Still Using helpers.context
|
|
472
|
+
|
|
473
|
+
```typescript
|
|
474
|
+
// ❌ WRONG: Using old pattern
|
|
475
|
+
'custom.resolver': (value, sourceData, config, helpers) => {
|
|
476
|
+
const rate = helpers.context?.taxRate || 0.1; // ← Old pattern
|
|
477
|
+
return value * rate;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// ✅ CORRECT: Use config parameter
|
|
481
|
+
'custom.resolver': (value, sourceData, config, helpers) => {
|
|
482
|
+
const rate = config.taxRate || 0.1;
|
|
483
|
+
return value * rate;
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
### Pitfall 4: Not Handling Undefined Config
|
|
488
|
+
|
|
489
|
+
```typescript
|
|
490
|
+
// ❌ RISKY: May throw if config is undefined
|
|
491
|
+
'custom.resolver': (value, sourceData, config, helpers) => {
|
|
492
|
+
return value * config.taxRate; // ← Error if config is undefined
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// ✅ SAFE: Handle undefined config
|
|
496
|
+
'custom.resolver': (value, sourceData, config, helpers) => {
|
|
497
|
+
return value * (config?.taxRate || 0.1);
|
|
498
|
+
}
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
## Best Practices After Migration
|
|
502
|
+
|
|
503
|
+
### 1. Always Use All 4 Parameters
|
|
504
|
+
|
|
505
|
+
```typescript
|
|
506
|
+
// ✅ GOOD: Include all 4 even if unused
|
|
507
|
+
'custom.simple': (value, sourceData, config, helpers) => {
|
|
508
|
+
return String(value).toUpperCase();
|
|
509
|
+
}
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
### 2. Use Standard Parameter Names
|
|
513
|
+
|
|
514
|
+
```typescript
|
|
515
|
+
// ✅ GOOD: Standard names
|
|
516
|
+
(value, sourceData, config, helpers) => { ... }
|
|
517
|
+
|
|
518
|
+
// ❌ BAD: Non-standard names
|
|
519
|
+
(val, src, cfg, hlp) => { ... }
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
### 3. Provide Safe Defaults
|
|
523
|
+
|
|
524
|
+
```typescript
|
|
525
|
+
// ✅ GOOD: Safe defaults for config
|
|
526
|
+
'custom.format': (value, sourceData, config, helpers) => {
|
|
527
|
+
const prefix = config?.prefix || 'DEFAULT';
|
|
528
|
+
const separator = config?.separator || '-';
|
|
529
|
+
return `${prefix}${separator}${value}`;
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
### 4. Document Config Requirements
|
|
534
|
+
|
|
535
|
+
```typescript
|
|
536
|
+
/**
|
|
537
|
+
* Formats SKU with configurable prefix and separator
|
|
538
|
+
*
|
|
539
|
+
* @param value - SKU value to format
|
|
540
|
+
* @param sourceData - Full source object
|
|
541
|
+
* @param config - Configuration object
|
|
542
|
+
* @param config.prefix - SKU prefix (default: 'SKU')
|
|
543
|
+
* @param config.separator - Separator character (default: '-')
|
|
544
|
+
* @param helpers - SDK utilities
|
|
545
|
+
*/
|
|
546
|
+
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
547
|
+
const prefix = config?.prefix || 'SKU';
|
|
548
|
+
const separator = config?.separator || '-';
|
|
549
|
+
return `${prefix}${separator}${value}`;
|
|
550
|
+
}
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
### 5. Type Your Resolvers
|
|
554
|
+
|
|
555
|
+
```typescript
|
|
556
|
+
import type { FieldResolverFunction } from '@fluentcommerce/fc-connect-sdk';
|
|
557
|
+
|
|
558
|
+
interface MyConfig {
|
|
559
|
+
prefix?: string;
|
|
560
|
+
separator?: string;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
const resolver: FieldResolverFunction = (
|
|
564
|
+
value: any,
|
|
565
|
+
sourceData: any,
|
|
566
|
+
config: MyConfig,
|
|
567
|
+
helpers: any
|
|
568
|
+
) => {
|
|
569
|
+
const prefix = config?.prefix || 'SKU';
|
|
570
|
+
return `${prefix}-${value}`;
|
|
571
|
+
};
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
## Complete Migration Example
|
|
575
|
+
|
|
576
|
+
### Before
|
|
577
|
+
|
|
578
|
+
```typescript
|
|
579
|
+
// old-resolvers.ts (3-parameter signature)
|
|
580
|
+
export const oldResolvers = {
|
|
581
|
+
'custom.formatSKU': (value, sourceData, helpers) => {
|
|
582
|
+
const prefix = helpers.context?.skuPrefix || 'SKU';
|
|
583
|
+
return `${prefix}-${String(value).toUpperCase()}`;
|
|
584
|
+
},
|
|
585
|
+
|
|
586
|
+
'custom.calculateTax': (value, sourceData, helpers) => {
|
|
587
|
+
const region = helpers.get(sourceData, 'customer.region');
|
|
588
|
+
const taxRates = helpers.context?.taxRates || {};
|
|
589
|
+
return value * (taxRates[region] || 0.08);
|
|
590
|
+
},
|
|
591
|
+
|
|
592
|
+
'custom.enrichProduct': async (sku, sourceData, helpers) => {
|
|
593
|
+
if (!helpers.fluentClient || !helpers.context?.enableEnrichment) {
|
|
594
|
+
return { sku };
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
const result = await helpers.fluentClient.graphql({ ... });
|
|
598
|
+
return result.data.product;
|
|
599
|
+
}
|
|
600
|
+
};
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
### After
|
|
604
|
+
|
|
605
|
+
```typescript
|
|
606
|
+
// new-resolvers.ts (4-parameter signature)
|
|
607
|
+
export const newResolvers = {
|
|
608
|
+
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
609
|
+
const prefix = config.skuPrefix || 'SKU';
|
|
610
|
+
return `${prefix}-${String(value).toUpperCase()}`;
|
|
611
|
+
},
|
|
612
|
+
|
|
613
|
+
'custom.calculateTax': (value, sourceData, config, helpers) => {
|
|
614
|
+
const region = helpers.get(sourceData, 'customer.region');
|
|
615
|
+
const taxRates = config.taxRates || {};
|
|
616
|
+
return value * (taxRates[region] || 0.08);
|
|
617
|
+
},
|
|
618
|
+
|
|
619
|
+
'custom.enrichProduct': async (sku, sourceData, config, helpers) => {
|
|
620
|
+
if (!helpers.fluentClient || !config.enableEnrichment) {
|
|
621
|
+
return { sku };
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
const result = await helpers.fluentClient.graphql({ ... });
|
|
625
|
+
return result.data.product;
|
|
626
|
+
}
|
|
627
|
+
};
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
## Key Takeaways
|
|
631
|
+
|
|
632
|
+
- 🎯 **Add config parameter** - Always include it as 3rd parameter
|
|
633
|
+
- 🎯 **Replace helpers.context** - Use config instead
|
|
634
|
+
- 🎯 **Test thoroughly** - Verify behavior unchanged
|
|
635
|
+
- 🎯 **Use standard names** - value, sourceData, config, helpers
|
|
636
|
+
- 🎯 **Handle undefined** - Use safe defaults (config?.prop || default)
|
|
637
|
+
|
|
638
|
+
## Migration Completion
|
|
639
|
+
|
|
640
|
+
You've successfully migrated when:
|
|
641
|
+
|
|
642
|
+
- ✅ All resolvers have 4 parameters
|
|
643
|
+
- ✅ No references to `helpers.context` remain
|
|
644
|
+
- ✅ All tests pass
|
|
645
|
+
- ✅ TypeScript type checks pass
|
|
646
|
+
- ✅ Lint checks pass
|
|
647
|
+
|
|
648
|
+
## Next Steps
|
|
649
|
+
|
|
650
|
+
Continue to [Module 7: API Reference](../../../02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md) for complete TypeScript types, interfaces, and testing utilities.
|