gremlin 3.5.2 → 3.5.3

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 (88) hide show
  1. package/.eslintrc.js +154 -0
  2. package/.prettierrc.js +29 -0
  3. package/Gruntfile.js +15 -16
  4. package/doc/AnonymousTraversalSource.html +4 -4
  5. package/doc/Authenticator.html +1 -1
  6. package/doc/Bytecode.html +6 -6
  7. package/doc/Client.html +137 -63
  8. package/doc/Connection.html +88 -4
  9. package/doc/DriverRemoteConnection.html +10 -10
  10. package/doc/EdgeLabelVerificationStrategy.html +1 -1
  11. package/doc/Graph.html +1 -1
  12. package/doc/GraphSON2Reader.html +3 -3
  13. package/doc/GraphSON2Writer.html +2 -2
  14. package/doc/GraphSON3Reader.html +2 -2
  15. package/doc/GraphSON3Writer.html +2 -2
  16. package/doc/GraphTraversal.html +106 -106
  17. package/doc/GraphTraversalSource.html +18 -18
  18. package/doc/HaltedTraverserStrategy.html +2 -2
  19. package/doc/MatchAlgorithmStrategy.html +2 -2
  20. package/doc/P.html +12 -12
  21. package/doc/PartitionStrategy.html +2 -2
  22. package/doc/Path.html +1 -1
  23. package/doc/PlainTextSaslAuthenticator.html +1 -1
  24. package/doc/ProductiveByStrategy.html +1 -1
  25. package/doc/RemoteConnection.html +9 -9
  26. package/doc/RemoteStrategy.html +3 -3
  27. package/doc/RemoteTraversal.html +2 -2
  28. package/doc/ReservedKeysVerificationStrategy.html +2 -2
  29. package/doc/ResponseError.html +1 -1
  30. package/doc/ResultSet.html +6 -6
  31. package/doc/SaslAuthenticator.html +1 -1
  32. package/doc/SaslMechanismBase.html +1 -1
  33. package/doc/SaslMechanismPlain.html +5 -5
  34. package/doc/SeedStrategy.html +2 -2
  35. package/doc/SubgraphStrategy.html +2 -2
  36. package/doc/TextP.html +9 -9
  37. package/doc/Transaction.html +5 -5
  38. package/doc/Translator.html +1 -1
  39. package/doc/TraversalStrategies.html +4 -4
  40. package/doc/TraversalStrategy.html +2 -2
  41. package/doc/TypeSerializer.html +1 -1
  42. package/doc/driver_auth_authenticator.js.html +3 -3
  43. package/doc/driver_auth_mechanisms_sasl-mechanism-base.js.html +2 -2
  44. package/doc/driver_auth_mechanisms_sasl-mechanism-plain.js.html +25 -16
  45. package/doc/driver_auth_plain-text-sasl-authenticator.js.html +6 -6
  46. package/doc/driver_auth_sasl-authenticator.js.html +2 -2
  47. package/doc/driver_client.js.html +69 -23
  48. package/doc/driver_connection.js.html +107 -88
  49. package/doc/driver_driver-remote-connection.js.html +11 -10
  50. package/doc/driver_remote-connection.js.html +3 -4
  51. package/doc/driver_response-error.js.html +4 -3
  52. package/doc/driver_result-set.js.html +3 -3
  53. package/doc/global.html +199 -2
  54. package/doc/index.html +1 -1
  55. package/doc/process_anonymous-traversal.js.html +3 -3
  56. package/doc/process_bytecode.js.html +10 -8
  57. package/doc/process_graph-traversal.js.html +193 -142
  58. package/doc/process_transaction.js.html +15 -8
  59. package/doc/process_translator.js.html +13 -10
  60. package/doc/process_traversal-strategy.js.html +59 -53
  61. package/doc/process_traversal.js.html +100 -107
  62. package/doc/structure_graph.js.html +6 -6
  63. package/doc/structure_io_graph-serializer.js.html +64 -17
  64. package/doc/structure_io_type-serializers.js.html +85 -88
  65. package/index.js +5 -5
  66. package/lib/driver/auth/authenticator.js +2 -2
  67. package/lib/driver/auth/mechanisms/sasl-mechanism-base.js +1 -1
  68. package/lib/driver/auth/mechanisms/sasl-mechanism-plain.js +24 -15
  69. package/lib/driver/auth/plain-text-sasl-authenticator.js +5 -5
  70. package/lib/driver/auth/sasl-authenticator.js +1 -1
  71. package/lib/driver/client.js +68 -22
  72. package/lib/driver/connection.js +106 -87
  73. package/lib/driver/driver-remote-connection.js +10 -9
  74. package/lib/driver/remote-connection.js +2 -3
  75. package/lib/driver/response-error.js +2 -2
  76. package/lib/driver/result-set.js +1 -2
  77. package/lib/process/anonymous-traversal.js +1 -2
  78. package/lib/process/bytecode.js +9 -7
  79. package/lib/process/graph-traversal.js +191 -141
  80. package/lib/process/transaction.js +13 -7
  81. package/lib/process/translator.js +11 -9
  82. package/lib/process/traversal-strategy.js +57 -52
  83. package/lib/process/traversal.js +99 -106
  84. package/lib/structure/graph.js +5 -5
  85. package/lib/structure/io/graph-serializer.js +62 -16
  86. package/lib/structure/io/type-serializers.js +84 -87
  87. package/lib/utils.js +15 -10
  88. package/package.json +10 -5
