@fluentcommerce/fc-connect-sdk 0.1.53 → 0.1.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -2
- package/README.md +39 -0
- package/dist/cjs/auth/index.d.ts +3 -0
- package/dist/cjs/auth/index.js +13 -0
- package/dist/cjs/auth/profile-loader.d.ts +18 -0
- package/dist/cjs/auth/profile-loader.js +208 -0
- package/dist/cjs/client-factory.d.ts +4 -0
- package/dist/cjs/client-factory.js +10 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/auth/index.d.ts +3 -0
- package/dist/esm/auth/index.js +2 -0
- package/dist/esm/auth/profile-loader.d.ts +18 -0
- package/dist/esm/auth/profile-loader.js +169 -0
- package/dist/esm/client-factory.d.ts +4 -0
- package/dist/esm/client-factory.js +9 -0
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/dist/types/auth/index.d.ts +3 -0
- package/dist/types/auth/profile-loader.d.ts +18 -0
- package/dist/types/client-factory.d.ts +4 -0
- package/dist/types/index.d.ts +3 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -482
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
|
@@ -1,531 +1,531 @@
|
|
|
1
|
-
# Module 5: SDK Resolvers
|
|
2
|
-
|
|
3
|
-
**Level:** Intermediate
|
|
4
|
-
**Estimated Time:** 15 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module explains how the SDK's built-in resolvers (the `sdk.*` namespace) use the same 4-parameter signature as your custom resolvers. Understanding this helps you extend SDK resolvers and maintain consistency.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
- ✅ Understand how SDK resolvers follow the 4-parameter signature
|
|
14
|
-
- ✅ Know which parameters SDK resolvers typically use
|
|
15
|
-
- ✅ Learn how to extend or wrap SDK resolvers
|
|
16
|
-
- ✅ Recognize the consistency pattern across all resolvers
|
|
17
|
-
|
|
18
|
-
## SDK Resolvers Overview
|
|
19
|
-
|
|
20
|
-
All SDK resolvers use the standard 4-parameter signature, even when they only need one or two parameters:
|
|
21
|
-
|
|
22
|
-
```typescript
|
|
23
|
-
// SDK resolver implementation
|
|
24
|
-
'sdk.parseFloat': (value, sourceData, config, helpers) => {
|
|
25
|
-
return helpers.parseFloatSafe(value, 0);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// Your custom resolver
|
|
29
|
-
'custom.parseFloat': (value, sourceData, config, helpers) => {
|
|
30
|
-
return helpers.parseFloatSafe(value, 0);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Identical signature = consistent behavior
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Available SDK Resolvers
|
|
37
|
-
|
|
38
|
-
The SDK provides 16 built-in resolvers (17 including aliases) organized by category:
|
|
39
|
-
|
|
40
|
-
> **Note:** `sdk.number` is an alias for `sdk.parseFloat`. The sections below list 16 unique functional resolvers.
|
|
41
|
-
|
|
42
|
-
### String Transformations
|
|
43
|
-
|
|
44
|
-
```typescript
|
|
45
|
-
// All follow 4-parameter signature
|
|
46
|
-
'sdk.uppercase': (value, sourceData, config, helpers) => {
|
|
47
|
-
return String(value).toUpperCase();
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
'sdk.lowercase': (value, sourceData, config, helpers) => {
|
|
51
|
-
return String(value).toLowerCase();
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
'sdk.trim': (value, sourceData, config, helpers) => {
|
|
55
|
-
return String(value).trim();
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
'sdk.toString': (value, sourceData, config, helpers) => {
|
|
59
|
-
return String(value);
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### Number Transformations
|
|
64
|
-
|
|
65
|
-
```typescript
|
|
66
|
-
'sdk.parseInt': (value, sourceData, config, helpers) => {
|
|
67
|
-
return helpers.parseIntSafe(value, 0);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
'sdk.parseFloat': (value, sourceData, config, helpers) => {
|
|
71
|
-
return helpers.parseFloatSafe(value, 0);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
'sdk.number': (value, sourceData, config, helpers) => {
|
|
75
|
-
return helpers.parseFloatSafe(value, 0);
|
|
76
|
-
}
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
### Date Transformations
|
|
80
|
-
|
|
81
|
-
```typescript
|
|
82
|
-
'sdk.formatDate': (value, sourceData, config, helpers) => {
|
|
83
|
-
const format = config?.dateFormat || 'YYYY-MM-DD';
|
|
84
|
-
return helpers.formatDate(value, format);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
'sdk.formatDateShort': (value, sourceData, config, helpers) => {
|
|
88
|
-
return helpers.formatDateShort(value);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
'sdk.parseDate': (value, sourceData, config, helpers) => {
|
|
92
|
-
return helpers.parseDate(value);
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
### Type Conversions
|
|
97
|
-
|
|
98
|
-
```typescript
|
|
99
|
-
'sdk.boolean': (value, sourceData, config, helpers) => {
|
|
100
|
-
if (typeof value === 'boolean') return value;
|
|
101
|
-
const str = String(value).toLowerCase();
|
|
102
|
-
return str === 'true' || str === '1' || str === 'yes';
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
'sdk.parseJson': (value, sourceData, config, helpers) => {
|
|
106
|
-
return helpers.safeJsonParse(value, null);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
'sdk.toJson': (value, sourceData, config, helpers) => {
|
|
110
|
-
return JSON.stringify(value);
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### Utility Resolvers
|
|
115
|
-
|
|
116
|
-
```typescript
|
|
117
|
-
'sdk.identity': (value, sourceData, config, helpers) => {
|
|
118
|
-
return value; // Pass-through
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
'sdk.coalesce': (value, sourceData, config, helpers) => {
|
|
122
|
-
return helpers.coalesce(value);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
'sdk.default': (value, sourceData, config, helpers) => {
|
|
126
|
-
// Default value logic is handled by UniversalMapper
|
|
127
|
-
// This resolver just returns the value as-is
|
|
128
|
-
// The actual defaultValue is applied before resolvers run
|
|
129
|
-
return value;
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
## Why SDK Resolvers Use All 4 Parameters
|
|
134
|
-
|
|
135
|
-
Even though most SDK resolvers only use `value` and `helpers`, they include all 4 parameters for:
|
|
136
|
-
|
|
137
|
-
### 1. Consistency
|
|
138
|
-
|
|
139
|
-
```typescript
|
|
140
|
-
// All resolvers have the same signature
|
|
141
|
-
const allResolvers = {
|
|
142
|
-
// SDK resolvers
|
|
143
|
-
'sdk.parseFloat': (value, sourceData, config, helpers) => { ... },
|
|
144
|
-
'sdk.formatDate': (value, sourceData, config, helpers) => { ... },
|
|
145
|
-
|
|
146
|
-
// Custom resolvers
|
|
147
|
-
'custom.transform': (value, sourceData, config, helpers) => { ... },
|
|
148
|
-
|
|
149
|
-
// No special cases, no exceptions
|
|
150
|
-
};
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### 2. Future Extensibility
|
|
154
|
-
|
|
155
|
-
SDK resolvers can evolve to use more parameters without breaking changes:
|
|
156
|
-
|
|
157
|
-
```typescript
|
|
158
|
-
// Today: Simple implementation
|
|
159
|
-
'sdk.formatDate': (value, sourceData, config, helpers) => {
|
|
160
|
-
return helpers.formatDate(value, 'YYYY-MM-DD');
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Tomorrow: Configurable without breaking change
|
|
164
|
-
'sdk.formatDate': (value, sourceData, config, helpers) => {
|
|
165
|
-
const format = config?.dateFormat || 'YYYY-MM-DD';
|
|
166
|
-
return helpers.formatDate(value, format);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Your code still works!
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### 3. Testing Uniformity
|
|
173
|
-
|
|
174
|
-
All resolvers can be tested with the same test utilities:
|
|
175
|
-
|
|
176
|
-
```typescript
|
|
177
|
-
// Generic resolver tester works for SDK and custom resolvers
|
|
178
|
-
function testResolver(resolver, value, sourceData, config, helpers) {
|
|
179
|
-
return resolver(value, sourceData, config, helpers);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// Test SDK resolver
|
|
183
|
-
testResolver(sdkResolvers['sdk.parseFloat'], '19.99', {}, {}, helpers);
|
|
184
|
-
|
|
185
|
-
// Test custom resolver
|
|
186
|
-
testResolver(customResolvers['custom.transform'], 'test', {}, {}, helpers);
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
## Extending SDK Resolvers
|
|
190
|
-
|
|
191
|
-
You can wrap or extend SDK resolvers while maintaining the signature:
|
|
192
|
-
|
|
193
|
-
### Wrapping with Additional Logic
|
|
194
|
-
|
|
195
|
-
```typescript
|
|
196
|
-
'custom.parseFloatWithLogging': (value, sourceData, config, helpers) => {
|
|
197
|
-
// Call SDK resolver
|
|
198
|
-
const sdkResolver = getSdkResolver('sdk.parseFloat');
|
|
199
|
-
const result = sdkResolver(value, sourceData, config, helpers);
|
|
200
|
-
|
|
201
|
-
// Add custom logic
|
|
202
|
-
helpers.log.debug(`Parsed ${value} to ${result}`);
|
|
203
|
-
|
|
204
|
-
return result;
|
|
205
|
-
}
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
### Adding Configuration
|
|
209
|
-
|
|
210
|
-
```typescript
|
|
211
|
-
'custom.parseFloatWithDefault': (value, sourceData, config, helpers) => {
|
|
212
|
-
// Use config to override default
|
|
213
|
-
const defaultValue = config?.defaultFloat || 0;
|
|
214
|
-
|
|
215
|
-
// Enhanced version of SDK resolver
|
|
216
|
-
const parsed = helpers.parseFloatSafe(value, defaultValue);
|
|
217
|
-
|
|
218
|
-
return parsed;
|
|
219
|
-
}
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
### Combining Multiple SDK Resolvers
|
|
223
|
-
|
|
224
|
-
```typescript
|
|
225
|
-
'custom.formatAndTrim': (value, sourceData, config, helpers) => {
|
|
226
|
-
// Chain SDK resolver functionality
|
|
227
|
-
const trimmed = String(value).trim();
|
|
228
|
-
const upper = trimmed.toUpperCase();
|
|
229
|
-
|
|
230
|
-
return upper;
|
|
231
|
-
}
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
## Accessing SDK Resolvers Programmatically
|
|
235
|
-
|
|
236
|
-
The SDK provides utilities to access resolvers:
|
|
237
|
-
|
|
238
|
-
```typescript
|
|
239
|
-
import { getSdkResolver, isSdkResolver, sdkResolvers } from '@fluentcommerce/fc-connect-sdk';
|
|
240
|
-
|
|
241
|
-
// Get a specific SDK resolver
|
|
242
|
-
const parseFloat = getSdkResolver('sdk.parseFloat');
|
|
243
|
-
const result = parseFloat('19.99', {}, {}, helpers);
|
|
244
|
-
|
|
245
|
-
// Check if a resolver name is an SDK resolver
|
|
246
|
-
if (isSdkResolver('sdk.parseFloat')) {
|
|
247
|
-
console.log('This is an SDK resolver');
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Access all SDK resolvers
|
|
251
|
-
console.log(Object.keys(sdkResolvers));
|
|
252
|
-
// Output: ['sdk.uppercase', 'sdk.lowercase', 'sdk.parseInt', ...]
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
## Real-World Usage Patterns
|
|
256
|
-
|
|
257
|
-
### Using SDK Resolvers in Mappings
|
|
258
|
-
|
|
259
|
-
```json
|
|
260
|
-
{
|
|
261
|
-
"fields": {
|
|
262
|
-
"sku": {
|
|
263
|
-
"source": "product_id",
|
|
264
|
-
"resolver": "sdk.uppercase"
|
|
265
|
-
},
|
|
266
|
-
"quantity": {
|
|
267
|
-
"source": "qty",
|
|
268
|
-
"resolver": "sdk.parseInt"
|
|
269
|
-
},
|
|
270
|
-
"price": {
|
|
271
|
-
"source": "unit_price",
|
|
272
|
-
"resolver": "sdk.parseFloat"
|
|
273
|
-
},
|
|
274
|
-
"expectedOn": {
|
|
275
|
-
"source": "delivery_date",
|
|
276
|
-
"resolver": "sdk.formatDate"
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
### Mixing SDK and Custom Resolvers
|
|
283
|
-
|
|
284
|
-
```typescript
|
|
285
|
-
const customResolvers = {
|
|
286
|
-
// Custom resolver
|
|
287
|
-
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
288
|
-
// Use SDK resolver helper
|
|
289
|
-
const upper = String(value).toUpperCase();
|
|
290
|
-
const prefix = config.skuPrefix || 'SKU';
|
|
291
|
-
return `${prefix}-${upper}`;
|
|
292
|
-
}
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
const mapper = new UniversalMapper(
|
|
296
|
-
{
|
|
297
|
-
fields: {
|
|
298
|
-
// SDK resolver
|
|
299
|
-
sku: { source: 'id', resolver: 'sdk.uppercase' },
|
|
300
|
-
|
|
301
|
-
// Custom resolver
|
|
302
|
-
formattedSKU: { source: 'id', resolver: 'custom.formatSKU' },
|
|
303
|
-
|
|
304
|
-
// SDK resolver
|
|
305
|
-
quantity: { source: 'qty', resolver: 'sdk.parseInt' }
|
|
306
|
-
}
|
|
307
|
-
},
|
|
308
|
-
{
|
|
309
|
-
customResolvers,
|
|
310
|
-
context: { skuPrefix: 'PROD' }
|
|
311
|
-
}
|
|
312
|
-
);
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
## SDK Resolver Implementation Example
|
|
316
|
-
|
|
317
|
-
Here's how SDK resolvers are actually implemented:
|
|
318
|
-
|
|
319
|
-
```typescript
|
|
320
|
-
// In the SDK: src/services/resolvers/sdk-resolvers.ts
|
|
321
|
-
export const sdkResolvers: Record<string, FieldResolverFunction> = {
|
|
322
|
-
'sdk.uppercase': (value, sourceData, config, helpers) => {
|
|
323
|
-
return String(value).toUpperCase();
|
|
324
|
-
},
|
|
325
|
-
|
|
326
|
-
'sdk.lowercase': (value, sourceData, config, helpers) => {
|
|
327
|
-
return String(value).toLowerCase();
|
|
328
|
-
},
|
|
329
|
-
|
|
330
|
-
'sdk.trim': (value, sourceData, config, helpers) => {
|
|
331
|
-
return String(value).trim();
|
|
332
|
-
},
|
|
333
|
-
|
|
334
|
-
'sdk.parseInt': (value, sourceData, config, helpers) => {
|
|
335
|
-
return helpers.parseIntSafe(value, 0);
|
|
336
|
-
},
|
|
337
|
-
|
|
338
|
-
'sdk.parseFloat': (value, sourceData, config, helpers) => {
|
|
339
|
-
return helpers.parseFloatSafe(value, 0);
|
|
340
|
-
},
|
|
341
|
-
|
|
342
|
-
'sdk.number': (value, sourceData, config, helpers) => {
|
|
343
|
-
return helpers.parseFloatSafe(value, 0);
|
|
344
|
-
},
|
|
345
|
-
|
|
346
|
-
'sdk.formatDate': (value, sourceData, config, helpers) => {
|
|
347
|
-
if (!value) return value;
|
|
348
|
-
return helpers.formatDate(value);
|
|
349
|
-
},
|
|
350
|
-
|
|
351
|
-
'sdk.formatDateShort': (value, sourceData, config, helpers) => {
|
|
352
|
-
if (!value) return value;
|
|
353
|
-
const date = new Date(value);
|
|
354
|
-
if (isNaN(date.getTime())) return value;
|
|
355
|
-
return date.toISOString().split('T')[0];
|
|
356
|
-
},
|
|
357
|
-
|
|
358
|
-
'sdk.parseDate': (value, sourceData, config, helpers) => {
|
|
359
|
-
return helpers.parseDate(value);
|
|
360
|
-
},
|
|
361
|
-
|
|
362
|
-
'sdk.boolean': (value, sourceData, config, helpers) => {
|
|
363
|
-
if (value === null || value === undefined) {
|
|
364
|
-
return false;
|
|
365
|
-
}
|
|
366
|
-
const checkValue = typeof value === 'string' ? value.toLowerCase() : value;
|
|
367
|
-
return ['true', '1', 'yes', 'y', true, 1].includes(checkValue);
|
|
368
|
-
},
|
|
369
|
-
|
|
370
|
-
'sdk.parseJson': (value, sourceData, config, helpers) => {
|
|
371
|
-
if (typeof value === 'string') {
|
|
372
|
-
return helpers.safeJsonParse(value, value);
|
|
373
|
-
}
|
|
374
|
-
return value;
|
|
375
|
-
},
|
|
376
|
-
|
|
377
|
-
'sdk.toJson': (value, sourceData, config, helpers) => {
|
|
378
|
-
try {
|
|
379
|
-
return JSON.stringify(value);
|
|
380
|
-
} catch {
|
|
381
|
-
return value;
|
|
382
|
-
}
|
|
383
|
-
},
|
|
384
|
-
|
|
385
|
-
'sdk.identity': (value, sourceData, config, helpers) => {
|
|
386
|
-
return value;
|
|
387
|
-
},
|
|
388
|
-
|
|
389
|
-
'sdk.toString': (value, sourceData, config, helpers) => {
|
|
390
|
-
if (value === null || value === undefined) return '';
|
|
391
|
-
return String(value);
|
|
392
|
-
},
|
|
393
|
-
|
|
394
|
-
'sdk.coalesce': (value, sourceData, config, helpers) => {
|
|
395
|
-
return helpers.coalesce(value);
|
|
396
|
-
},
|
|
397
|
-
|
|
398
|
-
'sdk.default': (value, sourceData, config, helpers) => {
|
|
399
|
-
// Default value logic is handled by UniversalMapper.mapField()
|
|
400
|
-
// which applies config.defaultValue before calling resolvers
|
|
401
|
-
// This resolver exists for backward compatibility
|
|
402
|
-
return value;
|
|
403
|
-
}
|
|
404
|
-
};
|
|
405
|
-
|
|
406
|
-
// Utility to get SDK resolver
|
|
407
|
-
export function getSdkResolver(name: string): FieldResolverFunction | undefined {
|
|
408
|
-
return sdkResolvers[name];
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
// Utility to check if resolver is SDK resolver
|
|
412
|
-
export function isSdkResolver(name: string): boolean {
|
|
413
|
-
return name.startsWith('sdk.') && name in sdkResolvers;
|
|
414
|
-
}
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
## Complete SDK Resolver List
|
|
418
|
-
|
|
419
|
-
| Resolver | Parameters Used | Purpose |
|
|
420
|
-
|----------|----------------|---------|
|
|
421
|
-
| `sdk.uppercase` | value, helpers | Convert to uppercase |
|
|
422
|
-
| `sdk.lowercase` | value, helpers | Convert to lowercase |
|
|
423
|
-
| `sdk.trim` | value, helpers | Trim whitespace |
|
|
424
|
-
| `sdk.toString` | value, helpers | Convert to string |
|
|
425
|
-
| `sdk.parseInt` | value, helpers | Parse integer safely |
|
|
426
|
-
| `sdk.parseFloat` | value, helpers | Parse float safely |
|
|
427
|
-
| `sdk.number` | value, helpers | Parse number (alias for parseFloat) |
|
|
428
|
-
| `sdk.formatDate` | value, helpers | Format date to ISO8601 |
|
|
429
|
-
| `sdk.formatDateShort` | value, helpers | Format date (YYYY-MM-DD) |
|
|
430
|
-
| `sdk.parseDate` | value, helpers | Parse date string |
|
|
431
|
-
| `sdk.boolean` | value, helpers | Convert to boolean |
|
|
432
|
-
| `sdk.parseJson` | value, helpers | Parse JSON safely |
|
|
433
|
-
| `sdk.toJson` | value, helpers | Convert to JSON string |
|
|
434
|
-
| `sdk.identity` | value | Pass-through (no transformation) |
|
|
435
|
-
| `sdk.coalesce` | value, helpers | Return first non-null value |
|
|
436
|
-
| `sdk.default` | value | No-op (defaultValue handled by mapper) |
|
|
437
|
-
|
|
438
|
-
## Creating Your Own SDK-Style Resolvers
|
|
439
|
-
|
|
440
|
-
You can create custom resolvers that follow SDK conventions:
|
|
441
|
-
|
|
442
|
-
```typescript
|
|
443
|
-
// Create a library of reusable resolvers
|
|
444
|
-
export const myResolvers = {
|
|
445
|
-
'my.formatPhone': (value, sourceData, config, helpers) => {
|
|
446
|
-
const digits = String(value).replace(/\D/g, '');
|
|
447
|
-
if (digits.length !== 10) return null;
|
|
448
|
-
return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)}-${digits.slice(6)}`;
|
|
449
|
-
},
|
|
450
|
-
|
|
451
|
-
'my.validateEmail': (value, sourceData, config, helpers) => {
|
|
452
|
-
if (!helpers.isValidEmail(value)) {
|
|
453
|
-
helpers.log.warn(`Invalid email: ${value}`);
|
|
454
|
-
return null;
|
|
455
|
-
}
|
|
456
|
-
return value;
|
|
457
|
-
},
|
|
458
|
-
|
|
459
|
-
'my.formatCurrency': (value, sourceData, config, helpers) => {
|
|
460
|
-
const currency = config?.currency || 'USD';
|
|
461
|
-
const locale = config?.locale || 'en-US';
|
|
462
|
-
return helpers.formatCurrency(value, currency, locale);
|
|
463
|
-
}
|
|
464
|
-
};
|
|
465
|
-
|
|
466
|
-
// Use alongside SDK resolvers
|
|
467
|
-
const mapper = new UniversalMapper(mapping, {
|
|
468
|
-
customResolvers: {
|
|
469
|
-
...sdkResolvers, // Include SDK resolvers
|
|
470
|
-
...myResolvers // Add your resolvers
|
|
471
|
-
}
|
|
472
|
-
});
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
## Key Takeaways
|
|
476
|
-
|
|
477
|
-
- 🎯 **SDK resolvers use 4 parameters** - Same signature as custom resolvers
|
|
478
|
-
- 🎯 **Consistency everywhere** - No exceptions, no special cases
|
|
479
|
-
- 🎯 **Extend easily** - Wrap SDK resolvers with custom logic
|
|
480
|
-
- 🎯 **Access programmatically** - Use `getSdkResolver()` and `isSdkResolver()`
|
|
481
|
-
- 🎯 **Mix and match** - Combine SDK and custom resolvers freely
|
|
482
|
-
|
|
483
|
-
## Practice Exercise
|
|
484
|
-
|
|
485
|
-
Create a custom resolver that wraps an SDK resolver and adds validation:
|
|
486
|
-
|
|
487
|
-
**Requirements:**
|
|
488
|
-
- Call `sdk.parseFloat` to parse value
|
|
489
|
-
- Validate result is within range (from config)
|
|
490
|
-
- Log warning if out of range
|
|
491
|
-
- Return null if invalid, result if valid
|
|
492
|
-
|
|
493
|
-
<details>
|
|
494
|
-
<summary>Show Solution</summary>
|
|
495
|
-
|
|
496
|
-
```typescript
|
|
497
|
-
'custom.parseFloatWithRange': (value, sourceData, config, helpers) => {
|
|
498
|
-
// Use SDK resolver to parse
|
|
499
|
-
const sdkParseFloat = getSdkResolver('sdk.parseFloat');
|
|
500
|
-
const parsed = sdkParseFloat(value, sourceData, config, helpers);
|
|
501
|
-
|
|
502
|
-
// Validate range from config
|
|
503
|
-
const min = config?.minValue ?? -Infinity;
|
|
504
|
-
const max = config?.maxValue ?? Infinity;
|
|
505
|
-
|
|
506
|
-
if (parsed < min || parsed > max) {
|
|
507
|
-
helpers.log.warn(
|
|
508
|
-
`Value ${parsed} out of range [${min}, ${max}]`
|
|
509
|
-
);
|
|
510
|
-
return null;
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
return parsed;
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
// Usage
|
|
517
|
-
const mapper = new UniversalMapper(mapping, {
|
|
518
|
-
customResolvers: {
|
|
519
|
-
'custom.parseFloatWithRange': parseFloatWithRange
|
|
520
|
-
},
|
|
521
|
-
context: {
|
|
522
|
-
minValue: 0,
|
|
523
|
-
maxValue: 10000
|
|
524
|
-
}
|
|
525
|
-
});
|
|
526
|
-
```
|
|
527
|
-
</details>
|
|
528
|
-
|
|
529
|
-
## Next Steps
|
|
530
|
-
|
|
531
|
-
Continue to [Module 6: Migration Guide](./resolver-signature-06-migration-guide.md) to learn how to migrate from old 3-parameter resolvers to the new 4-parameter signature.
|
|
1
|
+
# Module 5: SDK Resolvers
|
|
2
|
+
|
|
3
|
+
**Level:** Intermediate
|
|
4
|
+
**Estimated Time:** 15 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module explains how the SDK's built-in resolvers (the `sdk.*` namespace) use the same 4-parameter signature as your custom resolvers. Understanding this helps you extend SDK resolvers and maintain consistency.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
- ✅ Understand how SDK resolvers follow the 4-parameter signature
|
|
14
|
+
- ✅ Know which parameters SDK resolvers typically use
|
|
15
|
+
- ✅ Learn how to extend or wrap SDK resolvers
|
|
16
|
+
- ✅ Recognize the consistency pattern across all resolvers
|
|
17
|
+
|
|
18
|
+
## SDK Resolvers Overview
|
|
19
|
+
|
|
20
|
+
All SDK resolvers use the standard 4-parameter signature, even when they only need one or two parameters:
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// SDK resolver implementation
|
|
24
|
+
'sdk.parseFloat': (value, sourceData, config, helpers) => {
|
|
25
|
+
return helpers.parseFloatSafe(value, 0);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Your custom resolver
|
|
29
|
+
'custom.parseFloat': (value, sourceData, config, helpers) => {
|
|
30
|
+
return helpers.parseFloatSafe(value, 0);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Identical signature = consistent behavior
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Available SDK Resolvers
|
|
37
|
+
|
|
38
|
+
The SDK provides 16 built-in resolvers (17 including aliases) organized by category:
|
|
39
|
+
|
|
40
|
+
> **Note:** `sdk.number` is an alias for `sdk.parseFloat`. The sections below list 16 unique functional resolvers.
|
|
41
|
+
|
|
42
|
+
### String Transformations
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// All follow 4-parameter signature
|
|
46
|
+
'sdk.uppercase': (value, sourceData, config, helpers) => {
|
|
47
|
+
return String(value).toUpperCase();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
'sdk.lowercase': (value, sourceData, config, helpers) => {
|
|
51
|
+
return String(value).toLowerCase();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
'sdk.trim': (value, sourceData, config, helpers) => {
|
|
55
|
+
return String(value).trim();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
'sdk.toString': (value, sourceData, config, helpers) => {
|
|
59
|
+
return String(value);
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Number Transformations
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
'sdk.parseInt': (value, sourceData, config, helpers) => {
|
|
67
|
+
return helpers.parseIntSafe(value, 0);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
'sdk.parseFloat': (value, sourceData, config, helpers) => {
|
|
71
|
+
return helpers.parseFloatSafe(value, 0);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
'sdk.number': (value, sourceData, config, helpers) => {
|
|
75
|
+
return helpers.parseFloatSafe(value, 0);
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Date Transformations
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
'sdk.formatDate': (value, sourceData, config, helpers) => {
|
|
83
|
+
const format = config?.dateFormat || 'YYYY-MM-DD';
|
|
84
|
+
return helpers.formatDate(value, format);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
'sdk.formatDateShort': (value, sourceData, config, helpers) => {
|
|
88
|
+
return helpers.formatDateShort(value);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
'sdk.parseDate': (value, sourceData, config, helpers) => {
|
|
92
|
+
return helpers.parseDate(value);
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Type Conversions
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
'sdk.boolean': (value, sourceData, config, helpers) => {
|
|
100
|
+
if (typeof value === 'boolean') return value;
|
|
101
|
+
const str = String(value).toLowerCase();
|
|
102
|
+
return str === 'true' || str === '1' || str === 'yes';
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
'sdk.parseJson': (value, sourceData, config, helpers) => {
|
|
106
|
+
return helpers.safeJsonParse(value, null);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
'sdk.toJson': (value, sourceData, config, helpers) => {
|
|
110
|
+
return JSON.stringify(value);
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Utility Resolvers
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
'sdk.identity': (value, sourceData, config, helpers) => {
|
|
118
|
+
return value; // Pass-through
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
'sdk.coalesce': (value, sourceData, config, helpers) => {
|
|
122
|
+
return helpers.coalesce(value);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
'sdk.default': (value, sourceData, config, helpers) => {
|
|
126
|
+
// Default value logic is handled by UniversalMapper
|
|
127
|
+
// This resolver just returns the value as-is
|
|
128
|
+
// The actual defaultValue is applied before resolvers run
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Why SDK Resolvers Use All 4 Parameters
|
|
134
|
+
|
|
135
|
+
Even though most SDK resolvers only use `value` and `helpers`, they include all 4 parameters for:
|
|
136
|
+
|
|
137
|
+
### 1. Consistency
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
// All resolvers have the same signature
|
|
141
|
+
const allResolvers = {
|
|
142
|
+
// SDK resolvers
|
|
143
|
+
'sdk.parseFloat': (value, sourceData, config, helpers) => { ... },
|
|
144
|
+
'sdk.formatDate': (value, sourceData, config, helpers) => { ... },
|
|
145
|
+
|
|
146
|
+
// Custom resolvers
|
|
147
|
+
'custom.transform': (value, sourceData, config, helpers) => { ... },
|
|
148
|
+
|
|
149
|
+
// No special cases, no exceptions
|
|
150
|
+
};
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 2. Future Extensibility
|
|
154
|
+
|
|
155
|
+
SDK resolvers can evolve to use more parameters without breaking changes:
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
// Today: Simple implementation
|
|
159
|
+
'sdk.formatDate': (value, sourceData, config, helpers) => {
|
|
160
|
+
return helpers.formatDate(value, 'YYYY-MM-DD');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Tomorrow: Configurable without breaking change
|
|
164
|
+
'sdk.formatDate': (value, sourceData, config, helpers) => {
|
|
165
|
+
const format = config?.dateFormat || 'YYYY-MM-DD';
|
|
166
|
+
return helpers.formatDate(value, format);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Your code still works!
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 3. Testing Uniformity
|
|
173
|
+
|
|
174
|
+
All resolvers can be tested with the same test utilities:
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
// Generic resolver tester works for SDK and custom resolvers
|
|
178
|
+
function testResolver(resolver, value, sourceData, config, helpers) {
|
|
179
|
+
return resolver(value, sourceData, config, helpers);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Test SDK resolver
|
|
183
|
+
testResolver(sdkResolvers['sdk.parseFloat'], '19.99', {}, {}, helpers);
|
|
184
|
+
|
|
185
|
+
// Test custom resolver
|
|
186
|
+
testResolver(customResolvers['custom.transform'], 'test', {}, {}, helpers);
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Extending SDK Resolvers
|
|
190
|
+
|
|
191
|
+
You can wrap or extend SDK resolvers while maintaining the signature:
|
|
192
|
+
|
|
193
|
+
### Wrapping with Additional Logic
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
'custom.parseFloatWithLogging': (value, sourceData, config, helpers) => {
|
|
197
|
+
// Call SDK resolver
|
|
198
|
+
const sdkResolver = getSdkResolver('sdk.parseFloat');
|
|
199
|
+
const result = sdkResolver(value, sourceData, config, helpers);
|
|
200
|
+
|
|
201
|
+
// Add custom logic
|
|
202
|
+
helpers.log.debug(`Parsed ${value} to ${result}`);
|
|
203
|
+
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Adding Configuration
|
|
209
|
+
|
|
210
|
+
```typescript
|
|
211
|
+
'custom.parseFloatWithDefault': (value, sourceData, config, helpers) => {
|
|
212
|
+
// Use config to override default
|
|
213
|
+
const defaultValue = config?.defaultFloat || 0;
|
|
214
|
+
|
|
215
|
+
// Enhanced version of SDK resolver
|
|
216
|
+
const parsed = helpers.parseFloatSafe(value, defaultValue);
|
|
217
|
+
|
|
218
|
+
return parsed;
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Combining Multiple SDK Resolvers
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
'custom.formatAndTrim': (value, sourceData, config, helpers) => {
|
|
226
|
+
// Chain SDK resolver functionality
|
|
227
|
+
const trimmed = String(value).trim();
|
|
228
|
+
const upper = trimmed.toUpperCase();
|
|
229
|
+
|
|
230
|
+
return upper;
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Accessing SDK Resolvers Programmatically
|
|
235
|
+
|
|
236
|
+
The SDK provides utilities to access resolvers:
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
import { getSdkResolver, isSdkResolver, sdkResolvers } from '@fluentcommerce/fc-connect-sdk';
|
|
240
|
+
|
|
241
|
+
// Get a specific SDK resolver
|
|
242
|
+
const parseFloat = getSdkResolver('sdk.parseFloat');
|
|
243
|
+
const result = parseFloat('19.99', {}, {}, helpers);
|
|
244
|
+
|
|
245
|
+
// Check if a resolver name is an SDK resolver
|
|
246
|
+
if (isSdkResolver('sdk.parseFloat')) {
|
|
247
|
+
console.log('This is an SDK resolver');
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Access all SDK resolvers
|
|
251
|
+
console.log(Object.keys(sdkResolvers));
|
|
252
|
+
// Output: ['sdk.uppercase', 'sdk.lowercase', 'sdk.parseInt', ...]
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Real-World Usage Patterns
|
|
256
|
+
|
|
257
|
+
### Using SDK Resolvers in Mappings
|
|
258
|
+
|
|
259
|
+
```json
|
|
260
|
+
{
|
|
261
|
+
"fields": {
|
|
262
|
+
"sku": {
|
|
263
|
+
"source": "product_id",
|
|
264
|
+
"resolver": "sdk.uppercase"
|
|
265
|
+
},
|
|
266
|
+
"quantity": {
|
|
267
|
+
"source": "qty",
|
|
268
|
+
"resolver": "sdk.parseInt"
|
|
269
|
+
},
|
|
270
|
+
"price": {
|
|
271
|
+
"source": "unit_price",
|
|
272
|
+
"resolver": "sdk.parseFloat"
|
|
273
|
+
},
|
|
274
|
+
"expectedOn": {
|
|
275
|
+
"source": "delivery_date",
|
|
276
|
+
"resolver": "sdk.formatDate"
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Mixing SDK and Custom Resolvers
|
|
283
|
+
|
|
284
|
+
```typescript
|
|
285
|
+
const customResolvers = {
|
|
286
|
+
// Custom resolver
|
|
287
|
+
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
288
|
+
// Use SDK resolver helper
|
|
289
|
+
const upper = String(value).toUpperCase();
|
|
290
|
+
const prefix = config.skuPrefix || 'SKU';
|
|
291
|
+
return `${prefix}-${upper}`;
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
const mapper = new UniversalMapper(
|
|
296
|
+
{
|
|
297
|
+
fields: {
|
|
298
|
+
// SDK resolver
|
|
299
|
+
sku: { source: 'id', resolver: 'sdk.uppercase' },
|
|
300
|
+
|
|
301
|
+
// Custom resolver
|
|
302
|
+
formattedSKU: { source: 'id', resolver: 'custom.formatSKU' },
|
|
303
|
+
|
|
304
|
+
// SDK resolver
|
|
305
|
+
quantity: { source: 'qty', resolver: 'sdk.parseInt' }
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
customResolvers,
|
|
310
|
+
context: { skuPrefix: 'PROD' }
|
|
311
|
+
}
|
|
312
|
+
);
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## SDK Resolver Implementation Example
|
|
316
|
+
|
|
317
|
+
Here's how SDK resolvers are actually implemented:
|
|
318
|
+
|
|
319
|
+
```typescript
|
|
320
|
+
// In the SDK: src/services/resolvers/sdk-resolvers.ts
|
|
321
|
+
export const sdkResolvers: Record<string, FieldResolverFunction> = {
|
|
322
|
+
'sdk.uppercase': (value, sourceData, config, helpers) => {
|
|
323
|
+
return String(value).toUpperCase();
|
|
324
|
+
},
|
|
325
|
+
|
|
326
|
+
'sdk.lowercase': (value, sourceData, config, helpers) => {
|
|
327
|
+
return String(value).toLowerCase();
|
|
328
|
+
},
|
|
329
|
+
|
|
330
|
+
'sdk.trim': (value, sourceData, config, helpers) => {
|
|
331
|
+
return String(value).trim();
|
|
332
|
+
},
|
|
333
|
+
|
|
334
|
+
'sdk.parseInt': (value, sourceData, config, helpers) => {
|
|
335
|
+
return helpers.parseIntSafe(value, 0);
|
|
336
|
+
},
|
|
337
|
+
|
|
338
|
+
'sdk.parseFloat': (value, sourceData, config, helpers) => {
|
|
339
|
+
return helpers.parseFloatSafe(value, 0);
|
|
340
|
+
},
|
|
341
|
+
|
|
342
|
+
'sdk.number': (value, sourceData, config, helpers) => {
|
|
343
|
+
return helpers.parseFloatSafe(value, 0);
|
|
344
|
+
},
|
|
345
|
+
|
|
346
|
+
'sdk.formatDate': (value, sourceData, config, helpers) => {
|
|
347
|
+
if (!value) return value;
|
|
348
|
+
return helpers.formatDate(value);
|
|
349
|
+
},
|
|
350
|
+
|
|
351
|
+
'sdk.formatDateShort': (value, sourceData, config, helpers) => {
|
|
352
|
+
if (!value) return value;
|
|
353
|
+
const date = new Date(value);
|
|
354
|
+
if (isNaN(date.getTime())) return value;
|
|
355
|
+
return date.toISOString().split('T')[0];
|
|
356
|
+
},
|
|
357
|
+
|
|
358
|
+
'sdk.parseDate': (value, sourceData, config, helpers) => {
|
|
359
|
+
return helpers.parseDate(value);
|
|
360
|
+
},
|
|
361
|
+
|
|
362
|
+
'sdk.boolean': (value, sourceData, config, helpers) => {
|
|
363
|
+
if (value === null || value === undefined) {
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
const checkValue = typeof value === 'string' ? value.toLowerCase() : value;
|
|
367
|
+
return ['true', '1', 'yes', 'y', true, 1].includes(checkValue);
|
|
368
|
+
},
|
|
369
|
+
|
|
370
|
+
'sdk.parseJson': (value, sourceData, config, helpers) => {
|
|
371
|
+
if (typeof value === 'string') {
|
|
372
|
+
return helpers.safeJsonParse(value, value);
|
|
373
|
+
}
|
|
374
|
+
return value;
|
|
375
|
+
},
|
|
376
|
+
|
|
377
|
+
'sdk.toJson': (value, sourceData, config, helpers) => {
|
|
378
|
+
try {
|
|
379
|
+
return JSON.stringify(value);
|
|
380
|
+
} catch {
|
|
381
|
+
return value;
|
|
382
|
+
}
|
|
383
|
+
},
|
|
384
|
+
|
|
385
|
+
'sdk.identity': (value, sourceData, config, helpers) => {
|
|
386
|
+
return value;
|
|
387
|
+
},
|
|
388
|
+
|
|
389
|
+
'sdk.toString': (value, sourceData, config, helpers) => {
|
|
390
|
+
if (value === null || value === undefined) return '';
|
|
391
|
+
return String(value);
|
|
392
|
+
},
|
|
393
|
+
|
|
394
|
+
'sdk.coalesce': (value, sourceData, config, helpers) => {
|
|
395
|
+
return helpers.coalesce(value);
|
|
396
|
+
},
|
|
397
|
+
|
|
398
|
+
'sdk.default': (value, sourceData, config, helpers) => {
|
|
399
|
+
// Default value logic is handled by UniversalMapper.mapField()
|
|
400
|
+
// which applies config.defaultValue before calling resolvers
|
|
401
|
+
// This resolver exists for backward compatibility
|
|
402
|
+
return value;
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
// Utility to get SDK resolver
|
|
407
|
+
export function getSdkResolver(name: string): FieldResolverFunction | undefined {
|
|
408
|
+
return sdkResolvers[name];
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// Utility to check if resolver is SDK resolver
|
|
412
|
+
export function isSdkResolver(name: string): boolean {
|
|
413
|
+
return name.startsWith('sdk.') && name in sdkResolvers;
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
## Complete SDK Resolver List
|
|
418
|
+
|
|
419
|
+
| Resolver | Parameters Used | Purpose |
|
|
420
|
+
|----------|----------------|---------|
|
|
421
|
+
| `sdk.uppercase` | value, helpers | Convert to uppercase |
|
|
422
|
+
| `sdk.lowercase` | value, helpers | Convert to lowercase |
|
|
423
|
+
| `sdk.trim` | value, helpers | Trim whitespace |
|
|
424
|
+
| `sdk.toString` | value, helpers | Convert to string |
|
|
425
|
+
| `sdk.parseInt` | value, helpers | Parse integer safely |
|
|
426
|
+
| `sdk.parseFloat` | value, helpers | Parse float safely |
|
|
427
|
+
| `sdk.number` | value, helpers | Parse number (alias for parseFloat) |
|
|
428
|
+
| `sdk.formatDate` | value, helpers | Format date to ISO8601 |
|
|
429
|
+
| `sdk.formatDateShort` | value, helpers | Format date (YYYY-MM-DD) |
|
|
430
|
+
| `sdk.parseDate` | value, helpers | Parse date string |
|
|
431
|
+
| `sdk.boolean` | value, helpers | Convert to boolean |
|
|
432
|
+
| `sdk.parseJson` | value, helpers | Parse JSON safely |
|
|
433
|
+
| `sdk.toJson` | value, helpers | Convert to JSON string |
|
|
434
|
+
| `sdk.identity` | value | Pass-through (no transformation) |
|
|
435
|
+
| `sdk.coalesce` | value, helpers | Return first non-null value |
|
|
436
|
+
| `sdk.default` | value | No-op (defaultValue handled by mapper) |
|
|
437
|
+
|
|
438
|
+
## Creating Your Own SDK-Style Resolvers
|
|
439
|
+
|
|
440
|
+
You can create custom resolvers that follow SDK conventions:
|
|
441
|
+
|
|
442
|
+
```typescript
|
|
443
|
+
// Create a library of reusable resolvers
|
|
444
|
+
export const myResolvers = {
|
|
445
|
+
'my.formatPhone': (value, sourceData, config, helpers) => {
|
|
446
|
+
const digits = String(value).replace(/\D/g, '');
|
|
447
|
+
if (digits.length !== 10) return null;
|
|
448
|
+
return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)}-${digits.slice(6)}`;
|
|
449
|
+
},
|
|
450
|
+
|
|
451
|
+
'my.validateEmail': (value, sourceData, config, helpers) => {
|
|
452
|
+
if (!helpers.isValidEmail(value)) {
|
|
453
|
+
helpers.log.warn(`Invalid email: ${value}`);
|
|
454
|
+
return null;
|
|
455
|
+
}
|
|
456
|
+
return value;
|
|
457
|
+
},
|
|
458
|
+
|
|
459
|
+
'my.formatCurrency': (value, sourceData, config, helpers) => {
|
|
460
|
+
const currency = config?.currency || 'USD';
|
|
461
|
+
const locale = config?.locale || 'en-US';
|
|
462
|
+
return helpers.formatCurrency(value, currency, locale);
|
|
463
|
+
}
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
// Use alongside SDK resolvers
|
|
467
|
+
const mapper = new UniversalMapper(mapping, {
|
|
468
|
+
customResolvers: {
|
|
469
|
+
...sdkResolvers, // Include SDK resolvers
|
|
470
|
+
...myResolvers // Add your resolvers
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
## Key Takeaways
|
|
476
|
+
|
|
477
|
+
- 🎯 **SDK resolvers use 4 parameters** - Same signature as custom resolvers
|
|
478
|
+
- 🎯 **Consistency everywhere** - No exceptions, no special cases
|
|
479
|
+
- 🎯 **Extend easily** - Wrap SDK resolvers with custom logic
|
|
480
|
+
- 🎯 **Access programmatically** - Use `getSdkResolver()` and `isSdkResolver()`
|
|
481
|
+
- 🎯 **Mix and match** - Combine SDK and custom resolvers freely
|
|
482
|
+
|
|
483
|
+
## Practice Exercise
|
|
484
|
+
|
|
485
|
+
Create a custom resolver that wraps an SDK resolver and adds validation:
|
|
486
|
+
|
|
487
|
+
**Requirements:**
|
|
488
|
+
- Call `sdk.parseFloat` to parse value
|
|
489
|
+
- Validate result is within range (from config)
|
|
490
|
+
- Log warning if out of range
|
|
491
|
+
- Return null if invalid, result if valid
|
|
492
|
+
|
|
493
|
+
<details>
|
|
494
|
+
<summary>Show Solution</summary>
|
|
495
|
+
|
|
496
|
+
```typescript
|
|
497
|
+
'custom.parseFloatWithRange': (value, sourceData, config, helpers) => {
|
|
498
|
+
// Use SDK resolver to parse
|
|
499
|
+
const sdkParseFloat = getSdkResolver('sdk.parseFloat');
|
|
500
|
+
const parsed = sdkParseFloat(value, sourceData, config, helpers);
|
|
501
|
+
|
|
502
|
+
// Validate range from config
|
|
503
|
+
const min = config?.minValue ?? -Infinity;
|
|
504
|
+
const max = config?.maxValue ?? Infinity;
|
|
505
|
+
|
|
506
|
+
if (parsed < min || parsed > max) {
|
|
507
|
+
helpers.log.warn(
|
|
508
|
+
`Value ${parsed} out of range [${min}, ${max}]`
|
|
509
|
+
);
|
|
510
|
+
return null;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
return parsed;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// Usage
|
|
517
|
+
const mapper = new UniversalMapper(mapping, {
|
|
518
|
+
customResolvers: {
|
|
519
|
+
'custom.parseFloatWithRange': parseFloatWithRange
|
|
520
|
+
},
|
|
521
|
+
context: {
|
|
522
|
+
minValue: 0,
|
|
523
|
+
maxValue: 10000
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
```
|
|
527
|
+
</details>
|
|
528
|
+
|
|
529
|
+
## Next Steps
|
|
530
|
+
|
|
531
|
+
Continue to [Module 6: Migration Guide](./resolver-signature-06-migration-guide.md) to learn how to migrate from old 3-parameter resolvers to the new 4-parameter signature.
|