Nuvaka › Geliştirici belgeleri › Uygulama içi mağaza

Uygulama içi mağaza: eklentiler

Bir uzantı kendi eklenti mağazasını açabilir: kod düzenleyiciye dil ve tema paketi, bir oyuna seviye paketi, bir araca komut. Eklentiyi başka geliştiriciler yayınlar; kullanıcı ana uygulamanın içinden kurar. Nuvaka mağazasının güvenliği (imza, tarama, inceleme, geri çekme) eklentiler için de aynen geçerlidir.

Not: SDK tarafı (nuvaka.addons) Nuvaka 0.3.1 ile gelir. Mağaza ve yayın kuralları şimdiden geçerlidir.

Terimler

  • Ana uygulama (host): eklenti kabul eden uzantı. Manifestinde addons alanı vardır.
  • Eklenti (addon): manifestinde addonOf olan bir Nuvaka paketi. İki türü vardır:
    • Veri eklentisi ("addonKind": "data"): kod çalıştırmaz. JSON, metin ve görsellerden oluşur; ana uygulama okur ve yorumlar.
    • Kod eklentisi ("addonKind": "code"): kendi sayfası ya da arka plan betiği olan normal bir uzantıdır. Ana uygulama, expose ettiği işlevleri çağırır.

Ana uygulamanın manifesti

"addons": {
  "kinds": ["data", "code"],
  "open": true,
  "schema": "codeeditor.addon/1",
  "maxSizeMB": 5
}
AlanKural
kindszorunlu; kabul edilen türler: "data", "code" ya da ikisi
openzorunlu; true ise herkes eklenti yayınlayabilir, false ise yalnız ana uygulamanın yayıncısı
schemaisteğe bağlı; veri eklentilerinin uyacağı biçimin adı (ör. codeeditor.addon/1). Belgelemek ana uygulamanın işidir.
maxSizeMBisteğe bağlı; 1–20. Eklenti paketinin en büyük boyutu (varsayılan 20).

addons alanı kaldırılırsa ya da open kapatılırsa yayındaki eklentiler kalır; yenileri kabul edilmez (addons_not_accepted / addons_closed).

Eklentinin manifesti

{
  "id": "rust-lang-pack",
  "name": { "tr": "Rust dil paketi", "en": "Rust language pack" },
  "version": "1.0.0",
  "addonOf": "code-editor",
  "addonKind": "data",
  "minAppVersion": "0.3.1"
}
  • addonOf: ana uygulamanın kimliği. İlk yayından sonra değiştirilemez. Yayında olan normal bir uzantı sonradan eklentiye dönüştürülemez.
  • addonKind: data ya da code; ana uygulamanın kinds listesinde olmalı (yoksa addon_kind_not_accepted).

Veri eklentisi kuralları

  • Bu alanlar yasaktır: entry, pages, permissions, storage, shared, triggers, settings, contributes, workers, addons, dependencies.
  • Yalnız bu dosya türleri: json, txt, md, png, jpg, jpeg, webp, svg. SVG'de <script>, on*= öznitelikleri, foreignObject, javascript:, iframe/embed/object olamaz.
  • En çok 20 MB (ya da ana uygulamanın maxSizeMB değeri; aşarsa addon_too_large) ve 500 dosya.

Kod eklentisi kuralları

  • Ana uygulamaya zorunlu bir extends bağımlılığı olmalı (Bağımlılıklar): { "id": "<ana>", "version": "^x.y.z", "kind": "extends" }.
  • İzin devralınmaz: kod eklentisi kendi izinlerini ister, kullanıcı onlara ayrıca onay verir.
  • Normal uzantıların tüm kuralları (lint, tarama, inceleme) geçerlidir.

Platform

Eklentinin platforms kümesi ana uygulamanınkinin içinde olmalı (Platform uyumluluğu); değilse platform_exceeds_dependency.

CLI ile başlamak

nuvaka-ext init rust-lang-pack --addon-of code-editor --kind data
nuvaka-ext init my-formatter --addon-of code-editor --kind code

Yayın her zamanki gibi nuvaka-ext publish ile yapılır.