@@ -53,38 +53,36 @@ class NumberSerializer extends TypeSerializer {
53
53
  if (isNaN(item)) {
54
54
  return {
55
55
  [typeKey]: 'g:Double',
56
- [valueKey]: 'NaN'
56
+ [valueKey]: 'NaN',
57
57
  };
58
58
  } else if (item === Number.POSITIVE_INFINITY) {
59
59
  return {
60
60
  [typeKey]: 'g:Double',
61
- [valueKey]: 'Infinity'
61
+ [valueKey]: 'Infinity',
62
62
  };
63
63
  } else if (item === Number.NEGATIVE_INFINITY) {
64
64
  return {
65
65
  [typeKey]: 'g:Double',
66
- [valueKey]: '-Infinity'
66
+ [valueKey]: '-Infinity',
67
67
  };
68
- } else {
69
- return item;
70
68
  }
69
+ return item;
71
70
  }
72
71
 
73
72
  deserialize(obj) {
74
- var val = obj[valueKey];
73
+ const val = obj[valueKey];
75
74
  if (val === 'NaN') {
76
75
  return NaN;
77
76
  } else if (val === 'Infinity') {
78
77
  return Number.POSITIVE_INFINITY;
79
78
  } else if (val === '-Infinity') {
80
79
  return Number.NEGATIVE_INFINITY;
81
- } else {
82
- return parseFloat(val);
83
80
  }
81
+ return parseFloat(val);
84
82
  }
85
83
 
86
84
  canBeUsedFor(value) {
87
- return (typeof value === 'number');
85
+ return typeof value === 'number';
88
86
  }
89
87
  }
90
88
 
@@ -92,7 +90,7 @@ class DateSerializer extends TypeSerializer {
92
90
  serialize(item) {
93
91
  return {
94
92
  [typeKey]: 'g:Date',
95
- [valueKey]: item.getTime()
93
+ [valueKey]: item.getTime(),
96
94
  };
97
95
  }
98
96
 
@@ -101,7 +99,7 @@ class DateSerializer extends TypeSerializer {
101
99
  }
102
100
 
103
101
  canBeUsedFor(value) {
104
- return (value instanceof Date);
102
+ return value instanceof Date;
105
103
  }
106
104
  }
107
105
 
@@ -109,12 +107,12 @@ class LongSerializer extends TypeSerializer {
109
107
  serialize(item) {
110
108
  return {
111
109
  [typeKey]: 'g:Int64',
112
- [valueKey]: item.value
110
+ [valueKey]: item.value,
113
111
  };
114
112
  }
115
113
 
116
114
  canBeUsedFor(value) {
117
- return (value instanceof utils.Long);
115
+ return value instanceof utils.Long;
118
116
  }
119
117
  }
120
118
 
@@ -126,7 +124,7 @@ class BytecodeSerializer extends TypeSerializer {
126
124
  }
127
125
  const result = {};
128
126
  result[typeKey] = 'g:Bytecode';
129
- const resultValue = result[valueKey] = {};
127
+ const resultValue = (result[valueKey] = {});
130
128
  const sources = this._serializeInstructions(bytecode.sourceInstructions);
