@artilingo/artiframe-cli 2.0.3 → 2.0.5

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 (90) hide show
  1. package/LICENSE +660 -660
  2. package/bin/artiframe.js +0 -0
  3. package/bin/artiframe.php +0 -0
  4. package/core-stubs/app/ApiAuthControl.php +76 -0
  5. package/core-stubs/app/ApiControl.php +81 -35
  6. package/core-stubs/app/AuthControl.php +39 -0
  7. package/core-stubs/app/Database.php +36 -35
  8. package/core-stubs/app/DotEnv.php +19 -1
  9. package/core-stubs/app/ViewControl.php +47 -1
  10. package/core-stubs/bin/SQLMethod.php +261 -0
  11. package/core-stubs/bin/SystemMethod.php +115 -74
  12. package/core-stubs/bin/ViewMethod.php +19 -5
  13. package/core-stubs/docs/de.html +4325 -4347
  14. package/core-stubs/docs/en.html +4325 -4347
  15. package/core-stubs/docs/es.html +4325 -4347
  16. package/core-stubs/docs/fr.html +4325 -4347
  17. package/core-stubs/docs/tr.html +117 -46
  18. package/core-stubs/public/403.php +52 -0
  19. package/core-stubs/public/assets/css/components/header.css +174 -0
  20. package/core-stubs/public/assets/css/components/mobilenav.css +198 -0
  21. package/core-stubs/public/assets/css/components/sidebar.css +184 -0
  22. package/core-stubs/public/assets/css/root/app.css +975 -38
  23. package/core-stubs/public/assets/css/root/root.css +64 -0
  24. package/core-stubs/public/assets/js/components/header.js +380 -0
  25. package/core-stubs/public/assets/js/components/mobilenav.js +97 -0
  26. package/core-stubs/public/assets/js/components/theme-modal.js +74 -0
  27. package/core-stubs/public/assets/js/root/app.js +1870 -0
  28. package/core-stubs/public/includes/footer.php +4 -5
  29. package/core-stubs/public/includes/head-auth.php +65 -0
  30. package/core-stubs/public/includes/head.php +56 -17
  31. package/core-stubs/public/includes/header.php +135 -1
  32. package/core-stubs/public/includes/mobilenav.php +75 -3
  33. package/core-stubs/public/includes/sidebar.php +186 -1
  34. package/core-stubs/public/includes/theme-modal.php +1 -0
  35. package/db-studio/debug.log +3 -0
  36. package/db-studio/index.html +1755 -0
  37. package/db-studio/launcher.html +102 -0
  38. package/db-studio/launcher.js +180 -0
  39. package/db-studio/logo.svg +22 -0
  40. package/db-studio/main.js +568 -0
  41. package/db-studio/package-lock.json +1034 -0
  42. package/db-studio/package.json +16 -0
  43. package/db-studio/preload.js +29 -0
  44. package/devops-studio/api-inspector.js +222 -0
  45. package/devops-studio/index.html +1892 -0
  46. package/devops-studio/logo.svg +22 -0
  47. package/devops-studio/main.js +67 -0
  48. package/devops-studio/make-wizard.js +635 -0
  49. package/devops-studio/package-lock.json +871 -0
  50. package/devops-studio/package.json +12 -0
  51. package/package.json +5 -2
  52. package/scripts/postinstall.js +44 -8
  53. package/server-studio/.json-404-guard +1 -0
  54. package/server-studio/index.html +283 -0
  55. package/server-studio/logo.svg +22 -0
  56. package/server-studio/main.js +133 -0
  57. package/server-studio/package-lock.json +1179 -0
  58. package/server-studio/package.json +15 -0
  59. package/server-studio/router.php +99 -0
  60. package/src/App.php +29 -0
  61. package/src/Commands/AddCommand.php +26 -9
  62. package/src/Commands/DbExportCommand.php +131 -0
  63. package/src/Commands/DbStartCommand.php +46 -0
  64. package/src/Commands/DevopsCommand.php +35 -0
  65. package/src/Commands/GoCommand.php +48 -48
  66. package/src/Commands/ListCommand.php +68 -68
  67. package/src/Commands/MakeApiCommand.php +6 -1
  68. package/src/Commands/MakeViewCommand.php +25 -2
  69. package/src/Commands/NewProjectCommand.php +16 -11
  70. package/src/Commands/OptimizeCommand.php +61 -0
  71. package/src/Commands/RemoveCommand.php +36 -7
  72. package/src/Commands/ServeCommand.php +46 -91
  73. package/src/Commands/ShowCommand.php +24 -24
  74. package/src/Commands/UpgradeCommand.php +39 -10
  75. package/stubs/make/api-switch-case.stub +1 -1
  76. package/stubs/make/auth-api-standart.stub +20 -0
  77. package/stubs/make/auth-api-switch-case.stub +38 -0
  78. package/stubs/make/auth-view.stub +26 -0
  79. package/stubs/make/class.stub +10 -2
  80. package/stubs/make/view.stub +3 -0
  81. package/stubs/service/image.stub +334 -334
  82. package/stubs/service/iyzico.stub +637 -637
  83. package/stubs/service/jwt.stub +312 -312
  84. package/stubs/service/phpmailer.stub +143 -143
  85. package/stubs/service/pusher.stub +232 -232
  86. package/stubs/service/qrcode.stub +169 -169
  87. package/stubs/service/redis.stub +361 -361
  88. package/stubs/service/s3.stub +377 -377
  89. package/stubs/service/stripe.stub +526 -526
  90. package/stubs/service/twilio.stub +361 -361
