@mongosh/autocomplete 1.7.1 → 1.8.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/AUTHORS +1 -0
- package/lib/index.d.ts +216 -392
- package/lib/index.js +24 -4
- package/lib/index.js.map +1 -1
- package/package.json +5 -5
- package/src/index.spec.ts +68 -0
- package/src/index.ts +30 -6
package/lib/index.js
CHANGED
|
@@ -9,10 +9,13 @@ const semver_1 = __importDefault(require("semver"));
|
|
|
9
9
|
const mongodb_constants_1 = require("@mongodb-js/mongodb-constants");
|
|
10
10
|
exports.BASE_COMPLETIONS = [].concat(mongodb_constants_1.EXPRESSION_OPERATORS, mongodb_constants_1.CONVERSION_OPERATORS, mongodb_constants_1.BSON_TYPES, mongodb_constants_1.STAGE_OPERATORS);
|
|
11
11
|
exports.MATCH_COMPLETIONS = [].concat(mongodb_constants_1.QUERY_OPERATORS, mongodb_constants_1.BSON_TYPES);
|
|
12
|
+
const DB_AGGREGATE_COMPLETIONS = mongodb_constants_1.STAGE_OPERATORS.filter(({ namespaces }) => {
|
|
13
|
+
return namespaces.length === 1 && namespaces[0] === mongodb_constants_1.DATABASE;
|
|
14
|
+
});
|
|
12
15
|
const PROJECT = '$project';
|
|
13
16
|
const GROUP = '$group';
|
|
14
17
|
async function completer(params, line) {
|
|
15
|
-
var _a, _b;
|
|
18
|
+
var _a, _b, _c;
|
|
16
19
|
const SHELL_COMPLETIONS = shell_api_1.signatures.ShellApi.attributes;
|
|
17
20
|
const COLL_COMPLETIONS = shell_api_1.signatures.Collection.attributes;
|
|
18
21
|
const DB_COMPLETIONS = shell_api_1.signatures.Database.attributes;
|
|
@@ -46,6 +49,20 @@ async function completer(params, line) {
|
|
|
46
49
|
return [hits.length ? hits : [], line];
|
|
47
50
|
}
|
|
48
51
|
else if (firstLineEl.match(/\bdb\b/) && splitLine.length === 2) {
|
|
52
|
+
if (elToComplete.match(/aggregate\s*\(\s*\[\s*\{\s*/)) {
|
|
53
|
+
const splitQuery = line.split('{');
|
|
54
|
+
const prefix = ((_b = splitQuery.pop()) === null || _b === void 0 ? void 0 : _b.trim()) || '';
|
|
55
|
+
const command = prefix ? line.split(prefix).shift() : line;
|
|
56
|
+
const suggestFirstStage = splitQuery.length <= 2;
|
|
57
|
+
const expressions = suggestFirstStage
|
|
58
|
+
? DB_AGGREGATE_COMPLETIONS
|
|
59
|
+
: [
|
|
60
|
+
...exports.BASE_COMPLETIONS,
|
|
61
|
+
...getStageAccumulators(params, elToComplete)
|
|
62
|
+
];
|
|
63
|
+
const hits = filterQueries(params, expressions, prefix, command);
|
|
64
|
+
return [hits.length ? hits : [], line];
|
|
65
|
+
}
|
|
49
66
|
const hits = filterShellAPI(params, DB_COMPLETIONS, elToComplete, splitLine);
|
|
50
67
|
const colls = await params.getCollectionCompletionsForCurrentDb(elToComplete.trim());
|
|
51
68
|
hits.push(...colls.map(coll => `${splitLine[0]}.${coll}`));
|
|
@@ -69,13 +86,16 @@ async function completer(params, line) {
|
|
|
69
86
|
if (splitLine[2].includes('([') || splitLine[2].includes('({')) {
|
|
70
87
|
let expressions;
|
|
71
88
|
if (splitLine[2].match(/\baggregate\b/)) {
|
|
72
|
-
expressions = [
|
|
89
|
+
expressions = [
|
|
90
|
+
...exports.BASE_COMPLETIONS,
|
|
91
|
+
...getStageAccumulators(params, elToComplete)
|
|
92
|
+
];
|
|
73
93
|
}
|
|
74
94
|
else {
|
|
75
95
|
expressions = exports.MATCH_COMPLETIONS;
|
|
76
96
|
}
|
|
77
97
|
const splitQuery = line.split('{');
|
|
78
|
-
const prefix = (
|
|
98
|
+
const prefix = (_c = splitQuery.pop()) === null || _c === void 0 ? void 0 : _c.trim();
|
|
79
99
|
const command = prefix ? line.split(prefix).shift() : line;
|
|
80
100
|
const hits = filterQueries(params, expressions, prefix || '', command);
|
|
81
101
|
return [hits.length ? hits : [], line];
|
|
@@ -137,7 +157,7 @@ function filterQueries(params, completions, prefix, split) {
|
|
|
137
157
|
function filterShellAPI(params, completions, prefix, split) {
|
|
138
158
|
const hits = Object.keys(completions).filter((c) => {
|
|
139
159
|
var _a;
|
|
140
|
-
if (!c.startsWith(prefix))
|
|
160
|
+
if (!c.toLowerCase().startsWith(prefix.toLowerCase()))
|
|
141
161
|
return false;
|
|
142
162
|
if (completions[c].deprecated)
|
|
143
163
|
return false;
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,kDAA8F;AAC9F,oDAA4B;AAC5B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mongosh/autocomplete",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"description": "MongoDB Shell Autocomplete Package",
|
|
5
5
|
"homepage": "https://github.com/mongodb-js/mongosh",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -28,12 +28,12 @@
|
|
|
28
28
|
"unitTestsOnly": true
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"mocha": "^
|
|
31
|
+
"mocha": "^10.2.0"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@mongodb-js/mongodb-constants": "^0.
|
|
35
|
-
"@mongosh/shell-api": "1.
|
|
34
|
+
"@mongodb-js/mongodb-constants": "^0.2.2",
|
|
35
|
+
"@mongosh/shell-api": "1.8.1",
|
|
36
36
|
"semver": "^7.3.2"
|
|
37
37
|
},
|
|
38
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "b0244ae6670f5a0f375abbb38bcf3465917de6e4"
|
|
39
39
|
}
|
package/src/index.spec.ts
CHANGED
|
@@ -5,6 +5,17 @@ import { expect } from 'chai';
|
|
|
5
5
|
|
|
6
6
|
let collections: string[];
|
|
7
7
|
let databases: string[];
|
|
8
|
+
const standalone600 = {
|
|
9
|
+
topology: () => Topologies.Standalone,
|
|
10
|
+
apiVersionInfo: () => undefined,
|
|
11
|
+
connectionInfo: () => ({
|
|
12
|
+
is_atlas: false,
|
|
13
|
+
is_data_federation: false,
|
|
14
|
+
server_version: '6.0.0'
|
|
15
|
+
}),
|
|
16
|
+
getCollectionCompletionsForCurrentDb: () => collections,
|
|
17
|
+
getDatabaseCompletions: () => databases
|
|
18
|
+
};
|
|
8
19
|
const standalone440 = {
|
|
9
20
|
topology: () => Topologies.Standalone,
|
|
10
21
|
apiVersionInfo: () => undefined,
|
|
@@ -79,6 +90,16 @@ describe('completer.completer', () => {
|
|
|
79
90
|
collections = [];
|
|
80
91
|
});
|
|
81
92
|
|
|
93
|
+
it('returns case-insensitive results', async() => {
|
|
94
|
+
const input = 'db.getr';
|
|
95
|
+
const [completions] = await completer(noParams as any, input);
|
|
96
|
+
expect(completions).to.deep.eq([
|
|
97
|
+
'db.getRole',
|
|
98
|
+
'db.getRoles',
|
|
99
|
+
'db.getReplicationInfo'
|
|
100
|
+
]);
|
|
101
|
+
});
|
|
102
|
+
|
|
82
103
|
context('when context is top level shell api', () => {
|
|
83
104
|
it('matches shell completions', async() => {
|
|
84
105
|
const i = 'u';
|
|
@@ -324,6 +345,53 @@ describe('completer.completer', () => {
|
|
|
324
345
|
});
|
|
325
346
|
});
|
|
326
347
|
|
|
348
|
+
context('when context is db aggregation query', () => {
|
|
349
|
+
it('has several matches for db level stages', async() => {
|
|
350
|
+
const query = 'db.aggregate([{';
|
|
351
|
+
expect(await completer(standalone440, query)).to.deep.equal([
|
|
352
|
+
[
|
|
353
|
+
'db.aggregate([{$changeStream',
|
|
354
|
+
'db.aggregate([{$currentOp',
|
|
355
|
+
'db.aggregate([{$listLocalSessions',
|
|
356
|
+
],
|
|
357
|
+
query
|
|
358
|
+
]);
|
|
359
|
+
expect(await completer(standalone600, query)).to.deep.equal([
|
|
360
|
+
[
|
|
361
|
+
'db.aggregate([{$documents',
|
|
362
|
+
'db.aggregate([{$changeStream',
|
|
363
|
+
'db.aggregate([{$currentOp',
|
|
364
|
+
'db.aggregate([{$listLocalSessions',
|
|
365
|
+
],
|
|
366
|
+
query
|
|
367
|
+
]);
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
it('does not have a match', async() => {
|
|
371
|
+
const query = 'db.aggregate([{$mat';
|
|
372
|
+
expect(await completer(standalone440, query)).to.deep.equal([[], query]);
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
it('matches a db aggregation stage', async() => {
|
|
376
|
+
const query = 'db.aggregate([{$lis';
|
|
377
|
+
expect(await completer(standalone440, query)).to.deep.equal([
|
|
378
|
+
['db.aggregate([{$listLocalSessions'],
|
|
379
|
+
query
|
|
380
|
+
]);
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
it('completes the followup stages', async() => {
|
|
384
|
+
const query = 'db.aggregate([{$currentOp: {}}, {$ma';
|
|
385
|
+
expect(await completer(standalone440, query)).to.deep.equal([
|
|
386
|
+
[
|
|
387
|
+
'db.aggregate([{$currentOp: {}}, {$map',
|
|
388
|
+
'db.aggregate([{$currentOp: {}}, {$match'
|
|
389
|
+
],
|
|
390
|
+
query
|
|
391
|
+
]);
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
|
|
327
395
|
context('when context is aggregation query', () => {
|
|
328
396
|
it('has several matches', async() => {
|
|
329
397
|
const i = 'db.shipwrecks.aggregate([ { $so';
|
package/src/index.ts
CHANGED
|
@@ -11,7 +11,8 @@ import {
|
|
|
11
11
|
BSON_TYPES,
|
|
12
12
|
ATLAS,
|
|
13
13
|
ADL,
|
|
14
|
-
ON_PREM
|
|
14
|
+
ON_PREM,
|
|
15
|
+
DATABASE
|
|
15
16
|
} from '@mongodb-js/mongodb-constants';
|
|
16
17
|
|
|
17
18
|
type TypeSignatureAttributes = { [key: string]: TypeSignature };
|
|
@@ -49,6 +50,12 @@ export const MATCH_COMPLETIONS = ([] as AnyCompletions).concat(
|
|
|
49
50
|
BSON_TYPES
|
|
50
51
|
);
|
|
51
52
|
|
|
53
|
+
// Note: The following list is not a list of all the completions
|
|
54
|
+
// for `db.aggregate` but only for the first stage of `db.aggregate`.
|
|
55
|
+
const DB_AGGREGATE_COMPLETIONS = STAGE_OPERATORS.filter(({ namespaces }) => {
|
|
56
|
+
return namespaces.length === 1 && namespaces[0] === DATABASE;
|
|
57
|
+
});
|
|
58
|
+
|
|
52
59
|
/**
|
|
53
60
|
* The project stage operator.
|
|
54
61
|
*/
|
|
@@ -116,6 +123,23 @@ async function completer(params: AutocompleteParameters, line: string): Promise<
|
|
|
116
123
|
const hits = filterShellAPI(params, SHELL_COMPLETIONS, elToComplete);
|
|
117
124
|
return [hits.length ? hits : [], line];
|
|
118
125
|
} else if (firstLineEl.match(/\bdb\b/) && splitLine.length === 2) {
|
|
126
|
+
if (elToComplete.match(/aggregate\s*\(\s*\[\s*\{\s*/)) {
|
|
127
|
+
const splitQuery = line.split('{');
|
|
128
|
+
const prefix = splitQuery.pop()?.trim() || '';
|
|
129
|
+
const command: string = prefix ? line.split(prefix).shift() as string : line;
|
|
130
|
+
const suggestFirstStage = splitQuery.length <= 2;
|
|
131
|
+
|
|
132
|
+
const expressions = suggestFirstStage
|
|
133
|
+
// First stage in `db.aggregate` form can only be 'db' namespaced stages
|
|
134
|
+
? DB_AGGREGATE_COMPLETIONS
|
|
135
|
+
: [
|
|
136
|
+
...BASE_COMPLETIONS,
|
|
137
|
+
...getStageAccumulators(params, elToComplete)
|
|
138
|
+
];
|
|
139
|
+
|
|
140
|
+
const hits = filterQueries(params, expressions, prefix, command);
|
|
141
|
+
return [hits.length ? hits : [], line];
|
|
142
|
+
}
|
|
119
143
|
// We're seeing something like 'db.foo' and expand that to all methods on
|
|
120
144
|
// db which start with 'foo' and all collections on the current db that
|
|
121
145
|
// start with 'foo'.
|
|
@@ -154,10 +178,10 @@ async function completer(params: AutocompleteParameters, line: string): Promise<
|
|
|
154
178
|
let expressions;
|
|
155
179
|
if (splitLine[2].match(/\baggregate\b/)) {
|
|
156
180
|
// aggregation needs extra accumulators to autocomplete properly
|
|
157
|
-
expressions =
|
|
158
|
-
BASE_COMPLETIONS,
|
|
159
|
-
getStageAccumulators(params, elToComplete)
|
|
160
|
-
|
|
181
|
+
expressions = [
|
|
182
|
+
...BASE_COMPLETIONS,
|
|
183
|
+
...getStageAccumulators(params, elToComplete)
|
|
184
|
+
];
|
|
161
185
|
} else {
|
|
162
186
|
// collection querying just needs MATCH COMPLETIONS
|
|
163
187
|
expressions = MATCH_COMPLETIONS;
|
|
@@ -244,7 +268,7 @@ function filterShellAPI(
|
|
|
244
268
|
prefix: string,
|
|
245
269
|
split?: string[]): string[] {
|
|
246
270
|
const hits: string[] = Object.keys(completions).filter((c: string) => {
|
|
247
|
-
if (!c.startsWith(prefix)) return false;
|
|
271
|
+
if (!c.toLowerCase().startsWith(prefix.toLowerCase())) return false;
|
|
248
272
|
if (completions[c].deprecated) return false;
|
|
249
273
|
|
|
250
274
|
const apiVersionInfo = params.apiVersionInfo();
|