131
129
  if (sources) {
132
130
  resultValue['source'] = sources;
@@ -145,13 +143,13 @@ class BytecodeSerializer extends TypeSerializer {
145
143
  const result = new Array(instructions.length);
146
144
  result[0] = instructions[0];
147
145
  for (let i = 0; i < instructions.length; i++) {
148
- result[i] = instructions[i].map(item => this.writer.adaptObject(item));
146
+ result[i] = instructions[i].map((item) => this.writer.adaptObject(item));
149
147
  }
150
148
  return result;
151
149
  }
152
150
 
153
151
  canBeUsedFor(value) {
154
- return (value instanceof Bytecode) || (value instanceof t.Traversal);
152
+ return value instanceof Bytecode || value instanceof t.Traversal;
155
153
  }
156
154
  }
157
155
 
@@ -160,20 +158,19 @@ class PSerializer extends TypeSerializer {
160
158
  serialize(item) {
161
159
  const result = {};
162
160
  result[typeKey] = 'g:P';
163
- const resultValue = result[valueKey] = {
164
- 'predicate': item.operator
165
- };
161
+ const resultValue = (result[valueKey] = {
162
+ predicate: item.operator,
163
+ });
166
164
  if (item.other === undefined || item.other === null) {
167
165
  resultValue['value'] = this.writer.adaptObject(item.value);
168
- }
169
- else {
170
- resultValue['value'] = [ this.writer.adaptObject(item.value), this.writer.adaptObject(item.other) ];
166
+ } else {
167
+ resultValue['value'] = [this.writer.adaptObject(item.value), this.writer.adaptObject(item.other)];
171
168
  }
172
169
  return result;
173
170
  }
174
171
 
175
172
  canBeUsedFor(value) {
176
- return (value instanceof t.P);
173
+ return value instanceof t.P;
177
174
  }
178
175
  }
179
176
 
@@ -182,20 +179,19 @@ class TextPSerializer extends TypeSerializer {
182
179
  serialize(item) {
183
180
  const result = {};
184
181
  result[typeKey] = 'g:TextP';
185
- const resultValue = result[valueKey] = {
186
- 'predicate': item.operator
187
- };
182
+ const resultValue = (result[valueKey] = {
183
+ predicate: item.operator,
184
+ });
188
185
  if (item.other === undefined || item.other === null) {
189
186
  resultValue['value'] = this.writer.adaptObject(item.value);
190
- }
191
- else {
192
- resultValue['value'] = [ this.writer.adaptObject(item.value), this.writer.adaptObject(item.other) ];
187
+ } else {
188
+ resultValue['value'] = [this.writer.adaptObject(item.value), this.writer.adaptObject(item.other)];
193
189
  }
194
190
  return result;
195
191
  }
196
192
 
197
193
  canBeUsedFor(value) {
198
- return (value instanceof t.TextP);
194
+ return value instanceof t.TextP;
199
195
  }
200
196
  }
201
197
 
@@ -205,27 +201,30 @@ class LambdaSerializer extends TypeSerializer {
205
201
  const lambdaDef = item();
206
202
 
207
203
  // check if the language is specified otherwise assume gremlin-groovy.
208
- const returnIsString = typeof(lambdaDef) === 'string';
204
+ const returnIsString = typeof lambdaDef === 'string';
209
205
  const script = returnIsString ? lambdaDef : lambdaDef[0];
210
- const lang = returnIsString ? "gremlin-groovy" : lambdaDef[1];
206
+ const lang = returnIsString ? 'gremlin-groovy' : lambdaDef[1];
211
207
 
212
208
  // detect argument count
213
- const argCount = lang === "gremlin-groovy" && script.includes("->") ?
214
- (script.substring(0, script.indexOf("->")).includes(",") ? 2 : 1) :
215
- -1;
209
+ const argCount =
210
+ lang === 'gremlin-groovy' && script.includes('->')
211
+ ? script.substring(0, script.indexOf('->')).includes(',')
212
+ ? 2
213
+ : 1
214
+ : -1;
216
215
 
217
216
  return {
218
217
  [typeKey]: 'g:Lambda',
219
218
  [valueKey]: {
220
- 'arguments': argCount,
221
- 'language': lang,
222
- 'script': script
223
- }
219
+ arguments: argCount,
220
+ language: lang,
221
+ script: script,
222
+ },
224
223
  };
