Skip to content

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 validate veya kod içinde validateManifest(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.

AlanTipZorunluKuralAçıklama
schema_versionsabitevet= 1Şema sürümü. Her zaman 1.
keystringevetdesen ^[a-z][a-z0-9-]{2,40}$App anahtarı. Firma app’lerinde panel önüne c{company_id}. ekler (sistem anahtarı).
versionsemverevetsemver 2.0 (1.2.0, 1.2.0-rc.1)Sürüm. Her yayında öncekilerden büyük olmalı.
sdk_versionsemver aralığıevetdesen ^[0-9A-Za-z*^~<>=|.xX -]+$; en az 1 karakter; en fazla 200 karakterDesteklenen @corevo-ds/app-sdk aralığı (^0.4). Kurulu SDK bu aralıkta olmalı.
namei18n metinevet{ "tr": "…", "en": "…" }, tr zorunluTeknik ad. Vitrin metni panelde ayrıca tutulur.
descriptioni18n metinevet{ "tr": "…", "en": "…" }, tr zorunluTeknik açıklama.
targetsnesneevetPaket hedefleri. modern zorunlu.
targets.modernnesneevetChromium 56+ cihazlar. Tek HTML dosyası önerilir.
targets.modern.entrygöreli yolevetdesen ^(?!/)(?![A-Za-z]:)(?!.*\.\.)(?!.*\\)[A-Za-z0-9_./-]+$; en az 1 karakter; en fazla 240 karakterPaketteki giriş dosyası, ör. targets/modern/index.html.
targets.legacynesneES5 cihazlar (SSSP2/3, webOS 1–2). Opsiyonel.
targets.legacy.entrygöreli yolevetdesen ^(?!/)(?![A-Za-z]:)(?!.*\.\.)(?!.*\\)[A-Za-z0-9_./-]+$; en az 1 karakter; en fazla 240 karakterLegacy giriş dosyası.
targets.adminnesnePanelde açılan özel yönetim sayfası (admin.pages kind: custom).
targets.admin.entrygöreli yolevetdesen ^(?!/)(?![A-Za-z]:)(?!.*\.\.)(?!.*\\)[A-Za-z0-9_./-]+$; en az 1 karakter; en fazla 240 karakterYönetim sayfası giriş dosyası.
displaynesneevetEkran özellikleri.
display.orientationsdizieveten az 1 öğe; tekrarsız; öğeler: landscape, portraitDesteklenen yönler.
display.resolutionsdizien az 1 öğeÖnerilen çözünürlükler. Önizleme ve vitrinde kullanılır.
display.resolutions[].wtamsayıevet≥ 1Genişlik (px).
display.resolutions[].htamsayıevet≥ 1Yükseklik (px).
display.interactivebooleanevetDokunmatik/etkileşimli ekran mı. Etkileşim olayları ve oturumlar bununla anlam kazanır.
display.idle_timeout_secondstamsayı≥ 1Yalnız interactive: true iken. Oturumun boşta kapanma süresi (varsayılan 30 sn).
groupsdizien az 1 öğeParametre formundaki bölümler ve sıraları.
groups[].keyanahtarevetdesen ^[a-z][a-z0-9_]{0,40}$Grup anahtarı. params[].group buna bakar.
groups[].labeli18n metinevet{ "tr": "…", "en": "…" }, tr zorunluBölüm başlığı.
groups[].helpi18n metin{ "tr": "…", "en": "…" }, tr zorunluBölüm açıklaması.
paramsdiziPanelde formu üretilen parametreler. Ayrıntı: Parametre tipleri.
params[].keyanahtarevetdesen ^[a-z][a-z0-9_]{0,40}$Parametre anahtarı. Corevo.params.get(key).
params[].typeenumevettext, textarea, number, color, boolean, select, datetime, media, file, dataset, listParametre tipi.
params[].labeli18n metinevet{ "tr": "…", "en": "…" }, tr zorunluForm etiketi.
params[].helpi18n metin{ "tr": "…", "en": "…" }, tr zorunluForm yardım metni.
params[].requiredbooleanBoş bırakılamaz.
params[].groupstringen az 1 karakter; en fazla 80 karakterForm bölümü (groups varsa onun anahtarı).
params[].i18nbooleanDeğer dil bazında girilir: { "tr": ..., "en": ... }. list ve dataset için yasak.
params[].defaultherhangiVarsayılan değer. Tipe uymak zorundadır.
params[].minsayıYalnız number.
params[].maxsayıYalnız number.
params[].stepsayıYalnız number.
params[].optionsdizien az 1 öğeYalnız select. En az bir seçenek.
params[].options[].valuestringeveten az 1 karakterSaklanan değer.
params[].options[].labeli18n metinevet{ "tr": "…", "en": "…" }, tr zorunluGörünen etiket.
params[].acceptherhangimedia: image / video. file: .pdf gibi uzantılar.
params[].fieldsdizien az 1 öğeYalnız dataset. Beklenen sütunlar.
params[].fields[].keyanahtarevetdesen ^[a-z][a-z0-9_]{0,40}$Sütun anahtarı.
params[].fields[].typeenumevettext, number, boolean, datetime, moneySütun tipi.
params[].fields[].labeli18n metinevet{ "tr": "…", "en": "…" }, tr zorunluSütun etiketi.
params[].itemsdizien az 1 öğe; öğeler aynı parametre şemasıdırYalnız list. Öğe başına parametreler (aynı şema, en fazla 2 seviye).
params[].min_itemstamsayı≥ 0Yalnız list.
params[].max_itemstamsayı≥ 0Yalnız list.
collectionsnesnePanelde CRUD sayfası olan yönetim verisi.
collections.<anahtar>nesne
collections.<anahtar>.labeli18n metinevet{ "tr": "…", "en": "…" }, tr zorunluKoleksiyon adı.
collections.<anahtar>.scopeenumevetcompany, instancecompany (firma geneli) veya instance (örnek başına).
collections.<anahtar>.fieldsnesneeveten az 1 anahtarAlanlar.
collections.<anahtar>.fields.<anahtar>nesne
collections.<anahtar>.fields.<anahtar>.typeenum | stringevettext, textarea, number, money, boolean, media; desen ^ref:[a-z][a-z0-9_]{0,40}$Alan tipi veya ref:<koleksiyon>.
collections.<anahtar>.fields.<anahtar>.labeli18n metinevet{ "tr": "…", "en": "…" }, tr zorunlu
collections.<anahtar>.fields.<anahtar>.i18nboolean
controlsdizien az 1 öğeCanlı kumanda düğmeleri. live.subscribe yeteneği ister.
controls[].actionanahtarevetdesen ^[a-z][a-z0-9_]{0,40}$
controls[].labeli18n metinevet{ "tr": "…", "en": "…" }, tr zorunlu
controls[].typeenumevetbutton, number, text
adminnesnePanel menüsündeki yönetim sayfaları.
admin.pagesdizieveten az 1 öğe
admin.pages[].keyanahtarevetdesen ^[a-z][a-z0-9_]{0,40}$
admin.pages[].labeli18n metinevet{ "tr": "…", "en": "…" }, tr zorunlu
admin.pages[].kindenumevetcollection, customcollection: otomatik CRUD. custom: targets.admin sayfası.
admin.pages[].collectionanahtardesen ^[a-z][a-z0-9_]{0,40}$
permissionsnesneYetenekler ve özel izinler. Yeni yetenek eklemek sürümü incelemeye düşürür.
permissions.capabilitiesdizievettekrarsız; öğeler: storage, track, data, live.subscribe, live.up, actions.mail; veya proxy:<host>Bridge yetenekleri. Manifestte olmayan istek capability_denied alır.
permissions.customnesneApp’e özel izinler ve etiketleri.
permissions.custom.<anahtar>i18n metin{ "tr": "…", "en": "…" }, tr zorunlu
datanesneSunucu tarafı veri kaynakları.
data.providersdizieveten az 1 öğeVeri sağlayıcıları. Sağlayıcı bildiren app’e data yeteneği örtük verilir.
data.providers[].idenumevetweatherSağlayıcı. Şimdilik yalnız weather.
data.providers[].inputsnesneevetSağlayıcı girdisi → kök parametre anahtarı. weather: { "city": "<text parametre>" }.
migrationsnesneMajor sürümde parametre dönüşümü.
migrations.from_majortamsayıevet≥ 0Önceki major sürüm.
migrations.entrygöreli yolevetdesen ^(?!/)(?![A-Za-z]:)(?!.*\.\.)(?!.*\\)[A-Za-z0-9_./-]+$; en az 1 karakter; en fazla 240 karakterDö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.
  • default tipe uymalı: sayı min/max içinde, select için seçeneklerden biri, liste öğeleri items şemasına uygun.
  • groups tanımlıysa her params[].group bu anahtarlardan biri olmalı (unknown_group). Kullanılmayan grup uyarıdır.
  • list içinde list en fazla bir kez (list_too_deep).
  • dataset parametresi varsa permissions.capabilities içinde data (capability_missing_data); controls varsa live.subscribe.
  • ref:<koleksiyon> hedefi tanımlı olmalı; admin.pages kind: collection ise koleksiyon var olmalı, kind: custom ise targets.admin olmalı.
  • data.providers[].inputs.city kök seviyede, i18n olmayan bir text parametresi olmalı; sağlayıcı id'si ile aynı anahtarlı dataset olamaz.
  • display.idle_timeout_seconds yalnız interactive: true iken yazılabilir.
  • version için semver.valid, sdk_version için semver.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şiklikZorunlu artış
Yalnızca name, description, label, helppatch
groups ekleme, silme, etiket, yardım veya sırapatch
group, default değeri, steppatch
controls, admin.pagespatch
permissions.capabilities içinden yetenek silme, permissions.custompatch
display.resolutions, idle_timeout_secondspatch
targets entry yolu, targets.admin silmepatch
Sayı min azaltma veya kaldırma, max artırma veya kaldırmaminor
accept değer eklememinor
Liste max_items artırma veya kaldırma, min_items azaltma veya kaldırmaminor
display.orientations yön ekleme, display.interactive değişimiminor
targets.legacy ekleme, targets.admin eklememinor
permissions.capabilities yetenek eklememinor
data.providers sağlayıcı eklememinor
data.providers sağlayıcı silme veya inputs değişimipatch
Varsayılanı olan parametre eklemek (zorunlu olsa da)minor
Zorunlu olmayan parametre eklemekminor
Yeni collection veya yeni collection / dataset alanıminor
select seçeneği eklemekminor
Sayı min artırma veya yeni min, max azaltma veya yeni maxmajor
accept değer silmemajor
Liste max_items azaltma veya yeni tavan, min_items artırmamajor
display.orientations yön silmemajor
targets.legacy silmemajor
Parametre silmek veya anahtarını değiştirmekmajor
Parametre type değiştirmekmajor
Varsayılanı olmayan zorunlu parametre eklemekmajor
Mevcut parametreyi varsayılansız zorunlu yapmakmajor
select seçeneği silmekmajor
Collection silmek, alan silmek, alan tipini veya ref hedefini değiştirmekmajor
Collection scope değiştirmek (company ↔ instance)major
i18n bayrağını değiştirmekmajor
İç içe list öğeleriaynı 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 }]
    }
  ]
}

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" }]
    }
  ]
}