dsh-gitnexus-plus 0.1.3 → 0.1.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.
- package/README-CN.md +34 -10
- package/README.md +79 -14
- package/lib/bin/graph-helper.d.ts +21 -0
- package/lib/bin/graph-helper.d.ts.map +1 -0
- package/lib/bin/graph-helper.js +71 -0
- package/lib/bin/graph-helper.js.map +1 -0
- package/lib/client.js +4402 -2371
- package/lib/gitnexus/analyze.d.ts +54 -8
- package/lib/gitnexus/analyze.d.ts.map +1 -1
- package/lib/gitnexus/analyze.js +355 -84
- package/lib/gitnexus/analyze.js.map +1 -1
- package/lib/gitnexus/commands.d.ts +19 -2
- package/lib/gitnexus/commands.d.ts.map +1 -1
- package/lib/gitnexus/commands.js +42 -4
- package/lib/gitnexus/commands.js.map +1 -1
- package/lib/gitnexus/coverage.d.ts +8 -0
- package/lib/gitnexus/coverage.d.ts.map +1 -1
- package/lib/gitnexus/coverage.js +14 -2
- package/lib/gitnexus/coverage.js.map +1 -1
- package/lib/gitnexus/delta.d.ts +144 -0
- package/lib/gitnexus/delta.d.ts.map +1 -0
- package/lib/gitnexus/delta.js +347 -0
- package/lib/gitnexus/delta.js.map +1 -0
- package/lib/gitnexus/discover.d.ts +91 -0
- package/lib/gitnexus/discover.d.ts.map +1 -0
- package/lib/gitnexus/discover.js +214 -0
- package/lib/gitnexus/discover.js.map +1 -0
- package/lib/gitnexus/git-activity.d.ts +13 -21
- package/lib/gitnexus/git-activity.d.ts.map +1 -1
- package/lib/gitnexus/git-activity.js +60 -26
- package/lib/gitnexus/git-activity.js.map +1 -1
- package/lib/gitnexus/graph.d.ts +135 -0
- package/lib/gitnexus/graph.d.ts.map +1 -0
- package/lib/gitnexus/graph.js +474 -0
- package/lib/gitnexus/graph.js.map +1 -0
- package/lib/gitnexus/index-meta.d.ts +34 -6
- package/lib/gitnexus/index-meta.d.ts.map +1 -1
- package/lib/gitnexus/index-meta.js +47 -7
- package/lib/gitnexus/index-meta.js.map +1 -1
- package/lib/gitnexus/install.d.ts +11 -0
- package/lib/gitnexus/install.d.ts.map +1 -1
- package/lib/gitnexus/install.js +65 -9
- package/lib/gitnexus/install.js.map +1 -1
- package/lib/gitnexus/root.d.ts +0 -3
- package/lib/gitnexus/root.d.ts.map +1 -1
- package/lib/gitnexus/root.js +64 -5
- package/lib/gitnexus/root.js.map +1 -1
- package/lib/gitnexus/search.d.ts +34 -8
- package/lib/gitnexus/search.d.ts.map +1 -1
- package/lib/gitnexus/search.js +89 -13
- package/lib/gitnexus/search.js.map +1 -1
- package/lib/index.d.ts +13 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +189 -7
- package/lib/index.js.map +1 -1
- package/lib/routes/analyze.d.ts +8 -6
- package/lib/routes/analyze.d.ts.map +1 -1
- package/lib/routes/analyze.js +25 -6
- package/lib/routes/analyze.js.map +1 -1
- package/lib/routes/coverage.d.ts +16 -10
- package/lib/routes/coverage.d.ts.map +1 -1
- package/lib/routes/coverage.js +31 -22
- package/lib/routes/coverage.js.map +1 -1
- package/lib/routes/delta.d.ts +22 -0
- package/lib/routes/delta.d.ts.map +1 -0
- package/lib/routes/delta.js +50 -0
- package/lib/routes/delta.js.map +1 -0
- package/lib/routes/file-diff.d.ts +19 -0
- package/lib/routes/file-diff.d.ts.map +1 -0
- package/lib/routes/file-diff.js +69 -0
- package/lib/routes/file-diff.js.map +1 -0
- package/lib/routes/graph.d.ts +22 -0
- package/lib/routes/graph.d.ts.map +1 -0
- package/lib/routes/graph.js +71 -0
- package/lib/routes/graph.js.map +1 -0
- package/lib/routes/guard.d.ts +3 -6
- package/lib/routes/guard.d.ts.map +1 -1
- package/lib/routes/guard.js +3 -6
- package/lib/routes/guard.js.map +1 -1
- package/lib/routes/projects.d.ts +21 -0
- package/lib/routes/projects.d.ts.map +1 -0
- package/lib/routes/projects.js +61 -0
- package/lib/routes/projects.js.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-meta.js","sourceRoot":"","sources":["../../src/gitnexus/index-meta.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,+EAA+E;AAC/E,MAAM,UAAU,SAAS,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC5D,OAAO,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE;QACzD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACjC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC3C,CAAC;AA4BD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAA2B,EAAE;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC;IAC/E,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACpE,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,CACX,CAAC,KAAc,EAA0B,EAAE,CACzC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,CAC3E;YACH,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzE,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,UAA2B,EAAE;IAE7B,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,OAAO,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC;AACxD,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"index-meta.js","sourceRoot":"","sources":["../../src/gitnexus/index-meta.ts"],"names":[],"mappings":"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"}
|
|
@@ -66,6 +66,16 @@ export interface InstallRunnerOptions {
|
|
|
66
66
|
now?: () => number;
|
|
67
67
|
/** Platform whose shell syntax applies. */
|
|
68
68
|
platform?: NodeJS.Platform;
|
|
69
|
+
/**
|
|
70
|
+
* The deployment policy for the install target.
|
|
71
|
+
*
|
|
72
|
+
* A panel route has no session, so the deployment default is the DSH application
|
|
73
|
+
* directory. On Windows that directory is under Program Files, and the ACL runner
|
|
74
|
+
* cannot grant workspace-write there. The install writes only under `prefix`, so the
|
|
75
|
+
* host supplies a policy rooted at `prefix` — the same shape it supplies to analyze
|
|
76
|
+
* and the helpers. The mode is forwarded unchanged.
|
|
77
|
+
*/
|
|
78
|
+
sandboxPolicy?: (prefix: string) => unknown;
|
|
69
79
|
}
|
|
70
80
|
export interface InstallRunner {
|
|
71
81
|
start(): InstallStatus;
|
|
@@ -92,6 +102,7 @@ export declare function defaultInstallPrefix(env?: NodeJS.ProcessEnv): string;
|
|
|
92
102
|
*/
|
|
93
103
|
export declare function installCommandLine(prefix: string, spec: string, options?: {
|
|
94
104
|
platform?: NodeJS.Platform;
|
|
105
|
+
cacheDir?: string;
|
|
95
106
|
}): string;
|
|
96
107
|
export declare function createInstallRunner(options: InstallRunnerOptions): InstallRunner;
|
|
97
108
|
//# sourceMappingURL=install.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/gitnexus/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/gitnexus/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,MAAM,GACN,QAAQ,GACR,WAAW,GACX,WAAW;AACb,kEAAkE;GAChE,QAAQ;AACV,yEAAyE;GACvE,aAAa,CAAC;AAElB,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,8DAA8D;AAC9D,eAAO,MAAM,cAAc,YAAY,CAAC;AAMxC,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,IAAI,aAAa,CAAC;IACvB,MAAM,IAAI,aAAa,GAAG,IAAI,CAAC;IAC/B,MAAM,IAAI,OAAO,CAAC;IAClB,+CAA+C;IAC/C,OAAO,IAAI,MAAM,CAAC;IAClB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAGjF;AAOD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9D,MAAM,CAWR;AAcD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CA4MhF"}
|
package/lib/gitnexus/install.js
CHANGED
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
*/
|
|
36
36
|
import os from 'node:os';
|
|
37
37
|
import path from 'node:path';
|
|
38
|
+
import { mkdirSync } from 'node:fs';
|
|
38
39
|
/** The version range this plugin is known to work against. */
|
|
39
40
|
export const GITNEXUS_RANGE = '^1.6.12';
|
|
40
41
|
const DEFAULT_TIMEOUT_MS = 20 * 60 * 1000;
|
|
@@ -64,8 +65,15 @@ function quote(value, platform) {
|
|
|
64
65
|
*/
|
|
65
66
|
export function installCommandLine(prefix, spec, options = {}) {
|
|
66
67
|
const platform = options.platform ?? process.platform;
|
|
68
|
+
// npm's ambient cache is under the user profile, outside the install target. A
|
|
69
|
+
// workspace-write sandbox rooted at the prefix would deny those writes, so keep the
|
|
70
|
+
// cache inside the granted tree; it is also easier to remove with the install.
|
|
71
|
+
const cacheDir = options.cacheDir ?? path.join(prefix, '.npm-cache');
|
|
67
72
|
const args = ['install', '--prefix', quote(prefix, platform), spec, '--no-audit', '--no-fund'];
|
|
68
|
-
|
|
73
|
+
const cache = quote(cacheDir, platform);
|
|
74
|
+
return platform === 'win32'
|
|
75
|
+
? `$env:npm_config_cache=${cache}; npm ${args.join(' ')}`
|
|
76
|
+
: `npm_config_cache=${cache} npm ${args.join(' ')}`;
|
|
69
77
|
}
|
|
70
78
|
/** Keep the last `limit` characters, on a line boundary when one is available. */
|
|
71
79
|
function tail(text, limit) {
|
|
@@ -125,6 +133,39 @@ export function createInstallRunner(options) {
|
|
|
125
133
|
});
|
|
126
134
|
}
|
|
127
135
|
const command = installCommandLine(prefix, spec, { platform });
|
|
136
|
+
let sandboxPolicy;
|
|
137
|
+
try {
|
|
138
|
+
sandboxPolicy = options.sandboxPolicy?.(prefix);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
sandboxPolicy = undefined;
|
|
142
|
+
}
|
|
143
|
+
const policyMode = sandboxPolicy !== null && typeof sandboxPolicy === 'object'
|
|
144
|
+
? sandboxPolicy.mode
|
|
145
|
+
: undefined;
|
|
146
|
+
if (policyMode === 'read-only') {
|
|
147
|
+
return finish({
|
|
148
|
+
state: 'unavailable',
|
|
149
|
+
command,
|
|
150
|
+
startedAt: now(),
|
|
151
|
+
message: '当前部署是只读沙箱,安装需要写入安装目录。请复制下面的命令,在普通终端执行。',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// The sandbox grant is applied to the prefix itself, so it must exist before the
|
|
155
|
+
// grant materializes. The plugin owns this directory; creating it is the one step
|
|
156
|
+
// an install would do anyway. The policy above does not need it to exist.
|
|
157
|
+
try {
|
|
158
|
+
mkdirSync(prefix, { recursive: true });
|
|
159
|
+
}
|
|
160
|
+
catch (cause) {
|
|
161
|
+
return finish({
|
|
162
|
+
state: 'failed',
|
|
163
|
+
command,
|
|
164
|
+
startedAt: now(),
|
|
165
|
+
message: `无法创建安装目录 ${prefix}:${String(cause?.message ?? cause)}。` +
|
|
166
|
+
'请复制下面的命令,在普通终端执行。',
|
|
167
|
+
});
|
|
168
|
+
}
|
|
128
169
|
const abort = new AbortController();
|
|
129
170
|
controller = abort;
|
|
130
171
|
status = {
|
|
@@ -137,14 +178,29 @@ export function createInstallRunner(options) {
|
|
|
137
178
|
message: null,
|
|
138
179
|
output: '',
|
|
139
180
|
};
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
181
|
+
let spec0;
|
|
182
|
+
try {
|
|
183
|
+
spec0 = shell.resolve({
|
|
184
|
+
command,
|
|
185
|
+
timeoutMs,
|
|
186
|
+
onExpiry: 'kill',
|
|
187
|
+
stdoutMaxBytes: outputLimit,
|
|
188
|
+
signal: abort.signal,
|
|
189
|
+
// Rooted at the install target, not the DSH application directory: a no-session
|
|
190
|
+
// route otherwise inherits a root under Program Files, where the Windows ACL
|
|
191
|
+
// runner fails before the install starts.
|
|
192
|
+
...(sandboxPolicy === undefined ? {} : { sandboxPolicy }),
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
catch (cause) {
|
|
196
|
+
return finish({
|
|
197
|
+
state: 'failed',
|
|
198
|
+
command,
|
|
199
|
+
startedAt: now(),
|
|
200
|
+
message: `无法在沙箱中启动安装:${String(cause?.message ?? cause)}。` +
|
|
201
|
+
'请复制下面的命令,在普通终端执行。',
|
|
202
|
+
});
|
|
203
|
+
}
|
|
148
204
|
void (async () => {
|
|
149
205
|
let execution;
|
|
150
206
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/gitnexus/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/gitnexus/install.ts"],"names":[],"mappings":"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"}
|
package/lib/gitnexus/root.d.ts
CHANGED
|
@@ -26,9 +26,6 @@ export interface RootDiscoveryOptions {
|
|
|
26
26
|
*/
|
|
27
27
|
managedPrefix?: string;
|
|
28
28
|
}
|
|
29
|
-
/**
|
|
30
|
-
* Resolve the GitNexus package root, or `null` when no usable install is found.
|
|
31
|
-
*/
|
|
32
29
|
export declare function findGitnexusRoot(options?: RootDiscoveryOptions): string | null;
|
|
33
30
|
/**
|
|
34
31
|
* Read the installed GitNexus version. Returned for provenance so a report can
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/gitnexus/root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAcH,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/gitnexus/root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAcH,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAoHD,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM,GAAG,IAAI,CAmBlF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS/D;AAKD,oFAAoF;AACpF,MAAM,MAAM,mBAAmB,GAAG,CAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC;AAEpD,+EAA+E;AAC/E,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE1F,yDAAyD;AACzD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AA6BnF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,mBAAmB,EAAE,MAAM,MAAM,CAAC;IAClC,2BAA2B,EAAE,MAAM,CAAC;IACpC,+BAA+B,EAAE,MAAM,CAAC;IACxC,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;CACjC;AAED,8DAA8D;AAC9D,MAAM,WAAW,yBAA0B,SAAQ,oBAAoB;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAiDhC"}
|
package/lib/gitnexus/root.js
CHANGED
|
@@ -41,7 +41,14 @@ const DIST = Object.freeze({
|
|
|
41
41
|
function candidateRoots(options = {}) {
|
|
42
42
|
if (options.discover === false)
|
|
43
43
|
return [];
|
|
44
|
-
const
|
|
44
|
+
const override = options.env ?? {};
|
|
45
|
+
// `{ ...process.env }` turns Node's case-insensitive env proxy into an ordinary
|
|
46
|
+
// object, so on Windows the key is `Path` and `env.PATH` is `undefined` — the PATH
|
|
47
|
+
// probe then looked at nothing and reported "not installed" on a machine where
|
|
48
|
+
// `gitnexus` runs. Read every spelling, override first, like `toolchain.ts` does.
|
|
49
|
+
const overridePath = override.PATH ?? override.Path ?? override.path;
|
|
50
|
+
const env = { ...process.env, ...override };
|
|
51
|
+
const pathValue = overridePath ?? process.env.PATH ?? process.env.Path ?? '';
|
|
45
52
|
const roots = [];
|
|
46
53
|
if (env.GITNEXUS_PACKAGE_ROOT)
|
|
47
54
|
roots.push(env.GITNEXUS_PACKAGE_ROOT);
|
|
@@ -58,13 +65,27 @@ function candidateRoots(options = {}) {
|
|
|
58
65
|
// shim-based discovery silently finds nothing on the very machines where the
|
|
59
66
|
// CLI is most likely to be installed. Testing the directory is
|
|
60
67
|
// extension-independent and needs no PATHEXT reasoning.
|
|
61
|
-
|
|
68
|
+
//
|
|
69
|
+
// One exception, measured on this machine: a directory that CARRIES the shim owns
|
|
70
|
+
// the install the CLI actually runs, and an older copy sitting earlier on PATH wins
|
|
71
|
+
// the plain scan. That produced a graph helper loading 1.6.6 against an index written
|
|
72
|
+
// by 1.6.12 ("Database file version: 42, Current build storage version: 41"), so a
|
|
73
|
+
// shim-bearing entry is probed first.
|
|
74
|
+
const shimRoots = [];
|
|
75
|
+
const plainRoots = [];
|
|
76
|
+
for (const dir of pathValue.split(path.delimiter)) {
|
|
62
77
|
if (dir === '')
|
|
63
78
|
continue;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
79
|
+
const local = path.join(dir, 'node_modules', 'gitnexus');
|
|
80
|
+
const hasShim = existsSync(path.join(dir, 'gitnexus.cmd')) ||
|
|
81
|
+
existsSync(path.join(dir, 'gitnexus.exe')) ||
|
|
82
|
+
existsSync(path.join(dir, 'gitnexus.ps1')) ||
|
|
83
|
+
existsSync(path.join(dir, 'gitnexus'));
|
|
84
|
+
(hasShim ? shimRoots : plainRoots).push(local);
|
|
85
|
+
plainRoots.push(path.join(dir, '..', 'node_modules', 'gitnexus'));
|
|
86
|
+
plainRoots.push(path.join(dir, '..', '..', 'node_modules', 'gitnexus'));
|
|
67
87
|
}
|
|
88
|
+
roots.push(...shimRoots, ...plainRoots);
|
|
68
89
|
// nvm-for-windows keeps the real tree off PATH behind a junction.
|
|
69
90
|
if (env.NVM_SYMLINK)
|
|
70
91
|
roots.push(path.join(env.NVM_SYMLINK, 'node_modules', 'gitnexus'));
|
|
@@ -83,11 +104,49 @@ function candidateRoots(options = {}) {
|
|
|
83
104
|
}
|
|
84
105
|
/**
|
|
85
106
|
* Resolve the GitNexus package root, or `null` when no usable install is found.
|
|
107
|
+
*
|
|
108
|
+
* The candidate list is cheap to build and expensive to probe: every call stats dozens
|
|
109
|
+
* of paths, and a single panel load asks several times (coverage, languages, search and
|
|
110
|
+
* graph helpers). A positive result is memoized for 30 s and re-validated with one
|
|
111
|
+
* `existsSync` before reuse, so an uninstall cannot leave a dead path in place.
|
|
112
|
+
*
|
|
113
|
+
* `null` is deliberately NOT memoized: the panel's install flow writes the managed tree
|
|
114
|
+
* and immediately re-reads the toolchain, and a cached "absent" would keep reporting
|
|
115
|
+
* that for half a minute after a successful install.
|
|
86
116
|
*/
|
|
117
|
+
const ROOT_CACHE_TTL_MS = 30_000;
|
|
118
|
+
const ROOT_CACHE_MAX = 8;
|
|
119
|
+
const rootCache = new Map();
|
|
120
|
+
function rootCacheKey(options) {
|
|
121
|
+
const override = options.env ?? {};
|
|
122
|
+
const pathValue = override.PATH ??
|
|
123
|
+
override.Path ??
|
|
124
|
+
override.path ??
|
|
125
|
+
process.env.PATH ??
|
|
126
|
+
process.env.Path ??
|
|
127
|
+
'';
|
|
128
|
+
return [
|
|
129
|
+
options.discover === false ? '0' : '1',
|
|
130
|
+
options.managedPrefix ?? '',
|
|
131
|
+
override.GITNEXUS_PACKAGE_ROOT ?? process.env.GITNEXUS_PACKAGE_ROOT ?? '',
|
|
132
|
+
options.moduleUrl ?? '',
|
|
133
|
+
pathValue,
|
|
134
|
+
].join('\u0000');
|
|
135
|
+
}
|
|
87
136
|
export function findGitnexusRoot(options = {}) {
|
|
137
|
+
const key = rootCacheKey(options);
|
|
138
|
+
const hit = rootCache.get(key);
|
|
139
|
+
if (hit !== undefined && Date.now() - hit.at < ROOT_CACHE_TTL_MS) {
|
|
140
|
+
if (existsSync(hit.root))
|
|
141
|
+
return hit.root;
|
|
142
|
+
rootCache.delete(key);
|
|
143
|
+
}
|
|
88
144
|
for (const root of candidateRoots(options)) {
|
|
89
145
|
try {
|
|
90
146
|
if (existsSync(path.join(root, 'package.json')) && existsSync(path.join(root, DIST.walker))) {
|
|
147
|
+
if (rootCache.size >= ROOT_CACHE_MAX)
|
|
148
|
+
rootCache.clear();
|
|
149
|
+
rootCache.set(key, { root, at: Date.now() });
|
|
91
150
|
return root;
|
|
92
151
|
}
|
|
93
152
|
}
|
package/lib/gitnexus/root.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/gitnexus/root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,4EAA4E;AAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,MAAM,EAAE,0CAA0C;IAClD,WAAW,EAAE,4CAA4C;IACzD,MAAM,EAAE,+BAA+B;CACxC,CAAC,CAAC;AAeH;;;;;;;;;;;;;GAaG;AACH,SAAS,cAAc,CAAC,UAAgC,EAAE;IACxD,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAC1C,MAAM,GAAG,GAAsB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/gitnexus/root.ts"],"names":[],"mappings":"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"}
|
package/lib/gitnexus/search.d.ts
CHANGED
|
@@ -74,6 +74,26 @@ export declare class SearchError extends Error {
|
|
|
74
74
|
readonly status: number;
|
|
75
75
|
constructor(code: SearchErrorCode, status: number, message: string);
|
|
76
76
|
}
|
|
77
|
+
/** The two members of GitNexus's adapter this module uses. */
|
|
78
|
+
interface LbugAdapter {
|
|
79
|
+
withLbugDb: (dbPath: string, operation: () => Promise<unknown>, options?: {
|
|
80
|
+
readOnly?: boolean;
|
|
81
|
+
skipFts?: boolean;
|
|
82
|
+
}) => Promise<unknown>;
|
|
83
|
+
executePrepared: (cypher: string, params: Record<string, unknown>) => Promise<unknown[]>;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Load GitNexus's LadybugDB adapter from the installed package.
|
|
87
|
+
*
|
|
88
|
+
* A missing package, a missing native engine, or a reshaped adapter all become the
|
|
89
|
+
* same reported state: search is unavailable here, and the reason is carried in the
|
|
90
|
+
* message rather than hidden behind an empty result list.
|
|
91
|
+
*
|
|
92
|
+
* Exported for the graph projection (`./graph.ts`), which needs the same connection
|
|
93
|
+
* and must not carry a second copy of this probe: the two would drift on exactly the
|
|
94
|
+
* detail that is hardest to test — which install count as "present".
|
|
95
|
+
*/
|
|
96
|
+
export declare function loadAdapter(options: SearchOptions): Promise<LbugAdapter>;
|
|
77
97
|
/**
|
|
78
98
|
* Normalize a user keyword into a safe Cypher string literal body.
|
|
79
99
|
*
|
|
@@ -104,6 +124,19 @@ export interface HelperSearchOptions {
|
|
|
104
124
|
/** The plugin-owned GitNexus prefix, when one was installed from the panel. */
|
|
105
125
|
managedPrefix?: string;
|
|
106
126
|
limit?: number;
|
|
127
|
+
/**
|
|
128
|
+
* A policy the host resolved for this repository's index directory.
|
|
129
|
+
*
|
|
130
|
+
* A panel route has no session, so the deployment's default resolves to the DSH
|
|
131
|
+
* application directory. On Windows that directory is under Program Files, where
|
|
132
|
+
* the ACL sandbox cannot grant workspace-write (`SetNamedSecurityInfoW`, Win32 5).
|
|
133
|
+
* The helper only reads the graph and writes locks/caches inside `.gitnexus`, so the
|
|
134
|
+
* policy is rooted there rather than at the repository: the ACL grant propagates an
|
|
135
|
+
* inheritable ACE across the whole tree, which DSH itself notes takes minutes on a
|
|
136
|
+
* large workspace. Rooting at `.gitnexus` keeps the grant small; the mode is still
|
|
137
|
+
* the deployment's.
|
|
138
|
+
*/
|
|
139
|
+
sandboxPolicy?: (indexPath: string) => unknown;
|
|
107
140
|
}
|
|
108
141
|
/**
|
|
109
142
|
* Run the search in a child Node process.
|
|
@@ -155,13 +188,6 @@ export interface TextSearchOptions {
|
|
|
155
188
|
* It performs no spawn, no native load and no write.
|
|
156
189
|
*/
|
|
157
190
|
export declare function searchText(repoPath: string, rawQuery: string, options?: TextSearchOptions): Promise<SearchReport>;
|
|
158
|
-
/**
|
|
159
|
-
* Graph first, then the bounded source fallback when the native path cannot run.
|
|
160
|
-
*
|
|
161
|
-
* The fallback is not attempted for an empty query, an unidentified project, or a
|
|
162
|
-
* project with no index: in all three there is either nothing to search or no honest
|
|
163
|
-
* denominator. Every other failure gets the text search, and its report carries
|
|
164
|
-
* `mode: "text"` plus the graph failure in `warning`.
|
|
165
|
-
*/
|
|
166
191
|
export declare function searchWithFallback(repoPath: string, rawQuery: string, options: HelperSearchOptions): Promise<SearchReport>;
|
|
192
|
+
export {};
|
|
167
193
|
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/gitnexus/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,gDAAgD;AAChD,MAAM,WAAW,SAAS;IACxB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAE1C,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,IAAI,EAAE,UAAU,CAAC;IACjB,gFAAgF;IAChF,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,qEAAqE;AACrE,MAAM,MAAM,eAAe,GACvB,eAAe,GACf,eAAe,GACf,UAAU,GACV,gBAAgB,GAChB,oBAAoB,GACpB,YAAY,GACZ,eAAe,CAAC;AAEpB,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAMnE;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/gitnexus/search.ts"],"names":[],"mappings":"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"}
|
package/lib/gitnexus/search.js
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* stance; if the package or its native engine is unavailable, search reports that
|
|
26
26
|
* state rather than falling back to a filesystem scan with different semantics.
|
|
27
27
|
*/
|
|
28
|
-
import { existsSync } from 'node:fs';
|
|
28
|
+
import { existsSync, statSync } from 'node:fs';
|
|
29
29
|
import fs from 'node:fs/promises';
|
|
30
30
|
import path from 'node:path';
|
|
31
31
|
import { pathToFileURL } from 'node:url';
|
|
@@ -49,15 +49,25 @@ const adapters = new Map();
|
|
|
49
49
|
* A missing package, a missing native engine, or a reshaped adapter all become the
|
|
50
50
|
* same reported state: search is unavailable here, and the reason is carried in the
|
|
51
51
|
* message rather than hidden behind an empty result list.
|
|
52
|
+
*
|
|
53
|
+
* Exported for the graph projection (`./graph.ts`), which needs the same connection
|
|
54
|
+
* and must not carry a second copy of this probe: the two would drift on exactly the
|
|
55
|
+
* detail that is hardest to test — which install count as "present".
|
|
52
56
|
*/
|
|
53
|
-
async function loadAdapter(options) {
|
|
57
|
+
export async function loadAdapter(options) {
|
|
54
58
|
const root = findGitnexusRoot({ env: options.env, managedPrefix: options.managedPrefix });
|
|
55
59
|
if (root === null) {
|
|
56
60
|
throw new SearchError('search-unavailable', 503, '找不到 GitNexus 包,无法打开图数据库。安装或指向 GitNexus 后重试。');
|
|
57
61
|
}
|
|
58
62
|
const cached = adapters.get(root);
|
|
59
|
-
if (cached !== undefined)
|
|
60
|
-
|
|
63
|
+
if (cached !== undefined) {
|
|
64
|
+
// The install can be removed or replaced while the host runs (uninstall, upgrade to
|
|
65
|
+
// a tree with a different native build). Reusing the module bindings then points at
|
|
66
|
+
// a package that no longer exists; one stat is cheaper than a stale handle.
|
|
67
|
+
if (existsSync(root))
|
|
68
|
+
return cached;
|
|
69
|
+
adapters.delete(root);
|
|
70
|
+
}
|
|
61
71
|
try {
|
|
62
72
|
const mod = (await import(pathToFileURL(path.join(root, 'dist', 'core', 'lbug', 'lbug-adapter.js')).href));
|
|
63
73
|
if (typeof mod.withLbugDb !== 'function' || typeof mod.executePrepared !== 'function') {
|
|
@@ -311,6 +321,7 @@ export async function searchViaHelper(repoPath, rawQuery, options) {
|
|
|
311
321
|
throw new SearchError('search-unavailable', 503, '当前部署没有 shell 执行器,无法启动搜索子进程;搜索需要系统 Node 24 加载 GitNexus 原生模块。');
|
|
312
322
|
}
|
|
313
323
|
const limit = clampLimit(options.limit);
|
|
324
|
+
const sandboxPolicy = options.sandboxPolicy?.(path.join(absRepo, '.gitnexus'));
|
|
314
325
|
const args = [options.helperPath, absRepo, query, String(limit), options.managedPrefix ?? '']
|
|
315
326
|
.map(quoteFor)
|
|
316
327
|
.join(' ');
|
|
@@ -323,6 +334,7 @@ export async function searchViaHelper(repoPath, rawQuery, options) {
|
|
|
323
334
|
timeoutMs: 20_000,
|
|
324
335
|
onExpiry: 'kill',
|
|
325
336
|
stdoutMaxBytes: 2 * 1024 * 1024,
|
|
337
|
+
...(sandboxPolicy === undefined ? {} : { sandboxPolicy }),
|
|
326
338
|
});
|
|
327
339
|
const execution = await options.shell.execute(spec);
|
|
328
340
|
result = await execution.result();
|
|
@@ -499,19 +511,83 @@ const FALLBACK_CODES = new Set([
|
|
|
499
511
|
* project with no index: in all three there is either nothing to search or no honest
|
|
500
512
|
* denominator. Every other failure gets the text search, and its report carries
|
|
501
513
|
* `mode: "text"` plus the graph failure in `warning`.
|
|
514
|
+
*
|
|
515
|
+
* Results are memoized for a minute. Each search is a Node cold start plus a native
|
|
516
|
+
* open, which is the most expensive single interaction in the panel, and the same query
|
|
517
|
+
* is re-run on every submit/back-navigation. The index file's mtime is part of the key,
|
|
518
|
+
* so a refresh invalidates the cache without any wiring.
|
|
502
519
|
*/
|
|
503
|
-
|
|
520
|
+
const SEARCH_CACHE_MAX = 16;
|
|
521
|
+
const SEARCH_CACHE_TTL_MS = 60_000;
|
|
522
|
+
const searchCache = new Map();
|
|
523
|
+
function searchCacheKey(repoPath, query, limit) {
|
|
504
524
|
try {
|
|
505
|
-
|
|
525
|
+
const absRepo = path.resolve(repoPath);
|
|
526
|
+
const mtime = statSync(path.join(absRepo, '.gitnexus', 'gitnexus.json')).mtimeMs;
|
|
527
|
+
return [absRepo, query.toLowerCase(), limit, mtime].join('\u0000');
|
|
506
528
|
}
|
|
507
|
-
catch
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
529
|
+
catch {
|
|
530
|
+
return null;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
function rememberSearch(key, report) {
|
|
534
|
+
searchCache.delete(key);
|
|
535
|
+
searchCache.set(key, { at: Date.now(), report });
|
|
536
|
+
while (searchCache.size > SEARCH_CACHE_MAX) {
|
|
537
|
+
const oldest = searchCache.keys().next().value;
|
|
538
|
+
if (oldest === undefined)
|
|
539
|
+
break;
|
|
540
|
+
searchCache.delete(oldest);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Searches already running, so a double submit joins the first one instead of paying
|
|
545
|
+
* for a second helper process. The cache catches the same query after it completes;
|
|
546
|
+
* this catches it while it is still in flight.
|
|
547
|
+
*
|
|
548
|
+
* A resident helper (one process, a line protocol over stdin/stdout) would remove the
|
|
549
|
+
* cold start entirely, but the platform's shell executor is one-shot — `execute` gives
|
|
550
|
+
* a handle with `result()` and no stdin channel — and spawning a long-lived child
|
|
551
|
+
* directly would step outside the sandbox this plugin deliberately lives in.
|
|
552
|
+
*/
|
|
553
|
+
const inFlightSearches = new Map();
|
|
554
|
+
export async function searchWithFallback(repoPath, rawQuery, options) {
|
|
555
|
+
const sanitized = sanitizeSearchQuery(rawQuery);
|
|
556
|
+
const limit = clampLimit(options.limit);
|
|
557
|
+
const cacheKey = sanitized === '' ? null : searchCacheKey(repoPath, sanitized, limit);
|
|
558
|
+
if (cacheKey !== null) {
|
|
559
|
+
const hit = searchCache.get(cacheKey);
|
|
560
|
+
if (hit !== undefined && Date.now() - hit.at < SEARCH_CACHE_TTL_MS)
|
|
561
|
+
return hit.report;
|
|
562
|
+
const running = inFlightSearches.get(cacheKey);
|
|
563
|
+
if (running !== undefined)
|
|
564
|
+
return running;
|
|
565
|
+
}
|
|
566
|
+
const remember = (report) => {
|
|
567
|
+
if (cacheKey !== null)
|
|
568
|
+
rememberSearch(cacheKey, report);
|
|
569
|
+
return report;
|
|
570
|
+
};
|
|
571
|
+
const run = (async () => {
|
|
572
|
+
try {
|
|
573
|
+
return remember(await searchViaHelper(repoPath, rawQuery, options));
|
|
513
574
|
}
|
|
514
|
-
|
|
575
|
+
catch (error) {
|
|
576
|
+
if (error instanceof SearchError && FALLBACK_CODES.has(error.code)) {
|
|
577
|
+
return remember(await searchText(repoPath, rawQuery, {
|
|
578
|
+
limit: options.limit,
|
|
579
|
+
reason: error.message,
|
|
580
|
+
}));
|
|
581
|
+
}
|
|
582
|
+
throw error;
|
|
583
|
+
}
|
|
584
|
+
})();
|
|
585
|
+
if (cacheKey !== null) {
|
|
586
|
+
inFlightSearches.set(cacheKey, run);
|
|
587
|
+
void run.finally(() => inFlightSearches.delete(cacheKey)).catch(() => {
|
|
588
|
+
/* the caller owns the rejection; this chain only cleans the map */
|
|
589
|
+
});
|
|
515
590
|
}
|
|
591
|
+
return run;
|
|
516
592
|
}
|
|
517
593
|
//# sourceMappingURL=search.js.map
|