225
224
  }
226
225
 
227
226
  canBeUsedFor(value) {
228
- return (typeof value === 'function');
227
+ return typeof value === 'function';
229
228
  }
230
229
  }
231
230
 
@@ -234,7 +233,7 @@ class EnumSerializer extends TypeSerializer {
234
233
  serialize(item) {
235
234
  return {
236
235
  [typeKey]: 'g:' + item.typeName,
237
- [valueKey]: item.elementName
236
+ [valueKey]: item.elementName,
238
237
  };
239
238
  }
240
239
 
@@ -249,9 +248,9 @@ class TraverserSerializer extends TypeSerializer {
249
248
  return {
250
249
  [typeKey]: 'g:Traverser',
251
250
  [valueKey]: {
252
- 'value': this.writer.adaptObject(item.object),
253
- 'bulk': this.writer.adaptObject(item.bulk)
254
- }
251
+ value: this.writer.adaptObject(item.object),
252
+ bulk: this.writer.adaptObject(item.bulk),
253
+ },
255
254
  };
256
255
  }
257
256
 
@@ -261,7 +260,7 @@ class TraverserSerializer extends TypeSerializer {
261
260
  }
262
261
 
263
262
  canBeUsedFor(value) {
264
- return (value instanceof t.Traverser);
263
+ return value instanceof t.Traverser;
265
264
  }
266
265
  }
267
266
 
@@ -269,7 +268,7 @@ class TraversalStrategySerializer extends TypeSerializer {
269
268
  /** @param {TraversalStrategy} item */
270
269
  serialize(item) {
271
270
  const conf = {};
272
- for (let k in item.configuration) {
271
+ for (const k in item.configuration) {
273
272
  if (item.configuration.hasOwnProperty(k)) {
274
273
  conf[k] = this.writer.adaptObject(item.configuration[k]);
275
274
  }
@@ -277,12 +276,12 @@ class TraversalStrategySerializer extends TypeSerializer {
277
276
 
278
277
  return {
279
278
  [typeKey]: 'g:' + item.constructor.name,
280
- [valueKey]: conf
279
+ [valueKey]: conf,
281
280
  };
282
281
  }
283
282
 
284
283
  canBeUsedFor(value) {
285
- return (value instanceof ts.TraversalStrategy);
284
+ return value instanceof ts.TraversalStrategy;
286
285
  }
287
286
  }
288
287
 
@@ -297,14 +296,14 @@ class VertexSerializer extends TypeSerializer {
297
296
  return {
298
297
  [typeKey]: 'g:Vertex',
299
298
  [valueKey]: {
300
- 'id': this.writer.adaptObject(item.id),
301
- 'label': item.label
302
- }
299
+ id: this.writer.adaptObject(item.id),
300
+ label: item.label,
301
+ },
303
302
  };
304
303
  }
305
304
 
306
305
  canBeUsedFor(value) {
307
- return (value instanceof g.Vertex);
306
+ return value instanceof g.Vertex;
308
307
  }
309
308
  }
310
309
 
@@ -315,7 +314,7 @@ class VertexPropertySerializer extends TypeSerializer {
315
314
  this.reader.read(value['id']),
316
315
  value['label'],
317
316
  this.reader.read(value['value']),
318
- this.reader.read(value['properties'])
317
+ this.reader.read(value['properties']),
319
318
  );
320
319
  }
321
320
  }
@@ -323,9 +322,7 @@ class VertexPropertySerializer extends TypeSerializer {
323
322
  class PropertySerializer extends TypeSerializer {
324
323
  deserialize(obj) {
325
324
  const value = obj[valueKey];
326
- return new g.Property(
327
- value['key'],
328
- this.reader.read(value['value']));
325
+ return new g.Property(value['key'], this.reader.read(value['value']));
329
326
  }
330
327
  }
331
328
 
@@ -337,7 +334,7 @@ class EdgeSerializer extends TypeSerializer {
337
334
  new g.Vertex(this.reader.read(value['outV']), this.reader.read(value['outVLabel'])),
338
335
  value['label'],
339
336
  new g.Vertex(this.reader.read(value['inV']), this.reader.read(value['inVLabel'])),
340
- this.reader.read(value['properties'])
337
+ this.reader.read(value['properties']),
341
338
  );
342
339
  }
343
340
 
