Lanjutan kamus dari 66 Theme Check Referensi Aturan A–L. Format sama: nama aturan seperti di output Theme Check, severity default, apa dan kenapa, contoh gagal dan lolos, dan saran nonaktif. Bagian ini banyak berisi aturan yang lahir bareng LiquidDoc dan theme block, jadi kalau belum, baca dulu 07 Tools Lokal VS Code Extension, Prettier, LiquidDoc dan 29 Theme Blocks Mendalam.
MatchingSchemaTranslations (1.x saja)
Versi 1.x buat schema locale file (*.schema.json). Di 2.x digabung ke MatchingTranslations yang ngecek keduanya.
MatchingTranslations
Error, auto-correct. Ngenalin terjemahan yang hilang atau berlebih di locale file dibanding file default (33 Locales dan Translasi). Gagal: es.json kosong (hilang greeting dan goodbye), fr.json punya goodby (typo) yang gak ada di default. Lolos: semua file punya kunci yang sama. Pengecualian penting: kunci pluralisasi (one, other, zero, few, many, two) boleh beda antar bahasa, karena tiap bahasa punya bentuk jamak sendiri:
{
"greeting": "Bonjour, monde",
"goodbye": "Au revoir, monde",
"pluralized_greeting": {
"zero": "Je suis seul :(",
"few": "Salut, groupe!"
}
}--auto-correct nambahin kunci yang hilang dan ngehapus kunci berlebih di semua locale non-default. Nonaktifin gak disarankan karena bikin pengalaman terjemahan gak konsisten.
MissingAsset
Error. Semua file yang dirujuk asset_url harus ada di assets/.
❌ gagal, picture-does-not-exist.png gak ada
{% assign logo_url = 'picture-does-not-exist.png' | asset_url %}
<img src="{{ logo_url }}" alt="Logo" />Nonaktifin gak disarankan.
MissingContentForArguments
Warning. Waktu ngerender static block, semua argumen wajib (tanpa []) di LiquidDoc block itu harus dikirim. Dengan block yang punya @param {string} some_str (wajib) dan @param {number} [some_num] (opsional):
❌ gagal
{% content_for 'block', type: 'example-snippet', some_num: 1 %}✅ lolos (opsional boleh dilewatkan)
{% content_for 'block', type: 'example-snippet', some_str: 'text' %}Nonaktifin gak disarankan.
MissingEnableComment (1.x saja)
Kalau theme-check-disable dipakai di tengah file, harus ada theme-check-enable pasangannya, biar Theme Check gak “mati” buat sisa file tanpa sengaja. Di 2.x gak ada aturannya, tapi tetap praktik yang baik.
MissingRenderSnippetArguments
Warning. Sama dengan MissingContentForArguments buat render dan LiquidDoc snippet.
❌ gagal
{% render 'example-snippet', some_num: 1 %}✅ lolos
{% render 'example-snippet', some_str: 'text' %}MissingRequiredTemplateFiles (1.x saja)
Mastiin semua template yang diwajibkan Theme Store ada. Auto-correct bikin template JSON kosong. Daftar template wajibnya di 70 Theme Store Gambaran dan Requirements.
MissingTemplate
Error, auto-correct. Sumber daya yang dirujuk render, section, atau include gak ada.
❌ gagal
{% render 'snippet-that-does-not-exist' %}Dua opsi: ignore (daftar file yang semua pelanggaran di dalamnya diabaikan, misalnya templates/index.liquid) dan ignore_missing (pola target yang diabaikan di semua file, misalnya snippets/icon-* buat ikon yang dibikin dinamis):
MissingTemplate:
ignore:
- templates/index.liquid
ignore_missing:
- snippets/icon-*--auto-correct bikin file Liquid kosong di snippets/ (buat render/include) atau sections/ (buat section). Nonaktifin gak disarankan.
NestedSnippet (1.x saja)
Ngelaporin render/include yang bersarang lebih dari max_nesting_level (default 2): index → one → two → three → four gagal. Dihapus di 2.x, tapi alasannya masih valid dan dibahas di 58 Performance Liquid > render Bersarang.
OrphanedSnippet
Warning. Snippet yang ada tapi gak pernah dirujuk di theme. File mati yang nambah ukuran theme dan bikin bingung. Aman dinonaktifin (misalnya theme app extension yang snippet-nya dipanggil app). Pengganti UnusedSnippet 1.x, tapi tanpa auto-correct (1.x-nya ngehapus file, yang berbahaya).
PaginationSize
Warning. Ukuran paginate dalam rentang performan (58 Performance Liquid > Batas Paginasi). Opsi min_size (default 1) dan max_size (default 50 di halaman aturan, 250 di konfigurasi recommended terbaru, sesuaikan sendiri).
❌ gagal
{% paginate collection.products by 999 %}✅ lolos
{% paginate collection.products by 12 %}Aman dinonaktifin.
ParserBlockingScript
Error. Tag <script src> tanpa defer atau async ngeblokir konstruksi dan render DOM, bikin kemacetan jaringan, ngacaukan prioritas resource (61 Performance JavaScript dan INP > defer dan async). Theme gak boleh pakai script parser-blocking karena JavaScript harusnya progressive enhancement. Aturan umum: defer kalau urutan penting, async kalau gak. Cuma script dengan src yang di-lint, script inline gak.
❌ gagal, jQuery sinkron karena script inline bergantung padanya
{{ 'theme.js' | asset_url | script_tag }}
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<button id="thing">Click me!</button>
<script>
$('#thing').click(() => {
alert('Oh. Hi Mark!');
});
</script>✅ lolos, defer + DOMContentLoaded (jQuery dijamin siap waktu event itu nembak)
<script src="{{ 'theme.js' | asset_url }}" defer></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js" defer></script>
<button id="thing">Click me!</button>
<script>
document.addEventListener('DOMContentLoaded', () => {
$('#thing').click(() => {
alert('Oh. Hi Mark!');
});
});
</script>Perhatiin script_tag di contoh gagal: filter itu gak ndukung defer, jadi tulis tag-nya manual. Kalau gak terhindarkan, nonaktifin per instance lewat komentar. Alias 1.x: ParserBlockingJavaScript, ParserBlockingScriptTag.
RemoteAsset
Warning. Ngelarang aset dari domain pihak ketiga (64 Performance Navigasi dan Loading > Semua Aset dari CDN Shopify): banyak koneksi bersaing, prioritas kacau. Termasuk <img> yang gak pakai image_url.
❌ gagal
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" defer></script>
{{ "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" | stylesheet_tag }}
<img src="https://example.com/heart.png" alt="" />✅ lolos, semua dari satu koneksi
<script src="{{ 'theme.js' | asset_url }}" defer></script>
{{ 'bootstrap.min.css' | asset_url | stylesheet_tag }}
<img src="{{ image | image_url: width: 500 }}" alt="" />Pertimbangkan nonaktifin kalau konten remote-nya sangat dinamis. Alias 1.x: AssetUrlFilters.
RequiredDirectories (1.x saja)
Mastiin direktori wajib theme ada, auto-correct bikin yang hilang. Aman dinonaktifin, nonaktif default di app build.
RequiredLayoutThemeObject
Error, auto-correct. theme.liquid harus berisi {{ content_for_header }} dan {{ content_for_layout }} (22 Layouts). Auto-correct nambahin content_for_header sebelum </head> dan content_for_layout sebelum </body>. Aman dinonaktifin (misalnya layout non-theme.liquid yang sengaja beda), tapi ingat konsekuensinya ke CAPTCHA, hreflang, dan analitik.
ReservedDocParamNames
Error. Parameter LiquidDoc di file block gak boleh pakai nama yang direservasi content_for, karena block dirender lewat content_for dan namanya bakal bentrok: attributes, block, blocks, class, context, id, inherit, resource, resources, schema, section, sections, settings, snippet, snippets, src, style, styles, template, templates, type. Cuma berlaku di blocks/.
❌ gagal
{% doc %}
@param {string} settings - The block's settings
{% enddoc %}✅ lolos
{% doc %}
@param {string} heading - The block's heading
@param {number} columns - The number of columns to display
{% enddoc %}SchemaJsonFormat (1.x saja)
Format JSON di {% schema %} (indentasi). Severity style, auto-correct mem-prettify. Dihapus karena itu tugas formatter (Prettier plugin dari 07 Tools Lokal VS Code Extension, Prettier, LiquidDoc).
SchemaPresetsBlockOrder
Warning. block_order di preset schema harus konsisten dengan blocks (29 Theme Blocks Mendalam > 5. Static Block di Preset). Tiga cara gagal: block dinamis di blocks tapi gak ada di block_order; block static: true ada di block_order (static gak boleh diurutin); ID di block_order yang gak ada di blocks.
❌ gagal, block_2 static tapi di block_order
{% schema %}
"presets": [
{
"name": "My preset",
"blocks": {
"block_1": {
"type": "text"
},
"block_2": {
"type": "text",
"static": true
}
},
"block_order": ["block_1","block_2"]
}
]
{% endschema %}SchemaPresetsStaticBlocks
Error. Tiap static block di preset harus punya {% content_for "block", type, id %} yang cocok di Liquid-nya. Kalau preset nyatain block_2 static tapi Liquid cuma punya content_for buat block_1, gagal. Berlaku buat preset berbentuk object (blocks: { id: {...} }) maupun array (blocks: [{ id, type, static }]).
✅ lolos
{% content_for "block", type: "text", id: "block_1" %}
{% content_for "block", type: "slide", id: "block_2" %}
{% schema %}
"presets": [
{
"name": "My preset",
"blocks": {
"block_1": {
"type": "text",
"static": true
},
"block_2": {
"type": "slide",
"static": true
}
}
}
]
{% endschema %}SpaceInsideBraces (1.x saja)
Spasi konsisten di dalam {{ }} dan {% %}, setelah koma, di sekitar | dan operator. Auto-correct. Dihapus, tugas formatter.
StaticStylesheetAndJavascriptTags
Error. Liquid di dalam {% stylesheet %} atau {% javascript %} gak didukung dan bikin error (54 Best Practices Umum > Tag javascript dan stylesheet).
❌ gagal
{% stylesheet %}
.button {
background-color: {{ settings.button_color }};
color: white;
}
{% endstylesheet %}✅ lolos (nilai dinamis lewat <style> inline atau CSS variable di luar tag)
{% stylesheet %}
.button {
background-color: #333;
color: white;
}
{% endstylesheet %}Nonaktifin gak disarankan.
TemplateLength (1.x saja)
File Liquid lebih dari max_length baris (default 600, dengan exclude_schema/exclude_stylesheet/exclude_javascript). Dihapus, tapi sarannya tetap: pecah jadi snippet dan block.
TranslationKeyExists
Error. Kunci terjemahan yang dipakai | t harus ada di locale default (33 Locales dan Translasi).
❌ gagal
{{ 'notfound' | t }}✅ lolos (dengan greetings dan general.close di en.default.json)
{{ 'greetings' | t }}
{{ 'general.close' | t }}Nonaktifin gak disarankan.
UnclosedHTMLElement
Error. Elemen HTML yang dibuka dan ditutup di cabang kondisional harus: ada di cabang kondisional induk yang sama, buka dan tutup di kondisi yang sama, dan urutan yang benar (yang dibuka terakhir ditutup duluan). else dan unless dianggap negasi kondisi yang sama.
❌ gagal, buka di something, tutup di something_else
<div>
{% if something %}
<details>
{% endif %}
{% if something_else %}
</details>
{% endif %}
</div>✅ lolos
<div>
{% if something %}
<details>
{% endif %}
{% if something %}
</details>
{% endif %}
</div><div>
{% if cond %}
{% else %}
<details>
{% endif %}
{% unless cond %}
</details>
{% endunless %}
</div>Ini aturan yang bakal sering muncul waktu migrasi ke parser ketat di 69 Migrasi ke Strict Liquid Parser.
UndefinedObject
Warning. Referensi variabel yang gak dikenal. Variabel harus dideklarasiin lewat assign, capture, atau @param di LiquidDoc, kecuali object global (13 Objects Global). Di block: variabel yang dipakai sebelum di-assign gagal. Di snippet: check dilewati kecuali snippet-nya punya LiquidDoc, dan kalau punya, variabel yang gak ada di @param dan gak di-assign lokal gagal.
❌ gagal, snippet dengan LiquidDoc pakai variabel yang gak didokumentasiin
{% doc %}
@param {string} my_variable - The variable to be used.
{% enddoc %}
{{ another_variable }}✅ lolos
{% doc %}
@param {string} my_variable - The variable to be used.
{% enddoc %}
{{ my_variable }}Nonaktifin gak disarankan, ini penangkap typo terbaik.
UniqueDocParamNames
Error. Nama parameter LiquidDoc harus unik. @param {string} some_input dan @param {number} some_input di satu {% doc %} gagal.
UniqueStaticBlockId
Error. Static block harus punya ID berbeda. Dua block dianggap duplikat kalau id dan parameter arbitrer-nya identik; ID sama dengan parameter beda (misalnya variant) dianggap berbeda.
❌ gagal
{% content_for "block", type: "text", id: "static-block" %}
{% content_for "block", type: "text", id: "static-block" %}✅ lolos
{% content_for "block", type: "text", id: "header-menu" %}
{% content_for "block", type: "text", id: "header-menu", variant: "mobile" %}
{% content_for "block", type: "text", id: "header-menu", variant: "navigation_bar" %}UnknownFilter
Error. Filter yang gak dikenal: {{ x | some_unknown_filter }}. Semua filter valid ada di 18 Filters String, Math, dan Array sampai 20 Filters Money, Metafield, Cart, Customer, dan Localization.
UnrecognizedContentForArguments
Warning. Argumen ke static block harus ada di LiquidDoc block-nya. Dengan @param some_str dan @param [some_num], ngirim some_bool: false gagal.
UnrecognizedRenderSnippetArguments
Warning. Sama buat render dan LiquidDoc snippet: {% render 'example-snippet', some_str: 'text', some_num: 1, some_bool: false %} gagal karena some_bool gak didokumentasiin.
UnsupportedDocTag
Error. {% doc %} cuma boleh di snippet (dan block). Di sections/section.liquid gagal.
UnsupportedFilterArguments
Error. Filter gak didukung di nilai argumen render, include, content_for. Filternya diabaikan diam-diam dan nilainya diteruskan apa adanya, jadi output salah tanpa umpan balik. Ini penjelasan resmi buat jebakan skip_styles: forloop.index > 1 dari 58 Performance Liquid > render Bersarang (perbandingan juga dibuang).
❌ gagal, text jadi Hello, bukan Hello, World!
{% render 'paragraph', text: 'Hello,' | append: ' World!' %}✅ lolos
{% assign text = 'Hello,' | append: ' World!' %}
{% render 'paragraph', text: text %}UnusedAssign
Warning. Variabel yang di-assign tapi gak dipakai. Variabel yang sengaja gak dipakai diawali _ buat ngelewatin check:
{% capture _ %}
{% form "cart", cart %}
{% assign posted_successfully = cart.posted_successfully? %}
{% endform %}
{% endcapture %}
{% assign _unused = 'some value' %}Aman dinonaktifin.
UnusedDocParam
Warning. Parameter di {% doc %} harus dipakai di snippet-nya. @param some_str yang gak pernah muncul di body gagal.
UnusedSnippet (1.x saja)
Pendahulu OrphanedSnippet, dengan auto-correct yang ngehapus file-nya. Aman dinonaktifin.
ValidBlockTarget
Error. Dua validasi (29 Theme Blocks Mendalam > Targeting: Block Mana yang Boleh): tipe block di blocks schema harus punya file blocks/<type>.liquid; dan block bersarang di presets harus dideklarasiin di blocks level root (langsung, atau lewat @theme), dan private block _x harus disebut eksplisit karena @theme gak mencakupnya.
❌ gagal, _private_block di preset tapi root cuma @theme
{% schema %}
{
"name": "Section with Nested Blocks",
"blocks": [
{
"type": "@theme"
}
],
"presets": [
{
"name": "Default",
"blocks": [
{
"type": "_private_block"
}
]
}
]
}
{% endschema %}✅ lolos
{% schema %}
{
"name": "Section with Nested Blocks",
"blocks": [
{
"type": "_private_block"
}
],
"presets": [
{
"name": "Default",
"blocks": [
{
"type": "_private_block"
}
]
}
]
}
{% endschema %}ValidContentForArgumentTypes
Warning. Argumen ke static block harus cocok tipe di LiquidDoc block. Kalau argumennya variabel, check selalu lolos (tipenya gak bisa dianalisis statis). Object apapun boleh dikirim ke parameter boolean karena semua object truthy/falsy.
❌ gagal
{% content_for 'block', type: 'example-block', some_str: 1 %}✅ lolos
{% content_for 'block',
type: 'example-block',
some_str: 'text',
some_num: 1,
some_bool: false,
some_obj: shop,
some_untyped: product
%}ValidContentForArguments
Error. Argumen bernama ke content_for harus yang diterima tag-nya (bukan soal LiquidDoc, itu Unrecognized/Missing).
❌ gagal
{% content_for "blocks", invalid: 10 %}
{% content_for "block", invalid: 10 %}✅ lolos
{% content_for "blocks" %}
{% content_for "blocks", context.product: product %}
{% content_for "block", type: "slide", id: "my-static-slide" %}
{% content_for "block", type: "slide", id: "my-static-slide", context.product: product %}Catatan: contoh resmi pakai context.product, sementara 29 Theme Blocks Mendalam > 3. Ngirim Sumber Daya Lewat Liquid pakai closest.product. Keduanya ada di dokumentasi Shopify buat ngirim sumber daya ke block, ikuti yang dipakai theme referensi kamu (Horizon pakai closest).
ValidDocParamTypes
Error. Tipe parameter LiquidDoc harus string, number, boolean, object, atau object Liquid yang bukan eksklusif global (product, color, currency, …). Tipe opsional, dalam {}, dan [] setelah tipe buat array. Array multidimensi gak boleh.
❌ gagal
{% doc %}
@param {custom} param1
@param {string[][]} string_matrix
{% enddoc %}✅ lolos
{% doc %}
@param {product} special_product
@param {product[]} special_products
@param {string[]} array_of_strings
@param some_untyped
{% enddoc %}ValidHTMLTranslation
Warning. HTML di terjemahan (kunci _html, dari 33 Locales dan Translasi) harus valid.
❌ gagal
{
"hello_html": "<h2>Hello, world</h1>",
"image_html": "<a href='/cat'>Unclosed"
}✅ lolos
{
"hello_html": "<h1>Hello, world</h1>",
"image_html": "<img src="cat.png" />",
"line_break_html": "<br />",
"self_closing_svg_html": "<svg />"
}ValidLocalBlocks
Error. Local block (section block dengan name dan settings di schema, dari 28 Blocks) cuma boleh di section, gak di theme block, dan gak boleh dicampur sama theme block di satu section.
❌ gagal, local block di theme block
{% schema %}
{
"name": "Block name",
"blocks": [
{
"type": "local_block",
"name": "Local Block"
}
]
}
{% endschema %}❌ gagal, campur text (theme block) dan local block di section
{% schema %}
{
"name": "Section name",
"blocks": [
{
"type": "text"
},
{
"type": "local_block",
"name": "Local Block"
}
]
}
{% endschema %}ValidRenderSnippetArgumentTypes
Warning. Sama dengan ValidContentForArgumentTypes buat render: {% render 'example-snippet', some_str: 1 %} gagal, variabel selalu lolos, object ke boolean boleh.
ValidSchema
Error. JSON di {% schema %} harus valid. Perhatiin: trailing comma gagal di sini (beda dari JSONSyntaxError buat file .json yang toleran).
❌ gagal
{% schema %}
{
"comma": "trailing",
}
{% endschema %}ValidSchemaName
Error. name schema maksimal 25 karakter (21 Gambaran Arsitektur Theme > Batasan Platform), termasuk kalau name-nya kunci t: yang nilai di locale default-nya lebih dari 25. Perbaiki teksnya, bukan kuncinya.
ValidSchemaTranslations
Error. Tiap kunci t: di {% schema %} (name, label, info, category, nilai preset, label opsi, termasuk di blocks bersarang) harus ada di schema locale default (en.default.schema.json). Nonaktifin gak disarankan karena kunci yang gak resolve tampil sebagai string mentah t:... di theme editor.
ValidScopedCSSClass
Warning. Class di atribut class yang didefinisiin di theme tapi gak terjangkau dari scope file ini, aturan yang mendasari stylesheet subsetting di 60 Performance CSS dan Font > Stylesheet Subsetting. Class dalam scope kalau didefinisiin di: {% stylesheet %} file sendiri; {% stylesheet %} leluhur langsung yang ngerender file ini (render, section, content_for, seluruh rantai leluhur, tapi cuma referensi direct, bukan indirect/preset); snippet yang dirender file ini atau leluhurnya (termasuk turunan bersarang); dan .css apapun di assets/ (selalu global). Class yang gak didefinisiin di mana pun gak dilaporin (bisa dari CDN/framework), dan class="{{ ... }}" dinamis gak dianalisis.
❌ gagal, other-class di snippet yang gak dirender dari section ini
{% stylesheet %}
.local-class { color: red; }
{% endstylesheet %}
<div class="other-class">Hello</div>✅ lolos, class dari leluhur yang ngerender block ini
{%- comment -%} sections/section.liquid {%- endcomment -%}
{% stylesheet %}
.parent-class { color: red; }
{% endstylesheet %}
{% content_for 'block', type: 'child', id: 'child' %}
{%- comment -%} blocks/child.liquid {%- endcomment -%}
<div class="parent-class">Hello</div>Boleh dinonaktifin kalau theme sangat bergantung ke class dari stylesheet eksternal, script inline, atau pipeline CSS build-time yang gak bisa dianalisis.
ValidSettingsKey
Error. Kunci di presets[].settings dan default.settings harus ada sebagai settings[].id di schema file yang sama; dan kunci di presets[].blocks[].settings (rekursif) dan default.blocks[].settings harus ada di schema block yang dirujuk.
❌ gagal, fake-setting gak ada di settings
{% schema %}
{
"settings": {
"type": "text",
"id": "custom-setting",
"label": "Custom Setting",
},
"presets": [{
"name": "Preset",
"settings": {
"fake-setting": "not valid setting"
}
}]
}
{% endschema %}ValidStaticBlockType
Error. type di content_for "block" harus punya file di blocks/. type: "block-does-not-exist" gagal.
VariableName
Warning. Nama variabel ngikutin konvensi: opsi format snake_case (default), camelCase, PascalCase, kebab-case. {% assign variable-name = 1 %} gagal di default, variable_name lolos. Aman dinonaktifin.
Ringkasan
- Terjemahan:
MatchingTranslations(kunci sama di semua locale, plural boleh beda, auto-correct),TranslationKeyExists,ValidHTMLTranslation,ValidSchemaTranslations(t:harus ada di schema locale default). - File dan referensi:
MissingAsset,MissingTemplate(auto-correct,ignore/ignore_missing),OrphanedSnippet,RequiredLayoutThemeObject(auto-correct),RemoteAsset. - LiquidDoc:
Missing*Arguments(wajib harus dikirim),Unrecognized*Arguments(cuma yang didokumentasiin),Valid*ArgumentTypes(tipe cocok, variabel selalu lolos),UniqueDocParamNames,ReservedDocParamNames(block gak boleh pakai namacontent_for),UnsupportedDocTag(cuma snippet/block),UnusedDocParam,ValidDocParamTypes(string/number/boolean/object/object Liquid,[], tanpa matriks),UndefinedObject(aktif di snippet cuma kalau ada LiquidDoc). - Block dan schema:
SchemaPresetsBlockOrder(dinamis wajib diblock_order, static gak boleh),SchemaPresetsStaticBlocks(tiap static preset punyacontent_for),UniqueStaticBlockId,ValidBlockTarget(file ada, root mendeklarasiin, private eksplisit),ValidContentForArguments,ValidLocalBlocks(local cuma di section, gak campur theme block),ValidSettingsKey,ValidStaticBlockType,ValidSchema(trailing comma gagal),ValidSchemaName(25 karakter). - Performa dan syntax:
PaginationSize,ParserBlockingScript(srctanpadefer/async),StaticStylesheetAndJavascriptTags(tanpa Liquid di dalamnya),UnclosedHTMLElement(buka/tutup di kondisi yang sama, urutan benar),UnsupportedFilterArguments(filter di argumen diabaikan diam-diam),UnknownFilter,UnusedAssign(awali_),ValidScopedCSSClass(scope = file sendiri, leluhur direct, snippet yang dirender,assets/*.css),VariableName. - 1.x yang dihapus:
MatchingSchemaTranslations,MissingEnableComment,MissingRequiredTemplateFiles,NestedSnippet,RequiredDirectories,SchemaJsonFormat,SpaceInsideBraces,TemplateLength,UnusedSnippet.
Bab selanjutnya kita bahas dua alat pelengkap Theme Check: Theme Inspector for Chrome buat memprofil render Liquid (flame graph, sandwich view) waktu TTFB lambat, dan Lighthouse CI GitHub Action buat nyegah regresi performa dan aksesibilitas di tiap pull request.