<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsd:schema
        xmlns="http://www.demandware.com/xml/impex/storefronts/2026-02-23"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.demandware.com/xml/impex/storefronts/2026-02-23"
        elementFormDefault="qualified"
        attributeFormDefault="unqualified">

    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>

    <!-- top-level element -->
    <xsd:element name="storefronts">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="storefront" type="complexType.Storefront" minOccurs="0" maxOccurs="1"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <!-- fake top level elements to allow JAXB subsection parsing -->
    <xsd:element name="storefront" type="complexType.Storefront"/>

    <!-- Storefront -->
    <xsd:complexType name="complexType.Storefront" mixed="false">
        <xsd:sequence>
            <xsd:element name="ecom-site" type="simpleType.Generic.String.48" minOccurs="0" maxOccurs="1"/>
            <!-- Accepted values (case-insensitive on import): composable, pwa_kit. Export emits lowercase. -->
            <xsd:element name="storefront-type" type="simpleType.Generic.String.32" minOccurs="1" maxOccurs="1"/>
            <!--
                Deprecated. Retained solely for backward compatibility: storefront import validates incoming
                files against this schema (StorefrontImpexUnit.setSchema), so pre-cleanup export files that still
                carry <storefront-status> must remain declared here to pass validation. Optional and ignored on
                import; no longer emitted on export. Do not add new consumers.
            -->
            <xsd:element name="storefront-status" type="simpleType.Generic.String.32" minOccurs="0" maxOccurs="1"/>
            <xsd:element name="associated-sites" type="complexType.AssociatedSites" minOccurs="0" maxOccurs="1"/>
            <!--
                Optional. For interactive Business Manager (session-based) imports the importer's authenticated
                session identity is authoritative and this value is ignored. It supplies the acting identity only for
                server-to-server (client-credentials) imports, which have no session; such imports are rejected if it
                is absent or unauthorized. Retained and declared here because storefront import validates incoming
                files against this schema (StorefrontImpexUnit.setSchema).
            -->
            <xsd:element name="user-id" type="simpleType.Generic.String.48" minOccurs="0" maxOccurs="1"/>
            <xsd:element name="org-slug" type="simpleType.Generic.String.64" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="mrt-site" type="simpleType.Generic.String.64" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="scm-repo" type="simpleType.Generic.String.512" minOccurs="0" maxOccurs="1"/>
            <xsd:element name="scm-target" type="simpleType.Generic.String.64" minOccurs="0" maxOccurs="1"/>
            <!--
                Deprecated (W-23546554). Retained solely for backward compatibility: storefront import validates
                incoming files against this schema (StorefrontImpexUnit.setSchema), so pre-cleanup export files that
                still carry <github-app-installation> must remain declared here to pass validation. Optional and
                ignored on import; no longer emitted on export. Carrying the source realm's GitHub App installation
                onto a target would enable a cross-realm credential-leak (spike W-23298074 3.3), so it is dropped on
                import and the GitHub App must be reconnected manually. Do not add new consumers. This element will be
                removed in a future schema version once all pre-cleanup export files carrying it have cycled out.
            -->
            <xsd:element name="github-app-installation" type="complexType.GitHubAppInstallation" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="storefront-name" type="simpleType.Generic.NonEmptyString.64" use="required"/>
        <!--
            Deprecated. Retained solely for backward compatibility: pre-cleanup delta-export files could carry
            mode="delete". Optional and ignored on import (the import delete decision is driven by the framework
            import mode, not this attribute); no longer emitted on export. Do not add new consumers.
        -->
        <xsd:attribute name="mode" type="simpleType.Generic.String.32"/>
    </xsd:complexType>

    <!-- GitHub App Installation. Deprecated (W-23546554): declared only so legacy files that still carry
         <github-app-installation> validate on import. Ignored on import, never exported. Do not add new consumers. -->
    <xsd:complexType name="complexType.GitHubAppInstallation" mixed="false">
        <xsd:sequence>
            <xsd:element name="app-id" type="simpleType.Generic.String.64" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="installation-id" type="simpleType.Generic.String.64" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="target-id" type="simpleType.Generic.String.64" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="target-name" type="simpleType.Generic.String.256" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="target-url" type="simpleType.Generic.String.512" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="target-type" type="simpleType.Generic.String.32" minOccurs="1" maxOccurs="1"/>
        </xsd:sequence>
    </xsd:complexType>

    <!-- Associated Sites -->
    <xsd:complexType name="complexType.AssociatedSites" mixed="false">
        <xsd:sequence>
            <xsd:element name="ecom-site" type="simpleType.Generic.NonEmptyString.48" minOccurs="0" maxOccurs="100"/>
        </xsd:sequence>
    </xsd:complexType>

    <!-- simple generic types -->
    <xsd:simpleType name="simpleType.Generic.String">
        <xsd:restriction base="xsd:string"/>
    </xsd:simpleType>

    <xsd:simpleType name="simpleType.Generic.String.32">
        <xsd:restriction base="simpleType.Generic.String">
            <xsd:minLength value="0"/>
            <xsd:maxLength value="32"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="simpleType.Generic.String.48">
        <xsd:restriction base="simpleType.Generic.String">
            <xsd:minLength value="0"/>
            <xsd:maxLength value="48"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="simpleType.Generic.String.64">
        <xsd:restriction base="simpleType.Generic.String">
            <xsd:minLength value="0"/>
            <xsd:maxLength value="64"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="simpleType.Generic.String.256">
        <xsd:restriction base="simpleType.Generic.String">
            <xsd:minLength value="0"/>
            <xsd:maxLength value="256"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="simpleType.Generic.String.512">
        <xsd:restriction base="simpleType.Generic.String">
            <xsd:minLength value="0"/>
            <xsd:maxLength value="512"/>
        </xsd:restriction>
    </xsd:simpleType>

    <!--  Nonempty string with no leading or trailing whitespace -->
    <xsd:simpleType name="simpleType.Generic.NonEmptyString.48">
        <xsd:restriction base="simpleType.Generic.String">
            <xsd:minLength value="1"/>
            <xsd:maxLength value="48"/>
            <xsd:pattern value="\S|(\S(.*)\S)"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="simpleType.Generic.NonEmptyString.64">
        <xsd:restriction base="simpleType.Generic.String">
            <xsd:minLength value="1"/>
            <xsd:maxLength value="64"/>
            <xsd:pattern value="\S|(\S(.*)\S)"/>
        </xsd:restriction>
    </xsd:simpleType>

</xsd:schema>