@@ -346,25 +343,25 @@ class EdgeSerializer extends TypeSerializer {
346
343
  return {
347
344
  [typeKey]: 'g:Edge',
348
345
  [valueKey]: {
349
- 'id': this.writer.adaptObject(item.id),
350
- 'label': item.label,
351
- 'outV': this.writer.adaptObject(item.outV.id),
352
- 'outVLabel': item.outV.label,
353
- 'inV': this.writer.adaptObject(item.inV.id),
354
- 'inVLabel': item.inV.label
355
- }
346
+ id: this.writer.adaptObject(item.id),
347
+ label: item.label,
348
+ outV: this.writer.adaptObject(item.outV.id),
349
+ outVLabel: item.outV.label,
350
+ inV: this.writer.adaptObject(item.inV.id),
351
+ inVLabel: item.inV.label,
352
+ },
356
353
  };
357
354
  }
358
355
 
359
356
  canBeUsedFor(value) {
360
- return (value instanceof g.Edge);
357
+ return value instanceof g.Edge;
361
358
  }
362
359
  }
363
360
 
364
361
  class PathSerializer extends TypeSerializer {
365
362
  deserialize(obj) {
366
363
  const value = obj[valueKey];
367
- const objects = value['objects'].map(o => this.reader.read(o));
364
+ const objects = value['objects'].map((o) => this.reader.read(o));
368
365
  return new g.Path(this.reader.read(value['labels']), objects);
369
366
  }
370
367
  }
@@ -383,9 +380,9 @@ class TSerializer extends TypeSerializer {
383
380
  }
384
381
 
385
382
  class DirectionSerializer extends TypeSerializer {
386
- deserialize(obj) {
387
- return t.direction[obj[valueKey].toLowerCase()];
388
- }
383
+ deserialize(obj) {
384
+ return t.direction[obj[valueKey].toLowerCase()];
385
+ }
389
386
  }
390
387
 
391
388
  class ArraySerializer extends TypeSerializer {
@@ -399,14 +396,14 @@ class ArraySerializer extends TypeSerializer {
399
396
  if (!Array.isArray(value)) {
400
397
  throw new Error('Expected Array, obtained: ' + value);
401
398
  }
402
- return value.map(x => this.reader.read(x));
399
+ return value.map((x) => this.reader.read(x));
403
400
  }
404
401
 
405
402
  /** @param {Array} item */
406
403
  serialize(item) {
407
404
  return {
408
405
  [typeKey]: this.typeKey,
409
- [valueKey]: item.map(x => this.writer.adaptObject(x))
406
+ [valueKey]: item.map((x) => this.writer.adaptObject(x)),
410
407
  };
411
408
  }
412
409
 
@@ -417,22 +414,22 @@ class ArraySerializer extends TypeSerializer {
417
414
 
418
415
  class BulkSetSerializer extends TypeSerializer {
419
416
  deserialize(obj) {
420
- const value = obj[valueKey];
421
- if (!Array.isArray(value)) {
422
- throw new Error('Expected Array, obtained: ' + value);
423
- }
417
+ const value = obj[valueKey];
418
+ if (!Array.isArray(value)) {
419
+ throw new Error('Expected Array, obtained: ' + value);
420
+ }
424
421
 
425
- // coerce the BulkSet to List. if the bulk exceeds the int space then we can't coerce to List anyway,
426
- // so this query will be trouble. we'd need a legit BulkSet implementation here in js. this current
427
- // implementation is here to replicate the previous functionality that existed on the server side in
428
- // previous versions.
429
- let result = [];
430
- for (let ix = 0, iy = value.length; ix < iy; ix += 2) {
431
- const pair = value.slice(ix, ix + 2);
432
- result = result.concat(Array(this.reader.read(pair[1])).fill(this.reader.read(pair[0])));
433
- }
422
+ // coerce the BulkSet to List. if the bulk exceeds the int space then we can't coerce to List anyway,
423
+ // so this query will be trouble. we'd need a legit BulkSet implementation here in js. this current
424
+ // implementation is here to replicate the previous functionality that existed on the server side in
425
+ // previous versions.
426
+ let result = [];
427
+ for (let ix = 0, iy = value.length; ix < iy; ix += 2) {
428
+ const pair = value.slice(ix, ix + 2);
429
+ result = result.concat(Array(this.reader.read(pair[1])).fill(this.reader.read(pair[0])));
430
+ }
434
431
 
435
- return result;
432
+ return result;
436
433
  }
437
434
  }
438
435
 
@@ -458,7 +455,7 @@ class MapSerializer extends TypeSerializer {
458
455
  });
459
456
  return {
460
457
  [typeKey]: 'g:Map',
461
- [valueKey]: arr
458
+ [valueKey]: arr,
462
459
  };
463
460
  }
