simplemdg-dev-cli 2.0.4 → 2.4.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 (148) hide show
  1. package/README.md +62 -354
  2. package/USER_GUIDE.md +55 -376
  3. package/dist/commands/cds.command.js +69 -60
  4. package/dist/commands/cds.command.js.map +1 -1
  5. package/dist/commands/cf-db.command.d.ts +2 -0
  6. package/dist/commands/cf-db.command.js +606 -0
  7. package/dist/commands/cf-db.command.js.map +1 -0
  8. package/dist/commands/cf.command.js +291 -280
  9. package/dist/commands/cf.command.js.map +1 -1
  10. package/dist/commands/gitlab.command.d.ts +2 -0
  11. package/dist/commands/gitlab.command.js +351 -0
  12. package/dist/commands/gitlab.command.js.map +1 -0
  13. package/dist/commands/npmrc.command.js +50 -44
  14. package/dist/commands/npmrc.command.js.map +1 -1
  15. package/dist/core/cache.d.ts +1 -1
  16. package/dist/core/cache.js +58 -31
  17. package/dist/core/cache.js.map +1 -1
  18. package/dist/core/cds.js +32 -22
  19. package/dist/core/cds.js.map +1 -1
  20. package/dist/core/cf-env-parser.d.ts +1 -1
  21. package/dist/core/cf-env-parser.js +4 -1
  22. package/dist/core/cf-env-parser.js.map +1 -1
  23. package/dist/core/cf.d.ts +1 -1
  24. package/dist/core/cf.js +46 -31
  25. package/dist/core/cf.js.map +1 -1
  26. package/dist/core/db/db-btp.d.ts +48 -0
  27. package/dist/core/db/db-btp.js +162 -0
  28. package/dist/core/db/db-btp.js.map +1 -0
  29. package/dist/core/db/db-cache.d.ts +40 -0
  30. package/dist/core/db/db-cache.js +188 -0
  31. package/dist/core/db/db-cache.js.map +1 -0
  32. package/dist/core/db/db-connection.d.ts +22 -0
  33. package/dist/core/db/db-connection.js +73 -0
  34. package/dist/core/db/db-connection.js.map +1 -0
  35. package/dist/core/db/db-crypto.d.ts +3 -0
  36. package/dist/core/db/db-crypto.js +54 -0
  37. package/dist/core/db/db-crypto.js.map +1 -0
  38. package/dist/core/db/db-hana-adapter.d.ts +36 -0
  39. package/dist/core/db/db-hana-adapter.js +251 -0
  40. package/dist/core/db/db-hana-adapter.js.map +1 -0
  41. package/dist/core/db/db-metadata.d.ts +25 -0
  42. package/dist/core/db/db-metadata.js +150 -0
  43. package/dist/core/db/db-metadata.js.map +1 -0
  44. package/dist/core/db/db-postgres-adapter.d.ts +34 -0
  45. package/dist/core/db/db-postgres-adapter.js +259 -0
  46. package/dist/core/db/db-postgres-adapter.js.map +1 -0
  47. package/dist/core/db/db-query-files.d.ts +20 -0
  48. package/dist/core/db/db-query-files.js +106 -0
  49. package/dist/core/db/db-query-files.js.map +1 -0
  50. package/dist/core/db/db-query-history.d.ts +5 -0
  51. package/dist/core/db/db-query-history.js +49 -0
  52. package/dist/core/db/db-query-history.js.map +1 -0
  53. package/dist/core/db/db-row.d.ts +28 -0
  54. package/dist/core/db/db-row.js +123 -0
  55. package/dist/core/db/db-row.js.map +1 -0
  56. package/dist/core/db/db-studio-client.d.ts +1 -0
  57. package/dist/core/db/db-studio-client.js +401 -0
  58. package/dist/core/db/db-studio-client.js.map +1 -0
  59. package/dist/core/db/db-studio-html.d.ts +4 -0
  60. package/dist/core/db/db-studio-html.js +83 -0
  61. package/dist/core/db/db-studio-html.js.map +1 -0
  62. package/dist/core/db/db-studio-server.d.ts +11 -0
  63. package/dist/core/db/db-studio-server.js +528 -0
  64. package/dist/core/db/db-studio-server.js.map +1 -0
  65. package/dist/core/db/db-studio-styles.d.ts +1 -0
  66. package/dist/core/db/db-studio-styles.js +225 -0
  67. package/dist/core/db/db-studio-styles.js.map +1 -0
  68. package/dist/core/db/db-types.d.ts +214 -0
  69. package/dist/core/db/db-types.js +3 -0
  70. package/dist/core/db/db-types.js.map +1 -0
  71. package/dist/core/db/db-vcap-parser.d.ts +7 -0
  72. package/dist/core/db/db-vcap-parser.js +137 -0
  73. package/dist/core/db/db-vcap-parser.js.map +1 -0
  74. package/dist/core/doctor.d.ts +1 -1
  75. package/dist/core/doctor.js +14 -8
  76. package/dist/core/doctor.js.map +1 -1
  77. package/dist/core/guide.js +31 -26
  78. package/dist/core/guide.js.map +1 -1
  79. package/dist/core/install.d.ts +1 -1
  80. package/dist/core/install.js +17 -11
  81. package/dist/core/install.js.map +1 -1
  82. package/dist/core/navigator.d.ts +17 -0
  83. package/dist/core/navigator.js +140 -0
  84. package/dist/core/navigator.js.map +1 -0
  85. package/dist/core/npmrc.js +29 -16
  86. package/dist/core/npmrc.js.map +1 -1
  87. package/dist/core/process.js +11 -6
  88. package/dist/core/process.js.map +1 -1
  89. package/dist/core/prompts.js +16 -8
  90. package/dist/core/prompts.js.map +1 -1
  91. package/dist/core/repository.d.ts +1 -1
  92. package/dist/core/repository.js +16 -9
  93. package/dist/core/repository.js.map +1 -1
  94. package/dist/core/scanner.d.ts +1 -1
  95. package/dist/core/scanner.js +13 -7
  96. package/dist/core/scanner.js.map +1 -1
  97. package/dist/core/tooling.d.ts +28 -0
  98. package/dist/core/tooling.js +168 -0
  99. package/dist/core/tooling.js.map +1 -0
  100. package/dist/core/types.js +2 -1
  101. package/dist/core/version-conflict.d.ts +2 -2
  102. package/dist/core/version-conflict.js +11 -6
  103. package/dist/core/version-conflict.js.map +1 -1
  104. package/dist/index.js +65 -48
  105. package/dist/index.js.map +1 -1
  106. package/dist/types-local.js +2 -1
  107. package/package.json +12 -6
  108. package/src/commands/cds.command.ts +529 -0
  109. package/src/commands/cf-db.command.ts +636 -0
  110. package/src/commands/cf.command.ts +3345 -0
  111. package/src/commands/gitlab.command.ts +373 -0
  112. package/src/commands/npmrc.command.ts +581 -0
  113. package/src/core/cache.ts +332 -0
  114. package/src/core/cds.ts +278 -0
  115. package/src/core/cf-env-parser.ts +131 -0
  116. package/src/core/cf.ts +271 -0
  117. package/src/core/db/db-btp.ts +207 -0
  118. package/src/core/db/db-cache.ts +242 -0
  119. package/src/core/db/db-connection.ts +79 -0
  120. package/src/core/db/db-crypto.ts +53 -0
  121. package/src/core/db/db-hana-adapter.ts +306 -0
  122. package/src/core/db/db-metadata.ts +174 -0
  123. package/src/core/db/db-postgres-adapter.ts +293 -0
  124. package/src/core/db/db-query-files.ts +130 -0
  125. package/src/core/db/db-query-history.ts +53 -0
  126. package/src/core/db/db-row.ts +157 -0
  127. package/src/core/db/db-studio-client.ts +397 -0
  128. package/src/core/db/db-studio-html.ts +85 -0
  129. package/src/core/db/db-studio-server.ts +626 -0
  130. package/src/core/db/db-studio-styles.ts +221 -0
  131. package/src/core/db/db-types.ts +243 -0
  132. package/src/core/db/db-vcap-parser.ts +182 -0
  133. package/src/core/doctor.ts +70 -0
  134. package/src/core/guide.ts +261 -0
  135. package/src/core/install.ts +91 -0
  136. package/src/core/navigator.ts +164 -0
  137. package/src/core/npmrc.ts +171 -0
  138. package/src/core/process.ts +75 -0
  139. package/src/core/prompts.ts +225 -0
  140. package/src/core/repository.ts +36 -0
  141. package/src/core/scanner.ts +41 -0
  142. package/src/core/tooling.ts +207 -0
  143. package/src/core/types.ts +152 -0
  144. package/src/core/version-conflict.ts +46 -0
  145. package/src/index.ts +460 -0
  146. package/src/types/external.d.ts +3 -0
  147. package/src/types-local.ts +11 -0
  148. package/tsconfig.json +17 -0
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STUDIO_STYLES = void 0;
4
+ exports.STUDIO_STYLES = `
5
+ :root{
6
+ --bg:#0b0f17;--bg-2:#0e1420;--bg-3:#121a28;--panel:#0d131e;--elev:#16203250;
7
+ --border:#1f2c44;--border-2:#27374f;--text:#dce6f5;--muted:#8295b5;--faint:#5b6c8a;
8
+ --accent:#3b82f6;--accent-2:#1d4ed8;--green:#22c55e;--red:#ef4444;--yellow:#f59e0b;
9
+ --amber:#fbbf24;--chip:#1a2840;--sel:#16243d;--editbg:#3a2f08;--delbg:#3a1414;--insbg:#0f2e18;
10
+ }
11
+ *{box-sizing:border-box}
12
+ html,body{height:100%;margin:0}
13
+ body{background:var(--bg);color:var(--text);font:13px/1.45 "Segoe UI",Roboto,Arial,sans-serif;overflow:hidden}
14
+ button,input,select,textarea{font:inherit;color:inherit;outline:none}
15
+ ::-webkit-scrollbar{width:10px;height:10px}
16
+ ::-webkit-scrollbar-thumb{background:#22314c;border-radius:8px}
17
+ ::-webkit-scrollbar-track{background:transparent}
18
+ .app{display:flex;flex-direction:column;height:100vh}
19
+ .hidden{display:none!important}
20
+ .spin{width:14px;height:14px;border:2px solid var(--border-2);border-top-color:var(--accent);border-radius:50%;display:inline-block;animation:sp .7s linear infinite;vertical-align:middle}
21
+ @keyframes sp{to{transform:rotate(360deg)}}
22
+ svg.ic{width:15px;height:15px;vertical-align:-2px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
23
+
24
+ /* top bar */
25
+ .topbar{display:flex;align-items:center;gap:9px;padding:8px 12px;background:linear-gradient(180deg,#101a2b,#0d1521);border-bottom:1px solid var(--border);flex:0 0 auto}
26
+ .brand{font-weight:700;color:#cfe0ff;letter-spacing:.2px;white-space:nowrap}
27
+ .brand .b2{color:var(--faint);font-weight:600}
28
+ .badge{padding:3px 9px;border-radius:999px;background:var(--chip);border:1px solid var(--border);color:var(--muted);font-size:12px;white-space:nowrap;display:inline-flex;align-items:center;gap:5px}
29
+ .badge.on{color:#cfe0ff;border-color:var(--accent)}
30
+ .badge.hana{color:#7dd3fc;border-color:#0e7490}
31
+ .badge.pg{color:#a5b4fc;border-color:#4338ca}
32
+ .badge.ro{cursor:pointer}
33
+ .badge.ro.active{color:#fff;background:#7c2d12;border-color:#b45309}
34
+ .badge.prod{color:#fff;background:#7f1d1d;border-color:#b91c1c}
35
+ .grow{flex:1}
36
+ .top-search{flex:0 1 320px}
37
+ .iconbtn{background:transparent;border:1px solid var(--border);border-radius:8px;padding:6px 8px;color:var(--muted);cursor:pointer;display:inline-flex;align-items:center;gap:6px}
38
+ .iconbtn:hover{color:#cfe0ff;border-color:var(--border-2);background:var(--bg-3)}
39
+ .iconbtn.primary{background:var(--accent);border-color:var(--accent-2);color:#fff}
40
+ .iconbtn.primary:hover{filter:brightness(1.08);color:#fff}
41
+
42
+ /* body */
43
+ .body{display:flex;flex:1;min-height:0}
44
+ .sidebar{width:320px;min-width:220px;max-width:560px;background:var(--panel);border-right:1px solid var(--border);display:flex;flex-direction:column;overflow:hidden}
45
+ .resizer{width:5px;cursor:col-resize}
46
+ .resizer:hover{background:var(--accent)}
47
+ .workspace{flex:1;display:flex;flex-direction:column;min-width:0}
48
+
49
+ /* sidebar sections */
50
+ .side-sec{display:flex;flex-direction:column;min-height:0;border-bottom:1px solid var(--border)}
51
+ .side-sec.flex{flex:1}
52
+ .side-head{display:flex;align-items:center;gap:7px;padding:9px 11px;cursor:pointer;color:var(--muted);user-select:none}
53
+ .side-head:hover{color:#cfe0ff}
54
+ .side-head .h-title{font-size:11px;text-transform:uppercase;letter-spacing:.7px;font-weight:700;flex:1}
55
+ .side-head .chev{transition:transform .15s}
56
+ .side-sec.collapsed .chev{transform:rotate(-90deg)}
57
+ .side-sec.collapsed .side-body{display:none}
58
+ .side-body{padding:0 9px 10px;overflow:auto;min-height:0}
59
+ .side-sec.flex .side-body{flex:1}
60
+ .side-actions{display:flex;gap:6px;margin-bottom:7px}
61
+
62
+ /* search box */
63
+ .searchbox{display:flex;align-items:center;gap:6px;background:var(--bg-3);border:1px solid var(--border);border-radius:8px;padding:5px 8px;margin-bottom:7px}
64
+ .searchbox svg{color:var(--faint)}
65
+ .searchbox input{flex:1;background:transparent;border:0;color:var(--text)}
66
+ .searchbox .sbtn{background:transparent;border:0;color:var(--muted);cursor:pointer}
67
+
68
+ /* buttons + inputs */
69
+ .btn{background:var(--accent);border:1px solid var(--accent-2);color:#fff;border-radius:8px;padding:6px 11px;cursor:pointer}
70
+ .btn:hover{filter:brightness(1.08)}
71
+ .btn.sec{background:#22304a;border-color:var(--border-2);color:#cfe0ff}
72
+ .btn.ghost{background:transparent;border-color:var(--border);color:var(--muted)}
73
+ .btn.danger{background:#7f1d1d;border-color:#b91c1c;color:#fff}
74
+ .btn.sm{padding:3px 8px;font-size:12px}
75
+ .btn:disabled{opacity:.45;cursor:not-allowed;filter:none}
76
+ .input,.select{width:100%;background:var(--bg-3);border:1px solid var(--border);border-radius:8px;padding:7px 9px;color:var(--text)}
77
+ .field{display:flex;flex-direction:column;gap:4px;margin-bottom:9px}
78
+ .field label{color:var(--muted);font-size:12px}
79
+ .note{color:var(--muted);font-size:12px}
80
+ .faint{color:var(--faint)}
81
+ .row{display:flex;gap:7px;align-items:center;flex-wrap:wrap}
82
+ .right{justify-content:flex-end}
83
+
84
+ /* connection cards */
85
+ .conn-card{position:relative;background:var(--bg-3);border:1px solid var(--border);border-left:3px solid var(--faint);border-radius:9px;padding:8px 10px;margin-bottom:7px;cursor:pointer}
86
+ .conn-card:hover{border-color:var(--border-2);background:#152033}
87
+ .conn-card.active{border-color:var(--accent);background:var(--sel)}
88
+ .conn-top{display:flex;align-items:center;gap:7px}
89
+ .conn-name{font-weight:600;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
90
+ .conn-sub{color:var(--muted);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}
91
+ .conn-tags{display:flex;gap:5px;margin-top:5px;flex-wrap:wrap}
92
+ .tag{font-size:10.5px;padding:1px 7px;border-radius:999px;background:var(--chip);border:1px solid var(--border);color:var(--muted)}
93
+ .tag.env-DEV{color:#86efac;border-color:#166534}
94
+ .tag.env-QAS{color:#fde68a;border-color:#a16207}
95
+ .tag.env-PROD{color:#fecaca;border-color:#b91c1c}
96
+ .tag.env-SANDBOX{color:#a5b4fc;border-color:#4338ca}
97
+ .tag.type{color:#7dd3fc}
98
+ .star{cursor:pointer;color:var(--faint)}
99
+ .star.on{color:var(--amber)}
100
+ .skel{height:56px;border-radius:9px;margin-bottom:7px;background:linear-gradient(90deg,#121a28,#1a2740,#121a28);background-size:200% 100%;animation:shimmer 1.3s infinite}
101
+ @keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}
102
+
103
+ /* tree */
104
+ .tree{font-size:12.5px}
105
+ .trow{display:flex;align-items:center;gap:5px;padding:3px 5px;border-radius:6px;cursor:pointer;white-space:nowrap}
106
+ .trow:hover{background:var(--bg-3)}
107
+ .trow.sel{background:var(--sel)}
108
+ .tchev{width:13px;color:var(--faint);flex:0 0 auto;text-align:center;transition:transform .12s}
109
+ .tchev.open{transform:rotate(90deg)}
110
+ .tchev.leaf{visibility:hidden}
111
+ .ticon{flex:0 0 auto;color:var(--muted);display:inline-flex}
112
+ .ticon.tbl{color:#7dd3fc}.ticon.viw{color:#c4b5fd}.ticon.prc{color:#fca5a5}.ticon.fun{color:#fcd34d}.ticon.syn{color:#67e8f9}.ticon.sch{color:#93c5fd}.ticon.db{color:#86efac}.ticon.fld{color:var(--muted)}
113
+ .tlabel{flex:1;overflow:hidden;text-overflow:ellipsis}
114
+ .tbadge{color:var(--faint);font-size:11px}
115
+ .tchildren{margin-left:13px;border-left:1px solid var(--border);padding-left:3px}
116
+ .tnote{color:var(--faint);font-size:11.5px;padding:3px 6px}
117
+ .tsearch{margin:3px 0 4px}
118
+
119
+ /* workspace tabs */
120
+ .tabbar{display:flex;align-items:stretch;background:var(--bg-2);border-bottom:1px solid var(--border);overflow-x:auto;flex:0 0 auto;min-height:38px}
121
+ .wtab{display:flex;align-items:center;gap:7px;padding:8px 13px;border-right:1px solid var(--border);color:var(--muted);cursor:pointer;white-space:nowrap;max-width:260px}
122
+ .wtab:hover{color:var(--text);background:var(--bg-3)}
123
+ .wtab.active{color:#bcd4ff;background:var(--bg-3);box-shadow:inset 0 -2px 0 var(--accent)}
124
+ .wtab .t-ico{display:inline-flex;color:var(--faint)}
125
+ .wtab .t-title{overflow:hidden;text-overflow:ellipsis}
126
+ .wtab .dot{width:7px;height:7px;border-radius:50%;background:var(--amber)}
127
+ .wtab .x{color:var(--faint);border-radius:4px;padding:0 3px}
128
+ .wtab .x:hover{color:#fff;background:#37425c}
129
+ .tabcontent{flex:1;min-height:0;position:relative;background:var(--bg)}
130
+ .tabpane{position:absolute;inset:0;display:flex;flex-direction:column;overflow:auto}
131
+
132
+ /* welcome */
133
+ .welcome{padding:26px;max-width:1000px;margin:0 auto;width:100%}
134
+ .welcome h1{margin:0 0 4px;font-size:22px}
135
+ .welcome .lede{color:var(--muted);margin-bottom:22px}
136
+ .wcards{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px;margin-bottom:24px}
137
+ .wcard{background:var(--bg-2);border:1px solid var(--border);border-radius:12px;padding:16px;cursor:pointer}
138
+ .wcard:hover{border-color:var(--accent);background:var(--bg-3)}
139
+ .wcard .wc-ic{color:var(--accent);margin-bottom:8px}
140
+ .wcard h3{margin:0 0 4px;font-size:14px}
141
+ .wcard p{margin:0;color:var(--muted);font-size:12px}
142
+ .wcols{display:grid;grid-template-columns:1fr 1fr;gap:18px}
143
+ .wcol h4{color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.6px;margin:0 0 8px}
144
+ .wlist .wli{padding:8px 10px;border:1px solid var(--border);border-radius:8px;margin-bottom:6px;cursor:pointer;background:var(--bg-2)}
145
+ .wlist .wli:hover{border-color:var(--border-2);background:var(--bg-3)}
146
+
147
+ /* toolbar + editor */
148
+ .toolbar{display:flex;gap:6px;align-items:center;flex-wrap:wrap;padding:8px 10px;border-bottom:1px solid var(--border);background:var(--bg-2)}
149
+ .pane-body{flex:1;min-height:0;display:flex;flex-direction:column;padding:10px;gap:8px;overflow:auto}
150
+ .editor{width:100%;min-height:160px;resize:vertical;background:#0a1018;border:1px solid var(--border);border-radius:8px;padding:11px;color:#e7eefc;font-family:Consolas,"Cascadia Code",monospace;font-size:13px}
151
+ .errbox{background:#2a0f10;border:1px solid #7f1d1d;color:#fca5a5;border-radius:8px;padding:9px 11px;white-space:pre-wrap;font-family:Consolas,monospace;font-size:12px}
152
+
153
+ /* grid */
154
+ .gridwrap{flex:1;min-height:120px;overflow:auto;border:1px solid var(--border);border-radius:8px;background:var(--bg-3)}
155
+ table.grid{border-collapse:separate;border-spacing:0;width:100%;font-size:12.5px}
156
+ table.grid th,table.grid td{border-bottom:1px solid var(--border);border-right:1px solid var(--border);padding:6px 9px;text-align:left;white-space:nowrap;max-width:440px;overflow:hidden;text-overflow:ellipsis}
157
+ table.grid th{position:sticky;top:0;z-index:1;background:#172339;color:#cfe0ff;cursor:pointer;user-select:none}
158
+ table.grid th .sort{color:var(--accent);margin-left:4px}
159
+ table.grid tr:hover td{background:#13203450}
160
+ table.grid td.num{text-align:right;color:#a7f3d0}
161
+ table.grid th.rowhdr,table.grid td.rowhdr{width:54px;text-align:right;color:var(--faint);background:#15203550;cursor:pointer;position:sticky;left:0}
162
+ table.grid tr.selrow td{background:var(--sel)}
163
+ table.grid td.edited{background:var(--editbg);box-shadow:inset 0 0 0 1px var(--amber)}
164
+ table.grid tr.row-del td{background:var(--delbg);text-decoration:line-through;color:#fca5a5}
165
+ table.grid tr.row-ins td{background:var(--insbg)}
166
+ table.grid tr.row-err td{box-shadow:inset 0 0 0 1px var(--red)}
167
+ .rowflag{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px}
168
+ .rowflag.d{background:var(--amber)}.rowflag.del{background:var(--red)}.rowflag.ins{background:var(--green)}
169
+ .cellinput{width:100%;background:#0a1018;border:1px solid var(--accent);border-radius:4px;color:#fff;padding:3px 5px;font:inherit}
170
+ .rowerr-msg{color:#fca5a5;font-size:11px}
171
+
172
+ /* sql tabs inside editor */
173
+ .sqltabs{display:flex;gap:4px;flex-wrap:wrap;padding:6px 10px 0}
174
+ .sqltab{padding:4px 10px;background:var(--bg-3);border:1px solid var(--border);border-bottom:0;border-radius:7px 7px 0 0;cursor:pointer;color:var(--muted);font-size:12px}
175
+ .sqltab.active{color:#cfe0ff;border-color:var(--accent);background:var(--sel)}
176
+ .sqltab .x{margin-left:7px}
177
+
178
+ /* status bar */
179
+ .statusbar{display:flex;align-items:center;gap:16px;padding:5px 12px;background:var(--bg-2);border-top:1px solid var(--border);color:var(--muted);font-size:12px;flex:0 0 auto}
180
+ .st-item{display:inline-flex;align-items:center;gap:6px}
181
+ .st-dot{width:8px;height:8px;border-radius:50%;background:var(--faint)}
182
+ .st-dot.ok{background:var(--green)}.st-dot.err{background:var(--red)}.st-dot.run{background:var(--amber);animation:sp 1s linear infinite}
183
+ .st-pending{color:var(--amber)}
184
+
185
+ /* metadata */
186
+ .meta-tabs{display:flex;gap:5px;padding:8px 10px 0}
187
+ .meta-tab{padding:5px 11px;border:1px solid var(--border);border-bottom:0;border-radius:7px 7px 0 0;cursor:pointer;color:var(--muted);font-size:12px}
188
+ .meta-tab.active{color:#cfe0ff;border-color:var(--accent);background:var(--sel)}
189
+ .kvs{display:grid;grid-template-columns:160px 1fr;gap:5px 14px;padding:6px}
190
+ .kvs .k{color:var(--muted)}
191
+ .pill{display:inline-block;padding:1px 7px;border-radius:999px;background:var(--chip);border:1px solid var(--border);font-size:11px;color:var(--muted)}
192
+ .pill.pk{color:#fde68a;border-color:#a16207}
193
+
194
+ /* modal + wizard */
195
+ .modal{position:fixed;inset:0;background:rgba(2,6,15,.62);display:flex;align-items:center;justify-content:center;z-index:60}
196
+ .dialog{background:var(--bg-2);border:1px solid var(--border-2);border-radius:14px;padding:18px;width:560px;max-width:94vw;max-height:90vh;overflow:auto;box-shadow:0 24px 80px rgba(0,0,0,.5)}
197
+ .dialog h3{margin:0 0 14px}
198
+ .steps{display:flex;gap:6px;margin-bottom:14px;flex-wrap:wrap}
199
+ .step{flex:1;min-width:80px;text-align:center;font-size:11px;color:var(--faint);padding:6px 4px;border-radius:8px;background:var(--bg-3);border:1px solid var(--border)}
200
+ .step.active{color:#cfe0ff;border-color:var(--accent)}
201
+ .step.done{color:var(--green)}
202
+ .wlistbox{max-height:240px;overflow:auto;border:1px solid var(--border);border-radius:9px}
203
+ .wrow{padding:8px 10px;border-bottom:1px solid var(--border);cursor:pointer;display:flex;align-items:center;gap:8px}
204
+ .wrow:hover{background:var(--bg-3)}
205
+ .wrow.sel{background:var(--sel)}
206
+ .swatches{display:flex;gap:7px;flex-wrap:wrap}
207
+ .swatch{width:24px;height:24px;border-radius:7px;cursor:pointer;border:2px solid transparent}
208
+ .swatch.sel{border-color:#fff}
209
+
210
+ /* context menu */
211
+ .ctxmenu{position:fixed;z-index:80;background:var(--bg-2);border:1px solid var(--border-2);border-radius:9px;padding:5px;min-width:190px;box-shadow:0 16px 50px rgba(0,0,0,.5)}
212
+ .ctxitem{display:flex;align-items:center;gap:9px;padding:7px 10px;border-radius:7px;cursor:pointer;color:var(--text);font-size:12.5px}
213
+ .ctxitem:hover{background:var(--accent);color:#fff}
214
+ .ctxitem.danger{color:#fca5a5}
215
+ .ctxitem.danger:hover{background:#7f1d1d;color:#fff}
216
+ .ctxsep{height:1px;background:var(--border);margin:4px 6px}
217
+
218
+ /* toasts */
219
+ .toasts{position:fixed;right:16px;bottom:16px;display:flex;flex-direction:column;gap:8px;z-index:90}
220
+ .toast{background:var(--bg-2);border:1px solid var(--border-2);border-left:3px solid var(--accent);border-radius:9px;padding:9px 13px;min-width:240px;max-width:380px;box-shadow:0 10px 34px rgba(0,0,0,.4);animation:slideup .18s ease}
221
+ .toast.ok{border-left-color:var(--green)}.toast.err{border-left-color:var(--red)}.toast.warn{border-left-color:var(--yellow)}
222
+ @keyframes slideup{from{transform:translateY(8px);opacity:0}to{transform:translateY(0);opacity:1}}
223
+ .empty{color:var(--faint);padding:16px;text-align:center}
224
+ `;
225
+ //# sourceMappingURL=db-studio-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-studio-styles.js","sourceRoot":"","sources":["../../../src/core/db/db-studio-styles.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4N5B,CAAC"}
@@ -0,0 +1,214 @@
1
+ export type TDatabaseType = "hana" | "postgresql";
2
+ export type TConnectionEnvironment = "DEV" | "QAS" | "PROD" | "SANDBOX" | "CUSTOM";
3
+ export type TDatabaseConnectionProfile = {
4
+ id: string;
5
+ name: string;
6
+ color?: string;
7
+ environment?: TConnectionEnvironment;
8
+ isFavorite?: boolean;
9
+ type: TDatabaseType;
10
+ region?: string;
11
+ org?: string;
12
+ space?: string;
13
+ app?: string;
14
+ serviceName?: string;
15
+ servicePlan?: string;
16
+ host: string;
17
+ port: number;
18
+ database?: string;
19
+ schema?: string;
20
+ username: string;
21
+ encryptedPassword: string;
22
+ ssl?: boolean;
23
+ sslValidateCertificate?: boolean;
24
+ createdAt: string;
25
+ updatedAt: string;
26
+ lastUsedAt?: string;
27
+ tags?: string[];
28
+ };
29
+ /**
30
+ * A connection profile whose password has been decrypted for internal server
31
+ * use. This shape never leaves the local process boundary.
32
+ */
33
+ export type TResolvedDatabaseConnection = Omit<TDatabaseConnectionProfile, "encryptedPassword"> & {
34
+ password: string;
35
+ };
36
+ /**
37
+ * A connection profile safe to send to the browser: no password material.
38
+ */
39
+ export type TPublicDatabaseConnection = Omit<TDatabaseConnectionProfile, "encryptedPassword">;
40
+ export type TDatabaseColumn = {
41
+ name: string;
42
+ dataType: string;
43
+ length?: number;
44
+ scale?: number;
45
+ nullable: boolean;
46
+ defaultValue?: string;
47
+ isPrimaryKey?: boolean;
48
+ comment?: string;
49
+ position?: number;
50
+ };
51
+ export type TDatabaseObjectKind = "table" | "view" | "column-view" | "procedure" | "function" | "synonym" | "index";
52
+ export type TDatabaseObject = {
53
+ schema: string;
54
+ name: string;
55
+ kind: TDatabaseObjectKind;
56
+ type?: string;
57
+ comment?: string;
58
+ };
59
+ export type TDatabaseSchema = {
60
+ name: string;
61
+ isSystem: boolean;
62
+ };
63
+ export type TDatabaseIndex = {
64
+ name: string;
65
+ columns: string[];
66
+ isUnique: boolean;
67
+ isPrimaryKey: boolean;
68
+ };
69
+ export type TDatabaseQueryResult = {
70
+ fields: string[];
71
+ rows: Array<Record<string, unknown>>;
72
+ rowCount: number;
73
+ affectedRows?: number;
74
+ command?: string;
75
+ durationMs: number;
76
+ truncated?: boolean;
77
+ };
78
+ /**
79
+ * A database service candidate detected inside a parsed VCAP_SERVICES block.
80
+ * The password is kept here only transiently while importing from BTP.
81
+ */
82
+ export type TDatabaseServiceCandidate = {
83
+ type: TDatabaseType;
84
+ label: string;
85
+ serviceName: string;
86
+ servicePlan?: string;
87
+ host: string;
88
+ port: number;
89
+ database?: string;
90
+ schema?: string;
91
+ username: string;
92
+ password: string;
93
+ ssl: boolean;
94
+ sslValidateCertificate?: boolean;
95
+ };
96
+ export type TBtpAppDatabaseImportContext = {
97
+ region?: string;
98
+ org?: string;
99
+ space?: string;
100
+ app?: string;
101
+ };
102
+ export type TSavedQuery = {
103
+ id: string;
104
+ name: string;
105
+ connectionType?: TDatabaseType;
106
+ connectionId?: string;
107
+ sql: string;
108
+ tags?: string[];
109
+ createdAt: string;
110
+ updatedAt: string;
111
+ };
112
+ export type TQueryHistoryItem = {
113
+ id: string;
114
+ timestamp: string;
115
+ connectionId?: string;
116
+ connectionName?: string;
117
+ connectionType?: TDatabaseType;
118
+ sql: string;
119
+ durationMs: number;
120
+ success: boolean;
121
+ rowCount?: number;
122
+ error?: string;
123
+ };
124
+ export type TSqlSafetyAnalysis = {
125
+ isDestructive: boolean;
126
+ isReadOnly: boolean;
127
+ blockedByReadOnly: boolean;
128
+ matchedKeywords: string[];
129
+ reason?: string;
130
+ };
131
+ export type TConnectionTestResult = {
132
+ success: boolean;
133
+ message: string;
134
+ serverVersion?: string;
135
+ durationMs: number;
136
+ };
137
+ export type TListObjectsOptions = {
138
+ schema?: string;
139
+ kinds?: TDatabaseObjectKind[];
140
+ search?: string;
141
+ };
142
+ export type TTableDataOptions = {
143
+ schema: string;
144
+ table: string;
145
+ limit: number;
146
+ offset: number;
147
+ where?: string;
148
+ orderBy?: string;
149
+ orderDirection?: "asc" | "desc";
150
+ };
151
+ /**
152
+ * Common interface implemented by every database adapter. Adapters own dialect
153
+ * specifics (quoting, system catalog queries) so the rest of the studio is
154
+ * dialect-agnostic.
155
+ */
156
+ export type TDatabasePrimaryKey = {
157
+ columns: string[];
158
+ constraintName?: string;
159
+ };
160
+ export type TRowUpdate = {
161
+ key: Record<string, unknown>;
162
+ changes: Record<string, unknown>;
163
+ };
164
+ export type TRowInsert = {
165
+ values: Record<string, unknown>;
166
+ };
167
+ export type TRowDelete = {
168
+ key: Record<string, unknown>;
169
+ };
170
+ export type TTableChangeSet = {
171
+ schema: string;
172
+ table: string;
173
+ primaryKeyColumns: string[];
174
+ updates: TRowUpdate[];
175
+ inserts: TRowInsert[];
176
+ deletes: TRowDelete[];
177
+ };
178
+ export type TSaveRowResult = {
179
+ type: "update" | "insert" | "delete";
180
+ success: boolean;
181
+ key?: Record<string, unknown>;
182
+ error?: string;
183
+ };
184
+ export type TSaveTableChangesResult = {
185
+ success: boolean;
186
+ updated: number;
187
+ inserted: number;
188
+ deleted: number;
189
+ rowResults: TSaveRowResult[];
190
+ };
191
+ export interface IDatabaseAdapter {
192
+ readonly type: TDatabaseType;
193
+ connect(): Promise<void>;
194
+ disconnect(): Promise<void>;
195
+ testConnection(): Promise<TConnectionTestResult>;
196
+ getPrimaryKey(schema: string, table: string): Promise<TDatabasePrimaryKey>;
197
+ runQuery(sql: string, options?: {
198
+ maxRows?: number;
199
+ }): Promise<TDatabaseQueryResult>;
200
+ /** Run a parameterized statement. Placeholders come from `placeholder()`. */
201
+ runParameterized(sql: string, params: unknown[], options?: {
202
+ maxRows?: number;
203
+ }): Promise<TDatabaseQueryResult>;
204
+ /** Dialect-specific bind placeholder for parameter N (1-based). */
205
+ placeholder(index: number): string;
206
+ listSchemas(): Promise<TDatabaseSchema[]>;
207
+ listObjects(options: TListObjectsOptions): Promise<TDatabaseObject[]>;
208
+ listColumns(schema: string, table: string): Promise<TDatabaseColumn[]>;
209
+ listIndexes(schema: string, table: string): Promise<TDatabaseIndex[]>;
210
+ countRows(schema: string, table: string): Promise<number>;
211
+ getTableData(options: TTableDataOptions): Promise<TDatabaseQueryResult>;
212
+ quoteIdentifier(identifier: string): string;
213
+ buildQualifiedName(schema: string, name: string): string;
214
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=db-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-types.js","sourceRoot":"","sources":["../../../src/core/db/db-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { TDatabaseServiceCandidate } from "./db-types";
2
+ /**
3
+ * Inspect a parsed VCAP_SERVICES object and return every HANA / PostgreSQL
4
+ * service whose credentials are complete enough to connect.
5
+ */
6
+ export declare function detectDatabaseServiceCandidates(vcapServices: unknown): TDatabaseServiceCandidate[];
7
+ export declare function describeServiceCandidate(candidate: TDatabaseServiceCandidate): string;
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectDatabaseServiceCandidates = detectDatabaseServiceCandidates;
4
+ exports.describeServiceCandidate = describeServiceCandidate;
5
+ const HANA_HINTS = ["hana", "hana-cloud", "hanatrial", "hdi-shared", "hdi", "saphana"];
6
+ const POSTGRES_HINTS = ["postgres", "postgresql", "timescale", "postgresql-db", "postgres-db"];
7
+ function toStringValue(value) {
8
+ if (value === undefined || value === null) {
9
+ return "";
10
+ }
11
+ return String(value);
12
+ }
13
+ function toNumberValue(value, fallback) {
14
+ const parsed = Number(value);
15
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
16
+ }
17
+ function toBooleanValue(value, fallback) {
18
+ if (typeof value === "boolean") {
19
+ return value;
20
+ }
21
+ if (typeof value === "string") {
22
+ const normalized = value.trim().toLowerCase();
23
+ if (["true", "1", "yes", "on"].includes(normalized))
24
+ return true;
25
+ if (["false", "0", "no", "off"].includes(normalized))
26
+ return false;
27
+ }
28
+ return fallback;
29
+ }
30
+ function buildHaystack(label, entry, credentials) {
31
+ const tags = Array.isArray(entry.tags) ? entry.tags.map(toStringValue).join(" ") : "";
32
+ const credentialUrl = `${toStringValue(credentials.url)} ${toStringValue(credentials.uri)}`;
33
+ return `${label} ${toStringValue(entry.label)} ${toStringValue(entry.name)} ${tags} ${credentialUrl}`.toLowerCase();
34
+ }
35
+ function matchesAnyHint(haystack, hints) {
36
+ return hints.some((hint) => haystack.includes(hint));
37
+ }
38
+ function detectHanaCandidate(label, entry, credentials) {
39
+ const host = toStringValue(credentials.host ?? credentials.hostname);
40
+ const user = toStringValue(credentials.user ?? credentials.username ?? credentials.hdi_user);
41
+ const password = toStringValue(credentials.password ?? credentials.hdi_password);
42
+ if (!host || !user || !password) {
43
+ return undefined;
44
+ }
45
+ const schema = toStringValue(credentials.schema ?? credentials.currentSchema ?? credentials.hdi_user ?? credentials.user);
46
+ return {
47
+ type: "hana",
48
+ label,
49
+ serviceName: toStringValue(entry.name ?? entry.instance_name ?? label),
50
+ servicePlan: toStringValue(entry.plan) || undefined,
51
+ host,
52
+ port: toNumberValue(credentials.port, 443),
53
+ database: toStringValue(credentials.databaseName ?? credentials.dbname) || undefined,
54
+ schema: schema || undefined,
55
+ username: user,
56
+ password,
57
+ ssl: toBooleanValue(credentials.encrypt, true),
58
+ sslValidateCertificate: toBooleanValue(credentials.sslValidateCertificate ?? credentials.validate_certificate, false),
59
+ };
60
+ }
61
+ function detectPostgresCandidate(label, entry, credentials) {
62
+ const rawUri = toStringValue(credentials.uri ?? credentials.url);
63
+ let parsedUri;
64
+ if (rawUri && /^postg(res|resql)?:\/\//i.test(rawUri)) {
65
+ try {
66
+ parsedUri = new URL(rawUri);
67
+ }
68
+ catch {
69
+ parsedUri = undefined;
70
+ }
71
+ }
72
+ const host = toStringValue(credentials.hostname ?? credentials.host ?? parsedUri?.hostname);
73
+ const username = toStringValue(credentials.username ?? credentials.user ?? parsedUri?.username);
74
+ const password = toStringValue(credentials.password ?? (parsedUri?.password ? decodeURIComponent(parsedUri.password) : ""));
75
+ if (!host || !username || !password) {
76
+ return undefined;
77
+ }
78
+ const database = toStringValue(credentials.dbname ?? credentials.database ?? parsedUri?.pathname.replace(/^\//, ""));
79
+ return {
80
+ type: "postgresql",
81
+ label,
82
+ serviceName: toStringValue(entry.name ?? entry.instance_name ?? label),
83
+ servicePlan: toStringValue(entry.plan) || undefined,
84
+ host,
85
+ port: toNumberValue(credentials.port ?? parsedUri?.port, 5432),
86
+ database: database || undefined,
87
+ schema: toStringValue(credentials.schema) || "public",
88
+ username,
89
+ password,
90
+ ssl: toBooleanValue(credentials.sslrootcert ? true : credentials.ssl, true),
91
+ sslValidateCertificate: toBooleanValue(credentials.sslValidateCertificate, false),
92
+ };
93
+ }
94
+ /**
95
+ * Inspect a parsed VCAP_SERVICES object and return every HANA / PostgreSQL
96
+ * service whose credentials are complete enough to connect.
97
+ */
98
+ function detectDatabaseServiceCandidates(vcapServices) {
99
+ if (!vcapServices || typeof vcapServices !== "object") {
100
+ return [];
101
+ }
102
+ const candidates = [];
103
+ for (const [label, entries] of Object.entries(vcapServices)) {
104
+ if (!Array.isArray(entries)) {
105
+ continue;
106
+ }
107
+ for (const rawEntry of entries) {
108
+ const credentials = (rawEntry.credentials ?? {});
109
+ if (Object.keys(credentials).length === 0) {
110
+ continue;
111
+ }
112
+ const haystack = buildHaystack(label, rawEntry, credentials);
113
+ const isHanaShaped = matchesAnyHint(haystack, HANA_HINTS);
114
+ const isPostgresShaped = matchesAnyHint(haystack, POSTGRES_HINTS) || /^postg(res|resql)?:\/\//i.test(toStringValue(credentials.uri ?? credentials.url));
115
+ if (isPostgresShaped) {
116
+ const postgres = detectPostgresCandidate(label, rawEntry, credentials);
117
+ if (postgres) {
118
+ candidates.push(postgres);
119
+ continue;
120
+ }
121
+ }
122
+ if (isHanaShaped) {
123
+ const hana = detectHanaCandidate(label, rawEntry, credentials);
124
+ if (hana) {
125
+ candidates.push(hana);
126
+ }
127
+ }
128
+ }
129
+ }
130
+ return candidates;
131
+ }
132
+ function describeServiceCandidate(candidate) {
133
+ const databaseTypeLabel = { hana: "HANA", postgresql: "PostgreSQL" };
134
+ const target = candidate.database || candidate.schema || candidate.host;
135
+ return `${candidate.serviceName} · ${databaseTypeLabel[candidate.type]} · ${target}`;
136
+ }
137
+ //# sourceMappingURL=db-vcap-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-vcap-parser.js","sourceRoot":"","sources":["../../../src/core/db/db-vcap-parser.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { TDoctorPackageResult } from "./types.js";
1
+ import type { TDoctorPackageResult } from "./types";
2
2
  export declare function doctorPackage(options: {
3
3
  repositoryPath: string;
4
4
  packageName: string;
@@ -1,5 +1,11 @@
1
- import path from "node:path";
2
- import fs from "fs-extra";
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.doctorPackage = doctorPackage;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
3
9
  async function findPackageJsonFiles(startPath, packageName) {
4
10
  const packagePathParts = packageName.startsWith("@") ? packageName.split("/") : [packageName];
5
11
  const result = [];
@@ -7,7 +13,7 @@ async function findPackageJsonFiles(startPath, packageName) {
7
13
  if (depth > 8) {
8
14
  return;
9
15
  }
10
- const entries = await fs.readdir(directoryPath, { withFileTypes: true }).catch(() => []);
16
+ const entries = await fs_extra_1.default.readdir(directoryPath, { withFileTypes: true }).catch(() => []);
11
17
  for (const entry of entries) {
12
18
  if (!entry.isDirectory()) {
13
19
  continue;
@@ -15,10 +21,10 @@ async function findPackageJsonFiles(startPath, packageName) {
15
21
  if (entry.name === ".git") {
16
22
  continue;
17
23
  }
18
- const entryPath = path.join(directoryPath, entry.name);
24
+ const entryPath = node_path_1.default.join(directoryPath, entry.name);
19
25
  if (entry.name === "node_modules") {
20
- const packageJsonPath = path.join(entryPath, ...packagePathParts, "package.json");
21
- if (await fs.pathExists(packageJsonPath)) {
26
+ const packageJsonPath = node_path_1.default.join(entryPath, ...packagePathParts, "package.json");
27
+ if (await fs_extra_1.default.pathExists(packageJsonPath)) {
22
28
  result.push(packageJsonPath);
23
29
  }
24
30
  await walk(entryPath, depth + 1);
@@ -33,11 +39,11 @@ async function findPackageJsonFiles(startPath, packageName) {
33
39
  await walk(startPath, 0);
34
40
  return result;
35
41
  }
36
- export async function doctorPackage(options) {
42
+ async function doctorPackage(options) {
37
43
  const packageJsonFiles = await findPackageJsonFiles(options.repositoryPath, options.packageName);
38
44
  const occurrences = [];
39
45
  for (const packageJsonFile of packageJsonFiles) {
40
- const packageJson = await fs.readJson(packageJsonFile).catch(() => undefined);
46
+ const packageJson = await fs_extra_1.default.readJson(packageJsonFile).catch(() => undefined);
41
47
  occurrences.push({
42
48
  version: packageJson?.version,
43
49
  path: packageJsonFile,