Explorar el Código

fix(core): Correctly hydrate nested relations of empty array

Fixes #1324
Michael Bromley hace 4 años
padre
commit
4a11666463

+ 14 - 0
packages/core/e2e/entity-hydrator.e2e-spec.ts

@@ -140,6 +140,15 @@ describe('Entity hydration', () => {
         expect(hydrateProductAsset.assets).toEqual([]);
         expect(hydrateProductAsset.assets).toEqual([]);
     });
     });
 
 
+    // https://github.com/vendure-ecommerce/vendure/issues/1324
+    it('correctly handles empty nested array relations', async () => {
+        const { hydrateProductWithNoFacets } = await adminClient.query<{
+            hydrateProductWithNoFacets: Product;
+        }>(GET_HYDRATED_PRODUCT_NO_FACETS);
+
+        expect(hydrateProductWithNoFacets.facetValues).toEqual([]);
+    });
+
     // https://github.com/vendure-ecommerce/vendure/issues/1161
     // https://github.com/vendure-ecommerce/vendure/issues/1161
     it('correctly expands missing relations', async () => {
     it('correctly expands missing relations', async () => {
         const { hydrateProductVariant } = await adminClient.query<{ hydrateProductVariant: ProductVariant }>(
         const { hydrateProductVariant } = await adminClient.query<{ hydrateProductVariant: ProductVariant }>(
@@ -224,6 +233,11 @@ const GET_HYDRATED_PRODUCT = gql`
         hydrateProduct(id: $id)
         hydrateProduct(id: $id)
     }
     }
 `;
 `;
+const GET_HYDRATED_PRODUCT_NO_FACETS = gql`
+    query GetHydratedProductWithNoFacets {
+        hydrateProductWithNoFacets
+    }
+`;
 const GET_HYDRATED_PRODUCT_ASSET = gql`
 const GET_HYDRATED_PRODUCT_ASSET = gql`
     query GetHydratedProductAsset($id: ID!) {
     query GetHydratedProductAsset($id: ID!) {
         hydrateProductAsset(id: $id)
         hydrateProductAsset(id: $id)

+ 24 - 0
packages/core/e2e/fixtures/test-plugins/hydration-test-plugin.ts

@@ -6,9 +6,11 @@ import {
     Ctx,
     Ctx,
     EntityHydrator,
     EntityHydrator,
     ID,
     ID,
+    LanguageCode,
     OrderService,
     OrderService,
     PluginCommonModule,
     PluginCommonModule,
     Product,
     Product,
+    ProductService,
     ProductVariantService,
     ProductVariantService,
     RequestContext,
     RequestContext,
     TransactionalConnection,
     TransactionalConnection,
@@ -23,6 +25,7 @@ export class TestAdminPluginResolver {
         private orderService: OrderService,
         private orderService: OrderService,
         private channelService: ChannelService,
         private channelService: ChannelService,
         private productVariantService: ProductVariantService,
         private productVariantService: ProductVariantService,
+        private productService: ProductService,
         private entityHydrator: EntityHydrator,
         private entityHydrator: EntityHydrator,
     ) {}
     ) {}
 
 
@@ -67,6 +70,26 @@ export class TestAdminPluginResolver {
         return variant;
         return variant;
     }
     }
 
 
+    // Test case for https://github.com/vendure-ecommerce/vendure/issues/1324
+    @Query()
+    async hydrateProductWithNoFacets(@Ctx() ctx: RequestContext) {
+        const product = await this.productService.create(ctx, {
+            enabled: true,
+            translations: [
+                {
+                    languageCode: LanguageCode.en,
+                    name: 'test',
+                    slug: 'test',
+                    description: 'test',
+                },
+            ],
+        });
+        await this.entityHydrator.hydrate(ctx, product, {
+            relations: ['facetValues', 'facetValues.facet'],
+        });
+        return product;
+    }
+
     // Test case for https://github.com/vendure-ecommerce/vendure/issues/1172
     // Test case for https://github.com/vendure-ecommerce/vendure/issues/1172
     @Query()
     @Query()
     async hydrateOrder(@Ctx() ctx: RequestContext, @Args() args: { id: ID }) {
     async hydrateOrder(@Ctx() ctx: RequestContext, @Args() args: { id: ID }) {
@@ -110,6 +133,7 @@ export class TestAdminPluginResolver {
         schema: gql`
         schema: gql`
             extend type Query {
             extend type Query {
                 hydrateProduct(id: ID!): JSON
                 hydrateProduct(id: ID!): JSON
+                hydrateProductWithNoFacets: JSON
                 hydrateProductAsset(id: ID!): JSON
                 hydrateProductAsset(id: ID!): JSON
                 hydrateProductVariant(id: ID!): JSON
                 hydrateProductVariant(id: ID!): JSON
                 hydrateOrder(id: ID!): JSON
                 hydrateOrder(id: ID!): JSON

+ 4 - 1
packages/core/src/service/helpers/entity-hydrator/entity-hydrator.service.ts

@@ -218,7 +218,10 @@ export class EntityHydrator {
             const part = path[i];
             const part = path[i];
             const isLast = i === path.length - 1;
             const isLast = i === path.length - 1;
             if (relation[part]) {
             if (relation[part]) {
-                relation = Array.isArray(relation[part]) && !isLast ? relation[part][0] : relation[part];
+                relation =
+                    Array.isArray(relation[part]) && relation[part].length && !isLast
+                        ? relation[part][0]
+                        : relation[part];
             } else {
             } else {
                 return;
                 return;
             }
             }