dsh-git-changes 0.0.0-stage → 0.1.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.
Files changed (140) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +119 -0
  3. package/README.md +137 -2
  4. package/THIRD_PARTY_NOTICES.md +12 -0
  5. package/assets/vendor/monaco/LICENSE +21 -0
  6. package/assets/vendor/monaco/ThirdPartyNotices.txt +448 -0
  7. package/assets/vendor/monaco/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  8. package/assets/vendor/monaco/vs/base/common/worker/simpleWorker.nls.js +7 -0
  9. package/assets/vendor/monaco/vs/base/common/worker/simpleWorker.nls.zh-cn.js +7 -0
  10. package/assets/vendor/monaco/vs/base/worker/workerMain.js +26 -0
  11. package/assets/vendor/monaco/vs/basic-languages/abap/abap.js +10 -0
  12. package/assets/vendor/monaco/vs/basic-languages/apex/apex.js +10 -0
  13. package/assets/vendor/monaco/vs/basic-languages/azcli/azcli.js +10 -0
  14. package/assets/vendor/monaco/vs/basic-languages/bat/bat.js +10 -0
  15. package/assets/vendor/monaco/vs/basic-languages/bicep/bicep.js +11 -0
  16. package/assets/vendor/monaco/vs/basic-languages/cameligo/cameligo.js +10 -0
  17. package/assets/vendor/monaco/vs/basic-languages/clojure/clojure.js +10 -0
  18. package/assets/vendor/monaco/vs/basic-languages/coffee/coffee.js +10 -0
  19. package/assets/vendor/monaco/vs/basic-languages/cpp/cpp.js +10 -0
  20. package/assets/vendor/monaco/vs/basic-languages/csharp/csharp.js +10 -0
  21. package/assets/vendor/monaco/vs/basic-languages/csp/csp.js +10 -0
  22. package/assets/vendor/monaco/vs/basic-languages/css/css.js +12 -0
  23. package/assets/vendor/monaco/vs/basic-languages/cypher/cypher.js +10 -0
  24. package/assets/vendor/monaco/vs/basic-languages/dart/dart.js +10 -0
  25. package/assets/vendor/monaco/vs/basic-languages/dockerfile/dockerfile.js +10 -0
  26. package/assets/vendor/monaco/vs/basic-languages/ecl/ecl.js +10 -0
  27. package/assets/vendor/monaco/vs/basic-languages/elixir/elixir.js +10 -0
  28. package/assets/vendor/monaco/vs/basic-languages/flow9/flow9.js +10 -0
  29. package/assets/vendor/monaco/vs/basic-languages/freemarker2/freemarker2.js +12 -0
  30. package/assets/vendor/monaco/vs/basic-languages/fsharp/fsharp.js +10 -0
  31. package/assets/vendor/monaco/vs/basic-languages/go/go.js +10 -0
  32. package/assets/vendor/monaco/vs/basic-languages/graphql/graphql.js +10 -0
  33. package/assets/vendor/monaco/vs/basic-languages/handlebars/handlebars.js +10 -0
  34. package/assets/vendor/monaco/vs/basic-languages/hcl/hcl.js +10 -0
  35. package/assets/vendor/monaco/vs/basic-languages/html/html.js +10 -0
  36. package/assets/vendor/monaco/vs/basic-languages/ini/ini.js +10 -0
  37. package/assets/vendor/monaco/vs/basic-languages/java/java.js +10 -0
  38. package/assets/vendor/monaco/vs/basic-languages/javascript/javascript.js +10 -0
  39. package/assets/vendor/monaco/vs/basic-languages/julia/julia.js +10 -0
  40. package/assets/vendor/monaco/vs/basic-languages/kotlin/kotlin.js +10 -0
  41. package/assets/vendor/monaco/vs/basic-languages/less/less.js +11 -0
  42. package/assets/vendor/monaco/vs/basic-languages/lexon/lexon.js +10 -0
  43. package/assets/vendor/monaco/vs/basic-languages/liquid/liquid.js +10 -0
  44. package/assets/vendor/monaco/vs/basic-languages/lua/lua.js +10 -0
  45. package/assets/vendor/monaco/vs/basic-languages/m3/m3.js +10 -0
  46. package/assets/vendor/monaco/vs/basic-languages/markdown/markdown.js +10 -0
  47. package/assets/vendor/monaco/vs/basic-languages/mdx/mdx.js +10 -0
  48. package/assets/vendor/monaco/vs/basic-languages/mips/mips.js +10 -0
  49. package/assets/vendor/monaco/vs/basic-languages/msdax/msdax.js +10 -0
  50. package/assets/vendor/monaco/vs/basic-languages/mysql/mysql.js +10 -0
  51. package/assets/vendor/monaco/vs/basic-languages/objective-c/objective-c.js +10 -0
  52. package/assets/vendor/monaco/vs/basic-languages/pascal/pascal.js +10 -0
  53. package/assets/vendor/monaco/vs/basic-languages/pascaligo/pascaligo.js +10 -0
  54. package/assets/vendor/monaco/vs/basic-languages/perl/perl.js +10 -0
  55. package/assets/vendor/monaco/vs/basic-languages/pgsql/pgsql.js +10 -0
  56. package/assets/vendor/monaco/vs/basic-languages/php/php.js +10 -0
  57. package/assets/vendor/monaco/vs/basic-languages/pla/pla.js +10 -0
  58. package/assets/vendor/monaco/vs/basic-languages/postiats/postiats.js +10 -0
  59. package/assets/vendor/monaco/vs/basic-languages/powerquery/powerquery.js +10 -0
  60. package/assets/vendor/monaco/vs/basic-languages/powershell/powershell.js +10 -0
  61. package/assets/vendor/monaco/vs/basic-languages/protobuf/protobuf.js +11 -0
  62. package/assets/vendor/monaco/vs/basic-languages/pug/pug.js +10 -0
  63. package/assets/vendor/monaco/vs/basic-languages/python/python.js +10 -0
  64. package/assets/vendor/monaco/vs/basic-languages/qsharp/qsharp.js +10 -0
  65. package/assets/vendor/monaco/vs/basic-languages/r/r.js +10 -0
  66. package/assets/vendor/monaco/vs/basic-languages/razor/razor.js +10 -0
  67. package/assets/vendor/monaco/vs/basic-languages/redis/redis.js +10 -0
  68. package/assets/vendor/monaco/vs/basic-languages/redshift/redshift.js +10 -0
  69. package/assets/vendor/monaco/vs/basic-languages/restructuredtext/restructuredtext.js +10 -0
  70. package/assets/vendor/monaco/vs/basic-languages/ruby/ruby.js +10 -0
  71. package/assets/vendor/monaco/vs/basic-languages/rust/rust.js +10 -0
  72. package/assets/vendor/monaco/vs/basic-languages/sb/sb.js +10 -0
  73. package/assets/vendor/monaco/vs/basic-languages/scala/scala.js +10 -0
  74. package/assets/vendor/monaco/vs/basic-languages/scheme/scheme.js +10 -0
  75. package/assets/vendor/monaco/vs/basic-languages/scss/scss.js +12 -0
  76. package/assets/vendor/monaco/vs/basic-languages/shell/shell.js +10 -0
  77. package/assets/vendor/monaco/vs/basic-languages/solidity/solidity.js +10 -0
  78. package/assets/vendor/monaco/vs/basic-languages/sophia/sophia.js +10 -0
  79. package/assets/vendor/monaco/vs/basic-languages/sparql/sparql.js +10 -0
  80. package/assets/vendor/monaco/vs/basic-languages/sql/sql.js +10 -0
  81. package/assets/vendor/monaco/vs/basic-languages/st/st.js +10 -0
  82. package/assets/vendor/monaco/vs/basic-languages/swift/swift.js +13 -0
  83. package/assets/vendor/monaco/vs/basic-languages/systemverilog/systemverilog.js +10 -0
  84. package/assets/vendor/monaco/vs/basic-languages/tcl/tcl.js +10 -0
  85. package/assets/vendor/monaco/vs/basic-languages/twig/twig.js +10 -0
  86. package/assets/vendor/monaco/vs/basic-languages/typescript/typescript.js +10 -0
  87. package/assets/vendor/monaco/vs/basic-languages/vb/vb.js +10 -0
  88. package/assets/vendor/monaco/vs/basic-languages/wgsl/wgsl.js +307 -0
  89. package/assets/vendor/monaco/vs/basic-languages/xml/xml.js +10 -0
  90. package/assets/vendor/monaco/vs/basic-languages/yaml/yaml.js +10 -0
  91. package/assets/vendor/monaco/vs/editor/editor.main.css +6 -0
  92. package/assets/vendor/monaco/vs/editor/editor.main.js +744 -0
  93. package/assets/vendor/monaco/vs/editor/editor.main.nls.js +28 -0
  94. package/assets/vendor/monaco/vs/editor/editor.main.nls.zh-cn.js +30 -0
  95. package/assets/vendor/monaco/vs/language/css/cssMode.js +13 -0
  96. package/assets/vendor/monaco/vs/language/css/cssWorker.js +81 -0
  97. package/assets/vendor/monaco/vs/language/html/htmlMode.js +13 -0
  98. package/assets/vendor/monaco/vs/language/html/htmlWorker.js +453 -0
  99. package/assets/vendor/monaco/vs/language/json/jsonMode.js +15 -0
  100. package/assets/vendor/monaco/vs/language/json/jsonWorker.js +36 -0
  101. package/assets/vendor/monaco/vs/language/typescript/tsMode.js +20 -0
  102. package/assets/vendor/monaco/vs/language/typescript/tsWorker.js +37016 -0
  103. package/assets/vendor/monaco/vs/loader.js +10 -0
  104. package/cordis.patch.yml +3 -0
  105. package/docs/images/git-changes-diff.png +0 -0
  106. package/docs/regression-checklist.md +47 -0
  107. package/icon.svg +10 -0
  108. package/lib/client.js +9418 -0
  109. package/lib/host/assets.js +161 -0
  110. package/lib/host/commit-message.js +158 -0
  111. package/lib/host/files-index.js +206 -0
  112. package/lib/host/git-write.js +194 -0
  113. package/lib/host/git.js +1147 -0
  114. package/lib/host/lsp.js +842 -0
  115. package/lib/host/routes.js +976 -0
  116. package/lib/host/session.js +84 -0
  117. package/lib/host/util.js +107 -0
  118. package/lib/index.js +33 -0
  119. package/licenses/dsh-vscode-mode-LICENSE +21 -0
  120. package/licenses/vscode-theme-seti-LICENSE +21 -0
  121. package/licenses/vscode-theme-seti-ThirdPartyNotices.txt +32 -0
  122. package/locale/en.json +6 -0
  123. package/locale/zh.json +6 -0
  124. package/package.json +65 -4
  125. package/src/client/00-const.js +79 -0
  126. package/src/client/05-utils.js +277 -0
  127. package/src/client/10-i18n.js +548 -0
  128. package/src/client/12-vscode-icons.js +460 -0
  129. package/src/client/15-theme.js +509 -0
  130. package/src/client/20-monaco.js +1404 -0
  131. package/src/client/22-lsp.js +592 -0
  132. package/src/client/25-tree.js +563 -0
  133. package/src/client/28-changes.js +1163 -0
  134. package/src/client/30-page.js +2259 -0
  135. package/src/client/35-pill.js +185 -0
  136. package/src/client/40-commands.js +248 -0
  137. package/src/client/45-css.js +357 -0
  138. package/src/client/47-pickers.js +457 -0
  139. package/src/client/50-apply.js +207 -0
  140. package/src/client/99-footer.js +62 -0
