uvako-cli 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +143 -125
  2. package/package.json +1 -1
  3. package/src/check.js +32 -0
package/README.md CHANGED
@@ -1,125 +1,143 @@
1
- # uvako-cli
2
-
3
- Uvako mağazaları için tema geliştirme aracı. Temayı başlatır, denetler, mağazanıza yükler ve kaydettikçe canlı önizletir.
4
-
5
- **[Uvako](https://uvako.com)** — Rox Software ürünü.
6
-
7
- Node.js 22 ve üzeri gerekir. Ek bağımlılığı yoktur.
8
-
9
- ## Kurulum
10
-
11
- ```bash
12
- npm install -g uvako-cli
13
- uvako version
14
- ```
15
-
16
- ## Hızlı başlangıç
17
-
18
- 1. Mağaza panelinde **Ayarlar → Temalar → Geliştirici erişimi** bölümünden bir erişim anahtarı oluşturun.
19
- 2. Giriş yapın (anahtar sorulur, ekrana yazılmaz):
20
-
21
- ```bash
22
- uvako login --store magazam
23
- ```
24
-
25
- 3. Bir katalog temasını temel alan yeni tema başlatın:
26
-
27
- ```bash
28
- uvako theme init atolye --base linea
29
- ```
30
-
31
- 4. Canlı geliştirin: dosyaları kaydettikçe tema mağazanıza yüklenir, açık önizleme sayfası kendini yeniler.
32
-
33
- ```bash
34
- uvako theme dev atolye
35
- ```
36
-
37
- Önizleme adresi mağazanızın kendi adresidir (`https://magazam.uvoo.store/?preview=…`); tarayıcıda mağaza
38
- paneline giriş yapmış olmanız gerekir. Tema, panelden yayınlanana kadar vitrininizi değiştirmez.
39
-
40
- ## Komutlar
41
-
42
- | Komut | Ne yapar |
43
- |---|---|
44
- | `uvako login --store <mağaza>` | Mağazaya tema erişim anahtarıyla bağlanır. |
45
- | `uvako logout` · `uvako whoami` | Kayıtlı girişi siler · bağlı mağazayı gösterir. |
46
- | `uvako theme init <anahtar>` | Yeni tema iskeleti (`--base`, `--name`, `--author`). |
47
- | `uvako theme check [klasör]` | Temayı denetler: yapı, ayarlar, bölümler, görseller, güvenlik. |
48
- | `uvako theme dev [klasör]` | Canlı geliştirme: kaydettikçe yükler, önizleme yenilenir. Durdurunca mağaza eski hâline döner (`--keep` ile kütüphanede kalır). |
49
- | `uvako theme push [klasör]` | Temayı mağazanın tema kütüphanesine yükler. |
50
- | `uvako theme pull <anahtar>` | Yüklediğiniz temayı indirir (`--dir`, `--force`). |
51
- | `uvako theme list` | Mağazadaki temaları ve yüklediğiniz paketleri listeler. |
52
- | `uvako theme submit <anahtar>` | Temayı themes.uvako.com için incelemeye gönderir. |
53
- | `uvako theme delete <anahtar> --yes` | Yüklediğiniz paketi siler. |
54
- | `uvako theme package [klasör]` | Denetimden geçen temayı zip paketine çevirir (`--out`). |
55
- | `uvako version` | Sürümü yazar. |
56
-
57
- `uvako-cli` aynı komutların uzun adıdır. Hata varsa çıkış kodu 1'dir. CI için `UVAKO_STORE` ve
58
- `UVAKO_TOKEN` ortam değişkenleri girişin yerini tutar.
59
-
60
- ## Tema paketi
61
-
62
- Tema kod içermez. Bir katalog temasını (`base`) temel alır ve onun üstüne şunları getirir:
63
-
64
- ```
65
- theme.json kimlik: key, name, version, base; mağaza vitrini bilgileri
66
- config/settings_data.json temel temadan farklı olan ayar değerleri
67
- config/settings_schema.json (isteğe bağlı) panelde görünen ayarlar
68
- templates/index.json (isteğe bağlı) ana sayfadaki bölüm sırası
69
- styles/_tokens.scss renk, yazı tipi, köşe değişkenleri (temanın tamamına yayılır)
70
- styles/theme.scss temaya özgü SCSS
71
- assets/ logo, slayt ve banner görselleri, yazı tipleri
72
- reference/ temel temanın ayarları ve bölüm türleri (pakete girmez)
73
- ```
74
-
75
- Bölümlerin kendisi (slayt, banner, ürün vitrini…) temel temadan gelir; paket hangilerinin hangi sırayla
76
- ve hangi görünümle kullanılacağını söyler. Katalog temaları: [themes.uvako.com](https://themes.uvako.com).
77
-
78
- ## Yayınlama
79
-
80
- - `push` ile yüklenen tema **yalnızca kendi mağazanızda** görünür.
81
- - `submit` temayı Uvako incelemesine gönderir. Onaylanan sürüm themes.uvako.com'da listelenir ve diğer
82
- mağazalar kurabilir. Fiyatı (`theme.json` içindeki `price` öneridir) Uvako onaylar.
83
- - Onaydan sonra yüklediğiniz yeni sürümler yeniden onaylanana kadar yalnızca kendi mağazanızı etkiler.
84
-
85
- ## Güvenlik kuralları
86
-
87
- Mağaza, yüklenen paketi aynı kurallarla **kendisi yeniden denetler**; `check` hatayı önceden görmeniz içindir.
88
-
89
- - Yalnızca yukarıdaki dosyalar kabul edilir: JSON, SCSS, görsel ve yazı tipi. JavaScript, şablon ve
90
- çalıştırılabilir dosyalar reddedilir.
91
- - `<script>`, `javascript:` adresleri, `onclick` gibi olay öznitelikleri, `<iframe>` (SVG ve ayar metinleri dahil).
92
- - Kod çalıştıran CSS (`expression`, `behavior`, `-moz-binding`).
93
- - SCSS içinde döngü, fonksiyon ve mixin tanımı (`@while`, `@for`, `@each`, `@function`, `@mixin`, `@use`).
94
- Temel temanın mixin'leri `@include` ile kullanılabilir.
95
- - Paketin kendi dosyaları dışındaki `@import`'lar ve yazı tipi sağlayıcıları dışındaki adresler.
96
- - Sembolik bağlar, gizli dosyalar, 5 MB'tan büyük dosyalar, 60 MB'tan büyük ya da 600 dosyadan fazla paketler.
97
- - Gizli anahtar ya da parola gibi görünen değerler.
98
-
99
- Erişim anahtarı yalnızca tema işlemlerine yetkilidir; sipariş, müşteri ve ayarlara erişemez. Bilgisayarınızda
100
- kullanıcı klasörünüzde saklanır, tema klasörüne yazılmaz, yalnızca giriş yaptığınız mağazaya ve yalnızca
101
- https üzerinden gönderilir. Kaybederseniz panelden iptal edin.
102
-
103
- Araç platformun kaynak kodunu içermez.
104
-
105
- ## Uvako
106
-
107
- [uvako.com](https://uvako.com)
108
-
109
- Uvako, işletmelerin kendi alan adıyla online mağaza kurmasını sağlayan e-ticaret altyapısıdır. Ürün, sipariş, ödeme, kargo, kampanya ve tema yönetimi tek panelde toplanır.
110
-
111
- ## Rox Software · Rox Group
112
-
113
- Bu paket **Rox Software** tarafından geliştirilir ve yayınlanır.
114
-
115
- Rox Software; kurumsal web, e-ticaret, özel yazılım ve kendi ürün platformlarını (RoxB2B, RoxETS, Uvako) geliştiren Ankara merkezli yazılım ekibidir.
116
-
117
- **Rox Group Yazılım Havacılık Uzay ve Savunma Sanayi Limited Şirketi**
118
- İvedikköy Mahallesi 1493. Sokak No:5 Daire:22
119
- 06378 Yenimahalle / Ankara
120
-
121
- - Site: [roxsoftware.net](https://www.roxsoftware.net/)
122
- - Uvako: [uvako.com](https://uvako.com)
123
- - E-posta: info@roxsoftware.net
124
-
125
- Tüm hakları saklıdır. © Rox Group
1
+ # uvako-cli
2
+
3
+ Uvako mağazaları için tema geliştirme aracı. Temayı başlatır, denetler, mağazanıza yükler ve kaydettikçe canlı önizletir.
4
+
5
+ **[Uvako](https://uvako.com)** — Rox Software ürünü.
6
+
7
+ Node.js 22 ve üzeri gerekir. Ek bağımlılığı yoktur.
8
+
9
+ ## Kurulum
10
+
11
+ ```bash
12
+ npm install -g uvako-cli
13
+ uvako version
14
+ ```
15
+
16
+ ## Hızlı başlangıç
17
+
18
+ 1. Mağaza panelinde **Ayarlar → Temalar → Geliştirici erişimi** bölümünden bir erişim anahtarı oluşturun.
19
+ 2. Giriş yapın (anahtar sorulur, ekrana yazılmaz):
20
+
21
+ ```bash
22
+ uvako login --store magazam
23
+ ```
24
+
25
+ 3. Bir katalog temasını temel alan yeni tema başlatın:
26
+
27
+ ```bash
28
+ uvako theme init atolye --base linea
29
+ ```
30
+
31
+ 4. Canlı geliştirin: dosyaları kaydettikçe tema mağazanıza yüklenir, açık önizleme sayfası kendini yeniler.
32
+
33
+ ```bash
34
+ uvako theme dev atolye
35
+ ```
36
+
37
+ Önizleme adresi mağazanızın kendi adresidir (`https://magazam.uvoo.store/?preview=…`); tarayıcıda mağaza
38
+ paneline giriş yapmış olmanız gerekir. Tema, panelden yayınlanana kadar vitrininizi değiştirmez.
39
+
40
+ ## Komutlar
41
+
42
+ | Komut | Ne yapar |
43
+ |---|---|
44
+ | `uvako login --store <mağaza>` | Mağazaya tema erişim anahtarıyla bağlanır. |
45
+ | `uvako logout` · `uvako whoami` | Kayıtlı girişi siler · bağlı mağazayı gösterir. |
46
+ | `uvako theme init <anahtar>` | Yeni tema iskeleti (`--base`, `--name`, `--author`). |
47
+ | `uvako theme check [klasör]` | Temayı denetler: yapı, ayarlar, bölümler, görseller, güvenlik. |
48
+ | `uvako theme dev [klasör]` | Canlı geliştirme: kaydettikçe yükler, önizleme yenilenir. Durdurunca mağaza eski hâline döner (`--keep` ile kütüphanede kalır). |
49
+ | `uvako theme push [klasör]` | Temayı mağazanın tema kütüphanesine yükler. |
50
+ | `uvako theme pull <anahtar>` | Yüklediğiniz temayı indirir (`--dir`, `--force`). |
51
+ | `uvako theme list` | Mağazadaki temaları ve yüklediğiniz paketleri listeler. |
52
+ | `uvako theme submit <anahtar>` | Temayı themes.uvako.com için incelemeye gönderir. |
53
+ | `uvako theme delete <anahtar> --yes` | Yüklediğiniz paketi siler. |
54
+ | `uvako theme package [klasör]` | Denetimden geçen temayı zip paketine çevirir (`--out`). |
55
+ | `uvako version` | Sürümü yazar. |
56
+
57
+ `uvako-cli` aynı komutların uzun adıdır. Hata varsa çıkış kodu 1'dir. CI için `UVAKO_STORE` ve
58
+ `UVAKO_TOKEN` ortam değişkenleri girişin yerini tutar.
59
+
60
+ ## Tema paketi
61
+
62
+ Tema kod içermez. Bir katalog temasını (`base`) temel alır ve onun üstüne şunları getirir:
63
+
64
+ ```
65
+ theme.json kimlik: key, name, version, base; mağaza vitrini bilgileri
66
+ config/settings_data.json temel temadan farklı olan ayar değerleri
67
+ config/settings_schema.json (isteğe bağlı) panelde görünen ayarlar
68
+ templates/index.json (isteğe bağlı) ana sayfadaki bölüm sırası
69
+ styles/_tokens.scss renk, yazı tipi, köşe değişkenleri (temanın tamamına yayılır)
70
+ styles/theme.scss temaya özgü SCSS
71
+ assets/ logo, slayt ve banner görselleri, yazı tipleri
72
+ reference/ temel temanın ayarları ve bölüm türleri (pakete girmez)
73
+ ```
74
+
75
+ Bölümlerin kendisi (slayt, banner, ürün vitrini…) temel temadan gelir; paket hangilerinin hangi sırayla
76
+ ve hangi görünümle kullanılacağını söyler. Katalog temaları: [themes.uvako.com](https://themes.uvako.com).
77
+
78
+ ### Ürün sayfası sekmeleri
79
+
80
+ Ürün detay sayfasındaki sekmeler `config/settings_data.json` içindeki `product_detail_page_tabs` ile açılır
81
+ (`1` açık, `0` kapalı). Sekme başlıkları ilgili `tab_*` ayarlarıyla değişir.
82
+
83
+ | `product_detail_page_tabs` anahtarı | Sekme | Başlık ayarı |
84
+ |---|---|---|
85
+ | (her zaman açık) | Ürün Bilgisi | `tab_product_info` |
86
+ | `display_product_comments` | Yorumlar | `tab_product_comments` |
87
+ | `display_product_questions` | Soru & Cevap | `tab_product_questions` |
88
+ | `display_payment_options` | Taksit Seçenekleri (sanal pos oranlarıyla, yoksa elle girilen planlarla) | `tab_product_payment_options` |
89
+ | `display_product_feeds` | Önerileriniz (geri bildirim formu) | `tab_product_feeds` |
90
+ | `display_shopping_experiences` | Alışveriş Deneyimi | `tab_shopping_experiences` |
91
+
92
+ Taksit sekmesi mağazada satış kapalıysa (fiyatı gizli, WhatsApp satışı) görünmez.
93
+
94
+ `uvako theme check` bu ayarı denetler: bilinmeyen sekme anahtarı uyarı, 1/0 dışı değer ve metin olmayan başlık hata verir.
95
+
96
+ ## Yayınlama
97
+
98
+ - `push` ile yüklenen tema **yalnızca kendi mağazanızda** görünür.
99
+ - `submit` temayı Uvako incelemesine gönderir. Onaylanan sürüm themes.uvako.com'da listelenir ve diğer
100
+ mağazalar kurabilir. Fiyatı (`theme.json` içindeki `price` öneridir) Uvako onaylar.
101
+ - Onaydan sonra yüklediğiniz yeni sürümler yeniden onaylanana kadar yalnızca kendi mağazanızı etkiler.
102
+
103
+ ## Güvenlik kuralları
104
+
105
+ Mağaza, yüklenen paketi aynı kurallarla **kendisi yeniden denetler**; `check` hatayı önceden görmeniz içindir.
106
+
107
+ - Yalnızca yukarıdaki dosyalar kabul edilir: JSON, SCSS, görsel ve yazı tipi. JavaScript, şablon ve
108
+ çalıştırılabilir dosyalar reddedilir.
109
+ - `<script>`, `javascript:` adresleri, `onclick` gibi olay öznitelikleri, `<iframe>` (SVG ve ayar metinleri dahil).
110
+ - Kod çalıştıran CSS (`expression`, `behavior`, `-moz-binding`).
111
+ - SCSS içinde döngü, fonksiyon ve mixin tanımı (`@while`, `@for`, `@each`, `@function`, `@mixin`, `@use`).
112
+ Temel temanın mixin'leri `@include` ile kullanılabilir.
113
+ - Paketin kendi dosyaları dışındaki `@import`'lar ve yazı tipi sağlayıcıları dışındaki adresler.
114
+ - Sembolik bağlar, gizli dosyalar, 5 MB'tan büyük dosyalar, 60 MB'tan büyük ya da 600 dosyadan fazla paketler.
115
+ - Gizli anahtar ya da parola gibi görünen değerler.
116
+
117
+ Erişim anahtarı yalnızca tema işlemlerine yetkilidir; sipariş, müşteri ve ayarlara erişemez. Bilgisayarınızda
118
+ kullanıcı klasörünüzde saklanır, tema klasörüne yazılmaz, yalnızca giriş yaptığınız mağazaya ve yalnızca
119
+ https üzerinden gönderilir. Kaybederseniz panelden iptal edin.
120
+
121
+ Araç platformun kaynak kodunu içermez.
122
+
123
+ ## Uvako
124
+
125
+ [uvako.com](https://uvako.com)
126
+
127
+ Uvako, işletmelerin kendi alan adıyla online mağaza kurmasını sağlayan e-ticaret altyapısıdır. Ürün, sipariş, ödeme, kargo, kampanya ve tema yönetimi tek panelde toplanır.
128
+
129
+ ## Rox Software · Rox Group
130
+
131
+ Bu paket **Rox Software** tarafından geliştirilir ve yayınlanır.
132
+
133
+ Rox Software; kurumsal web, e-ticaret, özel yazılım ve kendi ürün platformlarını (RoxB2B, RoxETS, Uvako) geliştiren Ankara merkezli yazılım ekibidir.
134
+
135
+ **Rox Group Yazılım Havacılık Uzay ve Savunma Sanayi Limited Şirketi**
136
+ İvedikköy Mahallesi 1493. Sokak No:5 Daire:22
137
+ 06378 Yenimahalle / Ankara
138
+
139
+ - Site: [roxsoftware.net](https://www.roxsoftware.net/)
140
+ - Uvako: [uvako.com](https://uvako.com)
141
+ - E-posta: info@roxsoftware.net
142
+
143
+ Tüm hakları saklıdır. © Rox Group
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uvako-cli",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "Uvako tema geliştirme aracı. Tema başlatır, denetler, mağazaya yükler ve canlı önizletir. https://uvako.com",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
package/src/check.js CHANGED
@@ -172,6 +172,36 @@ function checkTemplate(index, types, report, source) {
172
172
  }
173
173
  }
174
174
 
175
+ // Ürün sayfası sekmeleri: product_detail_page_tabs anahtarları ve her sekmenin başlık ayarı.
176
+ export const productTabKeys = {
177
+ display_product_comments: "tab_product_comments",
178
+ display_product_questions: "tab_product_questions",
179
+ display_payment_options: "tab_product_payment_options",
180
+ display_product_feeds: "tab_product_feeds",
181
+ display_shopping_experiences: "tab_shopping_experiences",
182
+ display_special_information_area: null,
183
+ };
184
+
185
+ function checkProductTabs(data, report) {
186
+ if (!data || typeof data !== "object" || !("product_detail_page_tabs" in data)) return;
187
+ const value = data.product_detail_page_tabs;
188
+ if ([0, 1, "0", "1", true, false].includes(value)) return;
189
+ const where = 'config/settings_data.json: "product_detail_page_tabs"';
190
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
191
+ report.errors.push(`${where} 1 (hepsi açık) ya da {"display_product_comments": 1, …} nesnesi olmalı.`);
192
+ return;
193
+ }
194
+ for (const [key, flag] of Object.entries(value)) {
195
+ if (!(key in productTabKeys)) {
196
+ report.warnings.push(`${where}: "${key}" bilinen bir sekme değil (${Object.keys(productTabKeys).join(", ")}).`);
197
+ continue;
198
+ }
199
+ if (![0, 1, "0", "1", true, false].includes(flag)) report.errors.push(`${where}: "${key}" değeri 1 ya da 0 olmalı.`);
200
+ const label = productTabKeys[key];
201
+ if (label && label in data && typeof data[label] !== "string") report.errors.push(`config/settings_data.json: "${label}" sekme başlığı metin olmalı.`);
202
+ }
203
+ }
204
+
175
205
  function checkImages(data, assets, report) {
176
206
  if (!data || typeof data !== "object") return;
177
207
  for (const [name, value] of Object.entries(data)) {
@@ -245,6 +275,7 @@ function checkPackage(dir, meta, report) {
245
275
  const reference = existsSync(path.join(dir, "reference", "sections.json")) ? readJson(path.join(dir, "reference", "sections.json"), { errors: [] }, "") : null;
246
276
  checkTemplate(index, reference?.sections ? new Set(Object.keys(reference.sections)) : null, report, `${base} temasında`);
247
277
  checkImages(data, path.join(dir, "assets"), report);
278
+ checkProductTabs(data, report);
248
279
  for (const shot of [meta?.screenshot, ...(Array.isArray(meta?.screenshots) ? meta.screenshots : [])]) {
249
280
  const rel = String(shot ?? "").trim().replace(/^\//, "").replace(/^assets\//, "");
250
281
  if (rel && !existsSync(path.join(dir, "assets", rel))) report.errors.push(`theme.json: ekran görüntüsü pakette yok (assets/${rel}).`);
@@ -289,6 +320,7 @@ function checkRepo(dir, meta, key, where, report) {
289
320
  }
290
321
  const data = readJson(path.join(dir, "config", "settings_data.json"), report, "config/settings_data.json");
291
322
  if (data && (typeof data !== "object" || Array.isArray(data))) report.errors.push("config/settings_data.json: anahtar-değer nesnesi olmalı.");
323
+ else checkProductTabs(data, report);
292
324
 
293
325
  const sections = readJson(path.join(dir, "config", "sections.json"), report, "config/sections.json");
294
326
  const types = new Set(Object.keys(sections?.sections ?? {}));