tsoft-cli 1.2.0 → 1.2.1
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/CHANGELOG.md +15 -0
- package/README.md +108 -7
- package/bin/index.js +37 -41
- package/package.json +1 -1
- package/src/commands/create.js +59 -25
- package/src/commands/start.js +103 -80
package/CHANGELOG.md
CHANGED
|
@@ -13,3 +13,18 @@
|
|
|
13
13
|
|
|
14
14
|
### Fixed
|
|
15
15
|
- Birkaç hata düzeltildi ve genel kod kalitesi iyileştirildi.
|
|
16
|
+
|
|
17
|
+
# Changelog
|
|
18
|
+
|
|
19
|
+
## [1.2.1] - 2024-06-13
|
|
20
|
+
### Added
|
|
21
|
+
- T-Soft CLI'de yeni bir site oluşturma ve geçerliliğini kontrol etme özelliği eklendi.
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- `start.js` ve `create.js` dosyalarında refaktörizasyon yapıldı.
|
|
25
|
+
- T-Soft CLI ana menüsü, site ve tema seçimlerinin interaktif hale getirilmesi amacıyla güncellendi.
|
|
26
|
+
- Tüm metinler Türkçeleştirildi ve kullanıcıya daha açıklayıcı mesajlar sağlandı.
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
- Geliştirme ortamı başlatıldığında programın beklenmedik şekilde kapanmasına sebep olan hata giderildi.
|
|
30
|
+
- T-Soft CLI'nın `start.js` dosyasında initialize fonksiyonunun doğru şekilde çalışmaması sorunu çözüldü.
|
package/README.md
CHANGED
|
@@ -1,10 +1,111 @@
|
|
|
1
|
-
|
|
1
|
+
<style>
|
|
2
|
+
.container { max-width: 800px; margin: 0 auto; padding: 20px; box-shadow: 0 0 10px rgba(0,0,0,0.1); }
|
|
3
|
+
</style>
|
|
4
|
+
T-Soft CLI Kullanım Kılavuzu
|
|
2
5
|
|
|
3
|
-
|
|
4
|
-
|
|
6
|
+
T-Soft CLI Kullanım Kılavuzu
|
|
7
|
+
============================
|
|
5
8
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
npm install -g tsoft-cli
|
|
9
|
-
```
|
|
9
|
+
Açıklama
|
|
10
|
+
--------
|
|
10
11
|
|
|
12
|
+
T-Soft CLI, T-Soft için tema geliştirmek isteyen geliştiriciler için özel olarak hazırlanmış bir komut satırı arayüzüdür. Bu araç ile yeni temalar oluşturabilir, mevcut temaları düzenleyebilir ve geliştirme ortamınızı kolaylıkla yönetebilirsiniz.
|
|
13
|
+
|
|
14
|
+
Kurulum
|
|
15
|
+
-------
|
|
16
|
+
|
|
17
|
+
CLI aracını kullanmaya başlamadan önce, aşağıdaki adımları izleyerek T-Soft CLI'yı kurmanız gerekmektedir:
|
|
18
|
+
|
|
19
|
+
### NPM ile Kurulum
|
|
20
|
+
|
|
21
|
+
T-Soft CLI'yı global olarak kurmak için aşağıdaki komutu çalıştırın:
|
|
22
|
+
|
|
23
|
+
npm install -g tsoft-cli
|
|
24
|
+
|
|
25
|
+
Kullanım
|
|
26
|
+
--------
|
|
27
|
+
|
|
28
|
+
CLI arayüzünü çalıştırmak için terminale `tsoft-cli` yazmanız yeterlidir:
|
|
29
|
+
|
|
30
|
+
tsoft-cli
|
|
31
|
+
|
|
32
|
+
### Ana Menü
|
|
33
|
+
|
|
34
|
+
CLI başlatıldığında aşağıdaki seçeneklerle ana menü görünür:
|
|
35
|
+
|
|
36
|
+
* Yeni bir tema oluştur
|
|
37
|
+
* Geliştirme ortamını başlat
|
|
38
|
+
* Çıkış
|
|
39
|
+
|
|
40
|
+
### Yeni Bir Tema Oluşturma
|
|
41
|
+
|
|
42
|
+
Yeni bir tema oluşturmak için aşağıdaki adımları izleyin:
|
|
43
|
+
|
|
44
|
+
1. **Yeni Tema Oluşturma Seçeneğini Seçin**: Ana menüden `Yeni bir tema oluştur` seçeneğini seçin.
|
|
45
|
+
2. **Site Adı Seçimi**:
|
|
46
|
+
* Mevcut sitelerden birini seçin veya `Yeni bir site oluştur` seçeneğini seçin.
|
|
47
|
+
* Yeni bir site oluşturmak istiyorsanız, site adını girin. Bu ad, geçerliliği kontrol edilecektir.
|
|
48
|
+
3. **Tema Detayları**:
|
|
49
|
+
* Tema adı, yazar adı (isteğe bağlı) ve versiyon numarasını girin.
|
|
50
|
+
4. **Tema Oluşturma**: Tema başarıyla oluşturulduktan sonra otomatik olarak geliştirme ortamına geçilir.
|
|
51
|
+
|
|
52
|
+
### Geliştirme Ortamını Başlatma
|
|
53
|
+
|
|
54
|
+
Mevcut bir temayı düzenlemek veya geliştirmek için geliştirme ortamını başlatabilirsiniz:
|
|
55
|
+
|
|
56
|
+
1. **Geliştirme Ortamını Başlatma Seçeneğini Seçin**: Ana menüden `Geliştirme ortamını başlat` seçeneğini seçin.
|
|
57
|
+
2. **Site ve Tema Seçimi**:
|
|
58
|
+
* Mevcut sitelerden birini seçin.
|
|
59
|
+
* Seçilen sitedeki temalardan birini seçin.
|
|
60
|
+
3. **Geliştirme Ortamı**: Seçilen tema için geliştirme ortamı başlatılır ve dosya değişiklikleri izlenir.
|
|
61
|
+
|
|
62
|
+
### Geliştirme Ortamında Kullanılabilir Komutlar
|
|
63
|
+
|
|
64
|
+
Geliştirme ortamında aşağıdaki komutları kullanabilirsiniz:
|
|
65
|
+
|
|
66
|
+
* `q`: Dosya izlemeyi sonlandırır.
|
|
67
|
+
* `u`: Temayı günceller.
|
|
68
|
+
* `s`: Tüm dosyaları kaydeder.
|
|
69
|
+
* `e`: `.theme` dosyasını düzenler.
|
|
70
|
+
* `o`: Tema dizinini açar.
|
|
71
|
+
|
|
72
|
+
Proje Yapısı
|
|
73
|
+
------------
|
|
74
|
+
|
|
75
|
+
Projenizin dosya yapısı şu şekildedir:
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
tsoft-cli/
|
|
79
|
+
├── bin/
|
|
80
|
+
│ └── index.js
|
|
81
|
+
├── src/
|
|
82
|
+
│ ├── commands/
|
|
83
|
+
│ │ ├── create.js
|
|
84
|
+
│ │ └── start.js
|
|
85
|
+
│ ├── tsoft/
|
|
86
|
+
│ │ └── themeManager.js
|
|
87
|
+
│ ├── utils.js
|
|
88
|
+
│ └── constants.js
|
|
89
|
+
├── CHANGELOG.md
|
|
90
|
+
├── package.json
|
|
91
|
+
└── README.md
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
### Dosya ve Klasör Açıklamaları
|
|
95
|
+
|
|
96
|
+
* `bin/index.js`: Ana CLI giriş noktasıdır. Kullanıcı komutları burada işlenir ve ilgili komut dosyaları çalıştırılır.
|
|
97
|
+
* `src/commands/create.js`: Yeni bir tema oluşturmak için kullanılan komut dosyasıdır. Kullanıcıdan site ve tema adı alır ve temayı oluşturur.
|
|
98
|
+
* `src/commands/start.js`: Geliştirme ortamını başlatmak için kullanılan komut dosyasıdır. Dosya değişikliklerini izler ve temayı günceller.
|
|
99
|
+
* `src/tsoft/themeManager.js`: Tema yönetimi işlemlerini gerçekleştiren sınıftır. Temanın başlatılması, geçerliliğinin kontrol edilmesi ve ortamın oluşturulması işlemlerini yapar.
|
|
100
|
+
* `src/utils.js`: Yardımcı fonksiyonlar içerir.
|
|
101
|
+
* `src/constants.js`: Sabit değerleri içerir.
|
|
102
|
+
|
|
103
|
+
Katkıda Bulunma
|
|
104
|
+
---------------
|
|
105
|
+
|
|
106
|
+
Proje açık kaynaklıdır ve katkılara açıktır. Katkıda bulunmak isterseniz, lütfen bir pull request gönderin veya bir issue açın.
|
|
107
|
+
|
|
108
|
+
Lisans
|
|
109
|
+
------
|
|
110
|
+
|
|
111
|
+
Bu proje ISC lisansı altında lisanslanmıştır. Daha fazla bilgi için `LICENSE` dosyasına bakabilirsiniz.
|
package/bin/index.js
CHANGED
|
@@ -1,74 +1,70 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
const { Select
|
|
3
|
+
const { Select } = require('enquirer');
|
|
4
4
|
const { start } = require('../src/commands/start');
|
|
5
5
|
const { createTheme } = require('../src/commands/create');
|
|
6
6
|
const { clearScreen, displayAsciiArt } = require('../src/utils');
|
|
7
7
|
const fs = require('fs');
|
|
8
8
|
const path = require('path');
|
|
9
9
|
|
|
10
|
+
async function getDirectories(source) {
|
|
11
|
+
return fs.readdirSync(source).filter(file => {
|
|
12
|
+
return file.charAt(0) !== '.' && !['node_modules', 'build', 'dist'].includes(file);
|
|
13
|
+
}).filter(file => fs.statSync(path.join(source, file)).isDirectory());
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async function selectFromChoices(message, choices) {
|
|
17
|
+
const prompt = new Select({
|
|
18
|
+
name: 'selection',
|
|
19
|
+
message: message,
|
|
20
|
+
choices: choices
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
return await prompt.run();
|
|
24
|
+
}
|
|
25
|
+
|
|
10
26
|
async function selectSiteAndTheme() {
|
|
11
27
|
const cwd = process.cwd();
|
|
12
|
-
const sites =
|
|
13
|
-
return file.charAt(0) !== '.' && !['node_modules', 'build', 'dist'].includes(file);
|
|
14
|
-
}).filter(file => fs.statSync(path.join(cwd, file)).isDirectory());
|
|
28
|
+
const sites = await getDirectories(cwd);
|
|
15
29
|
|
|
16
30
|
if (sites.length === 0) {
|
|
17
31
|
console.error('Mevcut dizinde site bulunamadı.');
|
|
18
32
|
return null;
|
|
19
33
|
}
|
|
20
34
|
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
message: 'Bir site seçin:',
|
|
24
|
-
choices: sites
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
const selectedSite = await sitePrompt.run();
|
|
28
|
-
|
|
29
|
-
const themes = fs.readdirSync(path.join(cwd, selectedSite)).filter(file => {
|
|
30
|
-
return fs.statSync(path.join(cwd, selectedSite, file)).isDirectory();
|
|
31
|
-
});
|
|
35
|
+
const selectedSite = await selectFromChoices('Bir site seçin:', sites);
|
|
36
|
+
const themes = await getDirectories(path.join(cwd, selectedSite));
|
|
32
37
|
|
|
33
38
|
if (themes.length === 0) {
|
|
34
39
|
console.error('Seçilen site dizininde tema bulunamadı.');
|
|
35
40
|
return null;
|
|
36
41
|
}
|
|
37
42
|
|
|
38
|
-
const
|
|
39
|
-
name: 'theme',
|
|
40
|
-
message: 'Bir tema seçin:',
|
|
41
|
-
choices: themes
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
const selectedTheme = await themePrompt.run();
|
|
43
|
+
const selectedTheme = await selectFromChoices('Bir tema seçin:', themes);
|
|
45
44
|
|
|
46
45
|
return { siteName: selectedSite, themeName: selectedTheme };
|
|
47
46
|
}
|
|
48
47
|
|
|
49
48
|
async function showMainMenu() {
|
|
50
49
|
clearScreen();
|
|
51
|
-
|
|
52
50
|
await displayAsciiArt();
|
|
53
51
|
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
console.log('Programdan çıkılıyor. Hoşça kalın!');
|
|
71
|
-
process.exit(0);
|
|
52
|
+
const commandChoices = ['Yeni bir tema oluştur', 'Geliştirme ortamını başlat', 'Çıkış'];
|
|
53
|
+
const selectedCommand = await selectFromChoices('Bir komut seçin', commandChoices);
|
|
54
|
+
|
|
55
|
+
switch (selectedCommand) {
|
|
56
|
+
case 'Yeni bir tema oluştur':
|
|
57
|
+
await createTheme();
|
|
58
|
+
break;
|
|
59
|
+
case 'Geliştirme ortamını başlat':
|
|
60
|
+
const selection = await selectSiteAndTheme();
|
|
61
|
+
if (selection) {
|
|
62
|
+
await start(selection.siteName, selection.themeName);
|
|
63
|
+
}
|
|
64
|
+
break;
|
|
65
|
+
case 'Çıkış':
|
|
66
|
+
console.log('Programdan çıkılıyor. Hoşça kalın!');
|
|
67
|
+
process.exit(0);
|
|
72
68
|
}
|
|
73
69
|
}
|
|
74
70
|
|
package/package.json
CHANGED
package/src/commands/create.js
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
const fs = require('fs');
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const { Select, Input } = require('enquirer');
|
|
4
|
-
const {slugify} = require('../utils');
|
|
4
|
+
const { slugify } = require('../utils');
|
|
5
5
|
const { start } = require('./start');
|
|
6
6
|
const ThemeManager = require('../theme-manager');
|
|
7
7
|
|
|
8
|
-
async function
|
|
8
|
+
async function getSites() {
|
|
9
9
|
const cwd = process.cwd();
|
|
10
|
-
|
|
10
|
+
return fs.readdirSync(cwd).filter(file => {
|
|
11
11
|
return file.charAt(0) !== '.' && !['node_modules', 'build', 'dist'].includes(file);
|
|
12
12
|
}).filter(file => fs.statSync(path.join(cwd, file)).isDirectory());
|
|
13
|
+
}
|
|
13
14
|
|
|
15
|
+
async function selectSite(sites) {
|
|
14
16
|
const siteChoices = [...sites, 'Yeni bir site oluştur'];
|
|
15
17
|
|
|
16
18
|
const sitePrompt = new Select({
|
|
@@ -21,30 +23,42 @@ async function createTheme() {
|
|
|
21
23
|
|
|
22
24
|
const selectedSite = await sitePrompt.run();
|
|
23
25
|
|
|
24
|
-
let siteName;
|
|
25
26
|
if (selectedSite === 'Yeni bir site oluştur') {
|
|
26
|
-
|
|
27
|
-
name: 'newSite',
|
|
28
|
-
message: 'Yeni site adı:'
|
|
29
|
-
});
|
|
30
|
-
siteName = await newSitePrompt.run();
|
|
31
|
-
|
|
32
|
-
const themeManager = new ThemeManager(siteName);
|
|
33
|
-
try {
|
|
34
|
-
const isValid = await themeManager.checkSiteValidity(siteName);
|
|
35
|
-
if (!isValid) {
|
|
36
|
-
console.error('Geçersiz site adı. Lütfen geçerli bir site adı girin.');
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
} catch (error) {
|
|
40
|
-
console.error('Site doğrulaması sırasında hata oluştu:', error.message);
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
|
|
27
|
+
return await createNewSite();
|
|
44
28
|
} else {
|
|
45
|
-
|
|
29
|
+
return selectedSite;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function createNewSite() {
|
|
34
|
+
const newSitePrompt = new Input({
|
|
35
|
+
name: 'newSite',
|
|
36
|
+
message: 'Yeni site adı:'
|
|
37
|
+
});
|
|
38
|
+
const siteName = await newSitePrompt.run();
|
|
39
|
+
|
|
40
|
+
const themeManager = new ThemeManager(siteName);
|
|
41
|
+
const isValid = await validateSiteName(themeManager, siteName);
|
|
42
|
+
if (!isValid) return null;
|
|
43
|
+
|
|
44
|
+
return siteName;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function validateSiteName(themeManager, siteName) {
|
|
48
|
+
try {
|
|
49
|
+
const isValid = await themeManager.checkSiteValidity(siteName);
|
|
50
|
+
if (!isValid) {
|
|
51
|
+
console.error('Geçersiz site adı. Lütfen geçerli bir site adı girin.');
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
} catch (error) {
|
|
56
|
+
console.error('Site doğrulaması sırasında hata oluştu:', error.message);
|
|
57
|
+
return false;
|
|
46
58
|
}
|
|
59
|
+
}
|
|
47
60
|
|
|
61
|
+
async function getThemeDetails() {
|
|
48
62
|
const themeNamePrompt = new Input({
|
|
49
63
|
name: 'themeName',
|
|
50
64
|
message: 'Tema adı:'
|
|
@@ -65,14 +79,34 @@ async function createTheme() {
|
|
|
65
79
|
const author = await authorPrompt.run();
|
|
66
80
|
const version = await versionPrompt.run();
|
|
67
81
|
|
|
68
|
-
|
|
82
|
+
return { themeName, author, version };
|
|
83
|
+
}
|
|
69
84
|
|
|
85
|
+
async function createThemeDirectory(siteName, themeNameSlug) {
|
|
86
|
+
const cwd = process.cwd();
|
|
70
87
|
const themePath = path.join(cwd, siteName, themeNameSlug);
|
|
71
88
|
|
|
72
89
|
if (!fs.existsSync(themePath)) {
|
|
73
90
|
fs.mkdirSync(themePath, { recursive: true });
|
|
74
91
|
}
|
|
75
92
|
|
|
93
|
+
return themePath;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function saveThemeData(themePath, themeData) {
|
|
97
|
+
fs.writeFileSync(path.join(themePath, '.theme'), JSON.stringify(themeData, null, 2));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async function createTheme() {
|
|
101
|
+
const sites = await getSites();
|
|
102
|
+
const siteName = await selectSite(sites);
|
|
103
|
+
|
|
104
|
+
if (!siteName) return;
|
|
105
|
+
|
|
106
|
+
const { themeName, author, version } = await getThemeDetails();
|
|
107
|
+
const themeNameSlug = slugify(themeName);
|
|
108
|
+
const themePath = await createThemeDirectory(siteName, themeNameSlug);
|
|
109
|
+
|
|
76
110
|
const themeData = {
|
|
77
111
|
site: siteName,
|
|
78
112
|
theme: themeName,
|
|
@@ -80,7 +114,7 @@ async function createTheme() {
|
|
|
80
114
|
version: version
|
|
81
115
|
};
|
|
82
116
|
|
|
83
|
-
|
|
117
|
+
await saveThemeData(themePath, themeData);
|
|
84
118
|
|
|
85
119
|
console.log(`Tema "${themeName}" başarıyla oluşturuldu.`);
|
|
86
120
|
|
package/src/commands/start.js
CHANGED
|
@@ -7,14 +7,13 @@ const Tsoft = require('../tsoft');
|
|
|
7
7
|
const constants = require('../constants');
|
|
8
8
|
const cliProgress = require('cli-progress');
|
|
9
9
|
const { Input } = require('enquirer');
|
|
10
|
-
const { displayAsciiArt, clearScreen, info
|
|
10
|
+
const { displayAsciiArt, clearScreen, info } = require('../utils');
|
|
11
11
|
|
|
12
12
|
async function showProgress(tsoft, theme) {
|
|
13
13
|
const themePath = path.join(process.cwd(), tsoft.site, theme);
|
|
14
14
|
const fileList = tsoft.fileManager.listFilesRecursive(themePath).filter(file => !file.includes('.env'));
|
|
15
15
|
const totalFiles = fileList.length;
|
|
16
16
|
|
|
17
|
-
// Yeni bir ilerleme çubuğu oluşturun ve shades_classic temasını kullanın
|
|
18
17
|
const progressBar = new cliProgress.SingleBar({
|
|
19
18
|
format: 'İlerleme |{bar}| {percentage}% || {value}/{total} Dosya Yüklendi',
|
|
20
19
|
barCompleteChar: '\u2588',
|
|
@@ -43,16 +42,28 @@ async function showProgress(tsoft, theme) {
|
|
|
43
42
|
return 'Tüm dosyalar ilerleme ile başarıyla yüklendi';
|
|
44
43
|
}
|
|
45
44
|
|
|
46
|
-
async function
|
|
47
|
-
await
|
|
48
|
-
console.log('Geliştirme ortamı aşağıdaki ayrıntılarla başlatılıyor:');
|
|
49
|
-
console.log(`Site Adı: ${siteName}`);
|
|
50
|
-
console.log(`Tema Adı: ${themeName}`);
|
|
45
|
+
async function initializeAndAuthorize(tsoft, themeName) {
|
|
46
|
+
await tsoft.initialize(themeName);
|
|
51
47
|
|
|
52
|
-
const
|
|
53
|
-
|
|
48
|
+
const approvalPrompt = new Input({
|
|
49
|
+
name: 'approval',
|
|
50
|
+
message: 'Lütfen onay kodunu sağlayın:'
|
|
51
|
+
});
|
|
54
52
|
|
|
55
|
-
|
|
53
|
+
const approval = await approvalPrompt.run();
|
|
54
|
+
|
|
55
|
+
if (approval) {
|
|
56
|
+
await constants.APPROVAL.handler(tsoft.clientCredentials.setClientSecret(approval));
|
|
57
|
+
tsoft.buildEnvironment();
|
|
58
|
+
console.info('Hazırsınız');
|
|
59
|
+
return true;
|
|
60
|
+
} else {
|
|
61
|
+
console.error('Onay kodu gerekli.');
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function handleExistingEnvironment(tsoft, themeName, themeEnvPath) {
|
|
56
67
|
let envData = {};
|
|
57
68
|
if (fs.existsSync(themeEnvPath)) {
|
|
58
69
|
try {
|
|
@@ -68,45 +79,17 @@ async function start(siteName, themeName) {
|
|
|
68
79
|
|
|
69
80
|
if (bearerTokenValid) {
|
|
70
81
|
console.info('Geçerli bir taşıyıcı jetonuna sahip mevcut ortam dosyası bulundu. Mevcut yapılandırma ile devam ediliyor...');
|
|
71
|
-
|
|
72
|
-
await startWatching(siteName, themeName, tsoft);
|
|
73
|
-
return;
|
|
82
|
+
return true;
|
|
74
83
|
} else {
|
|
75
84
|
console.warn('Mevcut taşıyıcı jetonu geçersiz. Yeniden yetkilendirmeniz gerekecek.');
|
|
76
85
|
fs.unlinkSync(themeEnvPath);
|
|
77
86
|
}
|
|
78
87
|
}
|
|
79
88
|
}
|
|
80
|
-
|
|
81
|
-
await tsoft.initialize(themeName);
|
|
82
|
-
|
|
83
|
-
const approvalPrompt = new Input({
|
|
84
|
-
name: 'approval',
|
|
85
|
-
message: 'Lütfen onay kodunu sağlayın:'
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
const approval = await approvalPrompt.run();
|
|
89
|
-
|
|
90
|
-
if (approval) {
|
|
91
|
-
await constants.APPROVAL.handler(tsoft.clientCredentials.setClientSecret(approval));
|
|
92
|
-
tsoft.buildEnvironment();
|
|
93
|
-
console.info('Hazırsınız');
|
|
94
|
-
// Dosya değişikliklerini izlemeye başlayın
|
|
95
|
-
await startWatching(siteName, themeName, tsoft);
|
|
96
|
-
} else {
|
|
97
|
-
console.error('Onay kodu gerekli.');
|
|
98
|
-
}
|
|
89
|
+
return false;
|
|
99
90
|
}
|
|
100
91
|
|
|
101
|
-
async function startWatching(
|
|
102
|
-
const themePath = path.join(process.cwd(), site, theme);
|
|
103
|
-
const envPath = path.join(themePath, `${theme}.env`);
|
|
104
|
-
|
|
105
|
-
if (!fs.existsSync(envPath)) {
|
|
106
|
-
console.error('Ortam dosyası bulunamadı. Lütfen temayı önce başlatın.');
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
|
|
92
|
+
async function startWatching(themePath, tsoft, theme) {
|
|
110
93
|
const watcher = chokidar.watch(themePath, {
|
|
111
94
|
ignored: /(^|[\/\\])(\.theme|(.*?)\.env)$/, // .theme ve .env dosyaları yoksayılır
|
|
112
95
|
persistent: true
|
|
@@ -114,41 +97,13 @@ async function startWatching(site, theme, tsoft) {
|
|
|
114
97
|
|
|
115
98
|
watcher.on('change', async (filePath) => {
|
|
116
99
|
console.log(`Dosya değiştirildi ${filePath}`);
|
|
117
|
-
|
|
118
|
-
const env = JSON.parse(fs.readFileSync(envPath, 'utf-8'));
|
|
119
|
-
const fileName = filePath.replace(`${themePath}/`, '');
|
|
120
|
-
const content = fs.readFileSync(filePath).toString();
|
|
121
|
-
|
|
122
|
-
try {
|
|
123
|
-
await tsoft.saveFile(theme, fileName, content, env.bearer);
|
|
124
|
-
console.log(`Dosya başarıyla yüklendi ${fileName}`);
|
|
125
|
-
} catch (error) {
|
|
126
|
-
console.error(`Dosya yükleme hatası ${fileName}:`, error);
|
|
127
|
-
}
|
|
100
|
+
await handleFileChange(filePath, tsoft, theme);
|
|
128
101
|
}).on('unlink', async (filePath) => {
|
|
129
102
|
console.log(`Dosya silindi ${filePath}`);
|
|
130
|
-
|
|
131
|
-
const env = JSON.parse(fs.readFileSync(envPath, 'utf-8'));
|
|
132
|
-
const fileName = filePath.replace(`${themePath}/`, '');
|
|
133
|
-
|
|
134
|
-
try {
|
|
135
|
-
await tsoft.deleteFile(theme, fileName, env.bearer);
|
|
136
|
-
console.log(`Dosya başarıyla silindi ${fileName}`);
|
|
137
|
-
} catch (error) {
|
|
138
|
-
console.error(`Dosya silme hatası ${fileName}:`, error);
|
|
139
|
-
}
|
|
103
|
+
await handleFileDeletion(filePath, tsoft, theme);
|
|
140
104
|
}).on('unlinkDir', async (dirPath) => {
|
|
141
105
|
console.log(`Dizin silindi ${dirPath}`);
|
|
142
|
-
|
|
143
|
-
const env = JSON.parse(fs.readFileSync(envPath, 'utf-8'));
|
|
144
|
-
const dirName = dirPath.replace(`${themePath}/`, '');
|
|
145
|
-
|
|
146
|
-
try {
|
|
147
|
-
await tsoft.deleteDirectory(theme, dirName, env.bearer);
|
|
148
|
-
console.log(`Dizin başarıyla silindi ${dirName}`);
|
|
149
|
-
} catch (error) {
|
|
150
|
-
console.error(`Dizin silme hatası ${dirName}:`, error);
|
|
151
|
-
}
|
|
106
|
+
await handleDirectoryDeletion(dirPath, tsoft, theme);
|
|
152
107
|
});
|
|
153
108
|
|
|
154
109
|
console.log(`${themePath} dizinindeki dosya değişiklikleri izleniyor`);
|
|
@@ -161,12 +116,56 @@ async function startWatching(site, theme, tsoft) {
|
|
|
161
116
|
info();
|
|
162
117
|
|
|
163
118
|
rl.on('line', async (input) => {
|
|
164
|
-
|
|
119
|
+
await handleUserInput(input, tsoft, theme, watcher, rl);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async function handleFileChange(filePath, tsoft, theme) {
|
|
124
|
+
const env = JSON.parse(fs.readFileSync(path.join(process.cwd(), tsoft.site, theme, `${theme}.env`), 'utf-8'));
|
|
125
|
+
const fileName = filePath.replace(`${path.join(process.cwd(), tsoft.site, theme)}/`, '');
|
|
126
|
+
const content = fs.readFileSync(filePath).toString();
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
await tsoft.saveFile(theme, fileName, content, env.bearer);
|
|
130
|
+
console.log(`Dosya başarıyla yüklendi ${fileName}`);
|
|
131
|
+
} catch (error) {
|
|
132
|
+
console.error(`Dosya yükleme hatası ${fileName}:`, error);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function handleFileDeletion(filePath, tsoft, theme) {
|
|
137
|
+
const env = JSON.parse(fs.readFileSync(path.join(process.cwd(), tsoft.site, theme, `${theme}.env`), 'utf-8'));
|
|
138
|
+
const fileName = filePath.replace(`${path.join(process.cwd(), tsoft.site, theme)}/`, '');
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
await tsoft.deleteFile(theme, fileName, env.bearer);
|
|
142
|
+
console.log(`Dosya başarıyla silindi ${fileName}`);
|
|
143
|
+
} catch (error) {
|
|
144
|
+
console.error(`Dosya silme hatası ${fileName}:`, error);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function handleDirectoryDeletion(dirPath, tsoft, theme) {
|
|
149
|
+
const env = JSON.parse(fs.readFileSync(path.join(process.cwd(), tsoft.site, theme, `${theme}.env`), 'utf-8'));
|
|
150
|
+
const dirName = dirPath.replace(`${path.join(process.cwd(), tsoft.site, theme)}/`, '');
|
|
151
|
+
|
|
152
|
+
try {
|
|
153
|
+
await tsoft.deleteDirectory(theme, dirName, env.bearer);
|
|
154
|
+
console.log(`Dizin başarıyla silindi ${dirName}`);
|
|
155
|
+
} catch (error) {
|
|
156
|
+
console.error(`Dizin silme hatası ${dirName}:`, error);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
async function handleUserInput(input, tsoft, theme, watcher, rl) {
|
|
161
|
+
switch (input.trim()) {
|
|
162
|
+
case 'q':
|
|
165
163
|
console.log('Dosya izleme işlemi sonlandırılıyor...');
|
|
166
164
|
watcher.close();
|
|
167
165
|
rl.close();
|
|
168
166
|
process.exit(0);
|
|
169
|
-
|
|
167
|
+
break;
|
|
168
|
+
case 'u':
|
|
170
169
|
console.log('Tema güncelleniyor...');
|
|
171
170
|
try {
|
|
172
171
|
const result = await updateTheme(tsoft, theme);
|
|
@@ -175,7 +174,8 @@ async function startWatching(site, theme, tsoft) {
|
|
|
175
174
|
} catch (error) {
|
|
176
175
|
console.error(`Tema güncelleme hatası:`, error);
|
|
177
176
|
}
|
|
178
|
-
|
|
177
|
+
break;
|
|
178
|
+
case 's':
|
|
179
179
|
clearScreen();
|
|
180
180
|
console.log('Tüm dosyalar ilerleme ile yüklenmeye başlanıyor...');
|
|
181
181
|
try {
|
|
@@ -185,27 +185,50 @@ async function startWatching(site, theme, tsoft) {
|
|
|
185
185
|
} catch (error) {
|
|
186
186
|
console.error(`İlerleme gösterim hatası:`, error);
|
|
187
187
|
}
|
|
188
|
-
|
|
188
|
+
break;
|
|
189
|
+
case 'e':
|
|
189
190
|
console.log('.theme dosyası düzenleniyor...');
|
|
190
191
|
try {
|
|
191
192
|
await editThemeFile(tsoft.themeManager, theme);
|
|
192
193
|
} catch (error) {
|
|
193
194
|
console.error(`.theme dosyası düzenleme hatası:`, error);
|
|
194
195
|
}
|
|
195
|
-
|
|
196
|
+
break;
|
|
197
|
+
case 'o':
|
|
196
198
|
console.log('Tema dizini açılıyor...');
|
|
197
199
|
const openCommand = process.platform === 'win32' ? 'start' :
|
|
198
200
|
process.platform === 'darwin' ? 'open' :
|
|
199
201
|
'xdg-open';
|
|
200
|
-
exec(`${openCommand} ${
|
|
202
|
+
exec(`${openCommand} ${path.join(process.cwd(), tsoft.site, theme)}`, (err) => {
|
|
201
203
|
if (err) {
|
|
202
204
|
console.error('Tema dizini açılamadı:', err);
|
|
203
205
|
} else {
|
|
204
206
|
console.log('Tema dizini başarıyla açıldı.');
|
|
205
207
|
}
|
|
206
208
|
});
|
|
207
|
-
|
|
208
|
-
}
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
async function start(siteName, themeName) {
|
|
214
|
+
await displayAsciiArt();
|
|
215
|
+
console.log('Geliştirme ortamı aşağıdaki ayrıntılarla başlatılıyor:');
|
|
216
|
+
console.log(`Site Adı: ${siteName}`);
|
|
217
|
+
console.log(`Tema Adı: ${themeName}`);
|
|
218
|
+
|
|
219
|
+
const tsoft = new Tsoft(siteName);
|
|
220
|
+
const themeEnvPath = path.join(process.cwd(), siteName, themeName, `${themeName}.env`);
|
|
221
|
+
|
|
222
|
+
const existingEnvValid = await handleExistingEnvironment(tsoft, themeName, themeEnvPath);
|
|
223
|
+
if (existingEnvValid) {
|
|
224
|
+
await startWatching(path.join(process.cwd(), siteName, themeName), tsoft, themeName);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const initializedAndAuthorized = await initializeAndAuthorize(tsoft, themeName);
|
|
229
|
+
if (initializedAndAuthorized) {
|
|
230
|
+
await startWatching(path.join(process.cwd(), siteName, themeName), tsoft, themeName);
|
|
231
|
+
}
|
|
209
232
|
}
|
|
210
233
|
|
|
211
234
|
module.exports = { start };
|