← Files ShopifyARCHIVED FILE
skills/shopify-pos-ui/scripts/validate.mjs
61.2 KB · Oct 3, 2026 · 06:02 UTC
#!/usr/bin/env node
var pt=Object.defineProperty;var o=(e,t)=>pt(e,"name",{value:t,configurable:!0});import{readFileSync as On}from"fs";import{parseArgs as Nn}from"util";var d={PUBLIC:"public",EARLY_ACCESS:"earlyAccess",INTERNAL:"internal"},f={GRAPHQL:"graphql",FUNCTIONS:"functions",FUNCTION_GRAPHQL:"function-graphql",UI_FRAMEWORK:"ui-framework",THEME:"theme",CONFIGURATION:"configuration",EXECUTION:"execution",GUIDANCE:"guidance"};function lt(e){return Object.fromEntries(Object.entries(e).map(([t,n])=>[t,{name:t,...n}]))}o(lt,"defineApis");var Q=lt({"use-shopify-cli":{displayName:"Use Shopify CLI",description:"Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app.<name>.toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); or perform explicit store-scoped reads/writes on a named store domain (for example, show/list/find the first 10 products on my store at `foo.myshopify.com`, or inventory and product changes by handle, SKU, or location name). Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution, and skip for brand-new merchant asks to start a Shopify store or try Shopify before they have an account. Examples: validate configuration before deploy; run an existing query via CLI; show the first 10 products on `foo.myshopify.com`; missing `shopify store execute`.",category:f.EXECUTION,visibility:d.PUBLIC,searchable:!1},ucp:{displayName:"UCP CLI",description:'Use when the user wants to use the UCP CLI to find, compare, buy, or track products from online merchants, or to set up and troubleshoot the local UCP profile required for merchant-scoped operations. Covers global catalog search ("find me X under $Y"), named-merchant transactions ("buy this from Z.com"), order tracking, `ucp profile init`, `ucp doctor`, carts, checkout, orders, and UCP setup/help. Falls back to merchant-hosted handoff when direct in-protocol checkout isn\'t available.',category:f.EXECUTION,visibility:d.PUBLIC,searchable:!1,skillName:"ucp",compatibility:"Requires UCP CLI",frontmatterExtras:{requires_bin:"ucp",command:"ucp"}},admin:{displayName:"Admin API",versioned:!0,description:"Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app monetization**\u2014charging merchants for the app itself via app pricing plans, paid app tiers, app subscription charges, or app free trials\u2014use **`app-pricing`** unless the user is maintaining an existing Manual Pricing integration or explicitly needs an Admin Billing API operation. Merchant **product** subscriptions stay with `admin` (selling plans, subscription contracts, try-before-you-buy). Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).",category:f.GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"admin"},validation:!0,exampleVectorStoreQuery:{query:"productCreate mutation",context:"creating a product"}},shopifyql:{displayName:"ShopifyQL",versioned:!0,description:'Answer a merchant\'s **analytics and reporting** questions with **ShopifyQL** \u2014 Shopify\'s query language for aggregated store metrics that the Admin GraphQL API cannot compute. Choose this (not `admin`) whenever the ask is for **numbers, totals, trends, or breakdowns** rather than fetching or mutating individual records: including but not limited to total/gross/net sales and revenue, order counts, average order value, refunds, quantity sold, sessions, conversion rate, and traffic \u2014 sliced by product, channel, region, or customer, trended over time, or compared period-over-period. Examples: "total sales last 7 days", "orders by sales channel this month", "top products by revenue", "conversion rate this week", "sales this year vs last year". This topic covers writing the ShopifyQL query; if the merchant wants to run it against their store, execution is handed off to `use-shopify-cli`. Not for general Admin GraphQL record operations \u2014 fetching or mutating individual resources (use `admin`).',category:f.GUIDANCE,visibility:d.PUBLIC,exampleVectorStoreQuery:{query:"ShopifyQL total sales over time",context:"querying aggregated store analytics with ShopifyQL"},compatibility:"Claude Code, Claude Desktop, Cursor"},"storefront-graphql":{displayName:"Storefront GraphQL API",versioned:!0,description:"Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like <shopify-store>, <shopify-cart>, use storefront-web-components instead.",category:f.GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"storefront"},validation:!0,exampleVectorStoreQuery:{query:"predictiveSearch query",context:"storefront search"}},partner:{displayName:"Partner API",versioned:!0,description:"The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.",category:f.GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"partner"},validation:!0,exampleVectorStoreQuery:{query:"transactions query",context:"partner transaction history"}},customer:{displayName:"Customer Account API",versioned:!0,description:"The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.",category:f.GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"customer"},validation:!0,exampleVectorStoreQuery:{query:"customer orders query",context:"customer order history"}},"payments-apps":{displayName:"Payments Apps API",versioned:!0,description:"The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.",category:f.GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"payments_apps"},validation:!0,exampleVectorStoreQuery:{query:"paymentSessionPending mutation",context:"pending a payment session"}},functions:{displayName:"Shopify Functions",versioned:!0,description:"Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization",category:f.FUNCTIONS,visibility:d.PUBLIC,validation:!0,exampleVectorStoreQuery:{query:"cart transform function input query",context:"cart transform function inputs"}},functions_cart_checkout_validation:{displayName:"Cart Checkout Validation Function",versioned:!0,description:"GraphQL schema for Cart and Checkout Validation Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_cart_checkout_validation_schema"}},functions_cart_transform:{displayName:"Cart Transform Function",versioned:!0,description:"GraphQL schema for Cart Transform Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_cart_transform_schema"}},functions_delivery_customization:{displayName:"Delivery Customization Function",versioned:!0,description:"GraphQL schema for Delivery Customization Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_delivery_customization_schema"}},functions_discount:{displayName:"Discount Function",versioned:!0,description:"GraphQL schema for Discount Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_discount_schema"}},functions_discounts_allocator:{displayName:"Discounts Allocator Function",versioned:!0,description:"GraphQL schema for Discounts Allocator Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_discounts_allocator_schema"}},functions_fulfillment_constraints:{displayName:"Fulfillment Constraints Function",versioned:!0,description:"GraphQL schema for Fulfillment Constraints Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_fulfillment_constraints_schema"}},functions_local_pickup_delivery_option_generator:{displayName:"Local Pickup Delivery Option Generator Function",versioned:!0,description:"GraphQL schema for Local Pickup Delivery Option Generator Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_local_pickup_delivery_option_generator_schema"}},functions_order_discounts:{displayName:"Order Discounts Function",versioned:!0,description:"GraphQL schema for Order Discounts Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_order_discounts_schema"}},functions_order_routing_location_rule:{displayName:"Order Routing Location Rule Function",versioned:!0,description:"GraphQL schema for Order Routing Location Rule Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_order_routing_location_rule_schema"}},functions_payment_customization:{displayName:"Payment Customization Function",versioned:!0,description:"GraphQL schema for Payment Customization Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_payment_customization_schema"}},functions_pickup_point_delivery_option_generator:{displayName:"Pickup Point Delivery Option Generator Function",versioned:!0,description:"GraphQL schema for Pickup Point Delivery Option Generator Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_pickup_point_delivery_option_generator_schema"}},functions_product_discounts:{displayName:"Product Discounts Function",versioned:!0,description:"GraphQL schema for Product Discounts Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_product_discounts_schema"}},functions_shipping_discounts:{displayName:"Shipping Discounts Function",versioned:!0,description:"GraphQL schema for Shipping Discounts Function input queries",category:f.FUNCTION_GRAPHQL,visibility:d.PUBLIC,schemaSource:{shopifyDevPrefix:"functions_shipping_discounts_schema"}},"polaris-app-home":{displayName:"Polaris App Home",description:"Build your app's primary user interface embedded in the Shopify admin. Covers the Intents API (`shopify.intents.invoke`) for launching native workflows from App Home. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.",category:f.UI_FRAMEWORK,publicPackages:["@shopify/polaris-types","@shopify/app-bridge-types","@shopify/app-bridge-react"],visibility:d.PUBLIC,validation:!0,exampleVectorStoreQuery:{query:"s-form",context:"form in app home"}},"polaris-admin-extensions":{displayName:"Polaris Admin Extensions",versioned:!0,description:"Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Covers the Intents API (`shopify.intents.invoke`) for launching native workflows from an extension. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.",category:f.UI_FRAMEWORK,publicPackages:["@shopify/ui-extensions",{name:"@shopify/ui-extensions-react",versions:["2025-07"]}],extensionSurfaceName:"admin",extensionTypeName:"Admin Extensions",extensionSearchContext:"admin UI extensions",visibility:d.PUBLIC,validation:!0,exampleVectorStoreQuery:{query:"admin.product-details.block.render",context:"admin extension target for product details blocks"},exampleExtensionTarget:"admin.product-details.block.render"},"polaris-checkout-extensions":{displayName:"Polaris Checkout Extensions",versioned:!0,description:"Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands. This topic covers the extension code only \u2014 when the prompt also needs an app backend (for example storing data in the developer's own database, or verifying session tokens on a server), also learn **`onboarding-dev`** to scaffold the app with Shopify's official backend libraries.",category:f.UI_FRAMEWORK,publicPackages:["@shopify/ui-extensions",{name:"@shopify/ui-extensions-react",versions:["2025-07"]}],extensionSurfaceName:"checkout",extensionTypeName:"Checkout Extensions",extensionSearchContext:"checkout UI extensions",visibility:d.PUBLIC,validation:!0,exampleVectorStoreQuery:{query:"s-button checkout",context:"checkout button"},exampleExtensionTarget:"purchase.checkout.block.render"},"polaris-customer-account-extensions":{displayName:"Polaris Customer Account Extensions",versioned:!0,description:"Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.",category:f.UI_FRAMEWORK,publicPackages:["@shopify/ui-extensions",{name:"@shopify/ui-extensions-react",versions:["2025-07"]}],extensionSurfaceName:"customer-account",extensionTypeName:"Customer Account Extensions",extensionSearchContext:"customer account UI extensions",visibility:d.PUBLIC,validation:!0,exampleVectorStoreQuery:{query:"s-card customer-account",context:"customer account card"},exampleExtensionTarget:"customer-account.order-status.block.render"},"pos-ui":{displayName:"POS UI",versioned:!0,description:"Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid",category:f.UI_FRAMEWORK,publicPackages:["@shopify/ui-extensions",{name:"@shopify/ui-extensions-react",versions:["2025-07"]}],extensionSurfaceName:"point-of-sale",extensionTypeName:"POS UI Extensions",extensionSearchContext:"POS UI extensions",visibility:d.PUBLIC,validation:!0,exampleVectorStoreQuery:{query:"pos.home.tile.render",context:"POS home tile extension target"},exampleExtensionTarget:"pos.customer-details.block.render"},hydrogen:{displayName:"Hydrogen",versioned:!0,description:"Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.",category:f.UI_FRAMEWORK,publicPackages:["@shopify/hydrogen"],visibility:d.PUBLIC,validation:!0,exampleVectorStoreQuery:{query:"CartForm component",context:"cart UI"}},"storefront-web-components":{displayName:"Storefront Web Components",description:"HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (<shopify-store>, <shopify-context>, <shopify-cart>, <shopify-variant-selector>, <shopify-money>), native <dialog>, 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.",category:f.UI_FRAMEWORK,featureFlag:"storefrontWebComponentsEnabled",visibility:d.EARLY_ACCESS,validation:!0,exampleVectorStoreQuery:{query:"shopify-cart",context:"cart web component"}},liquid:{displayName:"Liquid",description:"Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas",category:f.THEME,visibility:d.PUBLIC,schemaSource:{npmPackage:"@shopify/theme-check-common"},validation:!0,exampleVectorStoreQuery:{query:"product metafields",context:"product metafield access in a theme"}},"custom-data":{displayName:"Custom Data",description:"MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.",category:f.CONFIGURATION,visibility:d.PUBLIC,searchable:!1},"app-pricing":{displayName:"Shopify App Pricing",description:"Merchant product subscriptions such as selling plans and subscription contracts use Admin, not App Pricing. For app monetization, MUST be used first for a new public app with pricing plans, paid tiers, recurring subscriptions, monthly or yearly options, usage pricing, or free trials. Shopify App Pricing is the default for supported public-app pricing models. Do not choose Admin GraphQL first merely because an app-monetization request asks for server-side code or mentions billing or subscriptions. Use Admin only for an existing Manual Pricing integration or a pricing model Shopify App Pricing doesn't support.",category:f.GUIDANCE,visibility:d.PUBLIC,searchable:"unscoped",exampleVectorStoreQuery:{query:"Shopify App Pricing",context:"choosing and implementing app monetization"}},"app-store-review":{displayName:"App Store Review",description:"Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.",category:f.GUIDANCE,visibility:d.PUBLIC,searchable:!1,compatibility:"Claude Code, Claude Desktop, Cursor"},"onboarding-dev":{displayName:"Developer Onboarding",description:"Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify \u2014 including building an app in a specific backend language or framework (for example Laravel, Symfony, Django, Flask, Rails, or Express); this topic covers scaffolding the app and choosing Shopify's official library for that language. When the prompt also involves an extension surface (checkout, admin, POS, customer accounts), learn this topic **in addition to** the surface topic. NOT for merchants managing stores.",category:f.GUIDANCE,visibility:d.PUBLIC,searchable:!1,compatibility:"Claude Code, Claude Desktop, Cursor"},"onboarding-merchant":{displayName:"Merchant Onboarding",description:'Set up a Shopify store. Use whenever someone asks to make, build, open, or set up a store or shop that sells something (e.g. "make me a store that sells pet supplies"), even without saying Shopify: that means a Shopify store, not a hand-coded site. Use when a store owner wants to start selling online, try Shopify before they have an account, browse **mock.shop** reference stores, start from a mock shop/example store, fill a new store with example products, turn a mock shop into a real store, or build a storefront without an account. Also use when developers explicitly need auth-free mock.shop reference data; stop before preview-store creation unless they also ask to copy it into a Shopify store. Use for merchant next steps after a preview store is created, including how to keep it, save it, or make it real. Preview creation belongs here via `shopify store create preview`; app and theme development belongs in `onboarding-dev`; CLI troubleshooting and named-store commands belong in **`use-shopify-cli`**.',category:f.GUIDANCE,visibility:d.PUBLIC,searchable:!1,compatibility:"Claude Code, Claude Desktop, Cursor",frontmatterExtras:{maintainer:"Shopify"}}});function K(e){return typeof e=="string"?e:e.name}o(K,"getPublicPackageName");function le(e,t){return typeof e=="string"||!e.versions||t===void 0?!0:e.versions.includes(t)}o(le,"publicPackageAppliesToVersion");var Ae={shopifyql:[{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],admin:[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],"storefront-graphql":[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],partner:[{name:"unstable"},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"},{name:"2025-07"}],customer:[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],"payments-apps":[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],"polaris-app-home":[],"polaris-admin-extensions":[{name:"2026-04",latestVersion:!0},{name:"2026-01"},{name:"2025-10"},{name:"2025-07"}],"polaris-checkout-extensions":[{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"},{name:"2025-07"}],"polaris-customer-account-extensions":[{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"},{name:"2025-07"}],"pos-ui":[{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"},{name:"2025-07"}],hydrogen:[{name:"2026-04",latestVersion:!0},{name:"2026-01"},{name:"2025-10"},{name:"2025-07"}],"storefront-web-components":[],functions_cart_checkout_validation:[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],functions_cart_transform:[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],functions_delivery_customization:[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],functions_discount:[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],functions_discounts_allocator:[{name:"unstable",latestVersion:!0}],functions_fulfillment_constraints:[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],functions_local_pickup_delivery_option_generator:[{name:"unstable",latestVersion:!0}],functions_order_discounts:[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],functions_order_routing_location_rule:[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],functions_payment_customization:[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],functions_pickup_point_delivery_option_generator:[{name:"unstable",latestVersion:!0}],functions_product_discounts:[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],functions_shipping_discounts:[{name:"unstable"},{name:"2026-10",releaseCandidate:!0},{name:"2026-07",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}]};var Ce=Ae,Te=Object.fromEntries(Object.entries(Ce).filter(([e,t])=>t.length>0).map(([e,t])=>[e,t.map(n=>n.name)]));function Oe(e){return Object.prototype.hasOwnProperty.call(Te,e)}o(Oe,"hasSupportedVersions");function ue(e){return Oe(e)?Te[e]:[]}o(ue,"getSupportedVersions");function dt(e){let t=Ce[e];if(t)return t.find(n=>n.latestVersion)?.name??t[0]?.name}o(dt,"getLatestVersion");function Ne(e,t){if(!Oe(e))throw new Error(`API "${e}" is not in the supported versions catalog. Only call resolveVersion for APIs with entries in SUPPORTED_API_VERSIONS.`);let n=ue(e);if(n.length===0)return{ok:!1,reason:"no_versions",supportedVersions:n};if(t)return n.includes(t)?{ok:!0,version:t,source:"explicit",supportedVersions:n}:{ok:!1,reason:"unsupported_version",supportedVersions:n};let i=dt(e);return i?{ok:!0,version:i,source:"default",supportedVersions:n}:{ok:!1,reason:"no_versions",supportedVersions:n}}o(Ne,"resolveVersion");function ft(e,t){return e.map(n=>t&&n.includes("@shopify/ui-extensions")?`import '${n}/${t}';`:`import '${n}';`).join(`
`)}o(ft,"generateMissingImports");function mt(e,t,n){if(t.includes("@shopify/ui-extensions")&&!n)throw new Error("Invalid input: extensionTarget is required");let i=ft(t,n);if(e&&(e.includes("const shopify =")||e.includes("globalThis.shopify")))return i;let r=t.find(a=>a.includes("@shopify/ui-extensions"))&&n?`interface ShopifyApiOverride extends Omit<import('@shopify/ui-extensions/${n}').Api, 'query'> { query: (...args: any[]) => Promise<{ data: any; errors?: any[] }>; } const shopify: ShopifyApiOverride = (globalThis as any).shopify;`:"";return`${i}
${r}`.trim()}o(mt,"addShopifyImports");function De(e,t,n){if(e.includes("!DOCTYPE")||e.includes("!html")){let s=e.match(/<body>(.*?)<\/body>/s)?.[1];s&&(e=`<>${s}</>`)}return`
${mt(e,t,n)}
${e}
`}o(De,"formatCode");import*as O from"path";import b from"typescript";import{fileURLToPath as ht}from"url";var Le=o((e,t)=>({target:b.ScriptTarget.ESNext,module:b.ModuleKind.ESNext,jsx:b.JsxEmit.ReactJSX,jsxImportSource:e||"preact",strict:!0,strictNullChecks:!1,esModuleInterop:!0,skipLibCheck:!0,moduleResolution:b.ModuleResolutionKind.NodeJs,allowSyntheticDefaultImports:!0,lib:["es2020","dom"],allowJs:!0,checkJs:!1,...t?{baseUrl:t,paths:{"@shopify/ui-extensions/src/surfaces/*":["node_modules/@shopify/ui-extensions/build/ts/surfaces/*"]}}:{}}),"getCompilerOptions");function gt(){let e=ht(import.meta.url);return O.resolve(e,"../..")}o(gt,"getPackageRoot");function yt(e,t){let n=t.get(e);if(n)return b.ScriptSnapshot.fromString(n);try{let i=b.sys.readFile(e);return i?b.ScriptSnapshot.fromString(i):void 0}catch{return}}o(yt,"getScriptSnapshot");function St(e,t,n){return{getScriptFileNames:o(()=>Array.from(e.virtualFiles.keys()),"getScriptFileNames"),getScriptVersion:o(i=>e.fileVersions.get(i)?.toString()||"0","getScriptVersion"),getScriptSnapshot:o(i=>yt(i,e.virtualFiles),"getScriptSnapshot"),getCurrentDirectory:o(()=>t,"getCurrentDirectory"),getCompilationSettings:o(()=>Le(n,t),"getCompilationSettings"),getDefaultLibFileName:o(i=>b.getDefaultLibFilePath(i),"getDefaultLibFileName"),fileExists:o(i=>e.virtualFiles.has(i)||b.sys.fileExists(i),"fileExists"),readFile:o(i=>e.virtualFiles.get(i)||b.sys.readFile(i),"readFile"),readDirectory:b.sys.readDirectory,getDirectories:b.sys.getDirectories,directoryExists:o(i=>{let r=i.endsWith(O.sep)?i:i+O.sep;for(let s of e.virtualFiles.keys())if(s.startsWith(r))return!0;return b.sys.directoryExists(i)},"directoryExists"),getNewLine:o(()=>`
`,"getNewLine")}}o(St,"createLanguageServiceHost");function Re(e,t){let n=new Map,i=new Map,r=gt(),s=t??(e==="hydrogen"?"react":"preact"),a=St({fileVersions:n,virtualFiles:i},r,s),c=b.createLanguageService(a,b.createDocumentRegistry()),p=O.dirname(b.getDefaultLibFilePath(Le(s,r))),u=["lib.es5.d.ts","lib.es2020.d.ts","lib.dom.d.ts"];for(let x of u)try{let S=O.join(p,x),I=b.sys.readFile(S);I&&(i.set(S,I),n.set(S,1))}catch{}return{languageService:c,servicesHost:a,fileVersions:n,virtualFiles:i}}o(Re,"createVirtualTSEnvironment");function vt(e,t){let i=(e.get(t)||0)+1;return e.set(t,i),i}o(vt,"incrementFileVersion");function H(e,t,n){e.virtualFiles.set(t,n),vt(e.fileVersions,t)}o(H,"addFileToVirtualEnv");var de=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","script","search","section","select","selectedcontent","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"];import g from"typescript";var Ve=["a","altGlyph","altGlyphDef","altGlyphItem","animate","animateColor","animateMotion","animateTransform","animation","audio","canvas","circle","clipPath","color-profile","cursor","defs","desc","discard","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","font","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignObject","g","glyph","glyphRef","handler","hkern","iframe","image","line","linearGradient","listener","marker","mask","metadata","missing-glyph","mpath","path","pattern","polygon","polyline","prefetch","radialGradient","rect","script","set","solidColor","stop","style","svg","switch","symbol","tbreak","text","textArea","textPath","title","tref","tspan","unknown","use","video","view","vkern"];var ke={NAMESPACE_USED_AS_VALUE:2708,TYPE_NOT_ASSIGNABLE:2322,CANNOT_FIND_NAME:2304},_={PROPERTY_NOT_EXIST:/Property '(\w+)' does not exist on type/,TYPE_NOT_ASSIGNABLE:/Type '(.+?)' is not assignable to type '(.+?)'/,PROPERTY:/[Pp]roperty '(\w+)'/,SHOPIFY_MODULE:/@shopify\//,MODULE_NOT_FOUND:/Invalid module name in augmentation/,INTRINSIC_ELEMENT:/does not exist on type 'JSX.IntrinsicElements'/,INVALID_JSX_ELEMENT:/cannot be used as a JSX component|is not a valid JSX element type/,USED_BEFORE_BEING_DEFINED:/is used before being assigned/,IMPLICITLY_HAS_AN_ANY_TYPE:/implicitly has an 'any' type./,PREACT_REACT_COMPAT:/type '(?:VNode|ReactPortal)|not assignable to type '(?:ReactNode|ReactPortal)'/,NEVER_TYPE_CASCADE:/does not exist on type 'never'|is not assignable to type 'never'/,PRIMITIVE_PROPERTY_ACCESS:/does not exist on type '(?:string|number|boolean|undefined|null|void)(?:\s*\|\s*(?:string|number|boolean|undefined|null|void))*'/,CSS_PROPERTIES_COMPAT:/CSSProperties/,OBJECT_IS_UNKNOWN:/Object is of type 'unknown'/},Pt=new Set(["class","style","title","id","slot","role","hidden","lang","dir","tabindex","inert","part","is","nonce","popover","contenteditable","draggable","spellcheck","translate","autocapitalize","autofocus","accesskey","enterkeyhint","inputmode"]),bt=/^(number|boolean)(\s*\|\s*(number|boolean|undefined|null))*$/;function xt(e){return Pt.has(e)||/^on[a-z]+$/.test(e)}o(xt,"isHtmlGlobalAttribute");function _t(e){let t=e.match(_.TYPE_NOT_ASSIGNABLE);if(!t)return!1;let n=t[1],i=t[2];return n!=="string"?!1:bt.test(i.trim())}o(_t,"isHtmlStringCoercion");function Et(e){return de.includes(e)}o(Et,"isStandardHTMLElement");function At(e){return Ve.includes(e)}o(At,"isStandardSVGElement");function Ct(e){let t=[];function n(i){if(g.isJsxOpeningElement(i)||g.isJsxSelfClosingElement(i)){let r=i.tagName.getText(e),s=i.getStart(e),a=i.getEnd();t.push({tagName:r,node:i,start:s,end:a})}g.forEachChild(i,n)}return o(n,"visit"),g.forEachChild(e,n),t}o(Ct,"extractJSXElements");function q(e){return{componentName:e,valid:!0,errors:[],skipped:!0}}o(q,"createSkippedValidation");function fe(e,t){let n=t==="custom"?`Custom component '${e}' is not allowed. UI extensions must only use Shopify Polaris web components. If this is a wrapper component, make sure to import it.`:`${t} element '${e}' is not allowed. UI extensions must only use Shopify Polaris web components.`;return{componentName:e,valid:!1,errors:[{property:"element",message:n}]}}o(fe,"createDisallowedElementValidation");function Tt(e){return e.replace(/\./g,"")}o(Tt,"sanitizeComponentName");function Ot(e,t,n,i,r){let s=Tt(e);return Et(s)?r?fe(e,"HTML"):q(e):At(s)?r?fe(e,"SVG"):q(e):t.has(s)?null:r?n.has(s)||i.has(s)?q(e):fe(e,"custom"):q(e)}o(Ot,"handleNonShopifyComponent");function Nt(e){return!e.startsWith("@shopify/")}o(Nt,"isUserDefinedImport");function Dt(e,t){e.name&&t.add(e.name.text)}o(Dt,"collectDefaultImportName");function Lt(e,t){let{namedBindings:n}=e;if(n&&g.isNamedImports(n))for(let i of n.elements)t.add(i.name.text)}o(Lt,"collectNamedImportNames");function Rt(e,t){Dt(e,t),Lt(e,t)}o(Rt,"collectImportedNames");function Vt(e){let{moduleSpecifier:t}=e;return g.isStringLiteral(t)?t.text:null}o(Vt,"getModulePath");function kt(e){let t=new Set;function n(i){g.isImportDeclaration(i)&&wt(i,t),g.forEachChild(i,n)}return o(n,"visitNode"),g.forEachChild(e,n),t}o(kt,"extractUserImportedComponents");function wt(e,t){let n=Vt(e);if(!n||!Nt(n))return;let{importClause:i}=e;i&&Rt(i,t)}o(wt,"processImportDeclaration");function me(e){return/^[A-Z]/.test(e)}o(me,"isPascalCase");function Ft(e){let t=new Set;function n(i){if(g.isFunctionDeclaration(i)&&i.name){let r=i.name.text;me(r)&&t.add(r)}if(g.isVariableStatement(i)){for(let r of i.declarationList.declarations)if(g.isIdentifier(r.name)&&r.initializer&&(g.isArrowFunction(r.initializer)||g.isFunctionExpression(r.initializer))){let s=r.name.text;me(s)&&t.add(s)}}if(g.isClassDeclaration(i)&&i.name){let r=i.name.text;me(r)&&t.add(r)}g.forEachChild(i,n)}return o(n,"visitNode"),g.forEachChild(e,n),t}o(Ft,"extractLocallyDefinedComponents");function Ut(e){return e.replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}o(Ut,"hyphenatedToCamelCase");function Mt(e){if(!g.isJsxOpeningElement(e)&&!g.isJsxSelfClosingElement(e))return[];let t=[];for(let n of e.attributes.properties){if(!g.isJsxAttribute(n))continue;let i=g.isIdentifier(n.name)?n.name.text:n.name.getText();if(!i.includes("-")||i.startsWith("aria-")||i.startsWith("data-"))continue;let r=Ut(i);t.push({property:i,message:`Property '${i}' uses a hyphenated name which is not a valid Polaris prop. Use camelCase '${r}' instead.`})}return t}o(Mt,"checkHyphenatedAttributes");function we(e,t,n,i={}){let{enforceShopifyOnlyComponents:r=!1,language:s}=i,a=s==="html",c=[],p=new Set,u=g.createSourceFile("temp.tsx",e,g.ScriptTarget.Latest,!0,g.ScriptKind.TSX),x=Ct(u),S=r?kt(u):new Set,I=r?Ft(u):new Set;for(let{tagName:l,node:v,start:C,end:N}of x){let U=Ot(l,n,S,I,r);if(U){c.push(U);continue}let{errors:M,handledDiagnostics:$}=Bt(C,N,t,a);$.forEach(T=>p.add(T));let j=Mt(v);M.push(...j),c.push({componentName:l,valid:M.length===0,errors:M})}let P=t.filter(l=>!p.has(l)).filter(l=>Fe(l,a)).filter($t).map(l=>({message:g.flattenDiagnosticMessageText(l.messageText,`
`),code:l.code,start:l.start,end:l.start!==void 0&&l.length!==void 0?l.start+l.length:void 0}));return{validations:c,genericErrors:P}}o(we,"extractComponentValidations");function Fe(e,t=!1){if(e.start===void 0||e.length===void 0)return!1;let n=g.flattenDiagnosticMessageText(e.messageText,`
`);if(e.code===ke.NAMESPACE_USED_AS_VALUE)return!1;if(t){let i=n.match(_.PROPERTY_NOT_EXIST);if(i&&xt(i[1])||_t(n))return!1}return!(n.includes("Cannot find module")&&!n.match(_.SHOPIFY_MODULE)||n.match(_.MODULE_NOT_FOUND)||n.match(_.USED_BEFORE_BEING_DEFINED)||n.match(_.INVALID_JSX_ELEMENT)||n.match(_.IMPLICITLY_HAS_AN_ANY_TYPE))}o(Fe,"shouldIncludeDiagnostic");function $t(e){let t=g.flattenDiagnosticMessageText(e.messageText,`
`);return!(t.match(_.PREACT_REACT_COMPAT)||t.match(_.NEVER_TYPE_CASCADE)||t.match(_.PRIMITIVE_PROPERTY_ACCESS)||t.match(_.CSS_PROPERTIES_COMPAT)||t.match(_.OBJECT_IS_UNKNOWN))}o($t,"shouldIncludeGenericDiagnostic");function Gt(e,t,n,i=!1){if(!Fe(e,i)||e.code===ke.CANNOT_FIND_NAME)return!1;let r=e.start,s=e.start+e.length;return r>=t&&s<=n}o(Gt,"isRelevantDiagnostic");function Bt(e,t,n,i=!1){let r=[],s=[],a=n.filter(c=>Gt(c,e,t,i));for(let c of a){let p=g.flattenDiagnosticMessageText(c.messageText,`
`),u=jt(c,p);u&&(r.push(u),s.push(c))}return{errors:r,handledDiagnostics:s}}o(Bt,"getComponentErrors");function jt(e,t){let n="",i,r,s=t.match(_.PROPERTY_NOT_EXIST);if(s)n=s[1];else{let a=t.match(_.TYPE_NOT_ASSIGNABLE),c=t.match(_.PROPERTY);a&&(r=a[1],i=a[2]),c&&(n=c[1])}return{property:n||"unknown",message:t,expected:i,actual:r}}o(jt,"parseDiagnostic");function Ue(e,t=[]){let n=[],i=[],r=[];for(let c of e)if(c.valid)c.skipped?r.push(c.componentName):i.push(c.componentName);else for(let p of c.errors)n.push(`${c.componentName} validation failed: Property '${p.property}': ${p.message}`);for(let c of t)n.push(c.message);let s,a;return n.length===0?(a="success",i.length>0?s=`All components validated successfully by TypeScript. Found components: ${Array.from(new Set(i)).join(", ")}.`:s="No components found to validate by TypeScript."):(a="failed",s=`Validation errors:
${n.join(`
`)}`),r.length>0&&(s+=`
Try and use component from Shopify Polaris components. Non-Shopify components (not validated):
${r.map(c=>` - ${c}`).join(`
`)}`),{result:a,resultDetail:s,componentValidationErrors:e.filter(c=>!c.skipped&&!c.valid).flatMap(c=>c.errors.map(p=>({componentName:c.componentName,...p}))),genericErrors:t,unvalidatedComponents:Array.from(new Set(r)),validatedComponents:Array.from(new Set(i))}}o(Ue,"formatValidationResponse");import{existsSync as A,readFileSync as G,readdirSync as zt}from"fs";import*as m from"path";import{fileURLToPath as Be}from"url";import{gunzipSync as Ge}from"zlib";import{brotliCompressSync as pi,brotliDecompressSync as Qt,constants as li}from"zlib";var he=4;function Me(e){let t=Qt(e);if(t.length<he)throw new Error(`Corrupt asset archive: ${t.length}-byte stream is shorter than the header-length field`);let n=t.readUInt32LE(0),i=he+n;if(i>t.length)throw new Error(`Corrupt asset archive: header (${n} bytes) extends past the ${t.length}-byte stream`);let r=JSON.parse(t.subarray(he,i).toString("utf-8")),s=t.subarray(i),a=new Map;for(let[c,p,u]of r){if(!Number.isInteger(p)||!Number.isInteger(u)||p<0||u<0||p+u>s.length)throw new Error(`Corrupt asset archive: member '${c}' (offset ${p}, length ${u}) is out of bounds for the ${s.length}-byte body`);a.set(c,s.subarray(p,p+u))}return a}o(Me,"unpackAssetArchive");function $e(e,t){if(!t)return[];switch(t){case"@shopify/polaris-types":case"@shopify/ui-extensions":return qt(e);case"@shopify/ui-extensions-react":return Yt(e);case"@shopify/app-bridge-types":return Wt(e);case"@shopify/hydrogen":return Jt(e);case"@shopify/app-bridge-react":return Ht(e);default:return[]}}o($e,"extractShopifyComponents");function Ht(e){let t=[],n=/(?:export\s+)?declare\s+const\s+(\w+)\s*:\s*React\.(?:ComponentType|ForwardRefExoticComponent)\b/g,i;for(;(i=n.exec(e))!==null;)t.push(i[1]);return[...new Set(t)]}o(Ht,"extractAppBridgeReactComponents");function qt(e){let t=[],n=/declare\s+const\s+tagName\$?\w*\s*=\s*['"]([^'"]+)['"]/g,i=/\[['"]([a-z]+-[a-z-]+)['"]\]\s*:/g,r;for(;(r=n.exec(e))!==null||(r=i.exec(e))!==null;)t.push(r[1]);return[...new Set(t)]}o(qt,"extractWebComponentTagNames");function Wt(e){let t=[],n=e.match(/interface\s+AppBridgeElements\s*\{([^}]+)\}/);if(n){let i=/['"]([a-z]+-[a-z-]+)['"]\s*:/g,r;for(;(r=i.exec(n[1]))!==null;)t.push(r[1])}return t}o(Wt,"extractAppBridgeElements");function Yt(e){let t=new Set,n=/export\s+declare\s+const\s+([A-Z]\w*)\s*:\s*"\1"\s*&/g,i;for(;(i=n.exec(e))!==null;)t.add(i[1]);let r=/export\s+(?!type\b)\{([^}]+)\}/g;for(;(i=r.exec(e))!==null;)for(let s of i[1].split(",")){let a=s.trim();if(!a||/^type\s/.test(a))continue;let c=a.split(/\s+as\s+/),p=c[c.length-1].trim();/^[A-Z]\w*$/.test(p)&&t.add(p)}return[...t]}o(Yt,"extractReactBindingComponentNames");function Jt(e){let t=[],n,i=/declare\s+function\s+(\w+)\s*(?:<[^>]*>)?\s*\([^)]*\)\s*:\s*(?:react_jsx_runtime\.)?JSX\.Element/g;for(;(n=i.exec(e))!==null;)t.push(n[1]);let r=/declare\s+function\s+(\w+)\s*(?:<[^>]*>)?\s*\([^)]*\)\s*:\s*ReturnType<FC>/g;for(;(n=r.exec(e))!==null;)t.push(n[1]);let s=/declare\s+function\s+(\w+)\s*(?:<[^>]*>)?\s*\([^)]*\)\s*:\s*react\.FunctionComponentElement/g;for(;(n=s.exec(e))!==null;)t.push(n[1]);let a=/declare\s+const\s+(\w+)\s*:\s*react\.ForwardRefExoticComponent/g;for(;(n=a.exec(e))!==null;)t.push(n[1]);let c=/declare\s+const\s+(\w+)\s*:\s*react\.Provider/g;for(;(n=c.exec(e))!==null;)t.push(n[1]);return[...new Set(t)]}o(Jt,"extractHydrogenComponents");var X,Z,ee;function Kt(e){let t=m.resolve(e,"..","assets","types");if(A(je(t))||A(m.join(t,"index.json")))return t;if(e.includes("dev-mcp")&&e.includes("dist")&&!e.includes("shopify-dev-tools"))return m.join(e,"data","types");if(e.includes("/dist")||e.includes("\\dist")){let n=e.lastIndexOf(m.sep+"dist");if(n!==-1){let i=e.substring(0,n+5);return m.join(i,"data","types")}return m.join(e,"data","types")}return m.resolve(e,"../data/types")}o(Kt,"resolveTypesDataDirectory");function Y(){if(Z)return Z;let e=m.dirname(Be(import.meta.url));return Z=Kt(e),Z}o(Y,"getTypesDataDirectory");function Xt(){if(X)return X;let e=m.join(Y(),"index.json"),t=V(e);if(t===void 0)throw new Error(`Types index not found at ${e}`);return X=JSON.parse(t),X}o(Xt,"readIndexJson");var W;function je(e){return`${e}.archive.br`}o(je,"typesArchivePathFor");function te(){if(W!==void 0)return W;let e=je(Y());if(!A(e))return W=null,null;let t=Me(G(e)),n=new Set([""]);for(let i of t.keys()){let r=i.split("/");for(let s=1;s<r.length;s++)n.add(r.slice(0,s).join("/"))}return W={files:t,dirs:n},W}o(te,"getArchiveStore");function ne(e){let t=m.relative(Y(),e).split(m.sep).join("/");if(!(t===".."||t.startsWith("../")||m.isAbsolute(t)))return t}o(ne,"archiveRel");function Qe(e){return e.endsWith(".gz")?e.slice(0,-3):e}o(Qe,"logicalRel");function V(e){let t=te();if(t){let n=ne(e);return n===void 0?void 0:t.files.get(Qe(n))?.toString("utf-8")}return tn(e)}o(V,"assetFileContent");function ge(e){let t=te();if(t){let n=ne(e);return n!==void 0&&t.files.has(Qe(n))}return e.endsWith(".gz")?A(e)||A(e.slice(0,-3)):A(e)||A(`${e}.gz`)}o(ge,"assetFileExists");function Se(e){let t=te();if(t){let n=ne(e);return n!==void 0&&t.dirs.has(n)}return A(e)}o(Se,"assetDirExists");function ve(e){let t=te();if(t){let i=ne(e);if(i===void 0||!t.dirs.has(i))return[];let r=i===""?"":`${i}/`,s=new Map;for(let a of t.files.keys()){if(!a.startsWith(r))continue;let c=a.slice(r.length),p=c.indexOf("/");if(p===-1)s.set(c,{name:c,isDirectory:!1,isFile:!0});else{let u=c.slice(0,p);s.has(u)||s.set(u,{name:u,isDirectory:!0,isFile:!1})}}return[...s.values()].sort((a,c)=>a.name.localeCompare(c.name))}let n;try{n=zt(e,{withFileTypes:!0})}catch{return[]}return n.map(i=>({name:i.name,isDirectory:i.isDirectory(),isFile:i.isFile()}))}o(ve,"assetDirEntries");function He(){if(ee)return ee;let e=Y(),t=m.join(e,"..","supported-versions-schema.json");return ee=JSON.parse(G(t,"utf-8")),ee}o(He,"readSupportedVersions");function Zt(e){let t=He()[e];if(t)return t.find(n=>n.latestVersion)?.name}o(Zt,"resolveLatestVersion");function qe(e,t){return e==="hydrogen"||/^\s*(?:import|export)\b[^'"]*['"]@shopify\/ui-extensions-react(?:\/[^'"]*)?['"]/m.test(t)?"react":"preact"}o(qe,"resolveJsxRuntime");function en(e){return(He()[e]??[]).map(t=>t.name)}o(en,"supportedVersionNames");function tn(e){if(e.endsWith(".gz")){if(A(e))return Ge(G(e)).toString("utf-8");let n=e.slice(0,-3);return A(n)?G(n,"utf-8"):void 0}if(A(e))return G(e,"utf-8");let t=e+".gz";if(A(t))return Ge(G(t)).toString("utf-8")}o(tn,"readAssetFile");function nn(e,t){let n=[];if(!Se(e))return n;function i(r,s){for(let a of ve(r)){if(a.name.startsWith(".")||a.name==="node_modules")continue;let c=m.join(r,a.name),p=a.name.endsWith(".gz")?a.name.slice(0,-3):a.name,u=s?`${s}/${p}`:p;if(a.isDirectory)i(c,u);else if(a.isFile){if(!(p.endsWith(".d.ts")||p.endsWith(".ts")&&!p.endsWith(".test.ts")&&!p.endsWith(".spec.ts"))||t&&!t(u))continue;n.push({assetPath:c,relPath:u})}}}return o(i,"walk"),i(e,""),n}o(nn,"walkAssetDts");function rn(e,t,n,i){for(let r of ve(e)){if(!r.isDirectory||r.name.startsWith(".")||r.name==="node_modules")continue;let s=m.join(e,r.name);if(ge(m.join(s,"package.json")))continue;let a;if(ge(m.join(s,"src","index.d.ts"))?a="./src/index.d.ts":ge(m.join(s,"index.d.ts"))&&(a="./index.d.ts"),!a)continue;let c=JSON.stringify({name:`${t}/${r.name}`,types:a}),p=`${r.name}/package.json`;k(n,i,t,p,c)}}o(rn,"synthesizeNestedPackageJsons");function on(e,t,n){return m.join(e,"node_modules",t,n)}o(on,"virtualPathFor");function k(e,t,n,i,r,s){let a=on(t,n,i);if(H(e,a,r),s)for(let c of $e(r,n))s.add(c)}o(k,"addAssetToVirtualEnv");var sn={"customer-account":["checkout"]};function ye(e){let t=[e,...sn[e]??[]],n=new Set(t.map(s=>`build/ts/surfaces/${s}.d.ts`)),i=t.map(s=>`build/ts/surfaces/${s}/`),r="build/ts/";return s=>!!(n.has(s)||i.some(a=>s.startsWith(a))||s.startsWith(r)&&s.endsWith(".d.ts")&&!s.slice(r.length).includes("/"))}o(ye,"surfaceMatcher");function B(e,t,n,i,r,s){for(let{assetPath:a,relPath:c}of nn(e,s)){let p=V(a);p&&k(n,i,t,c,p,r)}}o(B,"loadDtsTree");function an(e){let t=[],n=/import\s+['"]\.\.\/components\/(\w+)\.d\.ts['"]/g,i;for(;(i=n.exec(e))!==null;)t.push(i[1]);return t}o(an,"extractComponentImports");function cn(e){let t=new Set;for(let n of ve(e)){if(!n.isFile)continue;let i=n.name.endsWith(".gz")?n.name.slice(0,-3):n.name;i.endsWith(".d.ts")&&t.add(i.slice(0,-5))}return[...t].sort()}o(cn,"listAvailableTargets");function pn(e,t,n,i,r,s,a){let c=`build/ts/surfaces/${r}`,p=m.join(e,c,"targets"),u=`${c}/targets/${s}.d.ts`,x=V(m.join(e,u));if(!x)return Se(p)?{hasTargetSubpath:!1,invalidTarget:{target:s,surface:r,supported:cn(p)}}:(B(e,t,n,i,a,ye(r)),{hasTargetSubpath:!1});let S=`${c}.d.ts`,I=V(m.join(e,S));I&&k(n,i,t,S,I,a),k(n,i,t,u,x,a);let E=`${c}/components`;for(let P of an(x)){let l=`${E}/${P}.d.ts`,v=V(m.join(e,l));v&&k(n,i,t,l,v,a)}for(let P of["shared.d.ts","components-shared.d.ts"]){let l=`${E}/${P}`,v=V(m.join(e,l));v&&k(n,i,t,l,v,a)}for(let P of["api","types","event"]){let l=`${c}/${P}`;B(e,t,n,i,a,v=>v===l||v.startsWith(`${l}/`))}for(let P of["extension-targets.d.ts","globals.d.ts","api.d.ts","extension.d.ts"]){let l=`${c}/${P}`,v=V(m.join(e,l));v&&k(n,i,t,l,v,a)}return B(e,t,n,i,a,P=>{if(!P.startsWith("build/ts/"))return!1;let l=P.slice(9);return l.endsWith(".d.ts")&&!l.includes("/")}),{hasTargetSubpath:!0}}o(pn,"loadTargetSpecificComponents");async function We(e,t,n,i){let r=[],s=[],a=new Set,c=!1,p,u=Q[e],x=u?.versioned===!0,S=u?.extensionSurfaceName,I=Y(),E=Xt(),P=E[e],l;if(x){if(t){let y=en(e);if(y.length>0&&!y.includes(t))return{missingPackages:r,searchedPaths:s,shopifyWebComponents:a,applicablePackageNames:[],hasTargetSubpath:c,unsupportedVersion:{requested:t,supported:y}}}l=t??Zt(e)}else l="_";let v=x?l:void 0,C=(u?.publicPackages??[]).filter(y=>le(y,v)),N=C.map(K),U=new Set((u?.publicPackages??[]).filter(y=>!le(y,v)).map(K)),$=(l?P?.[l]??[]:[]).filter(y=>!U.has(y.package));if($.length===0&&C.length>0)for(let y of C){let L=K(y);r.push(L),s.push(m.join(I,L,l??"<unknown-version>"))}let j=E._always_loaded??[],T=[...$,...j],D=n.servicesHost.getCurrentDirectory();for(let{package:y,version:L}of T){let R=m.join(I,y,L);if(!Se(R)){r.push(y),s.push(R);continue}let Ee=V(m.join(R,"package.json"));if(Ee&&k(n,D,y,"package.json",Ee),rn(R,y,n,D),y==="@shopify/ui-extensions"&&S)if(i){let pe=pn(R,y,n,D,S,i,a);c=pe.hasTargetSubpath,pe.invalidTarget&&(p=pe.invalidTarget)}else B(R,y,n,D,a,ye(S));else y==="@shopify/ui-extensions-react"&&S?B(R,y,n,D,a,ye(S)):B(R,y,n,D,a);y==="@shopify/app-bridge-types"&&ln(n)}return{missingPackages:r,searchedPaths:s,shopifyWebComponents:a,applicablePackageNames:N,hasTargetSubpath:c,invalidTarget:p}}o(We,"loadTypesIntoTSEnv");function ln(e){let t=Be(import.meta.url),n=m.resolve(t,"../.."),i=m.join(n,"__shims__","app-bridge-preact-jsx.d.ts"),r=['import type { AppBridgeElements } from "@shopify/app-bridge-types/dist/shopify";','declare module "preact" {'," namespace createElement.JSX {"," interface IntrinsicElements extends AppBridgeElements {}"," }","}",""].join(`
`);H(e,i,r)}o(ln,"addAppBridgePreactJSXShim");var un=["polaris-admin-extensions","polaris-checkout-extensions","polaris-customer-account-extensions","pos-ui"],dn=["polaris-app-home"];function fn(e){return dn.includes(e)}o(fn,"supportsRawHtmlComponentValidation");async function Ye(e){try{let{code:t,apiName:n,version:i,extensionTarget:r,language:s}=e;if(!n)return{result:"failed",resultDetail:"Validation failed: Invalid input: apiName is required"};if(!t)return{result:"failed",resultDetail:"Validation failed: Invalid input: code is required"};let a=Q[n];if(!a)return{result:"failed",resultDetail:`Validation failed: Unknown API: ${n}`};if(s==="html"&&!fn(n))return{result:"failed",resultDetail:"Validation failed: HTML validation mode is only supported for API 'polaris-app-home'. Other UI framework APIs must use JSX/TSX code blocks."};if(a.extensionSurfaceName&&!r)return{result:"failed",resultDetail:`Extension target is required for API: ${n}. Look up the list of available extension targets in the API documentation.`};if(!a.publicPackages||a.publicPackages.length===0)return{result:"failed",resultDetail:`Validation failed: No packages configured for API: ${n}`};let c=Re(n,qe(n,t)),{missingPackages:p,searchedPaths:u,shopifyWebComponents:x,unsupportedVersion:S,invalidTarget:I,applicablePackageNames:E,hasTargetSubpath:P}=await We(n,i,c,r),l=E;if(S)return{result:"failed",resultDetail:`Validation failed: Version '${S.requested}' is not supported for API '${n}'. Supported versions: ${S.supported.join(", ")}`};if(I){let T=I.supported.length?`Supported extension targets for surface '${I.surface}'${i?` at version '${i}'`:""}: ${I.supported.join(", ")}`:`No extension targets are bundled for surface '${I.surface}'${i?` at version '${i}'`:""}.`;return{result:"failed",resultDetail:`Validation failed: Unknown extension target '${I.target}' for API '${n}'. ${T}`}}if(p.length>0){let T=p.map(L=>` - ${L}`).join(`
`),D=`npm install -D ${p.join(" ")}`,y=u.map(L=>` - ${L}`).join(`
`);return{result:"failed",resultDetail:`Missing required dev dependencies:
${T}
Searched paths:
${y}
Please install them using:
${D}`}}let v=`validation-${Date.now()}.tsx`,C=P?l:l.filter(T=>!T.includes("@shopify/ui-extensions")),N=De(t,C,P?r:void 0);H(c,v,N);let U=c.languageService.getSemanticDiagnostics(v),M=un.includes(n),{validations:$,genericErrors:j}=we(N,U,x,{enforceShopifyOnlyComponents:M,language:s});return Ue($,j)}catch(t){return{result:"failed",resultDetail:`Validation failed: ${t instanceof Error?t.message:String(t)}`}}}o(Ye,"validateComponentCodeBlock");import{randomUUID as mn}from"crypto";function Ie(e){return e.some(t=>t.result==="failed")}o(Ie,"hasFailedValidation");function ie(e){return e.map(t=>({artifactId:t.artifactId||`artifact-${mn()}`,revision:t.revision??1}))}o(ie,"extractArtifactsFromItems");function re(e,t){return e.map((n,i)=>{let r=t[i];return r?{...n,artifactId:r.artifactId,artifactRevision:r.revision}:n})}o(re,"attachArtifactIds");function oe(e,t="Items"){let n=Ie(e),i=e.some(a=>a.result==="inform"),r;n?r="\u274C INVALID":i?r="\u26A0\uFE0F VALID (with warnings)":r="\u2705 VALID";let s=`## Validation Summary
`;return s+=`**Overall Status:** ${r}
`,s+=`**Total ${t}:** ${e.length}
`,s+=`## Detailed Results
`,e.forEach((a,c)=>{let p;a.result==="success"?p="\u2705":a.result==="inform"?p="\u26A0\uFE0F":p="\u274C",s+=`### ${t.slice(0,-1)} ${c+1}
`,a.artifactId&&(s+=`**Artifact ID:** ${a.artifactId}`,a.artifactRevision&&(s+=`
**Revision:** ${a.artifactRevision}`),s+=`
*Use same ID & increment revision when retrying on an improvement of this artifact*
`),s+=`**Status:** ${p} ${a.result.toUpperCase()}
`,s+=`**Details:** ${a.resultDetail}
`}),s}o(oe,"formatValidationResult");function Je(e){return Object.fromEntries(Object.entries(e).map(([t,n])=>{let{description:i,valueName:r,choices:s,...a}=n;return[t,a]}))}o(Je,"toParseArgsOptions");var hn={model:{type:"string",valueName:"name",description:"Agent model name"},"client-name":{type:"string",valueName:"name",description:"Agent client name"},"client-version":{type:"string",valueName:"version",description:"Agent client version"}},gn={"user-prompt-base64":{type:"string",valueName:"base64",description:"Base64-encoded triggering prompt"},"session-id":{type:"string",valueName:"id",description:"Agent session identifier"},"tool-use-id":{type:"string",valueName:"id",description:"Agent tool-use identifier"}},ze={"artifact-id":{type:"string",valueName:"id",description:"Stable artifact identifier"},revision:{type:"string",valueName:"number",description:"Positive artifact revision"},...hn,...gn,json:{type:"boolean",description:"Emit machine-readable JSON"}},Ke={help:{type:"boolean",short:"h",description:"Show this help"}};function Xe(e,t){let n=Object.entries(t).map(([r,s])=>{let a=s.type==="string"?s.valueName||s.choices?.join("|")||"value":void 0,c=`--${r}${a?` <${a}>`:""}`;return[s.short?`-${s.short}, ${c}`:c,s.description]}),i=Math.max(...n.map(([r])=>r.length));return["Usage:",...e.map(r=>` ${r}`),"","Options:",...n.map(([r,s])=>` ${r.padEnd(i)} ${s}`)].join(`
`)}o(Xe,"formatCliHelp");function Ze(){let e=[process.env.CLAUDE_SESSION_ID,process.env.CLAUDE_CODE_SESSION_ID,process.env.CURSOR_SESSION_ID,process.env.COPILOT_SESSION_ID];for(let t of e)if(typeof t=="string"&&t.length>0)return t}o(Ze,"readHostSessionId");var yn="https://shopify.dev/",Sn="https://shopify-dev.shop.dev/";function et(e){return`https://shopify-dev-staging${e}.shopifycloud.com/`}o(et,"stagingHost");function Pe(e){let t=e?.env??process.env,n=t.SHOPIFY_DEV_STAGING_SERVER_NUMBER?.trim();if(n){if(!/^\d+$/.test(n))throw new Error(`SHOPIFY_DEV_STAGING_SERVER_NUMBER must be a positive integer; got: "${n}"`);let r=Number(n);if(!Number.isSafeInteger(r)||r<=0)throw new Error(`SHOPIFY_DEV_STAGING_SERVER_NUMBER must be a positive integer; got: "${n}"`);let s=t.MINERVA_TOKEN;if(!s){let a=et(r).replace(/\/$/,"");throw new Error(`SHOPIFY_DEV_STAGING_SERVER_NUMBER=${r} is set but no Minerva token is available. Staging servers are behind Minerva. Get a token via:
export MINERVA_TOKEN=$(devx minerva-auth --client-id 0oa1bphetnkOusboI0x8 --audience ${a})`)}return{url:et(r),headers:{Cookie:`MINERVA_TOKEN=${s}`}}}let i=t.SHOPIFY_DEV_INSTRUMENTATION_URL?.trim();return i&&e?.uri?.startsWith("/mcp/usage")?{url:i,headers:{}}:t.DEV&&t.DEV!=="false"?{url:Sn,headers:{}}:{url:yn,headers:{}}}o(Pe,"resolveShopifyDevBaseUrl");async function tt(e,t){let n,i={};if(e.startsWith("http://")||e.startsWith("https://"))n=new URL(e);else{let s=Pe({uri:e});n=new URL(e,s.url),i=s.headers}t?.parameters&&Object.entries(t.parameters).forEach(([s,a])=>{n.searchParams.append(s,a)});let r=await fetch(n.toString(),{method:t?.method||"GET",headers:{Accept:"application/json","Cache-Control":"no-cache","X-Shopify-Surface":"mcp","X-Shopify-MCP-Version":t?.instrumentation?.packageVersion||"","X-Shopify-Timestamp":t?.instrumentation?.timestamp||"",...i,...t?.headers},...t?.body&&{body:t.body}});if(!r.ok){let s;try{s=await r.text()}catch{}throw new Error(s?`HTTP ${r.status}: ${s}`:`HTTP error! status: ${r.status}`)}return await r.text()}o(tt,"shopifyDevFetch");import{readFileSync as vn,statSync as In}from"node:fs";import{homedir as Pn}from"node:os";import{join as J}from"node:path";var se="shopify-ai-toolkit",ae="opt-out",bn="SHOPIFY_AI_TOOLKIT_OPT_OUT_FILE",xn=new Set(["false","0","no","off"]);function nt(e){return{env:e?.env??process.env,platform:e?.platform??process.platform,homeDir:e&&"homeDir"in e?e.homeDir:_n(e?.env??process.env)}}o(nt,"resolveContext");function _n(e){let t=e.HOME?.trim()||e.USERPROFILE?.trim();if(t)return t;try{return Pn()||void 0}catch{return}}o(_n,"resolveHomeDir");function En(e){let{env:t,platform:n,homeDir:i}=nt(e),r=[],s=t[bn]?.trim();s&&r.push(s);let a=t.XDG_CONFIG_HOME?.trim();if(a&&r.push(J(a,se,ae)),i&&(r.push(J(i,".config",se,ae)),n==="darwin"&&r.push(J(i,"Library","Application Support",se,ae))),n==="win32"){let c=t.APPDATA?.trim()||(i?J(i,"AppData","Roaming"):void 0);c&&r.push(J(c,se,ae))}return[...new Set(r.filter(c=>!!c))]}o(En,"telemetryOptOutFileCandidates");function An(e){if(e.OPT_OUT_INSTRUMENTATION?.trim().toLowerCase()==="true")return!0;let t=e.DO_NOT_TRACK?.trim().toLowerCase();return t==="1"||t==="true"}o(An,"envSaysOptOut");function Cn(e){try{if(!In(e).isFile())return!1}catch{return!1}try{let t=vn(e,"utf8").trim().toLowerCase();return!xn.has(t)}catch{return!0}}o(Cn,"fileSaysOptOut");function it(e){try{let t=nt(e);return An(t.env)?!0:En(t).some(Cn)}catch{return!1}}o(it,"isTelemetryOptedOut");function rt(e){return{...e?.api&&{api:e.api},...e?.api_version&&{api_version:e.api_version},...e?.resolve_api_version&&{resolve_api_version:e.resolve_api_version}}}o(rt,"nonEmptyUsageMetadata");function Tn(){return it()}o(Tn,"isInstrumentationDisabled");function ot(e){if(!(typeof e!="string"||e.length===0))try{let t=Buffer.from(e,"base64").toString("utf8");return t.length>0?t:void 0}catch{return}}o(ot,"decodeUserPrompt");async function be(e,t,n,i){if(Tn())return;let{model:r,clientName:s,clientVersion:a,user_prompt:c,sessionId:p,toolUseId:u,...x}=n??{},S=typeof p=="string"&&p.length>0?p:Ze(),I=typeof c=="string"&&c.length>0?c.slice(0,2e3):void 0;try{let E={"Content-Type":"application/json","X-Shopify-Surface":"skills"};s&&(E["X-Shopify-Client-Name"]=String(s)),a&&(E["X-Shopify-Client-Version"]=String(a)),r&&(E["X-Shopify-Client-Model"]=String(r));let P=JSON.stringify({tool:e,parameters:{skill:"shopify-pos-ui",skillVersion:"1.14.1",...I!==void 0&&{user_prompt:I},...S!==void 0&&{sessionId:S},...typeof u=="string"&&u.length>0&&{toolUseId:u},...x},result:t,...rt(i)});if(process.env.SKILL_TELEMETRY_TEST_MODE==="1"){let{url:l}=Pe({uri:"/mcp/usage"}),v=new URL("/mcp/usage",l).toString();process.stderr.write([`[TEST_TELEMETRY_ENDPOINT] ${v}`,...Object.entries(E).map(([C,N])=>`[TEST_TELEMETRY_HEADER] ${C}: ${N}`),`[TEST_TELEMETRY_BODY] ${P}`,""].join(`
`));return}await tt("/mcp/usage",{method:"POST",headers:E,body:P,instrumentation:{packageVersion:"1.14.1",timestamp:new Date().toISOString()}})}catch{}}o(be,"reportValidation");var xe=["html","tsx","jsx"],st={code:{type:"string",short:"c",valueName:"code",description:"Component source string"},file:{type:"string",short:"f",valueName:"path",description:"Read component source from a file"},target:{type:"string",short:"t",valueName:"target",description:"Extension target"},language:{type:"string",choices:xe,description:"Source language"},api:{type:"string",short:"a",valueName:"name",description:"API for source-mode validation"},version:{type:"string",valueName:"YYYY-MM|unstable",description:"Shopify API version"},...ze,...Ke},Dn=Xe(["scripts/validate.mjs --code '<tsx-or-html>' [options]","scripts/validate.mjs --file ./component.tsx [options]"],st),{values:h}=Nn({options:Je(st)});h.help&&(console.log(Dn),process.exit(0));var at=ot(h["user-prompt-base64"]),F,ct="pos-ui";ct||(console.error("Required: --api <name> when running outside the bundled per-skill build."),process.exit(1));var w=ct;function _e(e){if(!e)return;let t=Number.parseInt(e,10);return Number.isFinite(t)&&t>0?t:void 0}o(_e,"parseRevision");function ce(e){let[t]=ie([{artifactId:h["artifact-id"],revision:_e(h.revision)}]),n=re([{result:"failed",resultDetail:e,componentValidationErrors:[],genericErrors:[]}],[t]);console.log(h.json?JSON.stringify({success:!1,responses:n,resolvedVersion:F}):oe(n,"Components")),process.exit(1)}o(ce,"emitError");h.language&&!xe.includes(h.language)&&ce(`Invalid --language "${h.language}". Valid values: ${xe.join(", ")}.`);var z=h.code;if(h.file)try{z=On(h.file,"utf-8")}catch{ce(`Failed to read file: ${h.file}`)}z||(console.error("Either --code or --file must be provided."),process.exit(1));async function Ln(){let[e]=ie([{artifactId:h["artifact-id"],revision:_e(h.revision)}]),t;if(ue(w).length>0){let p=Ne(w,h.version);p.ok||ce(h.version?`Version '${h.version}' is not available for API '${w}'. Available versions for '${w}': ${p.supportedVersions.join(", ")}.`:`No supported versions available for API '${w}'.`),F=p.version,t=p.source}else h.version&&ce(`API '${w}' does not support version selection; remove --version.`);let i=await Ye({code:z,apiName:w,version:F,extensionTarget:h.target,language:h.language}),r=re([{result:i.result,resultDetail:i.resultDetail,componentValidationErrors:i.componentValidationErrors??[],genericErrors:i.genericErrors??[],unvalidatedComponents:i.unvalidatedComponents,validatedComponents:i.validatedComponents}],[e]),s=t==="default"&&F?`
Version validated against is ${F}.`:"",a=oe(r,"Components")+s,c=i.result==="success";console.log(h.json?JSON.stringify({success:c,responses:r,resolvedVersion:F}):a),await be("validate_components",a,{model:h.model,clientName:h["client-name"],clientVersion:h["client-version"],user_prompt:at,sessionId:h["session-id"],toolUseId:h["tool-use-id"],code:z,target:h.target,artifactId:e.artifactId,revision:e.revision}),process.exit(c?0:1)}o(Ln,"main");Ln().catch(async e=>{let[t]=ie([{artifactId:h["artifact-id"],revision:_e(h.revision)}]),n=re([{result:"failed",resultDetail:e instanceof Error?e.message:String(e),componentValidationErrors:[],genericErrors:[]}],[t]),i=oe(n,"Components");console.log(h.json?JSON.stringify({success:!1,responses:n,resolvedVersion:F}):i),await be("validate_components",i,{model:h.model,clientName:h["client-name"],clientVersion:h["client-version"],user_prompt:at,sessionId:h["session-id"],toolUseId:h["tool-use-id"],code:z,target:h.target,artifactId:t.artifactId,revision:t.revision}),process.exit(1)});
SHA-256: 95f38d4353690da2c533c7942381532e266e9d73e49cd71e8fa30412364a6dc0