@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
package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md
CHANGED
|
@@ -1,643 +1,643 @@
|
|
|
1
|
-
# Module 2: Parameter Reference
|
|
2
|
-
|
|
3
|
-
**Level:** Beginner
|
|
4
|
-
**Estimated Time:** 20 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module provides a detailed breakdown of each parameter in the standard 4-parameter resolver signature. You'll learn what each parameter contains, when to use it, and common patterns.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
- ✅ Understand what each parameter contains
|
|
14
|
-
- ✅ Know when to use each parameter
|
|
15
|
-
- ✅ Recognize common patterns for each parameter
|
|
16
|
-
- ✅ Write resolvers that leverage all 4 parameters effectively
|
|
17
|
-
|
|
18
|
-
## The Four Parameters
|
|
19
|
-
|
|
20
|
-
```typescript
|
|
21
|
-
type ResolverFunction = (
|
|
22
|
-
value: any, // ← Parameter 1
|
|
23
|
-
sourceData: any, // ← Parameter 2
|
|
24
|
-
config: any, // ← Parameter 3
|
|
25
|
-
helpers: ResolverHelpers // ← Parameter 4
|
|
26
|
-
) => any | Promise<any>;
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## Parameter 1: `value`
|
|
32
|
-
|
|
33
|
-
### What It Is
|
|
34
|
-
|
|
35
|
-
The extracted field value that needs to be transformed.
|
|
36
|
-
|
|
37
|
-
```typescript
|
|
38
|
-
// For this mapping:
|
|
39
|
-
{ source: "price", resolver: "custom.addTax" }
|
|
40
|
-
|
|
41
|
-
// If sourceData = { price: 19.99, quantity: 5 }
|
|
42
|
-
// Then value = 19.99
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### Where It Comes From
|
|
46
|
-
|
|
47
|
-
| Mapping Config | value Parameter |
|
|
48
|
-
|----------------|-----------------|
|
|
49
|
-
| `{ source: "price" }` | `sourceData.price` |
|
|
50
|
-
| `{ value: "ACTIVE" }` | `"ACTIVE"` (literal) |
|
|
51
|
-
| `{ source: "product.name" }` | Nested value from `sourceData.product.name` |
|
|
52
|
-
| `{ resolver: "custom.gen" }` | `undefined` (generator resolver) |
|
|
53
|
-
|
|
54
|
-
### Common Use Cases
|
|
55
|
-
|
|
56
|
-
**1. Direct Transformation**
|
|
57
|
-
```typescript
|
|
58
|
-
'custom.uppercase': (value, sourceData, config, helpers) => {
|
|
59
|
-
return String(value).toUpperCase();
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Input: value = "widget"
|
|
63
|
-
// Output: "WIDGET"
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
**2. Type Conversion**
|
|
67
|
-
```typescript
|
|
68
|
-
'custom.toNumber': (value, sourceData, config, helpers) => {
|
|
69
|
-
return helpers.parseFloatSafe(value, 0);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Input: value = "19.99"
|
|
73
|
-
// Output: 19.99
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
**3. Validation**
|
|
77
|
-
```typescript
|
|
78
|
-
'custom.validateEmail': (value, sourceData, config, helpers) => {
|
|
79
|
-
if (!helpers.isValidEmail(value)) {
|
|
80
|
-
helpers.log.warn(`Invalid email: ${value}`);
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
return value;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Input: value = "user@example.com"
|
|
87
|
-
// Output: "user@example.com" (if valid) or null (if invalid)
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**4. Generator Resolvers**
|
|
91
|
-
```typescript
|
|
92
|
-
'custom.generateUUID': (value, sourceData, config, helpers) => {
|
|
93
|
-
// value is undefined for generators
|
|
94
|
-
return helpers.uuid();
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Input: value = undefined
|
|
98
|
-
// Output: "550e8400-e29b-41d4-a716-446655440000"
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## Parameter 2: `sourceData`
|
|
104
|
-
|
|
105
|
-
### What It Is
|
|
106
|
-
|
|
107
|
-
The complete source data object. Allows resolvers to access sibling fields and make context-aware transformations.
|
|
108
|
-
|
|
109
|
-
```typescript
|
|
110
|
-
// For this mapping:
|
|
111
|
-
{ source: "price", resolver: "custom.calculateTotal" }
|
|
112
|
-
|
|
113
|
-
// If source document is:
|
|
114
|
-
{
|
|
115
|
-
price: 19.99,
|
|
116
|
-
quantity: 5,
|
|
117
|
-
discount: 10,
|
|
118
|
-
customer: { tier: "gold" }
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Then sourceData = entire object above
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
### Why It Matters
|
|
125
|
-
|
|
126
|
-
Without `sourceData`, resolvers can only transform the single field value. With `sourceData`, resolvers can make decisions based on other fields:
|
|
127
|
-
|
|
128
|
-
```typescript
|
|
129
|
-
// ❌ LIMITED: Can only use price
|
|
130
|
-
'custom.basic': (value, sourceData, config, helpers) => {
|
|
131
|
-
return value * 1.1; // Always add 10%
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// ✅ POWERFUL: Can use price AND customer tier
|
|
135
|
-
'custom.smart': (value, sourceData, config, helpers) => {
|
|
136
|
-
const tier = helpers.get(sourceData, 'customer.tier');
|
|
137
|
-
const multiplier = tier === 'gold' ? 1.05 : 1.1;
|
|
138
|
-
return value * multiplier; // 5% for gold, 10% for others
|
|
139
|
-
}
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### Common Use Cases
|
|
143
|
-
|
|
144
|
-
**1. Multi-Field Calculations**
|
|
145
|
-
```typescript
|
|
146
|
-
'custom.calculateTotal': (basePrice, sourceData, config, helpers) => {
|
|
147
|
-
// Access sibling fields
|
|
148
|
-
const quantity = helpers.get(sourceData, 'quantity') || 1;
|
|
149
|
-
const discount = helpers.get(sourceData, 'discount') || 0;
|
|
150
|
-
|
|
151
|
-
// Calculate using multiple fields
|
|
152
|
-
const subtotal = basePrice * quantity;
|
|
153
|
-
const afterDiscount = subtotal * (1 - discount / 100);
|
|
154
|
-
|
|
155
|
-
return helpers.parseFloatSafe(afterDiscount, 0);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// sourceData: { price: 19.99, quantity: 5, discount: 10 }
|
|
159
|
-
// value: 19.99
|
|
160
|
-
// Output: 89.955 (19.99 * 5 * 0.9)
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
**2. Conditional Logic Based on Context**
|
|
164
|
-
```typescript
|
|
165
|
-
'custom.calculateTax': (price, sourceData, config, helpers) => {
|
|
166
|
-
// Tax rate depends on customer region
|
|
167
|
-
const region = helpers.get(sourceData, 'customer.region');
|
|
168
|
-
|
|
169
|
-
const taxRates = {
|
|
170
|
-
'CA': 0.0975,
|
|
171
|
-
'NY': 0.08875,
|
|
172
|
-
'TX': 0.0625
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
const taxRate = taxRates[region] || 0.08;
|
|
176
|
-
return price * taxRate;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// sourceData: { price: 100, customer: { region: 'CA' } }
|
|
180
|
-
// value: 100
|
|
181
|
-
// Output: 9.75
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
**3. Accessing Nested Fields**
|
|
185
|
-
```typescript
|
|
186
|
-
'custom.formatAddress': (value, sourceData, config, helpers) => {
|
|
187
|
-
// Access deeply nested fields
|
|
188
|
-
const street = helpers.get(sourceData, 'customer.address.street');
|
|
189
|
-
const city = helpers.get(sourceData, 'customer.address.city');
|
|
190
|
-
const state = helpers.get(sourceData, 'customer.address.state');
|
|
191
|
-
const zip = helpers.get(sourceData, 'customer.address.zip');
|
|
192
|
-
|
|
193
|
-
return `${street}, ${city}, ${state} ${zip}`;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// sourceData: { customer: { address: { street: "123 Main St", ... } } }
|
|
197
|
-
// Output: "123 Main St, Springfield, IL 62701"
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
**4. Array Processing**
|
|
201
|
-
```typescript
|
|
202
|
-
'custom.countItems': (value, sourceData, config, helpers) => {
|
|
203
|
-
// Count items in an array
|
|
204
|
-
const items = helpers.get(sourceData, 'items') || [];
|
|
205
|
-
return helpers.ensureArray(items).length;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// sourceData: { items: [{}, {}, {}] }
|
|
209
|
-
// Output: 3
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
## Parameter 3: `config`
|
|
215
|
-
|
|
216
|
-
### What It Is
|
|
217
|
-
|
|
218
|
-
Business rules and configuration passed to the mapper via the `context` option.
|
|
219
|
-
|
|
220
|
-
```typescript
|
|
221
|
-
// When creating mapper:
|
|
222
|
-
const mapper = new UniversalMapper(mapping, {
|
|
223
|
-
customResolvers: { 'custom.tax': myResolver },
|
|
224
|
-
context: { // ← This becomes 'config' parameter
|
|
225
|
-
taxRate: 0.1,
|
|
226
|
-
skuPrefix: 'PROD',
|
|
227
|
-
currency: 'USD'
|
|
228
|
-
}
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
// In resolver:
|
|
232
|
-
'custom.addTax': (value, sourceData, config, helpers) => {
|
|
233
|
-
const rate = config.taxRate; // ← Access context here
|
|
234
|
-
return value * (1 + rate);
|
|
235
|
-
}
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
### Why It Matters
|
|
239
|
-
|
|
240
|
-
Configuration allows you to write reusable resolvers that behave differently based on runtime settings:
|
|
241
|
-
|
|
242
|
-
```typescript
|
|
243
|
-
// ✅ GOOD: Configurable behavior
|
|
244
|
-
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
245
|
-
const prefix = config.skuPrefix || 'SKU';
|
|
246
|
-
return `${prefix}-${value}`;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// Use with different prefixes:
|
|
250
|
-
const csvMapper = new UniversalMapper(mapping, {
|
|
251
|
-
context: { skuPrefix: 'CSV' }
|
|
252
|
-
});
|
|
253
|
-
// Output: "CSV-123"
|
|
254
|
-
|
|
255
|
-
const xmlMapper = new UniversalMapper(mapping, {
|
|
256
|
-
context: { skuPrefix: 'XML' }
|
|
257
|
-
});
|
|
258
|
-
// Output: "XML-123"
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
### Common Use Cases
|
|
262
|
-
|
|
263
|
-
**1. Environment-Specific Settings**
|
|
264
|
-
```typescript
|
|
265
|
-
'custom.formatPrice': (value, sourceData, config, helpers) => {
|
|
266
|
-
const currency = config.currency || 'USD';
|
|
267
|
-
const locale = config.locale || 'en-US';
|
|
268
|
-
|
|
269
|
-
return helpers.formatCurrency(value, currency, locale);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// Development: USD
|
|
273
|
-
const devMapper = new UniversalMapper(mapping, {
|
|
274
|
-
context: { currency: 'USD', locale: 'en-US' }
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
// Production (EU): EUR
|
|
278
|
-
const prodMapper = new UniversalMapper(mapping, {
|
|
279
|
-
context: { currency: 'EUR', locale: 'de-DE' }
|
|
280
|
-
});
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
**2. Business Rule Configuration**
|
|
284
|
-
```typescript
|
|
285
|
-
'custom.applyDiscount': (price, sourceData, config, helpers) => {
|
|
286
|
-
const discountRules = config.discountRules || {};
|
|
287
|
-
|
|
288
|
-
const quantity = helpers.get(sourceData, 'quantity') || 1;
|
|
289
|
-
|
|
290
|
-
// Apply volume discounts based on rules
|
|
291
|
-
if (quantity >= 100 && discountRules.bulk) {
|
|
292
|
-
return price * (1 - discountRules.bulk);
|
|
293
|
-
} else if (quantity >= 10 && discountRules.volume) {
|
|
294
|
-
return price * (1 - discountRules.volume);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
return price;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
// Mapper with discount rules
|
|
301
|
-
const mapper = new UniversalMapper(mapping, {
|
|
302
|
-
context: {
|
|
303
|
-
discountRules: {
|
|
304
|
-
volume: 0.05, // 5% off for 10+
|
|
305
|
-
bulk: 0.15 // 15% off for 100+
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
});
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
**3. Feature Flags**
|
|
312
|
-
```typescript
|
|
313
|
-
'custom.enrichData': async (value, sourceData, config, helpers) => {
|
|
314
|
-
// Check feature flag
|
|
315
|
-
if (!config.enableEnrichment) {
|
|
316
|
-
return value; // Skip enrichment if disabled
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// Perform expensive enrichment
|
|
320
|
-
const enriched = await helpers.fluentClient.graphql({ ... });
|
|
321
|
-
return enriched;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// Development: enrichment disabled
|
|
325
|
-
const devMapper = new UniversalMapper(mapping, {
|
|
326
|
-
context: { enableEnrichment: false }
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
// Production: enrichment enabled
|
|
330
|
-
const prodMapper = new UniversalMapper(mapping, {
|
|
331
|
-
context: { enableEnrichment: true }
|
|
332
|
-
});
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
**4. Lookup Tables**
|
|
336
|
-
```typescript
|
|
337
|
-
'custom.mapCategory': (value, sourceData, config, helpers) => {
|
|
338
|
-
const categoryMap = config.categoryMapping || {};
|
|
339
|
-
|
|
340
|
-
// Map external category to internal category
|
|
341
|
-
return categoryMap[value] || value;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
// Mapper with category mapping
|
|
345
|
-
const mapper = new UniversalMapper(mapping, {
|
|
346
|
-
context: {
|
|
347
|
-
categoryMapping: {
|
|
348
|
-
'ELEC': 'Electronics',
|
|
349
|
-
'CLTH': 'Clothing',
|
|
350
|
-
'FOOD': 'Groceries'
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
});
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
---
|
|
357
|
-
|
|
358
|
-
## Parameter 4: `helpers`
|
|
359
|
-
|
|
360
|
-
### What It Is
|
|
361
|
-
|
|
362
|
-
SDK utilities and user-provided context. Contains 54 helper functions plus access to logger and FluentClient.
|
|
363
|
-
|
|
364
|
-
```typescript
|
|
365
|
-
interface ResolverHelpers {
|
|
366
|
-
// Core utilities (54 helper functions)
|
|
367
|
-
get, set, formatDate, formatCurrency, parseFloatSafe, parseIntSafe,
|
|
368
|
-
extractCustomAttribute, safeJsonParse, mapValue, isValidEmail,
|
|
369
|
-
requireField, fullName, truncate, normalizeWhitespace,
|
|
370
|
-
|
|
371
|
-
// Data transformation
|
|
372
|
-
toCamelCase, toSnakeCase, deepClone, deepMerge,
|
|
373
|
-
|
|
374
|
-
// Array operations
|
|
375
|
-
ensureArray, coalesce, groupBy, keyBy, chunk, flatten, unique,
|
|
376
|
-
sortBy, compact, sum, avg, min, max, clamp, merge,
|
|
377
|
-
|
|
378
|
-
// String operations
|
|
379
|
-
template, slugify, uuid, hashString,
|
|
380
|
-
|
|
381
|
-
// Date operations
|
|
382
|
-
addDays, subtractDays, dateDiff, parseDate,
|
|
383
|
-
|
|
384
|
-
// Performance
|
|
385
|
-
memoize, batchProcess, retry, debounce, throttle,
|
|
386
|
-
|
|
387
|
-
// Type checks
|
|
388
|
-
isString, isNumber, isArray, isObject, isDate,
|
|
389
|
-
|
|
390
|
-
// Additional context
|
|
391
|
-
log: Logger, // Logger instance
|
|
392
|
-
fluentClient?: any, // Fluent API client (for async operations)
|
|
393
|
-
context?: any // User-provided shared config (use config parameter instead)
|
|
394
|
-
}
|
|
395
|
-
```
|
|
396
|
-
|
|
397
|
-
### Why It Matters
|
|
398
|
-
|
|
399
|
-
Helpers provide safe, tested utilities so you don't have to reinvent common operations:
|
|
400
|
-
|
|
401
|
-
> **⚠️ IMPORTANT: Common Mistake**
|
|
402
|
-
>
|
|
403
|
-
> `toString()` is NOT a helper function. Use native `String(value)` instead.
|
|
404
|
-
>
|
|
405
|
-
> ```typescript
|
|
406
|
-
> // ❌ WRONG - helpers.toString() doesn't exist
|
|
407
|
-
> const str = helpers.toString(value);
|
|
408
|
-
>
|
|
409
|
-
> // ✅ CORRECT - Use native String()
|
|
410
|
-
> const str = String(value);
|
|
411
|
-
>
|
|
412
|
-
> // ✅ ALSO CORRECT - Use sdk.toString resolver for mapping config
|
|
413
|
-
> "field": { source: "value", resolver: "sdk.toString" }
|
|
414
|
-
> ```
|
|
415
|
-
|
|
416
|
-
```typescript
|
|
417
|
-
// ❌ BAD: Unsafe operations
|
|
418
|
-
'custom.unsafe': (value, sourceData, config, helpers) => {
|
|
419
|
-
return parseFloat(value); // NaN if value is "abc"
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
// ✅ GOOD: Safe operations with helpers
|
|
423
|
-
'custom.safe': (value, sourceData, config, helpers) => {
|
|
424
|
-
return helpers.parseFloatSafe(value, 0); // Returns 0 if value is "abc"
|
|
425
|
-
}
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
### Common Use Cases
|
|
429
|
-
|
|
430
|
-
**1. Safe Type Conversion**
|
|
431
|
-
```typescript
|
|
432
|
-
'custom.safeConvert': (value, sourceData, config, helpers) => {
|
|
433
|
-
const numeric = helpers.parseFloatSafe(value, 0);
|
|
434
|
-
const integer = helpers.parseIntSafe(value, 0);
|
|
435
|
-
const string = String(value); // Use native String() for conversion
|
|
436
|
-
const boolean = helpers.isString(value) && value.toLowerCase() === 'true';
|
|
437
|
-
|
|
438
|
-
return { numeric, integer, string, boolean };
|
|
439
|
-
}
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
**2. Date Formatting**
|
|
443
|
-
```typescript
|
|
444
|
-
'custom.formatDate': (value, sourceData, config, helpers) => {
|
|
445
|
-
// formatDate() returns ISO8601 string
|
|
446
|
-
return helpers.formatDate(value); // Returns ISO8601 format
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
// Input: value = "2025-01-15T10:30:00Z"
|
|
450
|
-
// Output: "2025-01-15"
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
**3. Nested Field Access**
|
|
454
|
-
```typescript
|
|
455
|
-
'custom.getNestedField': (value, sourceData, config, helpers) => {
|
|
456
|
-
// Safely access nested fields
|
|
457
|
-
const name = helpers.get(sourceData, 'customer.contact.name', 'Unknown');
|
|
458
|
-
|
|
459
|
-
// Returns 'Unknown' if path doesn't exist
|
|
460
|
-
return name;
|
|
461
|
-
}
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
**4. Array Operations**
|
|
465
|
-
```typescript
|
|
466
|
-
'custom.processArray': (value, sourceData, config, helpers) => {
|
|
467
|
-
const items = helpers.ensureArray(value);
|
|
468
|
-
|
|
469
|
-
// Array utilities
|
|
470
|
-
const unique = helpers.unique(items);
|
|
471
|
-
const sorted = helpers.sortBy(unique, 'price');
|
|
472
|
-
const summed = helpers.sum(sorted.map(i => i.price));
|
|
473
|
-
|
|
474
|
-
return { unique, sorted, total: summed };
|
|
475
|
-
}
|
|
476
|
-
```
|
|
477
|
-
|
|
478
|
-
**5. Logging**
|
|
479
|
-
```typescript
|
|
480
|
-
'custom.debugTransform': (value, sourceData, config, helpers) => {
|
|
481
|
-
helpers.log.debug(`Transforming value: ${value}`);
|
|
482
|
-
|
|
483
|
-
const result = String(value).toUpperCase(); // Use native String()
|
|
484
|
-
|
|
485
|
-
helpers.log.debug(`Result: ${result}`);
|
|
486
|
-
|
|
487
|
-
return result;
|
|
488
|
-
}
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
**6. Async API Calls**
|
|
492
|
-
```typescript
|
|
493
|
-
'custom.fetchData': async (id, sourceData, config, helpers) => {
|
|
494
|
-
if (!helpers.fluentClient) {
|
|
495
|
-
helpers.log.warn('FluentClient not available');
|
|
496
|
-
return null;
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
try {
|
|
500
|
-
const result = await helpers.fluentClient.graphql({
|
|
501
|
-
query: `query { product(id: "${id}") { name } }`
|
|
502
|
-
});
|
|
503
|
-
|
|
504
|
-
return result.data.product;
|
|
505
|
-
} catch (error) {
|
|
506
|
-
helpers.log.error('API call failed', error);
|
|
507
|
-
return null;
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
```
|
|
511
|
-
|
|
512
|
-
---
|
|
513
|
-
|
|
514
|
-
## Using All 4 Parameters Together
|
|
515
|
-
|
|
516
|
-
### Complex Real-World Example
|
|
517
|
-
|
|
518
|
-
```typescript
|
|
519
|
-
'custom.complexTransform': (value, sourceData, config, helpers) => {
|
|
520
|
-
// 1. Use VALUE - the field being transformed
|
|
521
|
-
const basePrice = helpers.parseFloatSafe(value, 0);
|
|
522
|
-
|
|
523
|
-
// 2. Use SOURCEDATA - access related fields
|
|
524
|
-
const quantity = helpers.get(sourceData, 'quantity') || 1;
|
|
525
|
-
const category = helpers.get(sourceData, 'product.category');
|
|
526
|
-
const customerTier = helpers.get(sourceData, 'customer.tier');
|
|
527
|
-
|
|
528
|
-
// 3. Use CONFIG - business rules
|
|
529
|
-
const categoryMultipliers = config.categoryMultipliers || {};
|
|
530
|
-
const tierDiscounts = config.tierDiscounts || {};
|
|
531
|
-
|
|
532
|
-
// 4. Use HELPERS - utilities
|
|
533
|
-
const multiplier = categoryMultipliers[category] || 1;
|
|
534
|
-
const discount = tierDiscounts[customerTier] || 0;
|
|
535
|
-
|
|
536
|
-
// Complex calculation
|
|
537
|
-
const subtotal = basePrice * quantity * multiplier;
|
|
538
|
-
const afterDiscount = subtotal * (1 - discount);
|
|
539
|
-
const final = helpers.parseFloatSafe(afterDiscount, 0);
|
|
540
|
-
|
|
541
|
-
helpers.log.debug(`Calculated price: ${final}`);
|
|
542
|
-
|
|
543
|
-
return final;
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
// Usage with full context
|
|
547
|
-
const mapper = new UniversalMapper(mapping, {
|
|
548
|
-
customResolvers: { 'custom.complexTransform': complexTransform },
|
|
549
|
-
context: {
|
|
550
|
-
categoryMultipliers: {
|
|
551
|
-
'electronics': 1.5,
|
|
552
|
-
'books': 1.2,
|
|
553
|
-
'clothing': 1.3
|
|
554
|
-
},
|
|
555
|
-
tierDiscounts: {
|
|
556
|
-
'gold': 0.15,
|
|
557
|
-
'silver': 0.10,
|
|
558
|
-
'bronze': 0.05
|
|
559
|
-
}
|
|
560
|
-
},
|
|
561
|
-
logger: myLogger
|
|
562
|
-
});
|
|
563
|
-
```
|
|
564
|
-
|
|
565
|
-
## Parameter Naming Convention
|
|
566
|
-
|
|
567
|
-
Always use these exact parameter names:
|
|
568
|
-
|
|
569
|
-
```typescript
|
|
570
|
-
// ✅ CORRECT - Standard names
|
|
571
|
-
(value, sourceData, config, helpers) => { ... }
|
|
572
|
-
|
|
573
|
-
// ❌ WRONG - Non-standard names
|
|
574
|
-
(val, src, cfg, hlp) => { ... }
|
|
575
|
-
(v, data, c, h) => { ... }
|
|
576
|
-
(fieldValue, record, options, utils) => { ... }
|
|
577
|
-
```
|
|
578
|
-
|
|
579
|
-
Standard names improve:
|
|
580
|
-
- Code readability
|
|
581
|
-
- Documentation clarity
|
|
582
|
-
- Team collaboration
|
|
583
|
-
- Error message clarity
|
|
584
|
-
|
|
585
|
-
## Key Takeaways
|
|
586
|
-
|
|
587
|
-
- 🎯 **value** - The extracted field value to transform
|
|
588
|
-
- 🎯 **sourceData** - Complete source object for context-aware transformations
|
|
589
|
-
- 🎯 **config** - Business rules passed via mapper `context` option
|
|
590
|
-
- 🎯 **helpers** - 54 SDK utility functions + logger + fluentClient
|
|
591
|
-
- 🎯 **Use all 4** - Even if you only need one, include all four parameters
|
|
592
|
-
- 🎯 **Standard names** - Always use `value`, `sourceData`, `config`, `helpers`
|
|
593
|
-
|
|
594
|
-
## Practice Exercise
|
|
595
|
-
|
|
596
|
-
Write a resolver that uses all 4 parameters to calculate a shipping cost:
|
|
597
|
-
|
|
598
|
-
**Requirements:**
|
|
599
|
-
- Base shipping rate from `value`
|
|
600
|
-
- Weight from `sourceData.weight`
|
|
601
|
-
- Shipping zone from `config.shippingZones`
|
|
602
|
-
- Use `helpers.parseFloatSafe` for safety
|
|
603
|
-
|
|
604
|
-
<details>
|
|
605
|
-
<summary>Show Solution</summary>
|
|
606
|
-
|
|
607
|
-
```typescript
|
|
608
|
-
'custom.calculateShipping': (baseRate, sourceData, config, helpers) => {
|
|
609
|
-
// 1. VALUE: Base shipping rate
|
|
610
|
-
const rate = helpers.parseFloatSafe(baseRate, 5.00);
|
|
611
|
-
|
|
612
|
-
// 2. SOURCEDATA: Get weight from source
|
|
613
|
-
const weight = helpers.get(sourceData, 'weight') || 1;
|
|
614
|
-
const zone = helpers.get(sourceData, 'address.zone');
|
|
615
|
-
|
|
616
|
-
// 3. CONFIG: Zone multipliers
|
|
617
|
-
const zoneMultipliers = config.shippingZones || {};
|
|
618
|
-
const multiplier = zoneMultipliers[zone] || 1;
|
|
619
|
-
|
|
620
|
-
// 4. HELPERS: Safe calculations
|
|
621
|
-
const shipping = rate * weight * multiplier;
|
|
622
|
-
|
|
623
|
-
return helpers.parseFloatSafe(shipping, rate);
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
// Usage
|
|
627
|
-
const mapper = new UniversalMapper(mapping, {
|
|
628
|
-
customResolvers: { 'custom.calculateShipping': calculateShipping },
|
|
629
|
-
context: {
|
|
630
|
-
shippingZones: {
|
|
631
|
-
'local': 1.0,
|
|
632
|
-
'regional': 1.5,
|
|
633
|
-
'national': 2.0,
|
|
634
|
-
'international': 3.0
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
});
|
|
638
|
-
```
|
|
639
|
-
</details>
|
|
640
|
-
|
|
641
|
-
## Next Steps
|
|
642
|
-
|
|
643
|
-
Continue to [Module 3: Basic Examples](./resolver-signature-03-basic-examples.md) to see simple, practical examples you can use immediately.
|
|
1
|
+
# Module 2: Parameter Reference
|
|
2
|
+
|
|
3
|
+
**Level:** Beginner
|
|
4
|
+
**Estimated Time:** 20 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module provides a detailed breakdown of each parameter in the standard 4-parameter resolver signature. You'll learn what each parameter contains, when to use it, and common patterns.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
- ✅ Understand what each parameter contains
|
|
14
|
+
- ✅ Know when to use each parameter
|
|
15
|
+
- ✅ Recognize common patterns for each parameter
|
|
16
|
+
- ✅ Write resolvers that leverage all 4 parameters effectively
|
|
17
|
+
|
|
18
|
+
## The Four Parameters
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
type ResolverFunction = (
|
|
22
|
+
value: any, // ← Parameter 1
|
|
23
|
+
sourceData: any, // ← Parameter 2
|
|
24
|
+
config: any, // ← Parameter 3
|
|
25
|
+
helpers: ResolverHelpers // ← Parameter 4
|
|
26
|
+
) => any | Promise<any>;
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Parameter 1: `value`
|
|
32
|
+
|
|
33
|
+
### What It Is
|
|
34
|
+
|
|
35
|
+
The extracted field value that needs to be transformed.
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// For this mapping:
|
|
39
|
+
{ source: "price", resolver: "custom.addTax" }
|
|
40
|
+
|
|
41
|
+
// If sourceData = { price: 19.99, quantity: 5 }
|
|
42
|
+
// Then value = 19.99
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Where It Comes From
|
|
46
|
+
|
|
47
|
+
| Mapping Config | value Parameter |
|
|
48
|
+
|----------------|-----------------|
|
|
49
|
+
| `{ source: "price" }` | `sourceData.price` |
|
|
50
|
+
| `{ value: "ACTIVE" }` | `"ACTIVE"` (literal) |
|
|
51
|
+
| `{ source: "product.name" }` | Nested value from `sourceData.product.name` |
|
|
52
|
+
| `{ resolver: "custom.gen" }` | `undefined` (generator resolver) |
|
|
53
|
+
|
|
54
|
+
### Common Use Cases
|
|
55
|
+
|
|
56
|
+
**1. Direct Transformation**
|
|
57
|
+
```typescript
|
|
58
|
+
'custom.uppercase': (value, sourceData, config, helpers) => {
|
|
59
|
+
return String(value).toUpperCase();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Input: value = "widget"
|
|
63
|
+
// Output: "WIDGET"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**2. Type Conversion**
|
|
67
|
+
```typescript
|
|
68
|
+
'custom.toNumber': (value, sourceData, config, helpers) => {
|
|
69
|
+
return helpers.parseFloatSafe(value, 0);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Input: value = "19.99"
|
|
73
|
+
// Output: 19.99
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**3. Validation**
|
|
77
|
+
```typescript
|
|
78
|
+
'custom.validateEmail': (value, sourceData, config, helpers) => {
|
|
79
|
+
if (!helpers.isValidEmail(value)) {
|
|
80
|
+
helpers.log.warn(`Invalid email: ${value}`);
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Input: value = "user@example.com"
|
|
87
|
+
// Output: "user@example.com" (if valid) or null (if invalid)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**4. Generator Resolvers**
|
|
91
|
+
```typescript
|
|
92
|
+
'custom.generateUUID': (value, sourceData, config, helpers) => {
|
|
93
|
+
// value is undefined for generators
|
|
94
|
+
return helpers.uuid();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Input: value = undefined
|
|
98
|
+
// Output: "550e8400-e29b-41d4-a716-446655440000"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Parameter 2: `sourceData`
|
|
104
|
+
|
|
105
|
+
### What It Is
|
|
106
|
+
|
|
107
|
+
The complete source data object. Allows resolvers to access sibling fields and make context-aware transformations.
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
// For this mapping:
|
|
111
|
+
{ source: "price", resolver: "custom.calculateTotal" }
|
|
112
|
+
|
|
113
|
+
// If source document is:
|
|
114
|
+
{
|
|
115
|
+
price: 19.99,
|
|
116
|
+
quantity: 5,
|
|
117
|
+
discount: 10,
|
|
118
|
+
customer: { tier: "gold" }
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Then sourceData = entire object above
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Why It Matters
|
|
125
|
+
|
|
126
|
+
Without `sourceData`, resolvers can only transform the single field value. With `sourceData`, resolvers can make decisions based on other fields:
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
// ❌ LIMITED: Can only use price
|
|
130
|
+
'custom.basic': (value, sourceData, config, helpers) => {
|
|
131
|
+
return value * 1.1; // Always add 10%
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// ✅ POWERFUL: Can use price AND customer tier
|
|
135
|
+
'custom.smart': (value, sourceData, config, helpers) => {
|
|
136
|
+
const tier = helpers.get(sourceData, 'customer.tier');
|
|
137
|
+
const multiplier = tier === 'gold' ? 1.05 : 1.1;
|
|
138
|
+
return value * multiplier; // 5% for gold, 10% for others
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Common Use Cases
|
|
143
|
+
|
|
144
|
+
**1. Multi-Field Calculations**
|
|
145
|
+
```typescript
|
|
146
|
+
'custom.calculateTotal': (basePrice, sourceData, config, helpers) => {
|
|
147
|
+
// Access sibling fields
|
|
148
|
+
const quantity = helpers.get(sourceData, 'quantity') || 1;
|
|
149
|
+
const discount = helpers.get(sourceData, 'discount') || 0;
|
|
150
|
+
|
|
151
|
+
// Calculate using multiple fields
|
|
152
|
+
const subtotal = basePrice * quantity;
|
|
153
|
+
const afterDiscount = subtotal * (1 - discount / 100);
|
|
154
|
+
|
|
155
|
+
return helpers.parseFloatSafe(afterDiscount, 0);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// sourceData: { price: 19.99, quantity: 5, discount: 10 }
|
|
159
|
+
// value: 19.99
|
|
160
|
+
// Output: 89.955 (19.99 * 5 * 0.9)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**2. Conditional Logic Based on Context**
|
|
164
|
+
```typescript
|
|
165
|
+
'custom.calculateTax': (price, sourceData, config, helpers) => {
|
|
166
|
+
// Tax rate depends on customer region
|
|
167
|
+
const region = helpers.get(sourceData, 'customer.region');
|
|
168
|
+
|
|
169
|
+
const taxRates = {
|
|
170
|
+
'CA': 0.0975,
|
|
171
|
+
'NY': 0.08875,
|
|
172
|
+
'TX': 0.0625
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const taxRate = taxRates[region] || 0.08;
|
|
176
|
+
return price * taxRate;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// sourceData: { price: 100, customer: { region: 'CA' } }
|
|
180
|
+
// value: 100
|
|
181
|
+
// Output: 9.75
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**3. Accessing Nested Fields**
|
|
185
|
+
```typescript
|
|
186
|
+
'custom.formatAddress': (value, sourceData, config, helpers) => {
|
|
187
|
+
// Access deeply nested fields
|
|
188
|
+
const street = helpers.get(sourceData, 'customer.address.street');
|
|
189
|
+
const city = helpers.get(sourceData, 'customer.address.city');
|
|
190
|
+
const state = helpers.get(sourceData, 'customer.address.state');
|
|
191
|
+
const zip = helpers.get(sourceData, 'customer.address.zip');
|
|
192
|
+
|
|
193
|
+
return `${street}, ${city}, ${state} ${zip}`;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// sourceData: { customer: { address: { street: "123 Main St", ... } } }
|
|
197
|
+
// Output: "123 Main St, Springfield, IL 62701"
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**4. Array Processing**
|
|
201
|
+
```typescript
|
|
202
|
+
'custom.countItems': (value, sourceData, config, helpers) => {
|
|
203
|
+
// Count items in an array
|
|
204
|
+
const items = helpers.get(sourceData, 'items') || [];
|
|
205
|
+
return helpers.ensureArray(items).length;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// sourceData: { items: [{}, {}, {}] }
|
|
209
|
+
// Output: 3
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Parameter 3: `config`
|
|
215
|
+
|
|
216
|
+
### What It Is
|
|
217
|
+
|
|
218
|
+
Business rules and configuration passed to the mapper via the `context` option.
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
// When creating mapper:
|
|
222
|
+
const mapper = new UniversalMapper(mapping, {
|
|
223
|
+
customResolvers: { 'custom.tax': myResolver },
|
|
224
|
+
context: { // ← This becomes 'config' parameter
|
|
225
|
+
taxRate: 0.1,
|
|
226
|
+
skuPrefix: 'PROD',
|
|
227
|
+
currency: 'USD'
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// In resolver:
|
|
232
|
+
'custom.addTax': (value, sourceData, config, helpers) => {
|
|
233
|
+
const rate = config.taxRate; // ← Access context here
|
|
234
|
+
return value * (1 + rate);
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Why It Matters
|
|
239
|
+
|
|
240
|
+
Configuration allows you to write reusable resolvers that behave differently based on runtime settings:
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
// ✅ GOOD: Configurable behavior
|
|
244
|
+
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
245
|
+
const prefix = config.skuPrefix || 'SKU';
|
|
246
|
+
return `${prefix}-${value}`;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Use with different prefixes:
|
|
250
|
+
const csvMapper = new UniversalMapper(mapping, {
|
|
251
|
+
context: { skuPrefix: 'CSV' }
|
|
252
|
+
});
|
|
253
|
+
// Output: "CSV-123"
|
|
254
|
+
|
|
255
|
+
const xmlMapper = new UniversalMapper(mapping, {
|
|
256
|
+
context: { skuPrefix: 'XML' }
|
|
257
|
+
});
|
|
258
|
+
// Output: "XML-123"
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Common Use Cases
|
|
262
|
+
|
|
263
|
+
**1. Environment-Specific Settings**
|
|
264
|
+
```typescript
|
|
265
|
+
'custom.formatPrice': (value, sourceData, config, helpers) => {
|
|
266
|
+
const currency = config.currency || 'USD';
|
|
267
|
+
const locale = config.locale || 'en-US';
|
|
268
|
+
|
|
269
|
+
return helpers.formatCurrency(value, currency, locale);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Development: USD
|
|
273
|
+
const devMapper = new UniversalMapper(mapping, {
|
|
274
|
+
context: { currency: 'USD', locale: 'en-US' }
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
// Production (EU): EUR
|
|
278
|
+
const prodMapper = new UniversalMapper(mapping, {
|
|
279
|
+
context: { currency: 'EUR', locale: 'de-DE' }
|
|
280
|
+
});
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**2. Business Rule Configuration**
|
|
284
|
+
```typescript
|
|
285
|
+
'custom.applyDiscount': (price, sourceData, config, helpers) => {
|
|
286
|
+
const discountRules = config.discountRules || {};
|
|
287
|
+
|
|
288
|
+
const quantity = helpers.get(sourceData, 'quantity') || 1;
|
|
289
|
+
|
|
290
|
+
// Apply volume discounts based on rules
|
|
291
|
+
if (quantity >= 100 && discountRules.bulk) {
|
|
292
|
+
return price * (1 - discountRules.bulk);
|
|
293
|
+
} else if (quantity >= 10 && discountRules.volume) {
|
|
294
|
+
return price * (1 - discountRules.volume);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return price;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Mapper with discount rules
|
|
301
|
+
const mapper = new UniversalMapper(mapping, {
|
|
302
|
+
context: {
|
|
303
|
+
discountRules: {
|
|
304
|
+
volume: 0.05, // 5% off for 10+
|
|
305
|
+
bulk: 0.15 // 15% off for 100+
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**3. Feature Flags**
|
|
312
|
+
```typescript
|
|
313
|
+
'custom.enrichData': async (value, sourceData, config, helpers) => {
|
|
314
|
+
// Check feature flag
|
|
315
|
+
if (!config.enableEnrichment) {
|
|
316
|
+
return value; // Skip enrichment if disabled
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Perform expensive enrichment
|
|
320
|
+
const enriched = await helpers.fluentClient.graphql({ ... });
|
|
321
|
+
return enriched;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Development: enrichment disabled
|
|
325
|
+
const devMapper = new UniversalMapper(mapping, {
|
|
326
|
+
context: { enableEnrichment: false }
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
// Production: enrichment enabled
|
|
330
|
+
const prodMapper = new UniversalMapper(mapping, {
|
|
331
|
+
context: { enableEnrichment: true }
|
|
332
|
+
});
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**4. Lookup Tables**
|
|
336
|
+
```typescript
|
|
337
|
+
'custom.mapCategory': (value, sourceData, config, helpers) => {
|
|
338
|
+
const categoryMap = config.categoryMapping || {};
|
|
339
|
+
|
|
340
|
+
// Map external category to internal category
|
|
341
|
+
return categoryMap[value] || value;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// Mapper with category mapping
|
|
345
|
+
const mapper = new UniversalMapper(mapping, {
|
|
346
|
+
context: {
|
|
347
|
+
categoryMapping: {
|
|
348
|
+
'ELEC': 'Electronics',
|
|
349
|
+
'CLTH': 'Clothing',
|
|
350
|
+
'FOOD': 'Groceries'
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Parameter 4: `helpers`
|
|
359
|
+
|
|
360
|
+
### What It Is
|
|
361
|
+
|
|
362
|
+
SDK utilities and user-provided context. Contains 54 helper functions plus access to logger and FluentClient.
|
|
363
|
+
|
|
364
|
+
```typescript
|
|
365
|
+
interface ResolverHelpers {
|
|
366
|
+
// Core utilities (54 helper functions)
|
|
367
|
+
get, set, formatDate, formatCurrency, parseFloatSafe, parseIntSafe,
|
|
368
|
+
extractCustomAttribute, safeJsonParse, mapValue, isValidEmail,
|
|
369
|
+
requireField, fullName, truncate, normalizeWhitespace,
|
|
370
|
+
|
|
371
|
+
// Data transformation
|
|
372
|
+
toCamelCase, toSnakeCase, deepClone, deepMerge,
|
|
373
|
+
|
|
374
|
+
// Array operations
|
|
375
|
+
ensureArray, coalesce, groupBy, keyBy, chunk, flatten, unique,
|
|
376
|
+
sortBy, compact, sum, avg, min, max, clamp, merge,
|
|
377
|
+
|
|
378
|
+
// String operations
|
|
379
|
+
template, slugify, uuid, hashString,
|
|
380
|
+
|
|
381
|
+
// Date operations
|
|
382
|
+
addDays, subtractDays, dateDiff, parseDate,
|
|
383
|
+
|
|
384
|
+
// Performance
|
|
385
|
+
memoize, batchProcess, retry, debounce, throttle,
|
|
386
|
+
|
|
387
|
+
// Type checks
|
|
388
|
+
isString, isNumber, isArray, isObject, isDate,
|
|
389
|
+
|
|
390
|
+
// Additional context
|
|
391
|
+
log: Logger, // Logger instance
|
|
392
|
+
fluentClient?: any, // Fluent API client (for async operations)
|
|
393
|
+
context?: any // User-provided shared config (use config parameter instead)
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### Why It Matters
|
|
398
|
+
|
|
399
|
+
Helpers provide safe, tested utilities so you don't have to reinvent common operations:
|
|
400
|
+
|
|
401
|
+
> **⚠️ IMPORTANT: Common Mistake**
|
|
402
|
+
>
|
|
403
|
+
> `toString()` is NOT a helper function. Use native `String(value)` instead.
|
|
404
|
+
>
|
|
405
|
+
> ```typescript
|
|
406
|
+
> // ❌ WRONG - helpers.toString() doesn't exist
|
|
407
|
+
> const str = helpers.toString(value);
|
|
408
|
+
>
|
|
409
|
+
> // ✅ CORRECT - Use native String()
|
|
410
|
+
> const str = String(value);
|
|
411
|
+
>
|
|
412
|
+
> // ✅ ALSO CORRECT - Use sdk.toString resolver for mapping config
|
|
413
|
+
> "field": { source: "value", resolver: "sdk.toString" }
|
|
414
|
+
> ```
|
|
415
|
+
|
|
416
|
+
```typescript
|
|
417
|
+
// ❌ BAD: Unsafe operations
|
|
418
|
+
'custom.unsafe': (value, sourceData, config, helpers) => {
|
|
419
|
+
return parseFloat(value); // NaN if value is "abc"
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// ✅ GOOD: Safe operations with helpers
|
|
423
|
+
'custom.safe': (value, sourceData, config, helpers) => {
|
|
424
|
+
return helpers.parseFloatSafe(value, 0); // Returns 0 if value is "abc"
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### Common Use Cases
|
|
429
|
+
|
|
430
|
+
**1. Safe Type Conversion**
|
|
431
|
+
```typescript
|
|
432
|
+
'custom.safeConvert': (value, sourceData, config, helpers) => {
|
|
433
|
+
const numeric = helpers.parseFloatSafe(value, 0);
|
|
434
|
+
const integer = helpers.parseIntSafe(value, 0);
|
|
435
|
+
const string = String(value); // Use native String() for conversion
|
|
436
|
+
const boolean = helpers.isString(value) && value.toLowerCase() === 'true';
|
|
437
|
+
|
|
438
|
+
return { numeric, integer, string, boolean };
|
|
439
|
+
}
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
**2. Date Formatting**
|
|
443
|
+
```typescript
|
|
444
|
+
'custom.formatDate': (value, sourceData, config, helpers) => {
|
|
445
|
+
// formatDate() returns ISO8601 string
|
|
446
|
+
return helpers.formatDate(value); // Returns ISO8601 format
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// Input: value = "2025-01-15T10:30:00Z"
|
|
450
|
+
// Output: "2025-01-15"
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
**3. Nested Field Access**
|
|
454
|
+
```typescript
|
|
455
|
+
'custom.getNestedField': (value, sourceData, config, helpers) => {
|
|
456
|
+
// Safely access nested fields
|
|
457
|
+
const name = helpers.get(sourceData, 'customer.contact.name', 'Unknown');
|
|
458
|
+
|
|
459
|
+
// Returns 'Unknown' if path doesn't exist
|
|
460
|
+
return name;
|
|
461
|
+
}
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
**4. Array Operations**
|
|
465
|
+
```typescript
|
|
466
|
+
'custom.processArray': (value, sourceData, config, helpers) => {
|
|
467
|
+
const items = helpers.ensureArray(value);
|
|
468
|
+
|
|
469
|
+
// Array utilities
|
|
470
|
+
const unique = helpers.unique(items);
|
|
471
|
+
const sorted = helpers.sortBy(unique, 'price');
|
|
472
|
+
const summed = helpers.sum(sorted.map(i => i.price));
|
|
473
|
+
|
|
474
|
+
return { unique, sorted, total: summed };
|
|
475
|
+
}
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
**5. Logging**
|
|
479
|
+
```typescript
|
|
480
|
+
'custom.debugTransform': (value, sourceData, config, helpers) => {
|
|
481
|
+
helpers.log.debug(`Transforming value: ${value}`);
|
|
482
|
+
|
|
483
|
+
const result = String(value).toUpperCase(); // Use native String()
|
|
484
|
+
|
|
485
|
+
helpers.log.debug(`Result: ${result}`);
|
|
486
|
+
|
|
487
|
+
return result;
|
|
488
|
+
}
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
**6. Async API Calls**
|
|
492
|
+
```typescript
|
|
493
|
+
'custom.fetchData': async (id, sourceData, config, helpers) => {
|
|
494
|
+
if (!helpers.fluentClient) {
|
|
495
|
+
helpers.log.warn('FluentClient not available');
|
|
496
|
+
return null;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
try {
|
|
500
|
+
const result = await helpers.fluentClient.graphql({
|
|
501
|
+
query: `query { product(id: "${id}") { name } }`
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
return result.data.product;
|
|
505
|
+
} catch (error) {
|
|
506
|
+
helpers.log.error('API call failed', error);
|
|
507
|
+
return null;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
---
|
|
513
|
+
|
|
514
|
+
## Using All 4 Parameters Together
|
|
515
|
+
|
|
516
|
+
### Complex Real-World Example
|
|
517
|
+
|
|
518
|
+
```typescript
|
|
519
|
+
'custom.complexTransform': (value, sourceData, config, helpers) => {
|
|
520
|
+
// 1. Use VALUE - the field being transformed
|
|
521
|
+
const basePrice = helpers.parseFloatSafe(value, 0);
|
|
522
|
+
|
|
523
|
+
// 2. Use SOURCEDATA - access related fields
|
|
524
|
+
const quantity = helpers.get(sourceData, 'quantity') || 1;
|
|
525
|
+
const category = helpers.get(sourceData, 'product.category');
|
|
526
|
+
const customerTier = helpers.get(sourceData, 'customer.tier');
|
|
527
|
+
|
|
528
|
+
// 3. Use CONFIG - business rules
|
|
529
|
+
const categoryMultipliers = config.categoryMultipliers || {};
|
|
530
|
+
const tierDiscounts = config.tierDiscounts || {};
|
|
531
|
+
|
|
532
|
+
// 4. Use HELPERS - utilities
|
|
533
|
+
const multiplier = categoryMultipliers[category] || 1;
|
|
534
|
+
const discount = tierDiscounts[customerTier] || 0;
|
|
535
|
+
|
|
536
|
+
// Complex calculation
|
|
537
|
+
const subtotal = basePrice * quantity * multiplier;
|
|
538
|
+
const afterDiscount = subtotal * (1 - discount);
|
|
539
|
+
const final = helpers.parseFloatSafe(afterDiscount, 0);
|
|
540
|
+
|
|
541
|
+
helpers.log.debug(`Calculated price: ${final}`);
|
|
542
|
+
|
|
543
|
+
return final;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
// Usage with full context
|
|
547
|
+
const mapper = new UniversalMapper(mapping, {
|
|
548
|
+
customResolvers: { 'custom.complexTransform': complexTransform },
|
|
549
|
+
context: {
|
|
550
|
+
categoryMultipliers: {
|
|
551
|
+
'electronics': 1.5,
|
|
552
|
+
'books': 1.2,
|
|
553
|
+
'clothing': 1.3
|
|
554
|
+
},
|
|
555
|
+
tierDiscounts: {
|
|
556
|
+
'gold': 0.15,
|
|
557
|
+
'silver': 0.10,
|
|
558
|
+
'bronze': 0.05
|
|
559
|
+
}
|
|
560
|
+
},
|
|
561
|
+
logger: myLogger
|
|
562
|
+
});
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
## Parameter Naming Convention
|
|
566
|
+
|
|
567
|
+
Always use these exact parameter names:
|
|
568
|
+
|
|
569
|
+
```typescript
|
|
570
|
+
// ✅ CORRECT - Standard names
|
|
571
|
+
(value, sourceData, config, helpers) => { ... }
|
|
572
|
+
|
|
573
|
+
// ❌ WRONG - Non-standard names
|
|
574
|
+
(val, src, cfg, hlp) => { ... }
|
|
575
|
+
(v, data, c, h) => { ... }
|
|
576
|
+
(fieldValue, record, options, utils) => { ... }
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
Standard names improve:
|
|
580
|
+
- Code readability
|
|
581
|
+
- Documentation clarity
|
|
582
|
+
- Team collaboration
|
|
583
|
+
- Error message clarity
|
|
584
|
+
|
|
585
|
+
## Key Takeaways
|
|
586
|
+
|
|
587
|
+
- 🎯 **value** - The extracted field value to transform
|
|
588
|
+
- 🎯 **sourceData** - Complete source object for context-aware transformations
|
|
589
|
+
- 🎯 **config** - Business rules passed via mapper `context` option
|
|
590
|
+
- 🎯 **helpers** - 54 SDK utility functions + logger + fluentClient
|
|
591
|
+
- 🎯 **Use all 4** - Even if you only need one, include all four parameters
|
|
592
|
+
- 🎯 **Standard names** - Always use `value`, `sourceData`, `config`, `helpers`
|
|
593
|
+
|
|
594
|
+
## Practice Exercise
|
|
595
|
+
|
|
596
|
+
Write a resolver that uses all 4 parameters to calculate a shipping cost:
|
|
597
|
+
|
|
598
|
+
**Requirements:**
|
|
599
|
+
- Base shipping rate from `value`
|
|
600
|
+
- Weight from `sourceData.weight`
|
|
601
|
+
- Shipping zone from `config.shippingZones`
|
|
602
|
+
- Use `helpers.parseFloatSafe` for safety
|
|
603
|
+
|
|
604
|
+
<details>
|
|
605
|
+
<summary>Show Solution</summary>
|
|
606
|
+
|
|
607
|
+
```typescript
|
|
608
|
+
'custom.calculateShipping': (baseRate, sourceData, config, helpers) => {
|
|
609
|
+
// 1. VALUE: Base shipping rate
|
|
610
|
+
const rate = helpers.parseFloatSafe(baseRate, 5.00);
|
|
611
|
+
|
|
612
|
+
// 2. SOURCEDATA: Get weight from source
|
|
613
|
+
const weight = helpers.get(sourceData, 'weight') || 1;
|
|
614
|
+
const zone = helpers.get(sourceData, 'address.zone');
|
|
615
|
+
|
|
616
|
+
// 3. CONFIG: Zone multipliers
|
|
617
|
+
const zoneMultipliers = config.shippingZones || {};
|
|
618
|
+
const multiplier = zoneMultipliers[zone] || 1;
|
|
619
|
+
|
|
620
|
+
// 4. HELPERS: Safe calculations
|
|
621
|
+
const shipping = rate * weight * multiplier;
|
|
622
|
+
|
|
623
|
+
return helpers.parseFloatSafe(shipping, rate);
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
// Usage
|
|
627
|
+
const mapper = new UniversalMapper(mapping, {
|
|
628
|
+
customResolvers: { 'custom.calculateShipping': calculateShipping },
|
|
629
|
+
context: {
|
|
630
|
+
shippingZones: {
|
|
631
|
+
'local': 1.0,
|
|
632
|
+
'regional': 1.5,
|
|
633
|
+
'national': 2.0,
|
|
634
|
+
'international': 3.0
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
});
|
|
638
|
+
```
|
|
639
|
+
</details>
|
|
640
|
+
|
|
641
|
+
## Next Steps
|
|
642
|
+
|
|
643
|
+
Continue to [Module 3: Basic Examples](./resolver-signature-03-basic-examples.md) to see simple, practical examples you can use immediately.
|