@@ -0,0 +1,102 @@
1
+ <!DOCTYPE html>
2
+ <html lang="tr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>ArtiFrame DB Studio - Launcher</title>
6
+ <style>
7
+ body { margin: 0; padding: 0; background-color: #1e1e1e; color: #d4d4d4; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; display: flex; flex-direction: column; align-items: center; height: 100vh; justify-content: center; overflow: hidden; }
8
+ .container { width: 80%; max-width: 800px; display: flex; flex-direction: column; gap: 20px; }
9
+ .header { text-align: center; margin-bottom: 20px; }
10
+ .header h1 { font-size: 36px; margin: 0; font-weight: 300; }
11
+ .header h1 span { font-weight: bold; color: #007acc; }
12
+ .header p { color: #888; font-size: 14px; margin-top: 5px; }
13
+ .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; }
14
+ .card { background: #252526; border: 1px solid #333; border-radius: 8px; padding: 25px; text-align: center; cursor: pointer; transition: all 0.2s; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 15px; }
15
+ .card:hover { border-color: #007acc; background: #2d2d30; transform: translateY(-2px); }
16
+ .card.success:hover { border-color: #2ecc71; }
17
+ .card.warning:hover { border-color: #f39c12; }
18
+ .icon { font-size: 40px; }
19
+ .title { font-size: 16px; font-weight: 600; color: #fff; }
20
+ .desc { font-size: 12px; color: #aaa; line-height: 1.4; }
21
+
22
+ #workspace-selector { margin-top: 30px; padding: 15px; background: #2d2d30; border-radius: 6px; border: 1px dashed #555; text-align: center; font-size: 12px; color: #aaa; }
23
+ #workspace-selector a { color: #007acc; cursor: pointer; text-decoration: none; }
24
+ #workspace-selector a:hover { text-decoration: underline; }
25
+ </style>
26
+ </head>
27
+ <body>
28
+ <div class="container">
29
+ <div class="header">
30
+ <h1>ArtiFrame <span>DB Studio</span></h1>
31
+ <p>Veritabanı Mimari ve Geliştirme Platformu</p>
32
+ </div>
33
+
34
+ <div class="grid">
35
+ <div class="card success" onclick="createNewProject()">
36
+ <div class="icon">🚀</div>
37
+ <div class="title">Yeni Proje Başlat</div>
38
+ <div class="desc">Çalışma alanınızda sıfırdan yeni bir ArtiFrame projesi oluşturun.</div>
39
+ </div>
40
+
41
+ <div class="card" onclick="loadProject()">
42
+ <div class="icon">📂</div>
43
+ <div class="title">Var Olan Projeyi Yükle</div>
44
+ <div class="desc">Mevcut projelerinizi görüntüleyin ve geliştirmeye devam edin.</div>
45
+ </div>
46
+
47
+ <div class="card warning" onclick="previewSchema()">
48
+ <div class="icon">👁️</div>
49
+ <div class="title">Şema Önizle (.artiframe)</div>
50
+ <div class="desc">Bir veritabanı şemasını açarak inceleyin veya yeni projeye dönüştürün.</div>
51
+ </div>
52
+ </div>
53
+
54
+ <div id="workspace-selector">
55
+ Çalışma Alanı (Workspace): <span id="workspace-path" style="color:#d4d4d4; margin-right: 10px;">Belirlenmedi</span>
56
+ <a onclick="selectWorkspace()">[Değiştir]</a>
57
+ </div>
58
+ </div>
59
+
60
+ <script src="launcher.js"></script>
61
+
62
+ <!-- Custom Modals -->
63
+ <div id="modal-overlay" style="display:none; position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.8); z-index:999; justify-content:center; align-items:center;">
64
+
65
+ <!-- Prompt Modal -->
66
+ <div id="prompt-modal" style="display:none; background:#252526; padding:25px; border-radius:8px; border:1px solid #444; width:350px;">
67
+ <h3 id="prompt-title" style="margin-top:0; color:#d4d4d4; font-size:16px;">Giriş Bekleniyor</h3>
68
+ <p id="prompt-desc" style="font-size:12px; color:#aaa; margin-bottom:15px;"></p>
69
+ <input type="text" id="prompt-input" style="width:100%; padding:8px; background:#1e1e1e; border:1px solid #555; color:white; margin-bottom:15px; box-sizing:border-box; border-radius:4px;">
70
+ <div style="display:flex; justify-content:flex-end; gap:10px;">
71
+ <button class="btn" style="background:#555; color:white; padding:8px 12px; border:none; cursor:pointer;" onclick="closeModal()">İptal</button>
72
+ <button class="btn" style="background:#007acc; color:white; padding:8px 12px; border:none; cursor:pointer;" onclick="submitPrompt()">Tamam</button>
73
+ </div>
74
+ </div>
75
+
76
+ <!-- Confirm Modal (For Preview Choice) -->
77
+ <div id="preview-choice-modal" style="display:none; background:#252526; padding:25px; border-radius:8px; border:1px solid #444; width:400px; text-align:center;">
78
+ <h3 style="margin-top:0; color:#f39c12; font-size:16px;">Şema Önizleme</h3>
79
+ <p style="font-size:12px; color:#aaa; margin-bottom:20px; line-height:1.5;">İçe aktardığınız şemayı sadece <b>ER Diyagramı</b> olarak incelemek mi istersiniz, yoksa bu şema ile doğrudan <b>Yeni Bir Proje</b> mi kurmak istersiniz?</p>
80
+ <div style="display:flex; flex-direction:column; gap:10px;">
81
+ <button class="btn" style="background:#007acc; color:white; padding:10px; border:none; cursor:pointer;" onclick="choosePreview('inspect')">👁️ Sadece Diyagramı İncele</button>
82
+ <button class="btn" style="background:#2ecc71; color:#111; padding:10px; border:none; cursor:pointer; font-weight:bold;" onclick="choosePreview('scaffold')">🚀 Bu Şema İle Proje Kur</button>
83
+ <button class="btn" style="background:#555; color:white; padding:10px; border:none; cursor:pointer;" onclick="closeModal()">İptal</button>
84
+ </div>
85
+ </div>
86
+
87
+ <!-- Project List Modal -->
88
+ <div id="project-list-modal" style="display:none; background:#252526; padding:25px; border-radius:8px; border:1px solid #444; width:350px;">
89
+ <h3 style="margin-top:0; color:#d4d4d4; font-size:16px;">Proje Seçin</h3>
90
+ <p style="font-size:12px; color:#aaa; margin-bottom:15px;">Çalışma alanınızdaki mevcut projeler:</p>
91
+ <select id="project-select" style="width:100%; padding:8px; background:#1e1e1e; border:1px solid #555; color:white; margin-bottom:15px; border-radius:4px;" size="5">
92
+ </select>
93
+ <div style="display:flex; justify-content:flex-end; gap:10px;">
94
+ <button class="btn" style="background:#555; color:white; padding:8px 12px; border:none; cursor:pointer;" onclick="closeModal()">İptal</button>
95
+ <button class="btn" style="background:#007acc; color:white; padding:8px 12px; border:none; cursor:pointer;" onclick="submitProjectList()">Aç</button>
96
+ </div>
97
+ </div>
98
+
99
+ </div>
100
+
101
+ </body>
102
+ </html>
@@ -0,0 +1,180 @@
1
+
2
+ let currentWorkspace = null;
3
+ let promptCallback = null;
4
+ let previewDataCache = null;
5
+
6
+ async function initLauncher() {
7
+ if (window.api && window.api.getWorkspace) {
8
+ currentWorkspace = await window.api.getWorkspace();
9
+ if (currentWorkspace) {
10
+ document.getElementById('workspace-path').innerText = currentWorkspace;
11
+ } else {
12
+ document.getElementById('workspace-path').innerText = "Belirlenmedi (Lütfen Seçin)";
13
+ document.getElementById('workspace-path').style.color = "#f39c12";
14
+ }
15
+ }
16
+ }
17
+
18
+ async function selectWorkspace() {
19
+ if (window.api && window.api.selectDirectory) {
20
+ const dir = await window.api.selectDirectory();
21
+ if (dir) {
22
+ await window.api.setWorkspace(dir);
23
+ currentWorkspace = dir;
24
+ document.getElementById('workspace-path').innerText = dir;
25
+ document.getElementById('workspace-path').style.color = "#d4d4d4";
26
+ }
27
+ }
28
+ }
29
+
30
+ function openPrompt(title, desc, callback) {
31
+ document.getElementById('modal-overlay').style.display = 'flex';
32
+ document.getElementById('prompt-modal').style.display = 'block';
33
+ document.getElementById('preview-choice-modal').style.display = 'none';
34
+ document.getElementById('project-list-modal').style.display = 'none';
35
+
36
+ document.getElementById('prompt-title').innerText = title;
37
+ document.getElementById('prompt-desc').innerText = desc;
38
+ document.getElementById('prompt-input').value = '';
39
+ document.getElementById('prompt-input').focus();
40
+ promptCallback = callback;
41
+ }
42
+
43
+ function closeModal() {
44
+ document.getElementById('modal-overlay').style.display = 'none';
45
+ promptCallback = null;
46
+ previewDataCache = null;
47
+ }
48
+
49
+ function submitPrompt() {
50
+ const val = document.getElementById('prompt-input').value.trim();
51
+ if (val && promptCallback) {
52
+ const cb = promptCallback;
53
+ closeModal();
54
+ cb(val);
55
+ }
56
+ }
57
+
58
+ async function createNewProject() {
59
+ if (!currentWorkspace) {
60
+ document.getElementById('workspace-path').innerText = "Önce Buradan Çalışma Alanı Seçin ->";
61
+ document.getElementById('workspace-path').style.color = "#e74c3c";
62
+ return;
63
+ }
64
+
65
+ openPrompt("Yeni Proje Başlat", "Projeniz için bir klasör adı girin (Örn: my-app):\n(Proje " + currentWorkspace + " dizininde kurulacaktır)", async (pName) => {
66
+ if (window.api && window.api.scaffoldProject) {
67
+ const btn = document.querySelector('.card.success');
68
+ const oldHtml = btn.innerHTML;
69
+ btn.innerHTML = "<div class='title'>🚀 Proje Kuruluyor...</div>";
70
+
71
+ const res = await window.api.scaffoldProject(pName, { tables: [] }, currentWorkspace);
72
+
73
+ if (res.success) {
74
+ window.api.openProject(res.path);
75
+ } else {
76
+ alert("Hata: " + res.error);
77
+ btn.innerHTML = oldHtml;
78
+ }
79
+ }
80
+ });
81
+ }
82
+
83
+ async function loadProject() {
84
+ if (!currentWorkspace) {
85
+ document.getElementById('workspace-path').innerText = "Önce Buradan Çalışma Alanı Seçin ->";
86
+ document.getElementById('workspace-path').style.color = "#e74c3c";
87
+ return;
88
+ }
89
+
90
+ // We should get all directories in workspace, not just the ones with .env, because .env might not exist yet if scaffold failed or just created.
91
+ // Actually, getProjects in main.js filters by .env or 'artiframe'. Let's ensure it shows more.
92
+ const projects = await window.api.getProjects(currentWorkspace);
93
+ if (projects.length === 0) {
94
+ openPrompt("Proje Bulunamadı", "Seçili çalışma alanında proje (.env veya artiframe dosyası içeren klasör) bulunamadı.", async (dir) => {
95
+ // Do nothing special
96
+ });
97
+ return;
98
+ }
99
+
100
+ // Open custom project list modal
101
+ document.getElementById('modal-overlay').style.display = 'flex';
102
+ document.getElementById('prompt-modal').style.display = 'none';
103
+ document.getElementById('preview-choice-modal').style.display = 'none';
104
+ document.getElementById('project-list-modal').style.display = 'block';
105
+
106
+ const select = document.getElementById('project-select');
107
+ select.innerHTML = '';
108
+ projects.forEach(p => {
109
+ const opt = document.createElement('option');
110
+ opt.value = p;
111
+ opt.innerText = p;
112
+ select.appendChild(opt);
113
+ });
114
+ }
115
+
116
+ function submitProjectList() {
117
+ const select = document.getElementById('project-select');
118
+ if (select.value) {
119
+ const pPath = currentWorkspace + '/' + select.value;
120
+ closeModal();
121
+ if (window.api && window.api.openProject) {
122
+ window.api.openProject(pPath);
123
+ }
124
+ }
125
+ }
126
+
127
+ async function previewSchema() {
128
+ if (!window.api || !window.api.loadArtiframeFile) return;
129
+
130
+ const res = await window.api.loadArtiframeFile();
131
+ if (!res) return; // User canceled dialog
132
+
133
+ if (res.error) {
134
+ alert(res.error);
135
+ return;
136
+ }
137
+
138
+ previewDataCache = res.data.schema;
139
+
140
+ // Show custom choice modal
141
+ document.getElementById('modal-overlay').style.display = 'flex';
142
+ document.getElementById('prompt-modal').style.display = 'none';
143
+ document.getElementById('project-list-modal').style.display = 'none';
144
+ document.getElementById('preview-choice-modal').style.display = 'block';
145
+ }
146
+
147
+ function choosePreview(action) {
148
+ if (!previewDataCache) return;
149
+
150
+ const schema = previewDataCache;
151
+ closeModal();
152
+
153
+ if (action === 'inspect') {
154
+ if (window.api && window.api.previewSchemaFile) {
155
+ window.api.previewSchemaFile(schema);
156
+ }
157
+ } else if (action === 'scaffold') {
158
+ if (!currentWorkspace) {
159
+ document.getElementById('workspace-path').innerText = "Önce Buradan Çalışma Alanı Seçin ->";
160
+ document.getElementById('workspace-path').style.color = "#e74c3c";
161
+ return;
162
+ }
163
+
164
+ openPrompt("Proje Kurulumu", "Bu şema ile kurulacak proje için klasör adı girin (Örn: blog-app):", async (pName) => {
165
+ const btn = document.querySelector('.card.warning');
166
+ const oldHtml = btn.innerHTML;
167
+ btn.innerHTML = "<div class='title'>🚀 Proje Kuruluyor...</div>";
168
+
169
+ const res = await window.api.scaffoldProject(pName, schema, currentWorkspace);
170
+ if (res.success) {
171
+ window.api.openProject(res.path);
172
+ } else {
173
+ alert("Hata: " + res.error);
174
+ btn.innerHTML = oldHtml;
175
+ }
176
+ });
177
+ }
178
+ }
179
+
180
+ document.addEventListener('DOMContentLoaded', initLauncher);
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg id="katman_2" data-name="katman 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 144.49 94.09">
3
+ <defs>
4
+ <style>
5
+ .cls-1 {
6
+ fill: #099772;
7
+ }
8
+
9
+ .cls-2 {
10
+ fill: #0a9872;
11
+ }
12
+ </style>
13
+ </defs>
14
+ <g id="katman_1" data-name="katman 1">
15
+ <g>
16
+ <path class="cls-2" d="M131.15,38.06c.67-.18,1.4-.1,2.26.14.32-3.12,2.59-5.34,5.55-5.33s5.5,2.5,5.53,5.43-2.23,5.38-5.12,5.59c-3.09.22-5.71-2.08-5.9-5.29-34.52,2.36-67.93,12.42-97.08,31.26-5.61,3.7-11,7.44-16,11.83l-6.13,12.38-14.26-.02,13.95-27.62,7.14-14.06L47.82.06l21.37,41.64c-3.96,1.03-7.73,2.29-11.62,3.65l-9.74-19.89-2.9,5.99-14.53,29.82c25.42-14.09,52.79-21.29,81.35-23.22l5.69-.27,11.17.03c.86,0,1.58.49,2.52.24Z"/>
17
+ <polygon class="cls-2" points="64.24 58.84 75.54 54.2 90.45 83.55 112.61 83.52 112.61 44.51 122.99 43.06 122.99 94.08 81.55 94.09 72.23 75.24 64.24 58.84"/>
18
+ <path class="cls-1" d="M112.61,33.97V10.34s-53.64.02-53.64.02L54.05.7c.04-.06.09-.22.35-.22h68.33s0,33.6,0,33.6l-10.13-.11Z"/>
19
+ <path class="cls-2" d="M112.61,33.97l10.13.11V.48s-68.34,0-68.34,0c-.26,0-.31.16-.35.22-.3-.09-.39-.7.07-.7h68.84s0,34.31,0,34.31h-7.91c-.8.25-1.56.34-2.36.21-.07-.2-.1-.34-.1-.56Z"/>
20
+ </g>
21
+ </g>
22
+ </svg>