uvako-cli 0.2.0 → 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.
- package/README.md +143 -125
- package/package.json +1 -1
- package/src/check.js +32 -0
- package/src/main.js +1 -0
- package/src/remote.js +38 -5
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. |
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
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 ?? {}));
|
package/src/main.js
CHANGED
|
@@ -23,6 +23,7 @@ Tema:
|
|
|
23
23
|
Bir katalog temasını temel alan yeni tema iskeleti
|
|
24
24
|
uvako theme check [klasör] Temayı denetler (yapı, ayarlar, güvenlik)
|
|
25
25
|
uvako theme dev [klasör] Canlı geliştirme: kaydettikçe mağazaya yükler, önizleme yenilenir
|
|
26
|
+
Durdurunca mağaza eski hâline döner (--keep: kütüphanede bırak)
|
|
26
27
|
uvako theme push [klasör] Temayı mağazanın tema kütüphanesine yükler
|
|
27
28
|
uvako theme pull <anahtar> [--dir klasör] Yüklediğiniz temayı indirir
|
|
28
29
|
uvako theme list Mağazadaki temaları ve yüklediğiniz paketleri listeler
|
package/src/remote.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, watch, writeFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, watch, writeFileSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { ApiError, call } from "./api.js";
|
|
4
4
|
import { printReport } from "./check.js";
|
|
@@ -152,11 +152,23 @@ export async function dev(target, options) {
|
|
|
152
152
|
const dir = path.resolve(target ?? ".");
|
|
153
153
|
let current;
|
|
154
154
|
let first;
|
|
155
|
+
// Geliştirme bitince mağaza başladığı hâle döner: paket önceden yüklüyse o sürüm geri yüklenir,
|
|
156
|
+
// değilse geliştirme kopyası silinir. `--keep` son hâli kütüphanede bırakır.
|
|
157
|
+
let before = null;
|
|
158
|
+
let existed = false;
|
|
155
159
|
try {
|
|
156
160
|
current = session(typeof options.store === "string" ? options.store : "");
|
|
161
|
+
const key = String(JSON.parse(readFileSync(path.join(dir, "theme.json"), "utf8")).key ?? "");
|
|
162
|
+
if (!options.keep && key) {
|
|
163
|
+
const state = await call(current, "GET", "/themes");
|
|
164
|
+
existed = state.packages.some((pkg) => pkg.key === key);
|
|
165
|
+
if (existed) before = await call(current, "GET", `/themes/${encodeURIComponent(key)}/package`, { raw: true });
|
|
166
|
+
}
|
|
157
167
|
first = await upload(current, dir);
|
|
158
168
|
} catch (error) {
|
|
159
|
-
return explain(error);
|
|
169
|
+
if (error instanceof ApiError) return explain(error);
|
|
170
|
+
console.error(`✖ ${error.message}`);
|
|
171
|
+
return 1;
|
|
160
172
|
}
|
|
161
173
|
if (!first) {
|
|
162
174
|
console.error("Başlatılamadı: önce hataları düzeltin.");
|
|
@@ -166,6 +178,8 @@ export async function dev(target, options) {
|
|
|
166
178
|
console.log(`Önizleme: ${previewUrl(current.origin, first.installationId)}`);
|
|
167
179
|
console.log(`Düzenleme: ${editorUrl(current.origin, first.installationId)}`);
|
|
168
180
|
console.log("Önizleme için tarayıcıda mağaza paneline giriş yapın. Dosyaları kaydettikçe sayfa yenilenir. Durdurmak için Ctrl+C.\n");
|
|
181
|
+
console.log(options.keep ? "Durdurduğunuzda tema son hâliyle kütüphanede kalır (--keep)." : existed ? "Durdurduğunuzda mağazadaki paket geliştirme öncesindeki sürümüne döner. Kalıcı yüklemek için: uvako theme push" : "Durdurduğunuzda geliştirme kopyası mağazadan silinir. Kalıcı yüklemek için: uvako theme push");
|
|
182
|
+
console.log("");
|
|
169
183
|
|
|
170
184
|
let timer = null;
|
|
171
185
|
let running = false;
|
|
@@ -204,10 +218,29 @@ export async function dev(target, options) {
|
|
|
204
218
|
timer = setTimeout(() => void sync(), 300);
|
|
205
219
|
});
|
|
206
220
|
return new Promise((resolve) => {
|
|
207
|
-
|
|
221
|
+
let stopping = false;
|
|
222
|
+
process.on("SIGINT", async () => {
|
|
223
|
+
if (stopping) return;
|
|
224
|
+
stopping = true;
|
|
208
225
|
watcher.close();
|
|
209
|
-
|
|
210
|
-
|
|
226
|
+
clearTimeout(timer);
|
|
227
|
+
const key = first.package.key;
|
|
228
|
+
try {
|
|
229
|
+
if (options.keep) {
|
|
230
|
+
console.log("\nCanlı geliştirme durdu. Tema son hâliyle mağaza kütüphanesinde duruyor.");
|
|
231
|
+
} else if (before) {
|
|
232
|
+
await call(current, "PUT", "/themes", { body: before });
|
|
233
|
+
console.log("\nCanlı geliştirme durdu. Mağazadaki paket geliştirme öncesindeki sürümüne döndü.");
|
|
234
|
+
} else {
|
|
235
|
+
await call(current, "DELETE", `/themes/${encodeURIComponent(key)}`);
|
|
236
|
+
console.log("\nCanlı geliştirme durdu. Geliştirme kopyası mağazadan silindi; vitrin ve kütüphane eski hâlinde.");
|
|
237
|
+
}
|
|
238
|
+
resolve(0);
|
|
239
|
+
} catch (error) {
|
|
240
|
+
console.error(`\nCanlı geliştirme durdu ama mağaza eski hâline döndürülemedi: ${error.message}`);
|
|
241
|
+
console.error(`Elle kaldırmak için: uvako theme delete ${key} --yes`);
|
|
242
|
+
resolve(1);
|
|
243
|
+
}
|
|
211
244
|
});
|
|
212
245
|
});
|
|
213
246
|
}
|