-
Notifications
You must be signed in to change notification settings - Fork 5.5k
[ACTION] Shopify - new components #19401
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. 2 Skipped Deployments
|
WalkthroughAdds multiple new Shopify actions (list/get/update orders, draft orders, customers, fulfillment orders), new GraphQL queries and an UPDATE_ORDER mutation, and corresponding app propDefinitions/methods; also includes many version bumps and a package version increment. Changes
Sequence Diagram(s)sequenceDiagram
participant Action as Action (user-triggered)
participant App as shopify.app (client wrapper)
participant GraphQL as Shopify Admin GraphQL API
participant Pager as Pagination helper
Action->>App: call method (e.g., listFulfillmentOrders / updateOrder / getCustomer) or this.shopify.getPaginated(...)
App->>GraphQL: _makeGraphQlRequest(queryOrMutation, variables)
GraphQL-->>App: return page/result (data, userErrors)
alt paginated list
App->>Pager: accumulate pages via listX calls
Pager-->>App: aggregated items
end
App-->>Action: return data (items or mutation response)
Action-->>Action: $.export("$summary", summary) and return payload
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20–30 minutes
Possibly related PRs
Suggested labels
Suggested reviewers
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (12)
components/shopify/actions/get-assigned-fulfillment-orders/get-assigned-fulfillment-orders.mjs(1 hunks)components/shopify/actions/get-customer/get-customer.mjs(1 hunks)components/shopify/actions/get-customers/get-customers.mjs(1 hunks)components/shopify/actions/get-draft-order/get-draft-order.mjs(1 hunks)components/shopify/actions/get-draft-orders/get-draft-orders.mjs(1 hunks)components/shopify/actions/get-fulfillment-order/get-fulfillment-order.mjs(1 hunks)components/shopify/actions/get-fulfillment-orders/get-fulfillment-orders.mjs(1 hunks)components/shopify/actions/search-orders/search-orders.mjs(1 hunks)components/shopify/actions/update-order/update-order.mjs(1 hunks)components/shopify/common/mutations.mjs(2 hunks)components/shopify/common/queries.mjs(2 hunks)components/shopify/shopify.app.mjs(2 hunks)
🧰 Additional context used
🧬 Code graph analysis (3)
components/shopify/actions/get-fulfillment-order/get-fulfillment-order.mjs (1)
components/shopify/shopify.app.mjs (1)
MAX_LIMIT(132-134)
components/shopify/actions/get-assigned-fulfillment-orders/get-assigned-fulfillment-orders.mjs (1)
components/shopify/actions/get-fulfillment-orders/get-fulfillment-orders.mjs (1)
fulfillmentOrders(56-68)
components/shopify/actions/get-fulfillment-orders/get-fulfillment-orders.mjs (1)
components/shopify/actions/get-assigned-fulfillment-orders/get-assigned-fulfillment-orders.mjs (1)
fulfillmentOrders(43-53)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
- GitHub Check: Verify TypeScript components
- GitHub Check: Publish TypeScript components
- GitHub Check: pnpm publish
- GitHub Check: Lint Code Base
🔇 Additional comments (10)
components/shopify/common/mutations.mjs (1)
418-434: LGTM!The UPDATE_ORDER mutation follows the established pattern in this file, includes proper error handling with userErrors, and returns appropriate fields for order updates.
Also applies to: 460-460
components/shopify/actions/get-customer/get-customer.mjs (1)
1-36: LGTM!This action follows the established pattern for Shopify actions in this codebase. The implementation correctly uses propDefinition for the customer ID, includes helpful documentation links, and provides appropriate fallback in the summary export.
components/shopify/actions/search-orders/search-orders.mjs (1)
1-51: LGTM!The search orders action correctly implements pagination using getPaginated, properly handles optional query filtering, and includes appropriate documentation. The plural handling in the summary export is a nice touch.
components/shopify/actions/get-draft-orders/get-draft-orders.mjs (1)
1-66: LGTM!This action provides excellent documentation for the query syntax and sort options. The implementation follows the established pagination pattern and correctly uses propDefinitions for reusable properties.
components/shopify/actions/get-draft-order/get-draft-order.mjs (1)
1-36: LGTM!The action follows the established pattern for single-item retrieval, uses appropriate propDefinition, and includes a sensible fallback in the summary export.
components/shopify/actions/get-customers/get-customers.mjs (1)
1-67: LGTM!This action follows the established pagination pattern, includes helpful documentation with examples, and provides clear guidance about access scope requirements. The inline comment on line 16 is a useful reminder for developers.
components/shopify/actions/update-order/update-order.mjs (1)
69-71: No action required. TheparseJsonutility already includes built-in error handling via try-catch (returning the original input if JSON parsing fails), so the call at line 70 will not throw. Invalid JSON will be passed as-is to the downstream API, which provides error feedback via theuserErrorsfield (line 77).components/shopify/actions/get-assigned-fulfillment-orders/get-assigned-fulfillment-orders.mjs (1)
14-58: Get Assigned Fulfillment Orders action wiring looks correctProps, pagination via
getPaginated, and theresourceKeys: ["assignedFulfillmentOrders"]path all match the expected connection shape; summary export and return value are consistent with other Shopify actions in this app. No blocking issues from this file.components/shopify/actions/get-fulfillment-orders/get-fulfillment-orders.mjs (1)
14-73: Get Fulfillment Orders action is correctly integrated with paginationThe props, filter arguments (
query,includeClosed,sortKey,reverse), and use ofthis.shopify.getPaginatedwithresourceKeys: ["fulfillmentOrders"]are consistent with the existing pagination helper and the fulfillment orders query shape. No issues spotted here.components/shopify/shopify.app.mjs (1)
247-306: New IDs and API methods are correctly wired into the Shopify app surfaceThe added
orderId,draftOrderId,customerId, andfulfillmentOrderIdpropDefinitions correctly reusegetPropOptionswith the rightresourceFn,resourceKeys, andlabelKeyvalues, matching the shapes of the new list queries. Likewise, the new methods (listOrders,getDraftOrder,listDraftOrders,updateOrder,getCustomer,listCustomers,listAssignedFulfillmentOrders,getFulfillmentOrder,listFulfillmentOrders) are straightforward wrappers around_makeGraphQlRequestand keep the app API consistent with existing list/get helpers.No additional changes needed here aside from fixing the underlying query field issues noted in
queries.mjs.Also applies to: 520-546
components/shopify/actions/get-fulfillment-order/get-fulfillment-order.mjs
Show resolved
Hide resolved
1921067 to
956f4af
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (5)
components/shopify/actions/update-product-variant/update-product-variant.mjs (2)
139-139: Fix misleading success message text.The summary message states "Created new product variant" but this action performs an update, not a create. This inconsistency may confuse users or downstream workflows.
Apply this diff to correct the message:
- $.export("$summary", `Created new product variant \`${response.productVariantsBulkUpdate.productVariants[0].title}\` with ID \`${response.productVariantsBulkUpdate.productVariants[0].id}\``); + $.export("$summary", `Updated product variant \`${response.productVariantsBulkUpdate.productVariants[0].title}\` with ID \`${response.productVariantsBulkUpdate.productVariants[0].id}\``);
136-138: Consider reporting all errors, not just the first.Currently, only the first
userErroris surfaced if the GraphQL mutation returns multiple errors. For better observability and debugging, consider aggregating and reporting all errors.Apply this diff to report all errors:
if (response.productVariantsBulkUpdate.userErrors.length > 0) { - throw new Error(response.productVariantsBulkUpdate.userErrors[0].message); + const errorMessages = response.productVariantsBulkUpdate.userErrors + .map((error) => error.message) + .join("; "); + throw new Error(errorMessages); }components/shopify/actions/search-products/search-products.mjs (2)
116-123: Client-side filtering applied after pagination causes result count mismatch.When
exactMatchis false, products are filtered client-side after pagination (line 117–119). This means:
- If a user sets
maxResults: 10and performs a non-exact title search, the API returns 10 products, but after client-side filtering, only 5 might match the title.- The final result count becomes unpredictable and often less than the requested
maxResults.Consider performing the non-exact match filter before pagination, or fetch additional products to compensate for post-filter reduction.
83-98: Escape special characters in search query string construction to prevent GraphQL injection.User input (title, productType, vendor) is interpolated directly into the search query string without escaping. Per Shopify's documentation, GraphQL variables cannot be used within search query string literals, so the query must be constructed server-side with proper escaping. At minimum, escape double quotes in all user-supplied fields:
if (this.title && this.exactMatch) { - queryArray.push(`title:"${this.title}"`); + const escapedTitle = this.title.replace(/"/g, '\\"'); + queryArray.push(`title:"${escapedTitle}"`); } if (this.productType) { - queryArray.push(`product_type:${this.productType}`); + const escapedType = this.productType.replace(/"/g, '\\"'); + queryArray.push(`product_type:${escapedType}`); } if (this.vendor) { - queryArray.push(`vendor:${this.vendor}`); + const escapedVendor = this.vendor.replace(/"/g, '\\"'); + queryArray.push(`vendor:${escapedVendor}`); }Consider expanding validation to reject or escape other special characters (colons, parentheses) that could alter query syntax.
components/shopify/actions/search-product-variant/search-product-variant.mjs (1)
151-151: Fix array indexing:productVariantsis an array, not a single object.Line 151 accesses
response.productVariantsBulkCreate.productVariants.titleand.idas if it's a single object, but the Shopify GraphQL mutation returnsproductVariantsas an array. This will returnundefinedand cause the summary export to fail.The
create-product-variantaction in the same codebase correctly uses[0]indexing to access the first variant:- $.export("$summary", `Created new product variant \`${response.productVariantsBulkCreate.productVariants.title}\` with ID \`${response.productVariantsBulkCreate.productVariants.id}\``); + $.export("$summary", `Created new product variant \`${response.productVariantsBulkCreate.productVariants[0].title}\` with ID \`${response.productVariantsBulkCreate.productVariants[0].id}\``);
♻️ Duplicate comments (6)
components/shopify/actions/get-fulfillment-order/get-fulfillment-order.mjs (1)
30-34: Remove thefirst: MAX_LIMITparameter from the single-item fetch.This action retrieves a single fulfillment order by ID. The
firstpagination parameter is only applicable to list operations and is inconsistent with other single-item fetch actions (getCustomer,getOrder,getDraftOrder) in this codebase.async run({ $ }) { const { fulfillmentOrder } = await this.shopify.getFulfillmentOrder({ id: this.fulfillmentOrderId, - first: MAX_LIMIT, });components/shopify/actions/update-order/update-order.mjs (1)
77-79: Consider surfacing all user errors, not just the first one.Currently, only the first userError is thrown. If multiple validation errors exist, the user will need to fix them one at a time.
components/shopify/common/queries.mjs (4)
626-633: Fix invalid GraphQL field in GET_DRAFT_ORDER.Line 632 selects
notewhich is not a valid field on theDraftOrdertype. The DraftOrder object exposesnote2(line 633) for the response. Thenotefield only exists onDraftOrderInputfor mutations.
903-949: Fix invalid GraphQL field in GET_CUSTOMER.Line 946 uses
ordersCountwhich does not exist on theCustomertype. The correct field name isnumberOfOrders.
647-680: Replace deprecated countryCode with countryCodeV2.The
countryCodefield is deprecated in Shopify's Admin GraphQL API. UsecountryCodeV2(which returns aCountryCodeenum) for address and destination fields to ensure compatibility with current and future API versions.Also applies to: 783-816, 918-945, 967-994
1034-1034: Avoid reusing $first for nested lineItems connections.Reusing the top-level
$firstparameter for nestedlineItemsconnections increases query complexity and can cause throttling. Per Shopify best practices, either hardcode smaller values (e.g.,lineItems(first: 50)) as done in LIST_ORDERS line 556, or expose separate variables.Also applies to: 1086-1086, 1133-1133
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (50)
components/shopify/actions/add-product-to-custom-collection/add-product-to-custom-collection.mjs(1 hunks)components/shopify/actions/add-tags/add-tags.mjs(1 hunks)components/shopify/actions/bulk-import/bulk-import.mjs(1 hunks)components/shopify/actions/create-article/create-article.mjs(1 hunks)components/shopify/actions/create-blog/create-blog.mjs(1 hunks)components/shopify/actions/create-custom-collection/create-custom-collection.mjs(1 hunks)components/shopify/actions/create-metafield/create-metafield.mjs(1 hunks)components/shopify/actions/create-metaobject/create-metaobject.mjs(1 hunks)components/shopify/actions/create-page/create-page.mjs(1 hunks)components/shopify/actions/create-product-variant/create-product-variant.mjs(1 hunks)components/shopify/actions/create-product/create-product.mjs(1 hunks)components/shopify/actions/create-smart-collection/create-smart-collection.mjs(1 hunks)components/shopify/actions/delete-article/delete-article.mjs(1 hunks)components/shopify/actions/delete-blog/delete-blog.mjs(1 hunks)components/shopify/actions/delete-metafield/delete-metafield.mjs(1 hunks)components/shopify/actions/delete-page/delete-page.mjs(1 hunks)components/shopify/actions/get-articles/get-articles.mjs(1 hunks)components/shopify/actions/get-assigned-fulfillment-orders/get-assigned-fulfillment-orders.mjs(1 hunks)components/shopify/actions/get-customer/get-customer.mjs(1 hunks)components/shopify/actions/get-customers/get-customers.mjs(1 hunks)components/shopify/actions/get-draft-order/get-draft-order.mjs(1 hunks)components/shopify/actions/get-draft-orders/get-draft-orders.mjs(1 hunks)components/shopify/actions/get-fulfillment-order/get-fulfillment-order.mjs(1 hunks)components/shopify/actions/get-fulfillment-orders/get-fulfillment-orders.mjs(1 hunks)components/shopify/actions/get-metafields/get-metafields.mjs(1 hunks)components/shopify/actions/get-metaobjects/get-metaobjects.mjs(1 hunks)components/shopify/actions/get-pages/get-pages.mjs(1 hunks)components/shopify/actions/search-custom-collection-by-name/search-custom-collection-by-name.mjs(1 hunks)components/shopify/actions/search-orders/search-orders.mjs(1 hunks)components/shopify/actions/search-product-variant/search-product-variant.mjs(1 hunks)components/shopify/actions/search-products/search-products.mjs(1 hunks)components/shopify/actions/update-article/update-article.mjs(1 hunks)components/shopify/actions/update-inventory-level/update-inventory-level.mjs(1 hunks)components/shopify/actions/update-metafield/update-metafield.mjs(1 hunks)components/shopify/actions/update-metaobject/update-metaobject.mjs(1 hunks)components/shopify/actions/update-order/update-order.mjs(1 hunks)components/shopify/actions/update-page/update-page.mjs(1 hunks)components/shopify/actions/update-product-variant/update-product-variant.mjs(1 hunks)components/shopify/actions/update-product/update-product.mjs(1 hunks)components/shopify/common/mutations.mjs(2 hunks)components/shopify/common/queries.mjs(2 hunks)components/shopify/package.json(1 hunks)components/shopify/shopify.app.mjs(2 hunks)components/shopify/sources/collection-updated/collection-updated.mjs(1 hunks)components/shopify/sources/customer-data-request/customer-data-request.mjs(1 hunks)components/shopify/sources/new-abandoned-cart/new-abandoned-cart.mjs(1 hunks)components/shopify/sources/new-article/new-article.mjs(1 hunks)components/shopify/sources/new-event-emitted/new-event-emitted.mjs(1 hunks)components/shopify/sources/new-page/new-page.mjs(1 hunks)components/shopify/sources/new-product-created/new-product-created.mjs(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2024-07-04T18:11:59.822Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 12731
File: components/hackerone/actions/get-members/get-members.mjs:3-28
Timestamp: 2024-07-04T18:11:59.822Z
Learning: When exporting a summary message in the `run` method of an action, ensure the message is correctly formatted. For example, in the `hackerone-get-members` action, the correct format is `Successfully retrieved ${response.data.length} members`.
Applied to files:
components/shopify/actions/get-customers/get-customers.mjs
🧬 Code graph analysis (2)
components/shopify/actions/get-fulfillment-orders/get-fulfillment-orders.mjs (1)
components/shopify/actions/get-assigned-fulfillment-orders/get-assigned-fulfillment-orders.mjs (1)
fulfillmentOrders(43-53)
components/shopify/actions/update-order/update-order.mjs (14)
components/shopify/actions/add-product-to-custom-collection/add-product-to-custom-collection.mjs (1)
response(33-36)components/shopify/actions/add-tags/add-tags.mjs (1)
response(67-70)components/shopify/actions/bulk-import/bulk-import.mjs (1)
response(136-140)components/shopify/actions/create-article/create-article.mjs (1)
response(59-73)components/shopify/actions/create-blog/create-blog.mjs (1)
response(23-27)components/shopify/actions/create-custom-collection/create-custom-collection.mjs (1)
response(44-53)components/shopify/actions/create-metafield/create-metafield.mjs (1)
response(56-65)components/shopify/actions/create-page/create-page.mjs (1)
response(28-33)components/shopify/actions/create-product-variant/create-product-variant.mjs (1)
response(121-147)components/shopify/actions/create-product/create-product.mjs (1)
response(72-86)components/shopify/actions/create-smart-collection/create-smart-collection.mjs (1)
response(73-81)components/shopify/actions/delete-blog/delete-blog.mjs (1)
response(24-26)components/shopify/actions/delete-metafield/delete-metafield.mjs (1)
response(48-54)components/shopify/actions/delete-page/delete-page.mjs (1)
response(24-26)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
- GitHub Check: Verify TypeScript components
- GitHub Check: Publish TypeScript components
- GitHub Check: pnpm publish
- GitHub Check: Lint Code Base
🔇 Additional comments (58)
components/shopify/actions/create-blog/create-blog.mjs (1)
7-7: Version bump approved.The change is a straightforward version increment (0.0.8 → 0.0.9) with no functional modifications. This aligns with the broader PR's pattern of updating module versions to reflect the expanded Shopify action suite.
components/shopify/actions/create-page/create-page.mjs (1)
7-7: Version bump is appropriate.The version bump from 0.0.8 to 0.0.9 is consistent with the PR's objective of expanding Shopify functionality. The rest of the action implementation remains unchanged and correct—error handling is in place, the async run method is properly structured, and the export summary provides useful feedback.
components/shopify/actions/create-smart-collection/create-smart-collection.mjs (1)
10-10: Version bump is appropriate.The version bump from 0.0.14 to 0.0.15 aligns with the broader PR scope of expanding Shopify action functionality. The existing code quality is solid—proper error handling, well-structured API calls, and clear user feedback via summary export.
components/shopify/actions/add-product-to-custom-collection/add-product-to-custom-collection.mjs (1)
7-7: Version bump with no functional changes.The version has been incremented from 0.0.8 to 0.0.9, but the rest of the file remains unchanged. If this version bump is part of a coordinated PR-wide versioning strategy (e.g., bumping all Shopify actions in lock-step), please confirm that's the intent. Otherwise, consider whether a version bump is necessary when there are no code changes to this file.
components/shopify/actions/create-metafield/create-metafield.mjs (2)
8-8: Verify the rationale for this version bump.Line 8 shows a version bump to
0.0.13, but the AI summary indicates no changes to exported/public entity signatures or runtime behavior in this file. According to semver conventions, version bumps typically correspond to new features (minor), bug fixes (patch), or breaking changes (major).Is this version bump intentional as part of a coordinated release across multiple Shopify actions, or should it be reverted?
1-72: Implementation is correct.The
create-metafieldaction implementation remains sound:
- Props are well-defined with appropriate types, labels, and descriptions
- Error handling properly checks and throws on GraphQL user errors (line 66–68)
- Summary export is clear and informative (line 69)
- GraphQL call respects the Shopify API contract
components/shopify/actions/delete-article/delete-article.mjs (1)
7-7: Verify the version bump is justified.The version was incremented from 0.0.8 to 0.0.9. Since the action's logic, error handling, and exported signatures remain unchanged, this bump appears to be driven by changes elsewhere in the Shopify app definition or shared API. Please confirm:
- Were the Shopify app's
propDefinitions(specificallyblogIdorarticleId) or shared methods modified in a way that affects this action?- Is this version bump part of a coordinated versioning strategy for all existing Shopify actions, or only those with affected dependencies?
components/shopify/actions/delete-metafield/delete-metafield.mjs (1)
8-8: Clarify the rationale for the version bump.The version has been incremented from "0.0.10" to "0.0.11", but per the AI summary, there are no changes to runtime logic, props, error handling, or public API shape in this file. Additionally, this file is an existing action—not one of the new actions listed in the PR objectives (get-orders, get-draft-orders, get-customers, etc.).
Verify whether this version bump is:
- A consequence of changes to the shared
commonmodule (line 1) or the Shopify client API?- Aligned with the PR's primary objectives?
- Following a standardized versioning strategy across all actions in this PR?
components/shopify/actions/create-product/create-product.mjs (2)
8-8: Verify version bump is justified.The version was bumped from 0.0.14 to 0.0.15, but no functional or control-flow changes were detected in this file. Patch version bumps typically indicate bug fixes or internal improvements, not additions to unrelated components.
Clarify whether this version bump is part of a coordinated module-level release strategy, or if it should be reverted.
1-92: Code structure and implementation appear correct.The action properly imports dependencies, defines props with appropriate validation (optional flags, enumerated options), and implements error handling for GraphQL responses. The implementation correctly transforms input to the GraphQL mutation format and provides user-friendly export summaries.
components/shopify/actions/update-product-variant/update-product-variant.mjs (1)
12-12: Verify version bump justification.The version is incremented without any corresponding code changes in this file. If this is part of a broader release across multiple Shopify actions (as indicated by the PR context), please confirm this is intentional. However, if only unrelated files are being changed in this PR, consider whether bumping this action's version is appropriate per semver conventions.
components/shopify/actions/update-article/update-article.mjs (3)
7-7: Verify version bump rationale.The version is being bumped from 0.0.8 to 0.0.9 with no functional changes to this action. Per the PR context, this is part of a broader set of version bumps across the Shopify actions. Confirm that this is intentional (e.g., for consistency across the Shopify app surface or due to a dependency change).
1-92: Code structure and error handling look good.The action module is well-structured with proper:
- Imports and dependencies
- Metadata and annotations (correctly marked as destructive)
- Props definition with dynamic dependencies (articleId depends on blogId context)
- Error handling for GraphQL mutations (checks userErrors array)
- Response export with meaningful summary
69-92: TheupdateArticlemethod exists and is properly implemented on the shopify app object.The method at
components/shopify/shopify.app.mjsaccepts a variables object and delegates tothis._makeGraphQlRequest(mutations.UPDATE_ARTICLE, variables). The usage in therunmethod—passing an object withidandarticleproperties—matches the expected signature. The return value is assumed to follow the structure expected by the code (response.articleUpdate.userErrorsandresponse.articleUpdate.article.id), which should be validated against theUPDATE_ARTICLEGraphQL mutation response schema.components/shopify/actions/search-products/search-products.mjs (1)
9-9: Version bump approved.The metadata version update is routine and well-placed as part of the broader Shopify component updates.
components/shopify/actions/get-metafields/get-metafields.mjs (1)
8-8: Remove this comment — the version assignment is appropriate for a new action.This file is newly added (not a modification of existing code), so the version "0.0.14" is a proper initial version for this new Shopify action, not an unnecessary bump. The implementation includes functional filtering logic for namespace and key parameters, making it a complete feature addition.
components/shopify/sources/new-page/new-page.mjs (1)
10-10: Version bump aligns with package release.The version increment from 0.0.19 to 0.0.20 is appropriate and consistent with the package-wide version bump to 0.8.0.
components/shopify/actions/delete-page/delete-page.mjs (1)
7-7: Version bump aligns with package release.The version increment is appropriate and consistent with the coordinated release.
components/shopify/actions/update-metafield/update-metafield.mjs (1)
8-8: Version bump aligns with package release.The version increment is appropriate and consistent with the package-wide update to 0.8.0.
components/shopify/actions/add-tags/add-tags.mjs (1)
7-7: Version bump aligns with package release.The version increment is appropriate and consistent with the coordinated release cycle.
components/shopify/actions/update-page/update-page.mjs (1)
7-7: Version bump aligns with package release.The version increment is appropriate and consistent with the package update to 0.8.0.
components/shopify/actions/search-custom-collection-by-name/search-custom-collection-by-name.mjs (1)
8-8: Version bump aligns with package release.The version increment is appropriate and consistent with the coordinated release.
components/shopify/sources/new-abandoned-cart/new-abandoned-cart.mjs (1)
9-9: Version bump aligns with package release.The version increment from 0.0.20 to 0.0.21 is appropriate and consistent with the package-wide version bump to 0.8.0.
components/shopify/package.json (1)
3-3: Appropriate minor version bump for new features.The version increment from 0.7.2 to 0.8.0 correctly follows semantic versioning for a release that adds new Shopify actions (orders, draft orders, customers, fulfillment orders) as described in the PR objectives.
components/shopify/sources/new-product-created/new-product-created.mjs (1)
10-10: LGTM!Version bump aligns with the broader release adding new Shopify components.
components/shopify/sources/collection-updated/collection-updated.mjs (1)
9-9: LGTM!Version bump is appropriate for this release.
components/shopify/actions/bulk-import/bulk-import.mjs (1)
10-10: LGTM!Version increment is consistent with the PR's release cadence.
components/shopify/actions/create-article/create-article.mjs (1)
7-7: LGTM!Version bump is appropriate for this coordinated release.
components/shopify/sources/customer-data-request/customer-data-request.mjs (1)
5-5: LGTM!Version increment aligns with the release.
components/shopify/actions/create-metaobject/create-metaobject.mjs (1)
10-10: LGTM!Version bump is consistent with the PR's versioning strategy.
components/shopify/sources/new-article/new-article.mjs (1)
10-10: LGTM!Version increment is appropriate for this release.
components/shopify/actions/create-product-variant/create-product-variant.mjs (1)
12-12: LGTM!Version bump aligns with the broader release.
components/shopify/actions/update-product/update-product.mjs (1)
9-9: Version bump is appropriate for non-breaking feature additions.Minor version increment aligns with the PR's broader Shopify expansion without altering runtime behavior.
components/shopify/actions/update-inventory-level/update-inventory-level.mjs (1)
8-8: Version bump aligns with non-breaking feature expansions.Patch-level increment is appropriate given no runtime changes to this action.
components/shopify/actions/get-articles/get-articles.mjs (1)
7-7: Version increment is consistent with PR-wide updates.Patch-level bump reflects the broader Shopify action surface expansion without modifying this action's behavior.
components/shopify/actions/get-pages/get-pages.mjs (1)
7-7: Version increment is appropriate.Patch-level bump aligns with non-breaking feature additions in this PR iteration.
components/shopify/actions/create-custom-collection/create-custom-collection.mjs (1)
8-8: Version bump follows PR-wide pattern.Patch-level increment is consistent with non-breaking feature expansion across Shopify actions.
components/shopify/actions/get-metaobjects/get-metaobjects.mjs (1)
10-10: Version increment aligns with non-breaking updates.Patch-level bump is consistent with the PR's broader feature expansion.
components/shopify/actions/update-metaobject/update-metaobject.mjs (1)
10-10: Version bump is consistent with non-breaking feature additions.Patch-level increment aligns with the broader PR updates to Shopify action surface.
components/shopify/sources/new-event-emitted/new-event-emitted.mjs (2)
10-10: Version increment aligns with PR-wide updates.Patch-level bump is consistent with the broader Shopify component expansion.
1-41: Incomplete review scope: Missing new action files referenced in PR objectives.The PR objectives specify multiple new Shopify actions (get-customer, get-customers, get-draft-order, get-draft-orders, get-fulfillment-orders, search-orders, update-order, etc.) with their corresponding GraphQL mutations and propDefinitions, but these files were not provided for review. The current review covers only version bumps on existing actions.
To complete the review, please provide:
- New action files (get-customer.mjs, get-customers.mjs, get-draft-order.mjs, etc.)
- Updated components/shopify/common/queries.mjs with new GraphQL query definitions
- Updated components/shopify/common/mutations.mjs with new GraphQL mutation definitions
- Updated components/shopify/shopify.app.mjs with new propDefinitions and wrapper methods
- Test coverage for the new actions
Can you confirm whether these files exist in the PR and should be included in the review?
components/shopify/actions/get-draft-order/get-draft-order.mjs (1)
29-35: LGTM!The run function correctly retrieves a draft order by ID, handles the response destructuring, and provides a meaningful summary with fallback to ID if name is unavailable.
components/shopify/actions/get-customer/get-customer.mjs (1)
1-36: LGTM!The action is well-structured with appropriate metadata, correct info alert content for customer data access, and proper handling of the response with a meaningful summary fallback.
components/shopify/common/mutations.mjs (2)
418-434: LGTM!The
UPDATE_ORDERmutation follows the established pattern with proper input typing, relevant return fields, and consistentuserErrorshandling.
460-460: LGTM!The new mutation is correctly added to the default export.
components/shopify/actions/search-orders/search-orders.mjs (2)
35-50: LGTM!The pagination logic is correctly implemented with
getPaginated, the query variable is properly passed, and the summary handles singular/plural forms correctly.
22-33: LGTM!The
queryandmaxprops are appropriately defined as optional with clear descriptions and correct types.components/shopify/actions/get-draft-orders/get-draft-orders.mjs (1)
1-66: LGTM!The action follows the established pattern for paginated Shopify list actions. The query filtering, sorting, and pagination are correctly implemented.
components/shopify/actions/get-customers/get-customers.mjs (1)
1-67: LGTM!The action correctly implements customer retrieval with proper query filtering, sorting, and pagination. The summary message format aligns with established patterns.
components/shopify/actions/get-assigned-fulfillment-orders/get-assigned-fulfillment-orders.mjs (1)
1-59: LGTM!The action correctly retrieves assigned fulfillment orders with appropriate sorting and pagination.
components/shopify/actions/get-fulfillment-orders/get-fulfillment-orders.mjs (1)
1-74: LGTM!The action properly implements fulfillment order retrieval with comprehensive filtering options including query syntax and the includeClosed flag.
components/shopify/common/queries.mjs (1)
1153-1179: LGTM on the export additions.The new query constants are correctly added to the default export, extending the public API surface.
components/shopify/shopify.app.mjs (2)
247-306: LGTM on the new propDefinitions.The four new propDefinitions (orderId, draftOrderId, customerId, fulfillmentOrderId) follow the established pattern and use appropriate label keys for user-friendly option display.
520-546: LGTM on the new methods.All nine new methods correctly delegate to
_makeGraphQlRequestwith the appropriate query or mutation constants. The implementation is consistent with existing patterns in the codebase.components/shopify/actions/update-order/update-order.mjs (1)
55-83: Input structure is correct and aligns with Shopify's orderUpdate API.The code correctly assembles the orderUpdate mutation input with all valid fields. According to Shopify's GraphQL Admin API, OrderInput supports
id,note,tags, andmetafields(as an array of MetafieldInput objects). The optional field handling is proper, and themetafieldsparsing viautils.parseJson()is appropriate.components/shopify/actions/search-product-variant/search-product-variant.mjs (1)
10-10: Version bump aligned with PR scope.The version bump from 0.0.14 to 0.0.15 is consistent with the coordinated updates across multiple Shopify actions in this PR. No functional concerns with the version change itself.
components/shopify/actions/delete-blog/delete-blog.mjs (2)
1-30: Inconsistency: Provided files don't match PR objectives.The PR objectives indicate this should add multiple NEW Shopify actions for orders, draft orders, customers, and fulfillment orders (e.g.,
get-assigned-fulfillment-orders,get-customer,get-customers, etc.). However, only this existingdelete-blogaction with a version bump is provided for review.Unable to perform a comprehensive review aligned with the stated PR objectives without access to the new action files and the updated
shopify.app.mjs.
7-7: The delete-blog action is a newly created component, not a modification with a version bump.This file is part of the "[ACTION] Shopify - new components" commit and is being added as a new action (
new file mode 100644), not incremented from a prior version. The version0.0.9is the initial version assigned to this new action component, not a bump from0.0.8. The version selection appears intentional and is consistent with other newly added Shopify actions in the same commit.Likely an incorrect or invalid review comment.
components/shopify/actions/get-fulfillment-order/get-fulfillment-order.mjs
Show resolved
Hide resolved
GTFalcao
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
|
Hello everyone, I have tested this PR and there're some test cases failed or needed improvement. Please check test reports below for more information:
|
956f4af to
c81f7bb
Compare
c81f7bb to
0d67e74
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
components/shopify/actions/delete-metafield/delete-metafield.mjs (1)
45-53: Guard against missing metafield before accessing its properties.If
this.metafieldIddoesn’t match any item returned bylistMetafields,metafieldwill beundefined, and accessingmetafield.key/metafield.namespacewill throw a runtime error.Add an explicit check and surface a clear error:
async run({ $ }) { const metafields = await this.listMetafields(this.ownerResource, this.ownerId); - const metafield = metafields.find(({ id }) => id === this.metafieldId); + const metafield = metafields.find(({ id }) => id === this.metafieldId); + + if (!metafield) { + throw new Error(`Metafield with ID ${this.metafieldId} not found for owner ${this.ownerId}`); + } const response = await this.shopify.deleteMetafield({ metafields: { key: metafield.key, ownerId: this.ownerId, namespace: metafield.namespace, }, });
♻️ Duplicate comments (6)
components/shopify/actions/update-order/update-order.mjs (1)
77-79: Aggregate and surface alluserErrorsinstead of just the first one.Right now only
response.orderUpdate.userErrors[0].messageis thrown. When there are multiple validation issues, users will have to fix them one-by-one without seeing the full set of problems.You can aggregate messages (optionally including fields) to provide better feedback:
- if (response.orderUpdate.userErrors.length > 0) { - throw new Error(response.orderUpdate.userErrors[0].message); - } + if (response.orderUpdate.userErrors.length > 0) { + const errorMessages = response.orderUpdate.userErrors + .map((err) => `${err.field ? `${err.field}: ` : ""}${err.message}`) + .join("; "); + throw new Error(errorMessages); + }components/shopify/common/queries.mjs (2)
782-798: Replace deprecatedcountryCodewithcountryCodeV2in LIST_DRAFT_ORDERS addressesLines 788 and 805 use the deprecated
countryCodefield inbillingAddressandshippingAddress. The relatedGET_DRAFT_ORDERquery (lines 652, 669) correctly usescountryCodeV2. Per Shopify's Admin GraphQL API,countryCodeis deprecated in favor ofcountryCodeV2(CountryCode enum).Apply this diff:
billingAddress { address1 address2 city company country - countryCode + countryCodeV2 firstName lastName phone @@ shippingAddress { address1 address2 city company country - countryCode + countryCodeV2 firstName lastName phoneAlso applies to: 799-815
1030-1041: Avoid reusing$firstfor nestedlineItemsconnections in fulfillment order queriesLines 1030, 1082, and 1129 reuse the top-level
$firstvariable for nestedlineItemsconnections. This multiplies query complexity and can trigger Shopify's throttling limits on large datasets. Other queries in this file correctly hard‑code smaller limits:LIST_ORDERSuseslineItems(first: 50)at line 556, and bothGET_DRAFT_ORDERandLIST_DRAFT_ORDERSuselineItems(first: 250)at lines 689 and 825.Apply this diff to hard‑code reasonable limits:
const LIST_ASSIGNED_FULFILLMENT_ORDERS = ` - query ($first: Int, $after: String, $reverse: Boolean, $sortKey: FulfillmentOrderSortKeys) { + query ($first: Int, $after: String, $reverse: Boolean, $sortKey: FulfillmentOrderSortKeys, $lineItemsFirst: Int) { assignedFulfillmentOrders(first: $first, after: $after, reverse: $reverse, sortKey: $sortKey) { @@ - lineItems(first: $first) { + lineItems(first: 50) { nodes { @@ const GET_FULFILLMENT_ORDER = ` - query ($id: ID!, $first: Int) { + query ($id: ID!) { fulfillmentOrder(id: $id) { @@ - lineItems(first: $first) { + lineItems(first: 50) { nodes { @@ const LIST_FULFILLMENT_ORDERS = ` - query ($first: Int, $after: String, $reverse: Boolean, $sortKey: FulfillmentOrderSortKeys, $query: String) { + query ($first: Int, $after: String, $reverse: Boolean, $sortKey: FulfillmentOrderSortKeys, $query: String, $lineItemsFirst: Int) { fulfillmentOrders(first: $first, after: $after, reverse: $reverse, sortKey: $sortKey, query: $query) { @@ - lineItems(first: $first) { + lineItems(first: 50) { nodes {Also applies to: 1082-1093, 1129-1140
components/shopify/actions/get-fulfillment-order/get-fulfillment-order.mjs (2)
2-2: Remove unusedMAX_LIMITimportAfter removing the pagination parameter from the
getFulfillmentOrdercall (see next comment), this import becomes unused.import shopify from "../../shopify.app.mjs"; -import { MAX_LIMIT } from "../../common/constants.mjs";
30-34: Remove pagination parameter from single-item fetchThis action retrieves a single fulfillment order by ID. Unlike list operations, single-item fetch actions (
getCustomer,getDraftOrder) do not use pagination parameters. Thefirst: MAX_LIMITparameter is inconsistent with these patterns and unnecessary for a single-item query.const { fulfillmentOrder } = await this.shopify.getFulfillmentOrder({ id: this.fulfillmentOrderId, - first: MAX_LIMIT, });components/shopify/actions/get-draft-order/get-draft-order.mjs (1)
17-21: Correct info alert to reference draft orders instead of customer dataThe alert mentions "customer data" and links to protected customer data documentation, but this action retrieves draft orders. Update the content to reference draft order access scopes.
info: { type: "alert", alertType: "info", - content: "Please verify that the Shopify shop has customer data properly defined and that your API credentials have been granted this access scope. [See the documentation](https://shopify.dev/docs/apps/launch/protected-customer-data)", + content: "Please verify that the Shopify shop has draft orders properly defined and that your API credentials have been granted this access scope. [See the documentation](https://shopify.dev/docs/admin-api/access-scopes)", },
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (50)
components/shopify/actions/add-product-to-custom-collection/add-product-to-custom-collection.mjs(1 hunks)components/shopify/actions/add-tags/add-tags.mjs(1 hunks)components/shopify/actions/bulk-import/bulk-import.mjs(1 hunks)components/shopify/actions/create-article/create-article.mjs(1 hunks)components/shopify/actions/create-blog/create-blog.mjs(1 hunks)components/shopify/actions/create-custom-collection/create-custom-collection.mjs(1 hunks)components/shopify/actions/create-metafield/create-metafield.mjs(1 hunks)components/shopify/actions/create-metaobject/create-metaobject.mjs(1 hunks)components/shopify/actions/create-page/create-page.mjs(1 hunks)components/shopify/actions/create-product-variant/create-product-variant.mjs(1 hunks)components/shopify/actions/create-product/create-product.mjs(1 hunks)components/shopify/actions/create-smart-collection/create-smart-collection.mjs(1 hunks)components/shopify/actions/delete-article/delete-article.mjs(1 hunks)components/shopify/actions/delete-blog/delete-blog.mjs(1 hunks)components/shopify/actions/delete-metafield/delete-metafield.mjs(1 hunks)components/shopify/actions/delete-page/delete-page.mjs(1 hunks)components/shopify/actions/get-articles/get-articles.mjs(1 hunks)components/shopify/actions/get-assigned-fulfillment-orders/get-assigned-fulfillment-orders.mjs(1 hunks)components/shopify/actions/get-customer/get-customer.mjs(1 hunks)components/shopify/actions/get-customers/get-customers.mjs(1 hunks)components/shopify/actions/get-draft-order/get-draft-order.mjs(1 hunks)components/shopify/actions/get-draft-orders/get-draft-orders.mjs(1 hunks)components/shopify/actions/get-fulfillment-order/get-fulfillment-order.mjs(1 hunks)components/shopify/actions/get-fulfillment-orders/get-fulfillment-orders.mjs(1 hunks)components/shopify/actions/get-metafields/get-metafields.mjs(1 hunks)components/shopify/actions/get-metaobjects/get-metaobjects.mjs(1 hunks)components/shopify/actions/get-pages/get-pages.mjs(1 hunks)components/shopify/actions/search-custom-collection-by-name/search-custom-collection-by-name.mjs(1 hunks)components/shopify/actions/search-orders/search-orders.mjs(1 hunks)components/shopify/actions/search-product-variant/search-product-variant.mjs(1 hunks)components/shopify/actions/search-products/search-products.mjs(1 hunks)components/shopify/actions/update-article/update-article.mjs(1 hunks)components/shopify/actions/update-inventory-level/update-inventory-level.mjs(1 hunks)components/shopify/actions/update-metafield/update-metafield.mjs(1 hunks)components/shopify/actions/update-metaobject/update-metaobject.mjs(1 hunks)components/shopify/actions/update-order/update-order.mjs(1 hunks)components/shopify/actions/update-page/update-page.mjs(1 hunks)components/shopify/actions/update-product-variant/update-product-variant.mjs(1 hunks)components/shopify/actions/update-product/update-product.mjs(1 hunks)components/shopify/common/mutations.mjs(2 hunks)components/shopify/common/queries.mjs(2 hunks)components/shopify/package.json(1 hunks)components/shopify/shopify.app.mjs(2 hunks)components/shopify/sources/collection-updated/collection-updated.mjs(1 hunks)components/shopify/sources/customer-data-request/customer-data-request.mjs(1 hunks)components/shopify/sources/new-abandoned-cart/new-abandoned-cart.mjs(1 hunks)components/shopify/sources/new-article/new-article.mjs(1 hunks)components/shopify/sources/new-event-emitted/new-event-emitted.mjs(1 hunks)components/shopify/sources/new-page/new-page.mjs(1 hunks)components/shopify/sources/new-product-created/new-product-created.mjs(1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2024-10-30T15:24:39.294Z
Learnt from: jcortes
Repo: PipedreamHQ/pipedream PR: 14467
File: components/gainsight_px/actions/create-account/create-account.mjs:4-6
Timestamp: 2024-10-30T15:24:39.294Z
Learning: In `components/gainsight_px/actions/create-account/create-account.mjs`, the action name should be "Create Account" instead of "Create Memory".
Applied to files:
components/shopify/actions/get-draft-order/get-draft-order.mjs
📚 Learning: 2024-07-04T18:11:59.822Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 12731
File: components/hackerone/actions/get-members/get-members.mjs:3-28
Timestamp: 2024-07-04T18:11:59.822Z
Learning: When exporting a summary message in the `run` method of an action, ensure the message is correctly formatted. For example, in the `hackerone-get-members` action, the correct format is `Successfully retrieved ${response.data.length} members`.
Applied to files:
components/shopify/actions/get-customers/get-customers.mjs
🧬 Code graph analysis (2)
components/shopify/actions/update-order/update-order.mjs (1)
components/shopify/actions/create-custom-collection/create-custom-collection.mjs (1)
response(44-53)
components/shopify/actions/get-assigned-fulfillment-orders/get-assigned-fulfillment-orders.mjs (1)
components/shopify/actions/get-fulfillment-orders/get-fulfillment-orders.mjs (1)
fulfillmentOrders(56-68)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: Verify TypeScript components
- GitHub Check: Publish TypeScript components
- GitHub Check: Lint Code Base
🔇 Additional comments (51)
components/shopify/actions/delete-article/delete-article.mjs (1)
7-7: Version bump is appropriate.The patch version increment from 0.0.8 to 0.0.9 is suitable for this update as part of the broader Shopify actions expansion. The file structure, annotations, and implementation remain sound with no functional changes.
components/shopify/actions/create-page/create-page.mjs (1)
7-7: Version bump approved.The patch version increment (0.0.8 → 0.0.9) is appropriate for this maintenance release. The implementation remains sound with proper GraphQL error handling and summary export.
components/shopify/actions/create-article/create-article.mjs (1)
7-7: Version bump is appropriate.This patch-level version increment aligns with the coordinated version updates across multiple Shopify actions in the PR, driven by underlying app changes and new functionality. No functional changes to review.
components/shopify/actions/create-metaobject/create-metaobject.mjs (2)
10-10: Version bump is standalone.This is a straightforward version increment with no behavioral changes to the action. Ensure this aligns with your versioning strategy for the coordinated Shopify action updates mentioned in the PR.
45-77: Run method logic is sound.The action correctly handles metaobject creation, validates the type, constructs fields from props, and includes error handling for GraphQL user errors. The success export is clear.
Given that the PR reviewers reported test failures across multiple Shopify actions, please verify that the
createMetaobjectmethod (called on line 63) and the upstreamlistMetaobjectDefinitionscall (lines 32 and 46) still function correctly with any recent changes to the Shopify app configuration or GraphQL schema.components/shopify/actions/create-metafield/create-metafield.mjs (1)
8-8: Version bump is appropriate and consistent with package release.The version increment from 0.0.12 to 0.0.13 is consistent with the broader package version bump (0.7.2 → 0.8.0). The underlying action logic remains unchanged and correct.
However, note that the provided review context indicates reviewer vunguyenhung reported failing or needing-improvement test cases. Since only a single file has been provided for this review (and the PR introduces numerous new Shopify actions and mutations), please verify that this existing action is not impacted by any of the new components or changes to common mutations/queries that may be shared across actions. The linked test reports may provide guidance on which actions or flows are affected.
components/shopify/actions/search-custom-collection-by-name/search-custom-collection-by-name.mjs (1)
8-8: Verify the justification for this version bump.The version is incremented from 0.0.7 to 0.0.8, but there are no behavioral changes to this action file itself. While the AI summary indicates this is part of a broader coordinated version update across multiple Shopify actions, confirm that this bump is justified—whether due to indirect dependency updates, schema changes, or as part of a consistent release strategy.
If other action files in this PR also have version bumps without code changes, document the coordinated release strategy. Alternatively, if this bump is only justified by indirect impacts (e.g., shopify.app.mjs changes), verify those impacts are material to this action's behavior or interface.
components/shopify/actions/create-custom-collection/create-custom-collection.mjs (1)
8-8: Verify the rationale for the version bump.The version is being incremented from
0.0.8to0.0.9, but no functional changes are visible in this file. According to the PR summary, this appears to be part of a broader coordinated version bump across multiple Shopify actions.Please clarify the motivation for this patch-level version increment. Is this bump coordinated across all actions due to an underlying app-level change (e.g.,
shopify.app.mjsor utilities update), or is it tied to a specific fix for this action that isn't visible in the diff?components/shopify/actions/create-smart-collection/create-smart-collection.mjs (1)
10-10: Version bump is consistent with a non‑breaking metadata updateThis file only changes the action version to
"0.0.15"with no behavioral modifications, which is appropriate for tracking the new release in the broader Shopify updates.components/shopify/actions/delete-page/delete-page.mjs (1)
7-7: Version bump is appropriate; action code looks good.The patch version increment from 0.0.8 to 0.0.9 is consistent with the PR's systematic version updates. The action's structure, error handling, and destructive operation annotations are correctly configured.
Given that the PR has reported test failures, please verify that this delete-page action continues to function correctly in the broader context of the changes.
components/shopify/actions/update-article/update-article.mjs (1)
7-7: Version bump looks consistent with other Shopify actionsThe patch version increment to
"0.0.9"is appropriate and there are no behavioral changes in this module. Nothing else to address here.components/shopify/sources/new-event-emitted/new-event-emitted.mjs (1)
10-10: LGTM: Version bump for consistency.The patch version increment aligns with the broader Shopify integration updates in this PR. No functional changes introduced.
components/shopify/actions/add-tags/add-tags.mjs (1)
7-7: LGTM: Routine version bump.The patch version increment is appropriate for this release cycle, which adds new Shopify components to the package while maintaining existing functionality.
components/shopify/actions/get-metaobjects/get-metaobjects.mjs (2)
27-39: Implementation is sound and follows Pipedream conventions.The
run()method properly integrates with the Shopify app'slistMetaobjectsmethod, uses appropriate limiting, and exports a well-formatted summary with correct pluralization.
10-10: Version bump is appropriate.The patch version bump from 0.0.6 to 0.0.7 is reasonable. The
shopify.listMetaobjects()method is properly implemented in shopify.app.mjs and correctly makes the GraphQL request usingqueries.LIST_METAOBJECTS. TheMAX_LIMITconstant is properly imported, and the code structure is clean.components/shopify/actions/update-metaobject/update-metaobject.mjs (1)
10-10: LGTM: Version bump is appropriate.The version increment from 0.0.8 to 0.0.9 is consistent with the PR-wide version release cycle. No functional changes are present in this file.
components/shopify/actions/create-blog/create-blog.mjs (1)
1-33: Implementation is correct; version bump is appropriate.The error handling at lines 28-30 properly validates the GraphQL response, and the summary export at line 31 is well-structured. The createBlog method is confirmed to exist in the shopify.app.mjs module and is invoked correctly with the required title parameter.
The version bump to 0.0.9 aligns with the broader version updates across the PR.
components/shopify/sources/new-page/new-page.mjs (1)
10-10: Version bump looks appropriate.The patch version increment aligns with the broader package release (0.8.0) that introduces new Shopify actions and features.
components/shopify/actions/add-product-to-custom-collection/add-product-to-custom-collection.mjs (1)
7-7: Version bump looks appropriate.The patch version increment is consistent with the package-wide version update strategy.
components/shopify/actions/update-metafield/update-metafield.mjs (1)
8-8: Version bump looks appropriate.The patch version increment is consistent with the coordinated package release.
components/shopify/package.json (1)
3-3: Minor version bump is appropriate, but address test failures first.The minor version increment (0.7.2 → 0.8.0) correctly reflects the addition of new actions and expanded functionality. However, per the PR objectives, reviewer vunguyenhung reported failing test cases across multiple batches:
- Actions Batch 2, 3, and 4 have issues
These test failures must be resolved before merging to ensure the new components function correctly.
Please review and resolve the test failures documented in the test reports before proceeding with the merge.
components/shopify/sources/new-abandoned-cart/new-abandoned-cart.mjs (1)
9-9: Version bump looks appropriate.The patch version increment aligns with the package-wide release strategy.
components/shopify/actions/update-product-variant/update-product-variant.mjs (1)
12-12: Version bump looks appropriate.The patch version increment is consistent with the coordinated package release.
components/shopify/actions/search-products/search-products.mjs (1)
9-9: Version bump looks appropriate.The patch version increment aligns with the package-wide version update.
components/shopify/sources/new-article/new-article.mjs (1)
10-10: Version bump looks appropriate.The patch version increment is consistent with the coordinated release. Note that the actual new components mentioned in the PR objectives (get-assigned-fulfillment-orders, get-customer, get-customers, get-draft-order, get-draft-orders, get-fulfillment-order, get-fulfillment-orders, search-orders, update-order, etc.) are not included in this review set. Those new components should be reviewed separately to ensure they align with the PR objectives and pass all test cases.
components/shopify/sources/new-product-created/new-product-created.mjs (1)
10-10: LGTM! Coordinated version bump.This version increment aligns with the broader package updates in this PR. No functional changes detected.
components/shopify/actions/update-page/update-page.mjs (1)
7-7: LGTM! Coordinated version bump.This version increment aligns with the broader package updates in this PR. No functional changes detected.
components/shopify/actions/get-pages/get-pages.mjs (1)
7-7: LGTM! Coordinated version bump.This version increment aligns with the broader package updates in this PR. No functional changes detected.
components/shopify/actions/create-product/create-product.mjs (1)
8-8: LGTM! Coordinated version bump.This version increment aligns with the broader package updates in this PR. No functional changes detected.
components/shopify/actions/create-product-variant/create-product-variant.mjs (1)
12-12: LGTM! Coordinated version bump.This version increment aligns with the broader package updates in this PR. No functional changes detected.
components/shopify/actions/get-articles/get-articles.mjs (1)
7-7: LGTM! Coordinated version bump.This version increment aligns with the broader package updates in this PR. No functional changes detected.
components/shopify/actions/update-product/update-product.mjs (1)
9-9: LGTM! Coordinated version bump.This version increment aligns with the broader package updates in this PR. No functional changes detected.
components/shopify/actions/search-product-variant/search-product-variant.mjs (1)
10-10: LGTM! Coordinated version bump.This version increment aligns with the broader package updates in this PR. No functional changes detected.
components/shopify/actions/update-inventory-level/update-inventory-level.mjs (1)
8-8: Version bump only; action remains consistent with existing behavior.The version increment is aligned with the broader Shopify package bump; no functional changes or regressions are introduced here.
components/shopify/actions/delete-blog/delete-blog.mjs (1)
7-7: Delete Blog action version bump looks good.Metadata update only; runtime behavior and props are unchanged and consistent with existing patterns.
components/shopify/actions/bulk-import/bulk-import.mjs (1)
10-10: Bulk Import version bump is safe.This is a metadata-only update; the staged upload and bulk operation logic remain untouched.
components/shopify/sources/collection-updated/collection-updated.mjs (1)
9-9: Collection Updated source version bump is fine.Source behavior, topic, and emitted metadata are unchanged; only the version field is updated.
components/shopify/sources/customer-data-request/customer-data-request.mjs (1)
5-5: Customer Data Request source version bump is appropriate.No functional changes; existing emit behavior remains intact.
components/shopify/actions/delete-metafield/delete-metafield.mjs (1)
8-8: Delete Metafield version bump only.The action semantics are unchanged; version aligns with the broader package bump.
components/shopify/common/mutations.mjs (1)
418-434: UPDATE_ORDER mutation wiring looks consistent with the new action.The
UPDATE_ORDERmutation expects anOrderInputand returns theorderfields your action uses (name, etc.) plususerErrors, and it’s correctly added to the default export forshopify.appto consume.Also applies to: 460-460
components/shopify/actions/update-order/update-order.mjs (1)
4-53: New Update Order action structure is consistent and clear.Props, annotations, and use of
orderId+ optionalnote,tags, and JSON-parsedmetafieldsalign with existing Shopify actions and the newUPDATE_ORDERmutation wiring. This should integrate cleanly with the sharedshopify.updateOrderhelper.components/shopify/common/queries.mjs (2)
470-624: LGTM: Well-structured order query with proper nested connection handlingThe
LIST_ORDERSquery correctly hard-codeslineItems(first: 50)at line 556 rather than reusing the top-level$firstparameter, following Shopify's best practices for managing query complexity. The comprehensive field selection and pagination structure align well with the existing query patterns.
902-997: LGTM: Customer queries correctly usecountryCodeV2Both
GET_CUSTOMERandLIST_CUSTOMERSqueries properly usecountryCodeV2for address fields, aligning with Shopify's current Admin GraphQL API standards. The field selections are comprehensive and appropriate for customer retrieval operations.components/shopify/actions/get-metafields/get-metafields.mjs (1)
8-8: LGTM: Version bump onlyThe version increment aligns with the broader version updates across the Shopify action suite in this PR.
components/shopify/actions/get-customer/get-customer.mjs (1)
1-36: LGTM: Well-structured customer retrieval actionThe action follows the established patterns for Shopify single-resource actions. The info alert appropriately references protected customer data access requirements, and the summary export correctly handles cases where email might be missing.
components/shopify/actions/search-orders/search-orders.mjs (2)
17-21: Review documentation link for order access scopeThe info alert references "orders properly defined" but links to
protected-customer-datadocumentation. While orders may contain customer data, the primary access scope concern isread_orders. Consider linking to the general access scopes documentation (https://shopify.dev/docs/admin-api/access-scopes) instead for clarity.
22-51: LGTM: Well-implemented order search actionThe action correctly uses the
getPaginatedpattern withlistOrdersand properly handles the search query parameter. The summary export correctly pluralizes "order" vs "orders".components/shopify/actions/get-draft-order/get-draft-order.mjs (1)
29-35: LGTM: Clean single-item draft order fetchThe action correctly fetches a single draft order without unnecessary pagination parameters, and the summary export appropriately falls back from
nametoid.components/shopify/actions/get-draft-orders/get-draft-orders.mjs (1)
22-66: LGTM: Comprehensive draft orders list actionThe action is well-structured with detailed query syntax documentation at line 25 and proper use of the pagination pattern. The summary export correctly handles singular/plural cases.
components/shopify/actions/get-customers/get-customers.mjs (1)
1-67: LGTM: Well-structured customer list actionThe action appropriately references protected customer data requirements in the info alert, uses the correct pagination pattern, and includes helpful query examples. The summary export correctly handles singular/plural cases.
components/shopify/shopify.app.mjs (1)
520-546: GraphQL helper methods are consistent with existing patternsThe new wrappers (
listOrders,getDraftOrder,listDraftOrders,updateOrder,getCustomer,listCustomers,listAssignedFulfillmentOrders,getFulfillmentOrder,listFulfillmentOrders) all delegate through_makeGraphQlRequestin the same way as existing helpers (e.g.,listProducts,getProduct, etc.), so from an app-facade standpoint this is clean and consistent.Just ensure the corresponding
queries.*andmutations.UPDATE_ORDERconstants are defined with the expected shapes (top‑level fields matching the names implied byresourceKeys, and connections exposingnodes/pageInfo) so that downstream usages likegetPropOptionsandgetPaginatedcontinue to work without adjustment.
| props: { | ||
| shopify, | ||
| // eslint-disable-next-line pipedream/props-label, pipedream/props-description | ||
| info: { | ||
| type: "alert", | ||
| alertType: "info", | ||
| content: "Please verify that the Shopify shop has fulfillment services properly defined and that your API credentials have been granted this access scope. [See the documentation](https://shopify.dev/docs/admin-api/access-scopes)", | ||
| }, | ||
| sortKey: { | ||
| propDefinition: [ | ||
| shopify, | ||
| "sortKey", | ||
| ], | ||
| description: "The key to sort the results by. Options: `ID`", | ||
| }, | ||
| maxResults: { | ||
| propDefinition: [ | ||
| shopify, | ||
| "maxResults", | ||
| ], | ||
| }, | ||
| reverse: { | ||
| propDefinition: [ | ||
| shopify, | ||
| "reverse", | ||
| ], | ||
| }, | ||
| }, | ||
| async run({ $ }) { | ||
| const fulfillmentOrders = await this.shopify.getPaginated({ | ||
| resourceFn: this.shopify.listAssignedFulfillmentOrders, | ||
| resourceKeys: [ | ||
| "assignedFulfillmentOrders", | ||
| ], | ||
| variables: { | ||
| sortKey: this.sortKey, | ||
| reverse: this.reverse, | ||
| }, | ||
| max: this.maxResults, | ||
| }); | ||
| $.export("$summary", `Successfully retrieved ${fulfillmentOrders.length} fulfillment order${fulfillmentOrders.length === 1 | ||
| ? "" | ||
| : "s"}`); | ||
| return fulfillmentOrders; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧹 Nitpick | 🔵 Trivial
Action wiring looks solid; consider loosening sortKey docs and exposing more filters
The pagination + listAssignedFulfillmentOrders wiring matches the expected assignedFulfillmentOrders → nodes/pageInfo shape, and the summary handling is correct.
Two small ergonomics points:
- Shopify’s
assignedFulfillmentOrderssupports additional filters likeassignmentStatusandlocationIds, and thesortKeyenum currently includes more than justID. (shopify.dev) If you expect Neople to need finer control (e.g., only requested assignments or a specific location), consider adding optionalassignmentStatus/locationIdsprops and passing them through invariables. - If you do intend to allow any valid
FulfillmentOrderSortKeysvalue, thesortKeydescription (“Options:ID”) is a bit misleading. Either make it more generic (“See Shopify docs for valid sort keys”) or explicitly constrain and validate toID.
These are non‑blocking but would make the action more self‑documenting and future‑proof.
🤖 Prompt for AI Agents
In
components/shopify/actions/get-assigned-fulfillment-orders/get-assigned-fulfillment-orders.mjs
around lines 14 to 57, loosen the ergonomics by adding optional props for
assignmentStatus and locationIds and passing them into the GraphQL variables,
and update the sortKey description to avoid implying only "ID" is valid: add
props.assignmentStatus (propDefinition or allowed string/enums) and
props.locationIds (array of IDs), include assignmentStatus and locationIds in
the variables object you pass to this.shopify.getPaginated, and change the
sortKey.description to a generic note like "See Shopify docs for valid sort
keys" (or implement validation to restrict to ID if you prefer).
| info: { | ||
| type: "alert", | ||
| alertType: "info", | ||
| content: "Please verify that the Shopify shop has draft orders properly defined and that your API credentials have been granted this access scope. [See the documentation](https://shopify.dev/docs/apps/launch/protected-customer-data)", | ||
| }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Update documentation link for draft order access scope
The alert correctly mentions "draft orders" but links to protected-customer-data documentation. For consistency and clarity, link to the general access scopes documentation instead.
info: {
type: "alert",
alertType: "info",
- content: "Please verify that the Shopify shop has draft orders properly defined and that your API credentials have been granted this access scope. [See the documentation](https://shopify.dev/docs/apps/launch/protected-customer-data)",
+ content: "Please verify that the Shopify shop has draft orders properly defined and that your API credentials have been granted this access scope. [See the documentation](https://shopify.dev/docs/admin-api/access-scopes)",
},📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| info: { | |
| type: "alert", | |
| alertType: "info", | |
| content: "Please verify that the Shopify shop has draft orders properly defined and that your API credentials have been granted this access scope. [See the documentation](https://shopify.dev/docs/apps/launch/protected-customer-data)", | |
| }, | |
| info: { | |
| type: "alert", | |
| alertType: "info", | |
| content: "Please verify that the Shopify shop has draft orders properly defined and that your API credentials have been granted this access scope. [See the documentation](https://shopify.dev/docs/admin-api/access-scopes)", | |
| }, |
🤖 Prompt for AI Agents
In components/shopify/actions/get-draft-orders/get-draft-orders.mjs around lines
17 to 21, the alert message about draft orders currently links to the
protected-customer-data doc; update the URL to Shopify's general access scopes
documentation (replace the existing link with
https://shopify.dev/docs/apps/auth/access-scopes) so the message points to the
correct, general scopes reference for API access.
| query: { | ||
| type: "string", | ||
| label: "Query", | ||
| description: "Filter fulfillment orders using [Shopify API search syntax](https://shopify.dev/api/usage/search-syntax). Available filters: `assigned_location_id` (id), `id` (id with range support like `id:>=1234`), `status` (string, e.g., `status:open`), `updated_at` (time), or default search (case-insensitive multi-field search). Examples: `status:open`, `assigned_location_id:12345`, `id:>=1000`, `updated_at:>2024-01-01`. [See the documentation](https://shopify.dev/docs/api/admin-graphql/latest/queries/fulfillmentorders#argument-fulfillmentorders-query)", | ||
| optional: true, | ||
| }, | ||
| includeClosed: { | ||
| type: "boolean", | ||
| label: "Include Closed", | ||
| description: "Whether to include closed fulfillment orders in the results. Defaults to false.", | ||
| optional: true, | ||
| default: false, | ||
| }, | ||
| sortKey: { | ||
| propDefinition: [ | ||
| shopify, | ||
| "sortKey", | ||
| ], | ||
| description: "The key to sort the results by. Options: `ID`", | ||
| }, | ||
| maxResults: { | ||
| propDefinition: [ | ||
| shopify, | ||
| "maxResults", | ||
| ], | ||
| }, | ||
| reverse: { | ||
| propDefinition: [ | ||
| shopify, | ||
| "reverse", | ||
| ], | ||
| }, | ||
| }, | ||
| async run({ $ }) { | ||
| const fulfillmentOrders = await this.shopify.getPaginated({ | ||
| resourceFn: this.shopify.listFulfillmentOrders, | ||
| resourceKeys: [ | ||
| "fulfillmentOrders", | ||
| ], | ||
| variables: { | ||
| query: this.query, | ||
| sortKey: this.sortKey, | ||
| reverse: this.reverse, | ||
| includeClosed: this.includeClosed, | ||
| }, | ||
| max: this.maxResults, | ||
| }); | ||
| $.export("$summary", `Successfully retrieved ${fulfillmentOrders.length} fulfillment order${fulfillmentOrders.length === 1 | ||
| ? "" | ||
| : "s"}`); | ||
| return fulfillmentOrders; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧹 Nitpick | 🔵 Trivial
Implementation matches the fulfillmentOrders API; just tighten sortKey description
The props and run implementation line up with the fulfillmentOrders query (query, includeClosed, reverse, sortKey) and the pagination helper, so behavior-wise this looks correct. (shopify.dev)
Minor docs issue: the sortKey description says “Options: ID”, but Shopify’s FulfillmentOrderSortKeys enum exposes additional values (for example, UPDATED_AT in current docs). (shopify.dev) Either:
- Make the description generic and point to the Shopify docs for valid sort keys, or
- If you intentionally only support
ID, add validation and make that restriction explicit in the description.
Functionality is fine as‑is; this is about avoiding confusing guidance in the UI.
🤖 Prompt for AI Agents
components/shopify/actions/get-fulfillment-orders/get-fulfillment-orders.mjs
lines 22-72: The sortKey prop description currently says "Options: `ID`" which
is misleading because Shopify's FulfillmentOrderSortKeys exposes additional
values (e.g., UPDATED_AT); update the description to either list valid sort keys
or make it generic and point to Shopify docs, or if you only support ID add
validation and state that explicitly. Change the description to a generic
guidance like "The key to sort the results by; see Shopify
FulfillmentOrderSortKeys in the docs for valid values" or enforce and validate
allowed values (and update the description to state "Only `ID` is supported")
depending on the intended behavior.
| orderId: { | ||
| type: "string", | ||
| label: "Order ID", | ||
| description: "The identifier of an order", | ||
| async options({ prevContext }) { | ||
| return this.getPropOptions({ | ||
| resourceFn: this.listOrders, | ||
| resourceKeys: [ | ||
| "orders", | ||
| ], | ||
| labelKey: "name", | ||
| prevContext, | ||
| }); | ||
| }, | ||
| }, | ||
| draftOrderId: { | ||
| type: "string", | ||
| label: "Draft Order ID", | ||
| description: "The identifier of a draft order", | ||
| async options({ prevContext }) { | ||
| return this.getPropOptions({ | ||
| resourceFn: this.listDraftOrders, | ||
| resourceKeys: [ | ||
| "draftOrders", | ||
| ], | ||
| labelKey: "name", | ||
| prevContext, | ||
| }); | ||
| }, | ||
| }, | ||
| customerId: { | ||
| type: "string", | ||
| label: "Customer ID", | ||
| description: "The identifier of a customer", | ||
| async options({ prevContext }) { | ||
| return this.getPropOptions({ | ||
| resourceFn: this.listCustomers, | ||
| resourceKeys: [ | ||
| "customers", | ||
| ], | ||
| labelKey: "email", | ||
| prevContext, | ||
| }); | ||
| }, | ||
| }, | ||
| fulfillmentOrderId: { | ||
| type: "string", | ||
| label: "Fulfillment Order ID", | ||
| description: "The identifier of a fulfillment order", | ||
| async options({ prevContext }) { | ||
| return this.getPropOptions({ | ||
| resourceFn: this.listAssignedFulfillmentOrders, | ||
| resourceKeys: [ | ||
| "assignedFulfillmentOrders", | ||
| ], | ||
| labelKey: "id", | ||
| prevContext, | ||
| }); | ||
| }, | ||
| }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧹 Nitpick | 🔵 Trivial
Broaden fulfillmentOrderId options to use listFulfillmentOrders instead of only assigned orders
fulfillmentOrderId currently builds its dropdown from listAssignedFulfillmentOrders → assignedFulfillmentOrders, labeling by id. That works, but it means the options list only ever reflects fulfillment orders assigned to the app’s fulfillment-service locations, even though the prop is generically labeled “Fulfillment Order ID” and is likely reused by the “Get Fulfillment Order” action. (shopify.dev)
For apps that also have merchant-managed / third‑party fulfillment order scopes, using the broader fulfillmentOrders query would surface more relevant IDs with no downside (the query still respects access scopes). (shopify.dev)
Consider switching this prop to:
- async options({ prevContext }) {
- return this.getPropOptions({
- resourceFn: this.listAssignedFulfillmentOrders,
- resourceKeys: [
- "assignedFulfillmentOrders",
- ],
- labelKey: "id",
- prevContext,
- });
- },
+ async options({ prevContext }) {
+ return this.getPropOptions({
+ resourceFn: this.listFulfillmentOrders,
+ resourceKeys: [
+ "fulfillmentOrders",
+ ],
+ labelKey: "id",
+ prevContext,
+ });
+ },Users who only have read_assigned_fulfillment_orders will still see the same subset, but apps with broader scopes get a more complete list. Behavior today remains correct; this is a usability alignment with the prop’s name.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| orderId: { | |
| type: "string", | |
| label: "Order ID", | |
| description: "The identifier of an order", | |
| async options({ prevContext }) { | |
| return this.getPropOptions({ | |
| resourceFn: this.listOrders, | |
| resourceKeys: [ | |
| "orders", | |
| ], | |
| labelKey: "name", | |
| prevContext, | |
| }); | |
| }, | |
| }, | |
| draftOrderId: { | |
| type: "string", | |
| label: "Draft Order ID", | |
| description: "The identifier of a draft order", | |
| async options({ prevContext }) { | |
| return this.getPropOptions({ | |
| resourceFn: this.listDraftOrders, | |
| resourceKeys: [ | |
| "draftOrders", | |
| ], | |
| labelKey: "name", | |
| prevContext, | |
| }); | |
| }, | |
| }, | |
| customerId: { | |
| type: "string", | |
| label: "Customer ID", | |
| description: "The identifier of a customer", | |
| async options({ prevContext }) { | |
| return this.getPropOptions({ | |
| resourceFn: this.listCustomers, | |
| resourceKeys: [ | |
| "customers", | |
| ], | |
| labelKey: "email", | |
| prevContext, | |
| }); | |
| }, | |
| }, | |
| fulfillmentOrderId: { | |
| type: "string", | |
| label: "Fulfillment Order ID", | |
| description: "The identifier of a fulfillment order", | |
| async options({ prevContext }) { | |
| return this.getPropOptions({ | |
| resourceFn: this.listAssignedFulfillmentOrders, | |
| resourceKeys: [ | |
| "assignedFulfillmentOrders", | |
| ], | |
| labelKey: "id", | |
| prevContext, | |
| }); | |
| }, | |
| }, | |
| fulfillmentOrderId: { | |
| type: "string", | |
| label: "Fulfillment Order ID", | |
| description: "The identifier of a fulfillment order", | |
| async options({ prevContext }) { | |
| return this.getPropOptions({ | |
| resourceFn: this.listFulfillmentOrders, | |
| resourceKeys: [ | |
| "fulfillmentOrders", | |
| ], | |
| labelKey: "id", | |
| prevContext, | |
| }); | |
| }, | |
| }, |
🤖 Prompt for AI Agents
In components/shopify/shopify.app.mjs around lines 247 to 306, the
fulfillmentOrderId prop currently sources options from
listAssignedFulfillmentOrders → assignedFulfillmentOrders which limits results
to assigned orders; replace that call with listFulfillmentOrders and update
resourceKeys to ["fulfillmentOrders"] (keeping labelKey: "id" and prevContext)
so the dropdown surfaces all fulfillment orders the app can access while
preserving behavior for apps with only assigned scope.
|
Hi everyone, all test cases are passed! Ready for release! Test reports
|
WHY
Resolves #19331
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.