Aparência
Contrato de importação e execução
O fluxo profissional usa o mesmo ThemeStorage, validador e metadados de revisões. O ZIP deve conter os arquivos diretamente na raiz, sem pasta envolvente. Aceita ZIP clássico sem criptografia, com entradas armazenadas ou Deflate; não aceita ZIP64, arquivos divididos, links, caminhos duplicados, absolutos ou traversal. Limites: 30 MiB de ZIP, 60 MiB descompactados, 12 MiB por arquivo e 500 entradas, incluindo diretórios. CRC, cabeçalhos e limites de expansão são verificados em memória antes de qualquer gravação; nenhum arquivo é extraído no filesystem.
A API de importação recebe application/zip, com expectedThemeRevision e baseThemeRevision na query. A identidade da loja vem exclusivamente da autenticação. JSON, Liquid, referências e fontes comerciais passam pelas mesmas validações do sistema. Templates e components ainda não utilizados também são validados e preservados na leitura, exportação e publicação.
Nesta etapa, o JavaScript do pacote importado deve ser idêntico ao da revisão-base. O layout pode manter a chamada canônica <script src="{{ theme.assets.js }}" defer></script>. CSS, templates, sections, components, imagens e estrutura Liquid podem ser editados externamente. Essa é uma restrição de execução, sem opções visuais ou schemas de layout.
A política de execução tem três camadas compartilhadas:
- A importação inspeciona HTML/SVG com o parser de
sanitize-html, incluindo entidades em URLs e namespaces SVG. SVG exige UTF-8 válido, sem bytes nulos. Também avalia expressões Liquid constantes em todos os ramos, inclusiveecho, com limites de tempo/memória. Não aceita scripts, atributos de eventos, documentos embutidos, URLs executáveis, XML com entidades/folhas externas ou animação SVG que possa alterar atributos executáveis. - O
ThemeEngineinspeciona o documento completo depois de resolver Liquid, componentes, concatenações e dados. Uma condição dependente de produto ou página não é considerada segura por não ter sido visitada na importação: cada renderização real passa pela verificação, tanto em preview quanto na loja publicada. Conteúdo executável causa erro antes de enviar HTML; não é removido silenciosamente. HTML legítimo viaraw, SVG estático, classes, estilos e hooks permanecem disponíveis. - O navegador recebe CSP com nonce aleatório por documento,
script-src-attr 'none',object-src 'none'ebase-uri 'none', semunsafe-inline/unsafe-eval. A política HTTP preservaframe-ancestorsda preview; uma meta anterior a todo o conteúdo do tema protege também consumidores do HTML fora dessas rotas. O nonce não integra o contexto Liquid. Somente a plataforma o aplica ao entrypoint original do tema, ao runtime e à ponte da preview.strict-dynamicpermite scripts carregados pelo runtime confiável, como o SDK de pagamento; scripts declarados pelo tema não herdam essa autorização. HTML usaprivate, no-store.
A verificação estática não procura prever todos os valores comerciais possíveis. Uma expressão dependente de dados pode ser aceita no rascunho e recusada quando produzir conteúdo executável. Essa recusa nunca ativa a revisão nem retorna o HTML inseguro. Pacotes e rascunhos seguem a publicação manual existente.
O contrato do navegador segue a especificação CSP. A homologação de integrações e navegadores deve conferir essa política; não se deve relaxá-la com unsafe-inline ou autorizar automaticamente scripts encontrados no HTML.