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.
- package/LICENSE +21 -0
- package/README.en.md +119 -0
- package/README.md +137 -2
- package/THIRD_PARTY_NOTICES.md +12 -0
- package/assets/vendor/monaco/LICENSE +21 -0
- package/assets/vendor/monaco/ThirdPartyNotices.txt +448 -0
- package/assets/vendor/monaco/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
- package/assets/vendor/monaco/vs/base/common/worker/simpleWorker.nls.js +7 -0
- package/assets/vendor/monaco/vs/base/common/worker/simpleWorker.nls.zh-cn.js +7 -0
- package/assets/vendor/monaco/vs/base/worker/workerMain.js +26 -0
- package/assets/vendor/monaco/vs/basic-languages/abap/abap.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/apex/apex.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/azcli/azcli.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/bat/bat.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/bicep/bicep.js +11 -0
- package/assets/vendor/monaco/vs/basic-languages/cameligo/cameligo.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/clojure/clojure.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/coffee/coffee.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/cpp/cpp.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/csharp/csharp.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/csp/csp.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/css/css.js +12 -0
- package/assets/vendor/monaco/vs/basic-languages/cypher/cypher.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/dart/dart.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/dockerfile/dockerfile.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/ecl/ecl.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/elixir/elixir.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/flow9/flow9.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/freemarker2/freemarker2.js +12 -0
- package/assets/vendor/monaco/vs/basic-languages/fsharp/fsharp.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/go/go.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/graphql/graphql.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/handlebars/handlebars.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/hcl/hcl.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/html/html.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/ini/ini.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/java/java.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/javascript/javascript.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/julia/julia.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/kotlin/kotlin.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/less/less.js +11 -0
- package/assets/vendor/monaco/vs/basic-languages/lexon/lexon.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/liquid/liquid.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/lua/lua.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/m3/m3.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/markdown/markdown.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/mdx/mdx.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/mips/mips.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/msdax/msdax.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/mysql/mysql.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/objective-c/objective-c.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/pascal/pascal.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/pascaligo/pascaligo.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/perl/perl.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/pgsql/pgsql.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/php/php.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/pla/pla.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/postiats/postiats.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/powerquery/powerquery.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/powershell/powershell.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/protobuf/protobuf.js +11 -0
- package/assets/vendor/monaco/vs/basic-languages/pug/pug.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/python/python.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/qsharp/qsharp.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/r/r.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/razor/razor.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/redis/redis.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/redshift/redshift.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/restructuredtext/restructuredtext.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/ruby/ruby.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/rust/rust.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/sb/sb.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/scala/scala.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/scheme/scheme.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/scss/scss.js +12 -0
- package/assets/vendor/monaco/vs/basic-languages/shell/shell.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/solidity/solidity.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/sophia/sophia.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/sparql/sparql.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/sql/sql.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/st/st.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/swift/swift.js +13 -0
- package/assets/vendor/monaco/vs/basic-languages/systemverilog/systemverilog.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/tcl/tcl.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/twig/twig.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/typescript/typescript.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/vb/vb.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/wgsl/wgsl.js +307 -0
- package/assets/vendor/monaco/vs/basic-languages/xml/xml.js +10 -0
- package/assets/vendor/monaco/vs/basic-languages/yaml/yaml.js +10 -0
- package/assets/vendor/monaco/vs/editor/editor.main.css +6 -0
- package/assets/vendor/monaco/vs/editor/editor.main.js +744 -0
- package/assets/vendor/monaco/vs/editor/editor.main.nls.js +28 -0
- package/assets/vendor/monaco/vs/editor/editor.main.nls.zh-cn.js +30 -0
- package/assets/vendor/monaco/vs/language/css/cssMode.js +13 -0
- package/assets/vendor/monaco/vs/language/css/cssWorker.js +81 -0
- package/assets/vendor/monaco/vs/language/html/htmlMode.js +13 -0
- package/assets/vendor/monaco/vs/language/html/htmlWorker.js +453 -0
- package/assets/vendor/monaco/vs/language/json/jsonMode.js +15 -0
- package/assets/vendor/monaco/vs/language/json/jsonWorker.js +36 -0
- package/assets/vendor/monaco/vs/language/typescript/tsMode.js +20 -0
- package/assets/vendor/monaco/vs/language/typescript/tsWorker.js +37016 -0
- package/assets/vendor/monaco/vs/loader.js +10 -0
- package/cordis.patch.yml +3 -0
- package/docs/images/git-changes-diff.png +0 -0
- package/docs/regression-checklist.md +47 -0
- package/icon.svg +10 -0
- package/lib/client.js +9418 -0
- package/lib/host/assets.js +161 -0
- package/lib/host/commit-message.js +158 -0
- package/lib/host/files-index.js +206 -0
- package/lib/host/git-write.js +194 -0
- package/lib/host/git.js +1147 -0
- package/lib/host/lsp.js +842 -0
- package/lib/host/routes.js +976 -0
- package/lib/host/session.js +84 -0
- package/lib/host/util.js +107 -0
- package/lib/index.js +33 -0
- package/licenses/dsh-vscode-mode-LICENSE +21 -0
- package/licenses/vscode-theme-seti-LICENSE +21 -0
- package/licenses/vscode-theme-seti-ThirdPartyNotices.txt +32 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +65 -4
- package/src/client/00-const.js +79 -0
- package/src/client/05-utils.js +277 -0
- package/src/client/10-i18n.js +548 -0
- package/src/client/12-vscode-icons.js +460 -0
- package/src/client/15-theme.js +509 -0
- package/src/client/20-monaco.js +1404 -0
- package/src/client/22-lsp.js +592 -0
- package/src/client/25-tree.js +563 -0
- package/src/client/28-changes.js +1163 -0
- package/src/client/30-page.js +2259 -0
- package/src/client/35-pill.js +185 -0
- package/src/client/40-commands.js +248 -0
- package/src/client/45-css.js +357 -0
- package/src/client/47-pickers.js +457 -0
- package/src/client/50-apply.js +207 -0
- 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
|
+
}
|