Tema
Manifest referansı
Her app sürümü kökteki manifest.json ile tanımlanır. Şema JSON Schema 2020-12'dir ve @corevo-ds/manifest paketiyle gelir:
- Şema kimliği:
https://appstore.corevo.com/schema/manifest.v1.json - Dosya:
@corevo-ds/manifest/schema(schema/manifest.v1.json) - Doğrulama:
npx corevo validateveya kod içindevalidateManifest(json)
Editörde otomatik tamamlama için şemayı dosyaya $schema alanıyla değil, editör ayarıyla bağlayın; şemada additionalProperties: false olduğundan tanınmayan her alan ($schema dahil) reddedilir. VS Code, .vscode/settings.json:
json
{
"json.schemas": [
{
"fileMatch": ["manifest.json"],
"url": "./node_modules/@corevo-ds/manifest/schema/manifest.v1.json"
}
]
}En küçük manifest
json
{
"schema_version": 1,
"key": "my-app",
"version": "1.0.0",
"sdk_version": "^0.4",
"name": { "tr": "Uygulamam" },
"description": { "tr": "Kısa açıklama" },
"targets": { "modern": { "entry": "targets/modern/index.html" } },
"display": { "orientations": ["landscape"], "interactive": false }
}targets/modern/ öneki paketin içindeki yoldur; corevo build bunu dist/modern/ klasöründen doldurur.
Alanlar
Aşağıdaki tablo şemadan otomatik üretilir. [] dizi öğesini, <anahtar> serbest anahtarı gösterir.
| Alan | Tip | Zorunlu | Kural | Açıklama |
|---|---|---|---|---|
schema_version | sabit | evet | = 1 | Şema sürümü. Her zaman 1. |
key | string | evet | desen ^[a-z][a-z0-9-]{2,40}$ | App anahtarı. Firma app’lerinde panel önüne c{company_id}. ekler (sistem anahtarı). |
version | semver | evet | semver 2.0 (1.2.0, 1.2.0-rc.1) | Sürüm. Her yayında öncekilerden büyük olmalı. |
sdk_version | semver aralığı | evet | desen ^[0-9A-Za-z*^~<>=|.xX -]+$; en az 1 karakter; en fazla 200 karakter | Desteklenen @corevo-ds/app-sdk aralığı (^0.4). Kurulu SDK bu aralıkta olmalı. |
name | i18n metin | evet | { "tr": "…", "en": "…" }, tr zorunlu | Teknik ad. Vitrin metni panelde ayrıca tutulur. |
description | i18n metin | evet | { "tr": "…", "en": "…" }, tr zorunlu | Teknik açıklama. |
targets | nesne | evet | Paket hedefleri. modern zorunlu. | |
targets.modern | nesne | evet | Chromium 56+ cihazlar. Tek HTML dosyası önerilir. | |
targets.modern.entry | göreli yol | evet | desen ^(?!/)(?![A-Za-z]:)(?!.*\.\.)(?!.*\\)[A-Za-z0-9_./-]+$; en az 1 karakter; en fazla 240 karakter | Paketteki giriş dosyası, ör. targets/modern/index.html. |
targets.legacy | nesne | ES5 cihazlar (SSSP2/3, webOS 1–2). Opsiyonel. | ||
targets.legacy.entry | göreli yol | evet | desen ^(?!/)(?![A-Za-z]:)(?!.*\.\.)(?!.*\\)[A-Za-z0-9_./-]+$; en az 1 karakter; en fazla 240 karakter | Legacy giriş dosyası. |
targets.admin | nesne | Panelde açılan özel yönetim sayfası (admin.pages kind: custom). | ||
targets.admin.entry | göreli yol | evet | desen ^(?!/)(?![A-Za-z]:)(?!.*\.\.)(?!.*\\)[A-Za-z0-9_./-]+$; en az 1 karakter; en fazla 240 karakter | Yönetim sayfası giriş dosyası. |
display | nesne | evet | Ekran özellikleri. | |
display.orientations | dizi | evet | en az 1 öğe; tekrarsız; öğeler: landscape, portrait | Desteklenen yönler. |
display.resolutions | dizi | en az 1 öğe | Önerilen çözünürlükler. Önizleme ve vitrinde kullanılır. | |
display.resolutions[].w | tamsayı | evet | ≥ 1 | Genişlik (px). |
display.resolutions[].h | tamsayı | evet | ≥ 1 | Yükseklik (px). |
display.interactive | boolean | evet | Dokunmatik/etkileşimli ekran mı. Etkileşim olayları ve oturumlar bununla anlam kazanır. | |
display.idle_timeout_seconds | tamsayı | ≥ 1 | Yalnız interactive: true iken. Oturumun boşta kapanma süresi (varsayılan 30 sn). | |
groups | dizi | en az 1 öğe | Parametre formundaki bölümler ve sıraları. | |
groups[].key | anahtar | evet | desen ^[a-z][a-z0-9_]{0,40}$ | Grup anahtarı. params[].group buna bakar. |
groups[].label | i18n metin | evet | { "tr": "…", "en": "…" }, tr zorunlu | Bölüm başlığı. |
groups[].help | i18n metin | { "tr": "…", "en": "…" }, tr zorunlu | Bölüm açıklaması. | |
params | dizi | Panelde formu üretilen parametreler. Ayrıntı: Parametre tipleri. | ||
params[].key | anahtar | evet | desen ^[a-z][a-z0-9_]{0,40}$ | Parametre anahtarı. Corevo.params.get(key). |
params[].type | enum | evet | text, textarea, number, color, boolean, select, datetime, media, file, dataset, list | Parametre tipi. |
params[].label | i18n metin | evet | { "tr": "…", "en": "…" }, tr zorunlu | Form etiketi. |
params[].help | i18n metin | { "tr": "…", "en": "…" }, tr zorunlu | Form yardım metni. | |
params[].required | boolean | Boş bırakılamaz. | ||
params[].group | string | en az 1 karakter; en fazla 80 karakter | Form bölümü (groups varsa onun anahtarı). | |
params[].i18n | boolean | Değer dil bazında girilir: { "tr": ..., "en": ... }. list ve dataset için yasak. | ||
params[].default | herhangi | Varsayılan değer. Tipe uymak zorundadır. | ||
params[].min | sayı | Yalnız number. | ||
params[].max | sayı | Yalnız number. | ||
params[].step | sayı | Yalnız number. | ||
params[].options | dizi | en az 1 öğe | Yalnız select. En az bir seçenek. | |
params[].options[].value | string | evet | en az 1 karakter | Saklanan değer. |
params[].options[].label | i18n metin | evet | { "tr": "…", "en": "…" }, tr zorunlu | Görünen etiket. |
params[].accept | herhangi | media: image / video. file: .pdf gibi uzantılar. | ||
params[].fields | dizi | en az 1 öğe | Yalnız dataset. Beklenen sütunlar. | |
params[].fields[].key | anahtar | evet | desen ^[a-z][a-z0-9_]{0,40}$ | Sütun anahtarı. |
params[].fields[].type | enum | evet | text, number, boolean, datetime, money | Sütun tipi. |
params[].fields[].label | i18n metin | evet | { "tr": "…", "en": "…" }, tr zorunlu | Sütun etiketi. |
params[].items | dizi | en az 1 öğe; öğeler aynı parametre şemasıdır | Yalnız list. Öğe başına parametreler (aynı şema, en fazla 2 seviye). | |
params[].min_items | tamsayı | ≥ 0 | Yalnız list. | |
params[].max_items | tamsayı | ≥ 0 | Yalnız list. | |
collections | nesne | Panelde CRUD sayfası olan yönetim verisi. | ||
collections.<anahtar> | nesne | |||
collections.<anahtar>.label | i18n metin | evet | { "tr": "…", "en": "…" }, tr zorunlu | Koleksiyon adı. |
collections.<anahtar>.scope | enum | evet | company, instance | company (firma geneli) veya instance (örnek başına). |
collections.<anahtar>.fields | nesne | evet | en az 1 anahtar | Alanlar. |
collections.<anahtar>.fields.<anahtar> | nesne | |||
collections.<anahtar>.fields.<anahtar>.type | enum | string | evet | text, textarea, number, money, boolean, media; desen ^ref:[a-z][a-z0-9_]{0,40}$ | Alan tipi veya ref:<koleksiyon>. |
collections.<anahtar>.fields.<anahtar>.label | i18n metin | evet | { "tr": "…", "en": "…" }, tr zorunlu | |
collections.<anahtar>.fields.<anahtar>.i18n | boolean | |||
controls | dizi | en az 1 öğe | Canlı kumanda düğmeleri. live.subscribe yeteneği ister. | |
controls[].action | anahtar | evet | desen ^[a-z][a-z0-9_]{0,40}$ | |
controls[].label | i18n metin | evet | { "tr": "…", "en": "…" }, tr zorunlu | |
controls[].type | enum | evet | button, number, text | |
admin | nesne | Panel menüsündeki yönetim sayfaları. | ||
admin.pages | dizi | evet | en az 1 öğe | |
admin.pages[].key | anahtar | evet | desen ^[a-z][a-z0-9_]{0,40}$ | |
admin.pages[].label | i18n metin | evet | { "tr": "…", "en": "…" }, tr zorunlu | |
admin.pages[].kind | enum | evet | collection, custom | collection: otomatik CRUD. custom: targets.admin sayfası. |
admin.pages[].collection | anahtar | desen ^[a-z][a-z0-9_]{0,40}$ | ||
permissions | nesne | Yetenekler ve özel izinler. Yeni yetenek eklemek sürümü incelemeye düşürür. | ||
permissions.capabilities | dizi | evet | tekrarsız; öğeler: storage, track, data, live.subscribe, live.up, actions.mail; veya proxy:<host> | Bridge yetenekleri. Manifestte olmayan istek capability_denied alır. |
permissions.custom | nesne | App’e özel izinler ve etiketleri. | ||
permissions.custom.<anahtar> | i18n metin | { "tr": "…", "en": "…" }, tr zorunlu | ||
data | nesne | Sunucu tarafı veri kaynakları. | ||
data.providers | dizi | evet | en az 1 öğe | Veri sağlayıcıları. Sağlayıcı bildiren app’e data yeteneği örtük verilir. |
data.providers[].id | enum | evet | weather | Sağlayıcı. Şimdilik yalnız weather. |
data.providers[].inputs | nesne | evet | Sağlayıcı girdisi → kök parametre anahtarı. weather: { "city": "<text parametre>" }. | |
migrations | nesne | Major sürümde parametre dönüşümü. | ||
migrations.from_major | tamsayı | evet | ≥ 0 | Önceki major sürüm. |
migrations.entry | göreli yol | evet | desen ^(?!/)(?![A-Za-z]:)(?!.*\.\.)(?!.*\\)[A-Za-z0-9_./-]+$; en az 1 karakter; en fazla 240 karakter | Dönüşüm dosyası. |
Şemanın ifade edemediği kurallar
Doğrulayıcı (validateManifest, corevo validate, panel) şunları da denetler:
- Parametre, seçenek, kontrol, sayfa ve grup anahtarları tekrar edemez.
defaulttipe uymalı: sayımin/maxiçinde,selectiçin seçeneklerden biri, liste öğeleriitemsşemasına uygun.groupstanımlıysa herparams[].groupbu anahtarlardan biri olmalı (unknown_group). Kullanılmayan grup uyarıdır.listiçindelisten fazla bir kez (list_too_deep).datasetparametresi varsapermissions.capabilitiesiçindedata(capability_missing_data);controlsvarsalive.subscribe.ref:<koleksiyon>hedefi tanımlı olmalı;admin.pageskind: collectionise koleksiyon var olmalı,kind: customisetargets.adminolmalı.data.providers[].inputs.citykök seviyede,i18nolmayan birtextparametresi olmalı; sağlayıcıid'si ile aynı anahtarlıdatasetolamaz.display.idle_timeout_secondsyalnızinteractive: trueiken yazılabilir.versioniçinsemver.valid,sdk_versioniçinsemver.validRange.
Semver kuralları
Karşılaştırma parametre ve liste öğelerini anahtarla eşler; dizi sırası önemsizdir. accept, display.orientations ve permissions.capabilities küme olarak bakılır; yalnız sıra değişimi ihlal değildir. Sayıda yazılmayan min veya max o ucu açık bırakır: sınır koymak daraltır, kaldırmak genişletir. Listede eksik min_items 0, eksik max_items sınırsızdır. min_items: 0 ile alanın yazılmaması aynıdır.
declaredBump, sürüm alanındaki artıştır. preminor minor, prepatch / prerelease patch sayılır. Build metadata artışı sayılmaz.
Zorunlu artış, bulunan kuralların en yükseğidir. Bildirilen artış bundan küçükse ok false olur (bump_too_small). Daha büyük artış serbesttir.
addedCapabilities ve removedCapabilities sıralı küme farkıdır. Geçersiz manifestte ve yetenek farkı yokken ikisi de boştur. Yetenek hem eklenip hem silinirse ikisi de dolu olur; zorunlu artış minor'dır.
| Değişiklik | Zorunlu artış |
|---|---|
Yalnızca name, description, label, help | patch |
groups ekleme, silme, etiket, yardım veya sıra | patch |
group, default değeri, step | patch |
controls, admin.pages | patch |
permissions.capabilities içinden yetenek silme, permissions.custom | patch |
display.resolutions, idle_timeout_seconds | patch |
targets entry yolu, targets.admin silme | patch |
Sayı min azaltma veya kaldırma, max artırma veya kaldırma | minor |
accept değer ekleme | minor |
Liste max_items artırma veya kaldırma, min_items azaltma veya kaldırma | minor |
display.orientations yön ekleme, display.interactive değişimi | minor |
targets.legacy ekleme, targets.admin ekleme | minor |
permissions.capabilities yetenek ekleme | minor |
data.providers sağlayıcı ekleme | minor |
data.providers sağlayıcı silme veya inputs değişimi | patch |
| Varsayılanı olan parametre eklemek (zorunlu olsa da) | minor |
| Zorunlu olmayan parametre eklemek | minor |
| Yeni collection veya yeni collection / dataset alanı | minor |
select seçeneği eklemek | minor |
Sayı min artırma veya yeni min, max azaltma veya yeni max | major |
accept değer silme | major |
Liste max_items azaltma veya yeni tavan, min_items artırma | major |
display.orientations yön silme | major |
targets.legacy silme | major |
| Parametre silmek veya anahtarını değiştirmek | major |
Parametre type değiştirmek | major |
| Varsayılanı olmayan zorunlu parametre eklemek | major |
| Mevcut parametreyi varsayılansız zorunlu yapmak | major |
select seçeneği silmek | major |
Collection silmek, alan silmek, alan tipini veya ref hedefini değiştirmek | major |
Collection scope değiştirmek (company ↔ instance) | major |
i18n bayrağını değiştirmek | major |
İç içe list öğeleri | aynı kurallar |
İçerik değişmeden sürüm aynı kalırsa ok true ve ihlal listesi boştur. İçerik değişip sürüm artmazsa ok false olur.
Major artışta migrations.from_major önceki major ile aynı değilse (veya migrations yoksa) migration_from_major uyarısı eklenir. Uyarı ok değerini bozmaz. Örnek: 1.4.2 → 2.0.0 için from_major 1 olmalıdır.
Örnekler
Hava durumu (veri sağlayıcılı)
fixtures/valid/weather.json
json
{
"schema_version": 1,
"key": "weather",
"version": "1.4.2",
"sdk_version": "^1.0.0",
"name": { "tr": "Hava Durumu", "en": "Weather" },
"description": { "tr": "Şehir bazlı hava durumu", "en": "City weather" },
"targets": {
"modern": { "entry": "targets/modern/index.html" },
"legacy": { "entry": "targets/legacy/index.html" }
},
"display": {
"orientations": ["landscape"],
"resolutions": [{ "w": 1920, "h": 1080 }],
"interactive": false
},
"params": [
{
"key": "city",
"type": "text",
"label": { "tr": "Şehir", "en": "City" },
"required": true,
"group": "Genel"
},
{
"key": "headline",
"type": "text",
"label": { "tr": "Başlık" },
"i18n": true,
"default": { "tr": "Hava durumu", "en": "Weather" }
},
{
"key": "units",
"type": "select",
"label": { "tr": "Birim" },
"default": "celsius",
"options": [
{ "value": "celsius", "label": { "tr": "Celsius" } },
{ "value": "fahrenheit", "label": { "tr": "Fahrenheit" } }
]
},
{
"key": "refresh_minutes",
"type": "number",
"label": { "tr": "Yenileme" },
"min": 5,
"max": 120,
"step": 5,
"default": 15
},
{
"key": "accent",
"type": "color",
"label": { "tr": "Vurgu rengi" },
"default": "#1D4ED8"
},
{
"key": "show_label",
"type": "boolean",
"label": { "tr": "Etiket göster" },
"default": true
},
{
"key": "logo",
"type": "media",
"label": { "tr": "Logo" },
"accept": ["image"]
},
{
"key": "forecast",
"type": "dataset",
"label": { "tr": "Tahmin verisi" },
"help": { "tr": "Sıcaklık ve durum alanları eşlenir" },
"fields": [
{ "key": "temp", "type": "number", "label": { "tr": "Sıcaklık" } },
{ "key": "condition", "type": "text", "label": { "tr": "Durum" } }
]
}
],
"permissions": {
"capabilities": ["data", "storage", "proxy:api.open-meteo.com"]
}
}Slayt (iç içe liste)
fixtures/valid/slides.json
json
{
"schema_version": 1,
"key": "slides",
"version": "1.0.0",
"sdk_version": "~1.2.0",
"name": { "tr": "Slaytlar" },
"description": { "tr": "İç içe liste parametresi" },
"targets": { "modern": { "entry": "targets/modern/index.html" } },
"display": { "orientations": ["landscape"], "interactive": false },
"params": [
{
"key": "slides",
"type": "list",
"label": { "tr": "Slaytlar" },
"min_items": 1,
"max_items": 20,
"items": [
{
"key": "title",
"type": "text",
"label": { "tr": "Başlık" },
"required": true,
"i18n": true
},
{
"key": "body",
"type": "textarea",
"label": { "tr": "Metin" }
},
{
"key": "duration",
"type": "number",
"label": { "tr": "Süre (sn)" },
"min": 1,
"max": 60,
"default": 8
},
{
"key": "starts_at",
"type": "datetime",
"label": { "tr": "Başlangıç" }
},
{
"key": "attachment",
"type": "file",
"label": { "tr": "Ek dosya" },
"accept": [".pdf", ".xlsx"]
}
],
"default": [{ "title": { "tr": "Hoş geldiniz", "en": "Welcome" }, "duration": 8 }]
}
]
}Menü (koleksiyon ve yönetim sayfası)
fixtures/valid/menu.json
json
{
"schema_version": 1,
"key": "menu",
"version": "1.0.0",
"sdk_version": "^1.0.0",
"name": { "tr": "Menü", "en": "Menu" },
"description": { "tr": "Kategori, alt kategori ve ürün yönetimi" },
"targets": { "modern": { "entry": "targets/modern/index.html" } },
"display": {
"orientations": ["landscape", "portrait"],
"interactive": true,
"idle_timeout_seconds": 90
},
"params": [
{
"key": "currency",
"type": "text",
"label": { "tr": "Para birimi" },
"default": "EUR"
}
],
"collections": {
"categories": {
"label": { "tr": "Kategoriler" },
"scope": "company",
"fields": {
"name": { "type": "text", "label": { "tr": "Ad" }, "i18n": true }
}
},
"subcategories": {
"label": { "tr": "Alt kategoriler" },
"scope": "company",
"fields": {
"name": { "type": "text", "label": { "tr": "Ad" }, "i18n": true },
"category": { "type": "ref:categories", "label": { "tr": "Kategori" } }
}
},
"products": {
"label": { "tr": "Ürünler" },
"scope": "instance",
"fields": {
"name": { "type": "text", "label": { "tr": "Ad" }, "i18n": true },
"description": { "type": "textarea", "label": { "tr": "Açıklama" }, "i18n": true },
"price": { "type": "money", "label": { "tr": "Fiyat" } },
"photo": { "type": "media", "label": { "tr": "Görsel" } },
"subcategory": { "type": "ref:subcategories", "label": { "tr": "Alt kategori" } }
}
}
},
"admin": {
"pages": [
{
"key": "categories",
"label": { "tr": "Kategoriler" },
"kind": "collection",
"collection": "categories"
},
{
"key": "subcategories",
"label": { "tr": "Alt kategoriler" },
"kind": "collection",
"collection": "subcategories"
},
{
"key": "products",
"label": { "tr": "Ürünler" },
"kind": "collection",
"collection": "products"
}
]
}
}Sıra (canlı kumanda)
fixtures/valid/queue.json
json
{
"schema_version": 1,
"key": "queue",
"version": "1.0.0",
"sdk_version": "^1.0.0",
"name": { "tr": "Sıra Numaratörü", "en": "Queue" },
"description": { "tr": "Canlı sıra çağırma" },
"targets": {
"modern": { "entry": "targets/modern/index.html" },
"admin": { "entry": "targets/admin/index.html" }
},
"display": {
"orientations": ["portrait"],
"interactive": true,
"idle_timeout_seconds": 30
},
"params": [
{
"key": "desk_count",
"type": "number",
"label": { "tr": "Gişe sayısı" },
"min": 1,
"default": 3
}
],
"controls": [
{ "action": "call_next", "label": { "tr": "Sıradakini çağır" }, "type": "button" },
{ "action": "counter", "label": { "tr": "Gişe" }, "type": "number" },
{ "action": "note", "label": { "tr": "Anons" }, "type": "text" }
],
"admin": {
"pages": [{ "key": "live", "label": { "tr": "Canlı sıra" }, "kind": "custom" }]
},
"permissions": {
"capabilities": ["live.subscribe", "live.up", "storage"],
"custom": {
"queue.call": { "tr": "Sıra çağır" },
"queue.manage_counters": { "tr": "Gişe yönetimi" },
"queue.view_history": { "tr": "Geçmişi gör" }
}
}
}Form grupları
fixtures/valid/groups.json
json
{
"schema_version": 1,
"key": "groups-app",
"version": "1.0.0",
"sdk_version": "^1.0.0",
"name": { "tr": "Gruplar" },
"description": { "tr": "Çevrilebilir parametre grupları" },
"groups": [
{
"key": "genel",
"label": { "tr": "Genel", "en": "General" },
"help": { "tr": "Temel alanlar", "en": "Basic fields" }
},
{ "key": "icerik", "label": { "tr": "İçerik", "en": "Content" } }
],
"targets": { "modern": { "entry": "targets/modern/index.html" } },
"display": { "orientations": ["landscape"], "interactive": false },
"params": [
{ "key": "city", "type": "text", "label": { "tr": "Şehir" }, "group": "genel" },
{
"key": "slides",
"type": "list",
"label": { "tr": "Slaytlar" },
"group": "icerik",
"items": [{ "key": "title", "type": "text", "label": { "tr": "Başlık" }, "group": "genel" }]
}
]
}