@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +11 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md
CHANGED
|
@@ -1,546 +1,546 @@
|
|
|
1
|
-
# Module 4: Data Enrichment
|
|
2
|
-
|
|
3
|
-
**Level:** Intermediate
|
|
4
|
-
**Estimated Time:** 20 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module covers advanced GraphQL techniques for enriching extracted data with related entities, including batch queries, nested relations, and efficient enrichment patterns.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
- ✅ Enrich data with related entities using GraphQL
|
|
14
|
-
- ✅ Use batch queries to avoid N+1 query problems
|
|
15
|
-
- ✅ Extract nested relations in a single query
|
|
16
|
-
- ✅ Implement efficient enrichment for large datasets
|
|
17
|
-
- ✅ Handle missing or null relations gracefully
|
|
18
|
-
|
|
19
|
-
## Why Enrichment Matters
|
|
20
|
-
|
|
21
|
-
**Without enrichment** (flat data):
|
|
22
|
-
```json
|
|
23
|
-
{
|
|
24
|
-
"ref": "INV-001",
|
|
25
|
-
"productRef": "SKU-123",
|
|
26
|
-
"locationRef": "WH-001",
|
|
27
|
-
"qty": 100
|
|
28
|
-
}
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
**With enrichment** (complete context):
|
|
32
|
-
```json
|
|
33
|
-
{
|
|
34
|
-
"ref": "INV-001",
|
|
35
|
-
"productRef": "SKU-123",
|
|
36
|
-
"locationRef": "WH-001",
|
|
37
|
-
"qty": 100,
|
|
38
|
-
"product": {
|
|
39
|
-
"ref": "SKU-123",
|
|
40
|
-
"name": "Wireless Mouse",
|
|
41
|
-
"gtin": "0123456789012"
|
|
42
|
-
},
|
|
43
|
-
"location": {
|
|
44
|
-
"ref": "WH-001",
|
|
45
|
-
"name": "Main Warehouse",
|
|
46
|
-
"type": "PHYSICAL"
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Single Query Enrichment
|
|
52
|
-
|
|
53
|
-
### Nested GraphQL Relations
|
|
54
|
-
|
|
55
|
-
Extract parent and child entities in one query:
|
|
56
|
-
|
|
57
|
-
```typescript
|
|
58
|
-
const query = `
|
|
59
|
-
query ExtractInventoryEnriched($first: Int!, $after: String) {
|
|
60
|
-
inventoryPositions(first: $first, after: $after) {
|
|
61
|
-
edges {
|
|
62
|
-
node {
|
|
63
|
-
id
|
|
64
|
-
ref
|
|
65
|
-
productRef
|
|
66
|
-
locationRef
|
|
67
|
-
qty
|
|
68
|
-
status
|
|
69
|
-
|
|
70
|
-
# Product relation
|
|
71
|
-
product {
|
|
72
|
-
ref
|
|
73
|
-
name
|
|
74
|
-
gtin
|
|
75
|
-
description
|
|
76
|
-
catalogue {
|
|
77
|
-
ref
|
|
78
|
-
name
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
# Location relation
|
|
83
|
-
location {
|
|
84
|
-
ref
|
|
85
|
-
name
|
|
86
|
-
type
|
|
87
|
-
address {
|
|
88
|
-
city
|
|
89
|
-
state
|
|
90
|
-
country
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
cursor
|
|
95
|
-
}
|
|
96
|
-
pageInfo { hasNextPage }
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
`;
|
|
100
|
-
|
|
101
|
-
const result = await client.graphql({
|
|
102
|
-
query,
|
|
103
|
-
variables: { first: 100 },
|
|
104
|
-
pagination: { maxRecords: 10000 }
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
const enriched = result.data.inventoryPositions.edges.map(e => e.node);
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
**Benefits:**
|
|
111
|
-
- Single API call per page
|
|
112
|
-
- Consistent data snapshot
|
|
113
|
-
- Reduced network overhead
|
|
114
|
-
|
|
115
|
-
### Orders with Items Example
|
|
116
|
-
|
|
117
|
-
```typescript
|
|
118
|
-
const query = `
|
|
119
|
-
query ExtractOrdersFull($first: Int!, $after: String) {
|
|
120
|
-
orders(first: $first, after: $after) {
|
|
121
|
-
edges {
|
|
122
|
-
node {
|
|
123
|
-
id
|
|
124
|
-
ref
|
|
125
|
-
type
|
|
126
|
-
status
|
|
127
|
-
totalPrice
|
|
128
|
-
currency
|
|
129
|
-
|
|
130
|
-
customer {
|
|
131
|
-
ref
|
|
132
|
-
email
|
|
133
|
-
firstName
|
|
134
|
-
lastName
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
billingAddress {
|
|
138
|
-
street
|
|
139
|
-
city
|
|
140
|
-
state
|
|
141
|
-
postcode
|
|
142
|
-
country
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
items {
|
|
146
|
-
edges {
|
|
147
|
-
node {
|
|
148
|
-
ref
|
|
149
|
-
productRef
|
|
150
|
-
quantity
|
|
151
|
-
price
|
|
152
|
-
totalPrice
|
|
153
|
-
currency
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
cursor
|
|
159
|
-
}
|
|
160
|
-
pageInfo { hasNextPage }
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
`;
|
|
164
|
-
|
|
165
|
-
const result = await client.graphql({
|
|
166
|
-
query,
|
|
167
|
-
variables: { first: 50 }, // Smaller pages for complex queries
|
|
168
|
-
pagination: { maxRecords: 5000 }
|
|
169
|
-
});
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
## Batch Enrichment Pattern
|
|
173
|
-
|
|
174
|
-
When you can't get all data in one query, use batch enrichment to avoid N+1 queries.
|
|
175
|
-
|
|
176
|
-
### The N+1 Problem
|
|
177
|
-
|
|
178
|
-
**❌ BAD: N+1 queries**
|
|
179
|
-
```typescript
|
|
180
|
-
// 1 query to get inventory
|
|
181
|
-
const inventory = await getInventoryPositions();
|
|
182
|
-
|
|
183
|
-
// N queries to get each product (if we have 1000 items = 1000 queries!)
|
|
184
|
-
for (const item of inventory) {
|
|
185
|
-
const product = await client.graphql({
|
|
186
|
-
query: `query { product(ref: "${item.productRef}") { name } }`
|
|
187
|
-
});
|
|
188
|
-
item.product = product.data.product;
|
|
189
|
-
}
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
### ✅ GOOD: Batch Query Solution
|
|
193
|
-
|
|
194
|
-
```typescript
|
|
195
|
-
async function enrichInventoryWithProducts(inventory: any[]) {
|
|
196
|
-
const batchSize = 50;
|
|
197
|
-
const enriched = [];
|
|
198
|
-
|
|
199
|
-
for (let i = 0; i < inventory.length; i += batchSize) {
|
|
200
|
-
const batch = inventory.slice(i, i + batchSize);
|
|
201
|
-
const productRefs = batch.map(item => item.productRef);
|
|
202
|
-
|
|
203
|
-
// Single query for 50 products
|
|
204
|
-
const result = await client.graphql({
|
|
205
|
-
query: `
|
|
206
|
-
query GetProducts($refs: [String!]!) {
|
|
207
|
-
products(filter: { ref: { in: $refs } }, first: ${batchSize}) {
|
|
208
|
-
edges {
|
|
209
|
-
node {
|
|
210
|
-
ref
|
|
211
|
-
name
|
|
212
|
-
gtin
|
|
213
|
-
catalogue { ref name }
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
`,
|
|
219
|
-
variables: { refs: productRefs }
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
// Map products back to inventory items
|
|
223
|
-
const productMap = new Map(
|
|
224
|
-
result.data.products.edges.map(e => [e.node.ref, e.node])
|
|
225
|
-
);
|
|
226
|
-
|
|
227
|
-
for (const item of batch) {
|
|
228
|
-
enriched.push({
|
|
229
|
-
...item,
|
|
230
|
-
product: productMap.get(item.productRef) || null
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
return enriched;
|
|
236
|
-
}
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
### Multi-Entity Batch Enrichment
|
|
240
|
-
|
|
241
|
-
Enrich with multiple entity types:
|
|
242
|
-
|
|
243
|
-
```typescript
|
|
244
|
-
async function enrichInventoryFull(inventory: any[]) {
|
|
245
|
-
const batchSize = 50;
|
|
246
|
-
const enriched = [];
|
|
247
|
-
|
|
248
|
-
for (let i = 0; i < inventory.length; i += batchSize) {
|
|
249
|
-
const batch = inventory.slice(i, i + batchSize);
|
|
250
|
-
|
|
251
|
-
// Get unique refs
|
|
252
|
-
const productRefs = [...new Set(batch.map(item => item.productRef))];
|
|
253
|
-
const locationRefs = [...new Set(batch.map(item => item.locationRef))];
|
|
254
|
-
|
|
255
|
-
// Parallel batch queries
|
|
256
|
-
const [productsResult, locationsResult] = await Promise.all([
|
|
257
|
-
client.graphql({
|
|
258
|
-
query: `
|
|
259
|
-
query GetProducts($refs: [String!]!) {
|
|
260
|
-
products(filter: { ref: { in: $refs } }, first: 100) {
|
|
261
|
-
edges { node { ref name gtin } }
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
`,
|
|
265
|
-
variables: { refs: productRefs }
|
|
266
|
-
}),
|
|
267
|
-
client.graphql({
|
|
268
|
-
query: `
|
|
269
|
-
query GetLocations($refs: [String!]!) {
|
|
270
|
-
locations(filter: { ref: { in: $refs } }, first: 100) {
|
|
271
|
-
edges { node { ref name type } }
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
`,
|
|
275
|
-
variables: { refs: locationRefs }
|
|
276
|
-
})
|
|
277
|
-
]);
|
|
278
|
-
|
|
279
|
-
// Create lookup maps
|
|
280
|
-
const productMap = new Map(
|
|
281
|
-
productsResult.data.products.edges.map(e => [e.node.ref, e.node])
|
|
282
|
-
);
|
|
283
|
-
const locationMap = new Map(
|
|
284
|
-
locationsResult.data.locations.edges.map(e => [e.node.ref, e.node])
|
|
285
|
-
);
|
|
286
|
-
|
|
287
|
-
// Enrich batch
|
|
288
|
-
for (const item of batch) {
|
|
289
|
-
enriched.push({
|
|
290
|
-
...item,
|
|
291
|
-
product: productMap.get(item.productRef) || null,
|
|
292
|
-
location: locationMap.get(item.locationRef) || null
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
return enriched;
|
|
298
|
-
}
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
## Advanced Enrichment Patterns
|
|
302
|
-
|
|
303
|
-
### Conditional Enrichment
|
|
304
|
-
|
|
305
|
-
Only enrich items that meet certain criteria:
|
|
306
|
-
|
|
307
|
-
```typescript
|
|
308
|
-
async function conditionalEnrichment(inventory: any[]) {
|
|
309
|
-
// Filter items that need enrichment
|
|
310
|
-
const itemsNeedingEnrichment = inventory.filter(item =>
|
|
311
|
-
item.qty > 0 && item.status === 'AVAILABLE'
|
|
312
|
-
);
|
|
313
|
-
|
|
314
|
-
// Enrich only those items
|
|
315
|
-
const enriched = await enrichInventoryWithProducts(itemsNeedingEnrichment);
|
|
316
|
-
|
|
317
|
-
// Merge back with original data
|
|
318
|
-
const enrichedMap = new Map(enriched.map(item => [item.ref, item]));
|
|
319
|
-
|
|
320
|
-
return inventory.map(item =>
|
|
321
|
-
enrichedMap.get(item.ref) || item
|
|
322
|
-
);
|
|
323
|
-
}
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
### Cached Enrichment
|
|
327
|
-
|
|
328
|
-
Cache frequently accessed reference data:
|
|
329
|
-
|
|
330
|
-
```typescript
|
|
331
|
-
class CachedEnrichment {
|
|
332
|
-
private productCache = new Map<string, any>();
|
|
333
|
-
private locationCache = new Map<string, any>();
|
|
334
|
-
|
|
335
|
-
async enrichWithCache(inventory: any[]) {
|
|
336
|
-
// Find uncached products
|
|
337
|
-
const uncachedProductRefs = inventory
|
|
338
|
-
.map(item => item.productRef)
|
|
339
|
-
.filter(ref => !this.productCache.has(ref));
|
|
340
|
-
|
|
341
|
-
// Fetch uncached products
|
|
342
|
-
if (uncachedProductRefs.length > 0) {
|
|
343
|
-
const products = await this.fetchProducts(uncachedProductRefs);
|
|
344
|
-
products.forEach(p => this.productCache.set(p.ref, p));
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
// Enrich from cache
|
|
348
|
-
return inventory.map(item => ({
|
|
349
|
-
...item,
|
|
350
|
-
product: this.productCache.get(item.productRef) || null
|
|
351
|
-
}));
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
private async fetchProducts(refs: string[]) {
|
|
355
|
-
const result = await client.graphql({
|
|
356
|
-
query: `
|
|
357
|
-
query GetProducts($refs: [String!]!) {
|
|
358
|
-
products(filter: { ref: { in: $refs } }, first: 1000) {
|
|
359
|
-
edges { node { ref name gtin } }
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
`,
|
|
363
|
-
variables: { refs }
|
|
364
|
-
});
|
|
365
|
-
return result.data.products.edges.map(e => e.node);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
### Deep Nesting
|
|
371
|
-
|
|
372
|
-
Extract multiple levels of relations:
|
|
373
|
-
|
|
374
|
-
```typescript
|
|
375
|
-
const query = `
|
|
376
|
-
query ExtractProductsDeep($first: Int!, $after: String) {
|
|
377
|
-
products(first: $first, after: $after) {
|
|
378
|
-
edges {
|
|
379
|
-
node {
|
|
380
|
-
ref
|
|
381
|
-
name
|
|
382
|
-
|
|
383
|
-
catalogue {
|
|
384
|
-
ref
|
|
385
|
-
name
|
|
386
|
-
retailer {
|
|
387
|
-
id
|
|
388
|
-
name
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
categories {
|
|
393
|
-
edges {
|
|
394
|
-
node {
|
|
395
|
-
name
|
|
396
|
-
path
|
|
397
|
-
parent {
|
|
398
|
-
name
|
|
399
|
-
path
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
inventoryPositions {
|
|
406
|
-
edges {
|
|
407
|
-
node {
|
|
408
|
-
ref
|
|
409
|
-
qty
|
|
410
|
-
location {
|
|
411
|
-
ref
|
|
412
|
-
name
|
|
413
|
-
type
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
cursor
|
|
420
|
-
}
|
|
421
|
-
pageInfo { hasNextPage }
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
`;
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
## Handling Missing Relations
|
|
428
|
-
|
|
429
|
-
### Graceful Null Handling
|
|
430
|
-
|
|
431
|
-
```typescript
|
|
432
|
-
function transformEnrichedRecord(record: any) {
|
|
433
|
-
return {
|
|
434
|
-
sku: record.productRef,
|
|
435
|
-
productName: record.product?.name || 'Unknown Product',
|
|
436
|
-
productGtin: record.product?.gtin || '',
|
|
437
|
-
warehouse: record.locationRef,
|
|
438
|
-
warehouseName: record.location?.name || 'Unknown Location',
|
|
439
|
-
warehouseType: record.location?.type || 'UNKNOWN',
|
|
440
|
-
quantity: parseInt(record.qty) || 0
|
|
441
|
-
};
|
|
442
|
-
}
|
|
443
|
-
```
|
|
444
|
-
|
|
445
|
-
### Validation and Error Reporting
|
|
446
|
-
|
|
447
|
-
```typescript
|
|
448
|
-
function validateEnrichment(enriched: any[]) {
|
|
449
|
-
const issues = [];
|
|
450
|
-
|
|
451
|
-
for (const record of enriched) {
|
|
452
|
-
if (!record.product) {
|
|
453
|
-
issues.push({
|
|
454
|
-
type: 'MISSING_PRODUCT',
|
|
455
|
-
ref: record.ref,
|
|
456
|
-
productRef: record.productRef
|
|
457
|
-
});
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
if (!record.location) {
|
|
461
|
-
issues.push({
|
|
462
|
-
type: 'MISSING_LOCATION',
|
|
463
|
-
ref: record.ref,
|
|
464
|
-
locationRef: record.locationRef
|
|
465
|
-
});
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
if (issues.length > 0) {
|
|
470
|
-
console.warn(`Found ${issues.length} enrichment issues`);
|
|
471
|
-
console.warn(issues.slice(0, 10)); // Show first 10
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
return issues;
|
|
475
|
-
}
|
|
476
|
-
```
|
|
477
|
-
|
|
478
|
-
## Practice Exercise
|
|
479
|
-
|
|
480
|
-
**Goal**: Extract inventory positions and enrich with product and location details using batch queries
|
|
481
|
-
|
|
482
|
-
**Requirements:**
|
|
483
|
-
1. Extract inventory positions with basic fields
|
|
484
|
-
2. Batch enrich with products (name, gtin, catalogue)
|
|
485
|
-
3. Batch enrich with locations (name, type)
|
|
486
|
-
4. Handle missing relations gracefully
|
|
487
|
-
5. Report enrichment statistics
|
|
488
|
-
|
|
489
|
-
**Solution:**
|
|
490
|
-
|
|
491
|
-
```typescript
|
|
492
|
-
async function extractAndEnrichInventory() {
|
|
493
|
-
// Step 1: Extract basic inventory
|
|
494
|
-
const result = await client.graphql({
|
|
495
|
-
query: `
|
|
496
|
-
query ExtractInventory($first: Int!, $after: String) {
|
|
497
|
-
inventoryPositions(first: $first, after: $after) {
|
|
498
|
-
edges {
|
|
499
|
-
node { id ref productRef locationRef qty status }
|
|
500
|
-
cursor
|
|
501
|
-
}
|
|
502
|
-
pageInfo { hasNextPage }
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
`,
|
|
506
|
-
variables: { first: 100 },
|
|
507
|
-
pagination: { maxRecords: 10000 }
|
|
508
|
-
});
|
|
509
|
-
|
|
510
|
-
const inventory = result.data.inventoryPositions.edges.map(e => e.node);
|
|
511
|
-
console.log(`Extracted ${inventory.length} inventory positions`);
|
|
512
|
-
|
|
513
|
-
// Step 2: Batch enrich
|
|
514
|
-
const enriched = await enrichInventoryFull(inventory);
|
|
515
|
-
|
|
516
|
-
// Step 3: Validate enrichment
|
|
517
|
-
const issues = validateEnrichment(enriched);
|
|
518
|
-
|
|
519
|
-
// Step 4: Report statistics
|
|
520
|
-
const stats = {
|
|
521
|
-
total: enriched.length,
|
|
522
|
-
withProduct: enriched.filter(r => r.product).length,
|
|
523
|
-
withLocation: enriched.filter(r => r.location).length,
|
|
524
|
-
fullyEnriched: enriched.filter(r => r.product && r.location).length,
|
|
525
|
-
issues: issues.length
|
|
526
|
-
};
|
|
527
|
-
|
|
528
|
-
console.log('Enrichment statistics:', stats);
|
|
529
|
-
|
|
530
|
-
return enriched;
|
|
531
|
-
}
|
|
532
|
-
```
|
|
533
|
-
|
|
534
|
-
## Key Takeaways
|
|
535
|
-
|
|
536
|
-
- 🎯 Use nested GraphQL relations when possible (single query)
|
|
537
|
-
- 🎯 Batch enrichment avoids N+1 query problem
|
|
538
|
-
- 🎯 Parallel queries for multiple entity types
|
|
539
|
-
- 🎯 Cache frequently accessed reference data
|
|
540
|
-
- 🎯 Handle missing relations gracefully with null checks
|
|
541
|
-
- 🎯 Validate enrichment and report issues
|
|
542
|
-
- 🎯 Choose appropriate batch sizes (50-100 typically optimal)
|
|
543
|
-
|
|
544
|
-
## Next Steps
|
|
545
|
-
|
|
546
|
-
Continue to [Module 5: Data Transformation](./02-core-guides-extraction-05-transformation.md) to learn how to transform enriched data using UniversalMapper and custom transformers.
|
|
1
|
+
# Module 4: Data Enrichment
|
|
2
|
+
|
|
3
|
+
**Level:** Intermediate
|
|
4
|
+
**Estimated Time:** 20 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module covers advanced GraphQL techniques for enriching extracted data with related entities, including batch queries, nested relations, and efficient enrichment patterns.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
- ✅ Enrich data with related entities using GraphQL
|
|
14
|
+
- ✅ Use batch queries to avoid N+1 query problems
|
|
15
|
+
- ✅ Extract nested relations in a single query
|
|
16
|
+
- ✅ Implement efficient enrichment for large datasets
|
|
17
|
+
- ✅ Handle missing or null relations gracefully
|
|
18
|
+
|
|
19
|
+
## Why Enrichment Matters
|
|
20
|
+
|
|
21
|
+
**Without enrichment** (flat data):
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"ref": "INV-001",
|
|
25
|
+
"productRef": "SKU-123",
|
|
26
|
+
"locationRef": "WH-001",
|
|
27
|
+
"qty": 100
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**With enrichment** (complete context):
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"ref": "INV-001",
|
|
35
|
+
"productRef": "SKU-123",
|
|
36
|
+
"locationRef": "WH-001",
|
|
37
|
+
"qty": 100,
|
|
38
|
+
"product": {
|
|
39
|
+
"ref": "SKU-123",
|
|
40
|
+
"name": "Wireless Mouse",
|
|
41
|
+
"gtin": "0123456789012"
|
|
42
|
+
},
|
|
43
|
+
"location": {
|
|
44
|
+
"ref": "WH-001",
|
|
45
|
+
"name": "Main Warehouse",
|
|
46
|
+
"type": "PHYSICAL"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Single Query Enrichment
|
|
52
|
+
|
|
53
|
+
### Nested GraphQL Relations
|
|
54
|
+
|
|
55
|
+
Extract parent and child entities in one query:
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
const query = `
|
|
59
|
+
query ExtractInventoryEnriched($first: Int!, $after: String) {
|
|
60
|
+
inventoryPositions(first: $first, after: $after) {
|
|
61
|
+
edges {
|
|
62
|
+
node {
|
|
63
|
+
id
|
|
64
|
+
ref
|
|
65
|
+
productRef
|
|
66
|
+
locationRef
|
|
67
|
+
qty
|
|
68
|
+
status
|
|
69
|
+
|
|
70
|
+
# Product relation
|
|
71
|
+
product {
|
|
72
|
+
ref
|
|
73
|
+
name
|
|
74
|
+
gtin
|
|
75
|
+
description
|
|
76
|
+
catalogue {
|
|
77
|
+
ref
|
|
78
|
+
name
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
# Location relation
|
|
83
|
+
location {
|
|
84
|
+
ref
|
|
85
|
+
name
|
|
86
|
+
type
|
|
87
|
+
address {
|
|
88
|
+
city
|
|
89
|
+
state
|
|
90
|
+
country
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
cursor
|
|
95
|
+
}
|
|
96
|
+
pageInfo { hasNextPage }
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
`;
|
|
100
|
+
|
|
101
|
+
const result = await client.graphql({
|
|
102
|
+
query,
|
|
103
|
+
variables: { first: 100 },
|
|
104
|
+
pagination: { maxRecords: 10000 }
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const enriched = result.data.inventoryPositions.edges.map(e => e.node);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Benefits:**
|
|
111
|
+
- Single API call per page
|
|
112
|
+
- Consistent data snapshot
|
|
113
|
+
- Reduced network overhead
|
|
114
|
+
|
|
115
|
+
### Orders with Items Example
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
const query = `
|
|
119
|
+
query ExtractOrdersFull($first: Int!, $after: String) {
|
|
120
|
+
orders(first: $first, after: $after) {
|
|
121
|
+
edges {
|
|
122
|
+
node {
|
|
123
|
+
id
|
|
124
|
+
ref
|
|
125
|
+
type
|
|
126
|
+
status
|
|
127
|
+
totalPrice
|
|
128
|
+
currency
|
|
129
|
+
|
|
130
|
+
customer {
|
|
131
|
+
ref
|
|
132
|
+
email
|
|
133
|
+
firstName
|
|
134
|
+
lastName
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
billingAddress {
|
|
138
|
+
street
|
|
139
|
+
city
|
|
140
|
+
state
|
|
141
|
+
postcode
|
|
142
|
+
country
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
items {
|
|
146
|
+
edges {
|
|
147
|
+
node {
|
|
148
|
+
ref
|
|
149
|
+
productRef
|
|
150
|
+
quantity
|
|
151
|
+
price
|
|
152
|
+
totalPrice
|
|
153
|
+
currency
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
cursor
|
|
159
|
+
}
|
|
160
|
+
pageInfo { hasNextPage }
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
`;
|
|
164
|
+
|
|
165
|
+
const result = await client.graphql({
|
|
166
|
+
query,
|
|
167
|
+
variables: { first: 50 }, // Smaller pages for complex queries
|
|
168
|
+
pagination: { maxRecords: 5000 }
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Batch Enrichment Pattern
|
|
173
|
+
|
|
174
|
+
When you can't get all data in one query, use batch enrichment to avoid N+1 queries.
|
|
175
|
+
|
|
176
|
+
### The N+1 Problem
|
|
177
|
+
|
|
178
|
+
**❌ BAD: N+1 queries**
|
|
179
|
+
```typescript
|
|
180
|
+
// 1 query to get inventory
|
|
181
|
+
const inventory = await getInventoryPositions();
|
|
182
|
+
|
|
183
|
+
// N queries to get each product (if we have 1000 items = 1000 queries!)
|
|
184
|
+
for (const item of inventory) {
|
|
185
|
+
const product = await client.graphql({
|
|
186
|
+
query: `query { product(ref: "${item.productRef}") { name } }`
|
|
187
|
+
});
|
|
188
|
+
item.product = product.data.product;
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### ✅ GOOD: Batch Query Solution
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
async function enrichInventoryWithProducts(inventory: any[]) {
|
|
196
|
+
const batchSize = 50;
|
|
197
|
+
const enriched = [];
|
|
198
|
+
|
|
199
|
+
for (let i = 0; i < inventory.length; i += batchSize) {
|
|
200
|
+
const batch = inventory.slice(i, i + batchSize);
|
|
201
|
+
const productRefs = batch.map(item => item.productRef);
|
|
202
|
+
|
|
203
|
+
// Single query for 50 products
|
|
204
|
+
const result = await client.graphql({
|
|
205
|
+
query: `
|
|
206
|
+
query GetProducts($refs: [String!]!) {
|
|
207
|
+
products(filter: { ref: { in: $refs } }, first: ${batchSize}) {
|
|
208
|
+
edges {
|
|
209
|
+
node {
|
|
210
|
+
ref
|
|
211
|
+
name
|
|
212
|
+
gtin
|
|
213
|
+
catalogue { ref name }
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
`,
|
|
219
|
+
variables: { refs: productRefs }
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
// Map products back to inventory items
|
|
223
|
+
const productMap = new Map(
|
|
224
|
+
result.data.products.edges.map(e => [e.node.ref, e.node])
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
for (const item of batch) {
|
|
228
|
+
enriched.push({
|
|
229
|
+
...item,
|
|
230
|
+
product: productMap.get(item.productRef) || null
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return enriched;
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Multi-Entity Batch Enrichment
|
|
240
|
+
|
|
241
|
+
Enrich with multiple entity types:
|
|
242
|
+
|
|
243
|
+
```typescript
|
|
244
|
+
async function enrichInventoryFull(inventory: any[]) {
|
|
245
|
+
const batchSize = 50;
|
|
246
|
+
const enriched = [];
|
|
247
|
+
|
|
248
|
+
for (let i = 0; i < inventory.length; i += batchSize) {
|
|
249
|
+
const batch = inventory.slice(i, i + batchSize);
|
|
250
|
+
|
|
251
|
+
// Get unique refs
|
|
252
|
+
const productRefs = [...new Set(batch.map(item => item.productRef))];
|
|
253
|
+
const locationRefs = [...new Set(batch.map(item => item.locationRef))];
|
|
254
|
+
|
|
255
|
+
// Parallel batch queries
|
|
256
|
+
const [productsResult, locationsResult] = await Promise.all([
|
|
257
|
+
client.graphql({
|
|
258
|
+
query: `
|
|
259
|
+
query GetProducts($refs: [String!]!) {
|
|
260
|
+
products(filter: { ref: { in: $refs } }, first: 100) {
|
|
261
|
+
edges { node { ref name gtin } }
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
`,
|
|
265
|
+
variables: { refs: productRefs }
|
|
266
|
+
}),
|
|
267
|
+
client.graphql({
|
|
268
|
+
query: `
|
|
269
|
+
query GetLocations($refs: [String!]!) {
|
|
270
|
+
locations(filter: { ref: { in: $refs } }, first: 100) {
|
|
271
|
+
edges { node { ref name type } }
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
`,
|
|
275
|
+
variables: { refs: locationRefs }
|
|
276
|
+
})
|
|
277
|
+
]);
|
|
278
|
+
|
|
279
|
+
// Create lookup maps
|
|
280
|
+
const productMap = new Map(
|
|
281
|
+
productsResult.data.products.edges.map(e => [e.node.ref, e.node])
|
|
282
|
+
);
|
|
283
|
+
const locationMap = new Map(
|
|
284
|
+
locationsResult.data.locations.edges.map(e => [e.node.ref, e.node])
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
// Enrich batch
|
|
288
|
+
for (const item of batch) {
|
|
289
|
+
enriched.push({
|
|
290
|
+
...item,
|
|
291
|
+
product: productMap.get(item.productRef) || null,
|
|
292
|
+
location: locationMap.get(item.locationRef) || null
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return enriched;
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## Advanced Enrichment Patterns
|
|
302
|
+
|
|
303
|
+
### Conditional Enrichment
|
|
304
|
+
|
|
305
|
+
Only enrich items that meet certain criteria:
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
async function conditionalEnrichment(inventory: any[]) {
|
|
309
|
+
// Filter items that need enrichment
|
|
310
|
+
const itemsNeedingEnrichment = inventory.filter(item =>
|
|
311
|
+
item.qty > 0 && item.status === 'AVAILABLE'
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
// Enrich only those items
|
|
315
|
+
const enriched = await enrichInventoryWithProducts(itemsNeedingEnrichment);
|
|
316
|
+
|
|
317
|
+
// Merge back with original data
|
|
318
|
+
const enrichedMap = new Map(enriched.map(item => [item.ref, item]));
|
|
319
|
+
|
|
320
|
+
return inventory.map(item =>
|
|
321
|
+
enrichedMap.get(item.ref) || item
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Cached Enrichment
|
|
327
|
+
|
|
328
|
+
Cache frequently accessed reference data:
|
|
329
|
+
|
|
330
|
+
```typescript
|
|
331
|
+
class CachedEnrichment {
|
|
332
|
+
private productCache = new Map<string, any>();
|
|
333
|
+
private locationCache = new Map<string, any>();
|
|
334
|
+
|
|
335
|
+
async enrichWithCache(inventory: any[]) {
|
|
336
|
+
// Find uncached products
|
|
337
|
+
const uncachedProductRefs = inventory
|
|
338
|
+
.map(item => item.productRef)
|
|
339
|
+
.filter(ref => !this.productCache.has(ref));
|
|
340
|
+
|
|
341
|
+
// Fetch uncached products
|
|
342
|
+
if (uncachedProductRefs.length > 0) {
|
|
343
|
+
const products = await this.fetchProducts(uncachedProductRefs);
|
|
344
|
+
products.forEach(p => this.productCache.set(p.ref, p));
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Enrich from cache
|
|
348
|
+
return inventory.map(item => ({
|
|
349
|
+
...item,
|
|
350
|
+
product: this.productCache.get(item.productRef) || null
|
|
351
|
+
}));
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
private async fetchProducts(refs: string[]) {
|
|
355
|
+
const result = await client.graphql({
|
|
356
|
+
query: `
|
|
357
|
+
query GetProducts($refs: [String!]!) {
|
|
358
|
+
products(filter: { ref: { in: $refs } }, first: 1000) {
|
|
359
|
+
edges { node { ref name gtin } }
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
`,
|
|
363
|
+
variables: { refs }
|
|
364
|
+
});
|
|
365
|
+
return result.data.products.edges.map(e => e.node);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Deep Nesting
|
|
371
|
+
|
|
372
|
+
Extract multiple levels of relations:
|
|
373
|
+
|
|
374
|
+
```typescript
|
|
375
|
+
const query = `
|
|
376
|
+
query ExtractProductsDeep($first: Int!, $after: String) {
|
|
377
|
+
products(first: $first, after: $after) {
|
|
378
|
+
edges {
|
|
379
|
+
node {
|
|
380
|
+
ref
|
|
381
|
+
name
|
|
382
|
+
|
|
383
|
+
catalogue {
|
|
384
|
+
ref
|
|
385
|
+
name
|
|
386
|
+
retailer {
|
|
387
|
+
id
|
|
388
|
+
name
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
categories {
|
|
393
|
+
edges {
|
|
394
|
+
node {
|
|
395
|
+
name
|
|
396
|
+
path
|
|
397
|
+
parent {
|
|
398
|
+
name
|
|
399
|
+
path
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
inventoryPositions {
|
|
406
|
+
edges {
|
|
407
|
+
node {
|
|
408
|
+
ref
|
|
409
|
+
qty
|
|
410
|
+
location {
|
|
411
|
+
ref
|
|
412
|
+
name
|
|
413
|
+
type
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
cursor
|
|
420
|
+
}
|
|
421
|
+
pageInfo { hasNextPage }
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
`;
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
## Handling Missing Relations
|
|
428
|
+
|
|
429
|
+
### Graceful Null Handling
|
|
430
|
+
|
|
431
|
+
```typescript
|
|
432
|
+
function transformEnrichedRecord(record: any) {
|
|
433
|
+
return {
|
|
434
|
+
sku: record.productRef,
|
|
435
|
+
productName: record.product?.name || 'Unknown Product',
|
|
436
|
+
productGtin: record.product?.gtin || '',
|
|
437
|
+
warehouse: record.locationRef,
|
|
438
|
+
warehouseName: record.location?.name || 'Unknown Location',
|
|
439
|
+
warehouseType: record.location?.type || 'UNKNOWN',
|
|
440
|
+
quantity: parseInt(record.qty) || 0
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### Validation and Error Reporting
|
|
446
|
+
|
|
447
|
+
```typescript
|
|
448
|
+
function validateEnrichment(enriched: any[]) {
|
|
449
|
+
const issues = [];
|
|
450
|
+
|
|
451
|
+
for (const record of enriched) {
|
|
452
|
+
if (!record.product) {
|
|
453
|
+
issues.push({
|
|
454
|
+
type: 'MISSING_PRODUCT',
|
|
455
|
+
ref: record.ref,
|
|
456
|
+
productRef: record.productRef
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
if (!record.location) {
|
|
461
|
+
issues.push({
|
|
462
|
+
type: 'MISSING_LOCATION',
|
|
463
|
+
ref: record.ref,
|
|
464
|
+
locationRef: record.locationRef
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
if (issues.length > 0) {
|
|
470
|
+
console.warn(`Found ${issues.length} enrichment issues`);
|
|
471
|
+
console.warn(issues.slice(0, 10)); // Show first 10
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
return issues;
|
|
475
|
+
}
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
## Practice Exercise
|
|
479
|
+
|
|
480
|
+
**Goal**: Extract inventory positions and enrich with product and location details using batch queries
|
|
481
|
+
|
|
482
|
+
**Requirements:**
|
|
483
|
+
1. Extract inventory positions with basic fields
|
|
484
|
+
2. Batch enrich with products (name, gtin, catalogue)
|
|
485
|
+
3. Batch enrich with locations (name, type)
|
|
486
|
+
4. Handle missing relations gracefully
|
|
487
|
+
5. Report enrichment statistics
|
|
488
|
+
|
|
489
|
+
**Solution:**
|
|
490
|
+
|
|
491
|
+
```typescript
|
|
492
|
+
async function extractAndEnrichInventory() {
|
|
493
|
+
// Step 1: Extract basic inventory
|
|
494
|
+
const result = await client.graphql({
|
|
495
|
+
query: `
|
|
496
|
+
query ExtractInventory($first: Int!, $after: String) {
|
|
497
|
+
inventoryPositions(first: $first, after: $after) {
|
|
498
|
+
edges {
|
|
499
|
+
node { id ref productRef locationRef qty status }
|
|
500
|
+
cursor
|
|
501
|
+
}
|
|
502
|
+
pageInfo { hasNextPage }
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
`,
|
|
506
|
+
variables: { first: 100 },
|
|
507
|
+
pagination: { maxRecords: 10000 }
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
const inventory = result.data.inventoryPositions.edges.map(e => e.node);
|
|
511
|
+
console.log(`Extracted ${inventory.length} inventory positions`);
|
|
512
|
+
|
|
513
|
+
// Step 2: Batch enrich
|
|
514
|
+
const enriched = await enrichInventoryFull(inventory);
|
|
515
|
+
|
|
516
|
+
// Step 3: Validate enrichment
|
|
517
|
+
const issues = validateEnrichment(enriched);
|
|
518
|
+
|
|
519
|
+
// Step 4: Report statistics
|
|
520
|
+
const stats = {
|
|
521
|
+
total: enriched.length,
|
|
522
|
+
withProduct: enriched.filter(r => r.product).length,
|
|
523
|
+
withLocation: enriched.filter(r => r.location).length,
|
|
524
|
+
fullyEnriched: enriched.filter(r => r.product && r.location).length,
|
|
525
|
+
issues: issues.length
|
|
526
|
+
};
|
|
527
|
+
|
|
528
|
+
console.log('Enrichment statistics:', stats);
|
|
529
|
+
|
|
530
|
+
return enriched;
|
|
531
|
+
}
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
## Key Takeaways
|
|
535
|
+
|
|
536
|
+
- 🎯 Use nested GraphQL relations when possible (single query)
|
|
537
|
+
- 🎯 Batch enrichment avoids N+1 query problem
|
|
538
|
+
- 🎯 Parallel queries for multiple entity types
|
|
539
|
+
- 🎯 Cache frequently accessed reference data
|
|
540
|
+
- 🎯 Handle missing relations gracefully with null checks
|
|
541
|
+
- 🎯 Validate enrichment and report issues
|
|
542
|
+
- 🎯 Choose appropriate batch sizes (50-100 typically optimal)
|
|
543
|
+
|
|
544
|
+
## Next Steps
|
|
545
|
+
|
|
546
|
+
Continue to [Module 5: Data Transformation](./02-core-guides-extraction-05-transformation.md) to learn how to transform enriched data using UniversalMapper and custom transformers.
|