@@ -0,0 +1,277 @@
1
+ /* dsh-git-changes client half — pure helpers. */
2
+
3
+ /**
4
+ * Join class names, dropping empty values.
5
+ * @param {...(string|false|null|undefined)} values class names
6
+ * @returns {string}
7
+ */
8
+ function cx(...values) {
9
+ return values.filter((value) => typeof value === 'string' && value.length > 0).join(' ')
10
+ }
11
+
12
+ /**
13
+ * Resolve an application-local path against the document base (reverse-proxy and
14
+ * desktop `dsh-app:` safe).
15
+ * @param {string} path root-shaped path
16
+ * @returns {string} absolute application URL
17
+ */
18
+ function appUrl(path) {
19
+ try {
20
+ const base = (typeof document !== 'undefined' && document.baseURI) || (typeof location !== 'undefined' ? location.href : undefined)
21
+ if (!base) return path
22
+ const root = new URL('.', base)
23
+ return new URL(String(path).replace(/^\/+/, ''), root).href
24
+ } catch (error) {
25
+ return path
26
+ }
27
+ }
28
+
29
+ /**
30
+ * Read one optional client service without throwing.
31
+ * @param {object} ctx client plugin context
32
+ * @param {string} name service name
33
+ * @returns {any}
34
+ */
35
+ function safeGet(ctx, name) {
36
+ try {
37
+ return ctx.get(name)
38
+ } catch (error) {
39
+ return undefined
40
+ }
41
+ }
42
+
43
+ /** Resolve shortcut labels against the connected client's profile, not the Host OS. */
44
+ function shortcutEnvironment(service) {
45
+ if (!service && typeof globalCtxRef !== 'undefined' && globalCtxRef.current) {
46
+ service = safeGet(globalCtxRef.current, 'shortcuts')
47
+ }
48
+ let detected = ''
49
+ try {
50
+ if (typeof navigator !== 'undefined') detected = navigator.userAgentData?.platform || navigator.platform || navigator.userAgent || ''
51
+ } catch (error) { /* use the service profile or neutral labels */ }
52
+ const rawPlatform = String(service?.platform || detected).toLowerCase()
53
+ const platform = /mac|darwin|iphone|ipad/.test(rawPlatform) ? 'macos'
54
+ : /win/.test(rawPlatform) ? 'windows' : /linux/.test(rawPlatform) ? 'linux' : 'unknown'
55
+ let runtime = service?.runtime
56
+ if (runtime !== 'desktop' && runtime !== 'web') {
57
+ runtime = typeof document !== 'undefined' && /^dsh-app:/i.test(document.baseURI || '') ? 'desktop' : 'web'
58
+ }
59
+ return { platform, runtime }
60
+ }
61
+
62
+ /** Name one logical/physical modifier using the current client platform. */
63
+ function shortcutModifierLabel(modifier, environment = shortcutEnvironment()) {
64
+ const mac = environment.platform === 'macos'
65
+ const labels = {
66
+ primary: mac ? 'Cmd' : 'Ctrl', control: 'Ctrl', shift: 'Shift',
67
+ alt: mac ? 'Option' : 'Alt', meta: mac ? 'Cmd' : environment.platform === 'windows' ? 'Win' : 'Super',
68
+ }
69
+ return labels[modifier] || modifier
70
+ }
71
+
72
+ /**
73
+ * Tagged console logger (the client runtime tags it per package).
74
+ * @param {'log'|'warn'|'error'} level console level
75
+ * @param {...unknown} args values
76
+ */
77
+ function log(level, ...args) {
78
+ try {
79
+ const target = console[level] || console.log
80
+ target.call(console, '[dsh-git-changes]', ...args)
81
+ } catch (error) {
82
+ /* logging must never break the view */
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Format an integer with grouping.
88
+ * @param {number} value number
89
+ * @returns {string}
90
+ */
91
+ function fmtInt(value) {
92
+ const number = Number(value)
93
+ if (!Number.isFinite(number)) return '0'
94
+ return number.toLocaleString('en-US')
95
+ }
96
+
97
+ /**
98
+ * Decode one service response as JSON, mapping HTTP failures to Errors.
99
+ * @param {Response} response fetch response
100
+ * @returns {Promise<any>}
101
+ */
102
+ async function decodeJson(response) {
103
+ let body = null
104
+ try {
105
+ body = await response.json()
106
+ } catch (error) {
107
+ body = null
108
+ }
109
+ if (!response.ok) {
110
+ const message = body && body.error && typeof body.error.message === 'string'
111
+ ? body.error.message
112
+ : 'HTTP ' + response.status
113
+ const failure = new Error(message)
114
+ failure.status = response.status
115
+ failure.code = body && body.error ? body.error.code : undefined
116
+ throw failure
117
+ }
118
+ return body
119
+ }
120
+
121
+ /**
122
+ * GET one authenticated review route with document-relative resolution.
123
+ * @param {string} name route key in ROUTES
124
+ * @param {Record<string, string|number|undefined|null>} [params] query parameters
125
+ * @param {AbortSignal} [signal] cancellation
126
+ * @returns {Promise<any>}
127
+ */
128
+ async function apiGet(name, params, signal) {
129
+ const query = new URLSearchParams()
130
+ if (params) {
131
+ for (const key of Object.keys(params)) {
132
+ const value = params[key]
133
+ if (value === undefined || value === null || value === '') continue
134
+ query.set(key, String(value))
135
+ }
136
+ }
137
+ const suffix = query.toString()
138
+ const url = ROUTES[name] + (suffix ? '?' + suffix : '')
139
+ const response = await fetch(url, {
140
+ signal,
141
+ credentials: 'same-origin',
142
+ headers: { accept: 'application/json' },
143
+ })
144
+ return decodeJson(response)
145
+ }
146
+
147
+ /**
148
+ * POST one authenticated review route with a JSON body.
149
+ * @param {string} name route key in ROUTES
150
+ * @param {object} body JSON body
151
+ * @param {AbortSignal} [signal] cancellation
152
+ * @returns {Promise<any>}
153
+ */
154
+ async function apiPost(name, body, signal) {
155
+ const response = await fetch(ROUTES[name], {
156
+ method: 'POST',
157
+ signal,
158
+ credentials: 'same-origin',
159
+ headers: { accept: 'application/json', 'content-type': 'application/json' },
160
+ body: JSON.stringify(body || {}),
161
+ })
162
+ return decodeJson(response)
163
+ }
164
+
165
+ /**
166
+ * Normalize a workspace-relative path for display and comparison.
167
+ * @param {string} value path using either separator
168
+ * @returns {string} posix relative path without leading `./`
169
+ */
170
+ function normalizeRel(value) {
171
+ if (typeof value !== 'string') return ''
172
+ return value.replace(/\\/g, '/').replace(/^\.\/+/, '').replace(/^\/+/, '')
173
+ }
174
+
175
+ /**
176
+ * Split a normalized relative path into segments.
177
+ * @param {string} value normalized path
178
+ * @returns {string[]}
179
+ */
180
+ function segmentsOf(value) {
181
+ const normalized = normalizeRel(value)
182
+ return normalized === '' ? [] : normalized.split('/')
183
+ }
184
+
185
+ /**
186
+ * The final segment of a path.
187
+ * @param {string} value path
188
+ * @returns {string}
189
+ */
190
+ function basename(value) {
191
+ const segments = segmentsOf(value)
192
+ return segments.length === 0 ? '' : segments[segments.length - 1]
193
+ }
194
+
195
+ /**
196
+ * The parent path of a normalized relative path ('' for top-level files).
197
+ * @param {string} value normalized path
198
+ * @returns {string}
199
+ */
200
+ function dirname(value) {
201
+ const segments = segmentsOf(value)
202
+ segments.pop()
203
+ return segments.join('/')
204
+ }
205
+
206
+ /**
207
+ * Join relative path segments, skipping empty segments.
208
+ * @param {...string} parts segments
209
+ * @returns {string}
210
+ */
211
+ function joinRel(...parts) {
212
+ const segments = []
213
+ for (const part of parts) for (const segment of segmentsOf(part)) segments.push(segment)
214
+ return segments.join('/')
215
+ }
216
+
217
+ /**
218
+ * Whether a path should open in the code viewer (vs handoff to DSH preview).
219
+ * @param {string} path workspace-relative path
220
+ * @returns {boolean}
221
+ */
222
+ function isCodeFile(path) {
223
+ const name = basename(path).toLowerCase()
224
+ if (name === '') return false
225
+ if (CODE_BASENAMES.has(name)) return true
226
+ const dot = name.lastIndexOf('.')
227
+ if (dot <= 0) return false
228
+ return CODE_EXT.has(name.slice(dot + 1))
229
+ }
230
+
231
+ /**
232
+ * Monaco language id for a path.
233
+ * @param {string} path workspace-relative path
234
+ * @returns {string}
235
+ */
236
+ function languageOf(path) {
237
+ const name = basename(path).toLowerCase()
238
+ if (name === 'dockerfile') return 'dockerfile'
239
+ const dot = name.lastIndexOf('.')
240
+ if (dot <= 0) return 'plaintext'
241
+ return LANG_BY_EXT[name.slice(dot + 1)] || 'plaintext'
242
+ }
243
+
244
+ /**
245
+ * Split text into lines, normalizing CRLF/CR (Monaco reports line numbers by line).
246
+ * @param {string} text source text
247
+ * @returns {string[]}
248
+ */
249
+ function splitLines(text) {
250
+ const normalized = String(text ?? '').replace(/\r\n/g, '\n').replace(/\r/g, '\n')
251
+ if (normalized === '') return []
252
+ const lines = normalized.split('\n')
253
+ if (lines.length > 0 && lines[lines.length - 1] === '') lines.pop()
254
+ return lines
255
+ }
256
+
257
+ /**
258
+ * Current date-time stamp for status messages.
259
+ * @returns {string}
260
+ */
261
+ function timeStamp() {
262
+ try {
263
+ const now = new Date()
264
+ return now.toLocaleTimeString('zh-CN', { hour12: false })
265
+ } catch (error) {
266
+ return ''
267
+ }
268
+ }
269
+
270
+ /**
271
+ * Escape a string for safe use inside a RegExp.
272
+ * @param {string} value raw text
273
+ * @returns {string}
274
+ */
275
+ function escapeRegExp(value) {
276
+ return String(value).replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
277
+ }