Mağazada eklentiler

  • Eklentiler Nuvaka mağazasının ana listelerinde görünmez. Ana uygulamanın kendi mağaza sekmesinde ve yayıncı sayfalarında görünür.
  • GET /api/ext/v1/store?addonOf=<host>: bir ana uygulamanın eklentileri. Arama, sıralama ve sayfalama aynıdır.
  • Ana uygulamanın detayı addons: { kinds, open, schema, maxSizeMB, count } döner.

Kurulum ve kaldırma

  • Eklenti yalnız ana uygulama kuruluysa kurulur; değilse sunucu 409 host_required ve { host } döner.
  • Kurulumu her zaman kullanıcı onaylar: ana uygulama nuvaka.addons.install çağırsa bile Nuvaka kendi onay penceresini gösterir.
  • Ana uygulama kaldırılınca Nuvaka eklentilerini de kaldırmayı önerir. Eklentinin verisi 30 gün saklanır.

Ana uygulama API'si: nuvaka.addons

Bu çağrıları yalnız ana uygulama (addons alanı olan uzantı) yapabilir. store her zaman çağıranın kendi iç mağazasını listeler; bir uygulama başkasının iç mağazasını göremez. call ana uygulamanın izinlerini eklentiye vermez.

ÇağrıAçıklama
list()Kurulu eklentiler: [{ id, version, kind, name, files }]
read(id, path)Veri eklentisinden bir dosya; Uint8Array
readText(id, path) / readJson(id, path)Aynısı, metin ya da ayrıştırılmış JSON olarak
call(id, method, arg)Kod eklentisinin expose ettiği bir işlevi çağırır
store(query)Bu ana uygulamanın eklenti mağazası listesini döner
install(id)Kurulumu başlatır; Nuvaka onay penceresini gösterir. Vazgeçilirse cancelled.
uninstall(id)Kaldırmayı başlatır (onaylı)
onChanged(cb)Eklenti kurulunca, güncellenince ya da kaldırılınca çağrılır
for (const a of await nuvaka.addons.list()) {
  if (a.kind !== 'data') continue
  const meta = await nuvaka.addons.readJson(a.id, 'addon.json')
  registerLanguages(meta.languages)
}
nuvaka.addons.onChanged(() => location.reload())

Örnek şema: codeeditor.addon/1

Nuvaka'nın kod düzenleyicisi dil, tema ve kod parçacığı eklentisi kabul eder. Veri eklentisinin kökünde addon.json bulunur:

{
  "schema": "codeeditor.addon/1",
  "languages": [
    { "id": "rust", "extensions": [".rs"], "aliases": ["Rust"],
      "monarch": "rust.monarch.json", "configuration": "rust.config.json" }
  ],
  "themes": [
    { "id": "ember", "label": { "tr": "Kor", "en": "Ember" }, "base": "vs-dark", "file": "ember.theme.json" }
  ],
  "snippets": [{ "language": "rust", "file": "rust.snippets.json" }]
}
  • Tema dosyası: { "inherit": true, "rules": [...], "colors": { ... } }.
  • Kod parçacıkları VS Code biçimindedir (prefix, body, description).
  • Kod eklentisi komut ekler:
nuvaka.expose('codeeditor.commands', () => [{ id: 'sort-lines', title: 'Satırları sırala' }])
nuvaka.expose('codeeditor.run', ({ command, text, selection, language, fileName }) => {
  const sorted = text.split('\n').sort().join('\n')
  return { text: sorted, replace: 'selection', message: 'Sıralandı' }
})

replace: 'selection' ya da 'document'. message isteğe bağlıdır ve durum çubuğunda görünür.

Hata kodları

KodAnlamı
addons_not_acceptedHedef uzantı eklenti kabul etmiyor
addon_kind_not_acceptedBu tür (data/code) kabul edilmiyor
addons_closedopen: false; yalnız ana uygulamanın yayıncısı yayınlayabilir
addon_too_largePaket maxSizeMB sınırını aşıyor
platform_exceeds_dependencyEklentinin platformları ana uygulamanınkini aşıyor
host_required(409) Önce ana uygulama kurulmalı
"addonOf değiştirilemez"Yayındaki bir eklentinin ana uygulaması değiştirilemez
"yayındaki uzantı eklentiye dönüştürülemez"Normal uzantı sonradan eklenti yapılamaz; yeni kimlikle yayınla

Nuvaka Apps API v1 · son güncelleme 2026-09-28