464
461
 
@@ -503,5 +500,5 @@ module.exports = {
503
500
  typeKey,
504
501
  valueKey,
505
502
  VertexPropertySerializer,
506
- VertexSerializer
503
+ VertexSerializer,
507
504
  };
package/lib/utils.js CHANGED
@@ -29,12 +29,12 @@ exports.toLong = function toLong(value) {
29
29
  return new Long(value);
30
30
  };
31
31
 
32
- const Long = exports.Long = function Long(value) {
32
+ const Long = (exports.Long = function Long(value) {
33
33
  if (typeof value !== 'string' && typeof value !== 'number') {
34
34
  throw new TypeError('The value must be a string or a number');
35
35
  }
36
36
  this.value = value.toString();
37
- };
37
+ });
38
38
 
39
39
  exports.getUuid = function getUuid() {
40
40
  const buffer = crypto.randomBytes(16);
@@ -48,11 +48,16 @@ exports.getUuid = function getUuid() {
48
48
  buffer[8] |= 0x80;
49
49
  const hex = buffer.toString('hex');
50
50
  return (
51
- hex.substr(0, 8) + '-' +
52
- hex.substr(8, 4) + '-' +
53
- hex.substr(12, 4) + '-' +
54
- hex.substr(16, 4) + '-' +
55
- hex.substr(20, 12));
51
+ hex.substr(0, 8) +
52
+ '-' +
53
+ hex.substr(8, 4) +
54
+ '-' +
55
+ hex.substr(12, 4) +
56
+ '-' +
57
+ hex.substr(16, 4) +
58
+ '-' +
59
+ hex.substr(20, 12)
60
+ );
56
61
  };
57
62
 
58
63
  exports.emptyArray = Object.freeze([]);
@@ -62,15 +67,15 @@ class ImmutableMap extends Map {
62
67
  super(iterable);
63
68
  }
64
69
 
65
- set(){
70
+ set() {
66
71
  return this;
67
72
  }
68
73
 
69
- ['delete'](){
74
+ ['delete']() {
70
75
  return false;
71
76
  }
72
77
 
73
- clear() { }
78
+ clear() {}
74
79
  }
75
80
 
76
81
  exports.ImmutableMap = ImmutableMap;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gremlin",
3
- "version": "3.5.2",
3
+ "version": "3.5.3",
4
4
  "description": "JavaScript Gremlin Language Variant",
5
5
  "author": "Apache TinkerPop team",
6
6
  "keywords": [
@@ -18,12 +18,16 @@
18
18
  },
19
19
  "devDependencies": {
20
20
  "chai": "~4.1.2",
21
+ "colors": "1.4.0",
21
22
  "cucumber": "~4.2.1",
22
- "grunt": "~1.2.0",
23
+ "eslint": "^7.32.0",
24
+ "eslint-config-prettier": "^8.5.0",
25
+ "eslint-plugin-prettier": "^4.0.0",
26
+ "grunt": "^1.4.1",
23
27
  "grunt-cli": "~1.3.2",
24
28
  "grunt-jsdoc": "~2.4.1",
25
- "mocha": "~5.2.0",
26
- "colors": "1.4.0"
29
+ "mocha": "^9.2.2",
30
+ "prettier": "^2.5.1"
27
31
  },
28
32
  "repository": {
29
33
  "type": "git",
@@ -36,7 +40,8 @@
36
40
  "scripts": {
37
41
  "test": "./node_modules/mocha/bin/mocha test/unit test/integration -t 5000",
38
42
  "features": "./node_modules/.bin/cucumber-js --require test/cucumber ../../../../../gremlin-test/features/",
39
- "unit-test": "./node_modules/mocha/bin/mocha test/unit"
43
+ "unit-test": "./node_modules/mocha/bin/mocha test/unit",
44
+ "lint": "eslint --ext .js ."
40
45
  },
41
46
  "engines": {
42
47
  "node": ">=10"