kuzzle 2.19.2 → 2.19.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 (289) hide show
  1. package/lib/api/controllers/adminController.js +94 -80
  2. package/lib/api/controllers/authController.js +239 -212
  3. package/lib/api/controllers/baseController.js +89 -51
  4. package/lib/api/controllers/bulkController.js +62 -49
  5. package/lib/api/controllers/clusterController.js +6 -8
  6. package/lib/api/controllers/collectionController.js +140 -129
  7. package/lib/api/controllers/debugController.d.ts +2 -2
  8. package/lib/api/controllers/debugController.js +33 -31
  9. package/lib/api/controllers/documentController.js +365 -274
  10. package/lib/api/controllers/index.js +13 -13
  11. package/lib/api/controllers/indexController.js +46 -50
  12. package/lib/api/controllers/memoryStorageController.js +410 -360
  13. package/lib/api/controllers/realtimeController.js +37 -36
  14. package/lib/api/controllers/securityController.js +553 -412
  15. package/lib/api/controllers/serverController.js +111 -104
  16. package/lib/api/documentExtractor.js +75 -68
  17. package/lib/api/funnel.js +411 -312
  18. package/lib/api/httpRoutes.js +1493 -324
  19. package/lib/api/openapi/OpenApiManager.d.ts +1 -1
  20. package/lib/api/openapi/OpenApiManager.js +22 -22
  21. package/lib/api/openapi/components/document/count.yaml +1 -1
  22. package/lib/api/openapi/components/document/create.yaml +2 -2
  23. package/lib/api/openapi/components/document/delete.yaml +1 -1
  24. package/lib/api/openapi/components/document/deleteByQuery.yaml +1 -1
  25. package/lib/api/openapi/components/document/exists.yaml +1 -1
  26. package/lib/api/openapi/components/document/get.yaml +2 -2
  27. package/lib/api/openapi/components/document/index.js +12 -12
  28. package/lib/api/openapi/components/document/replace.yaml +1 -1
  29. package/lib/api/openapi/components/document/scroll.yaml +1 -1
  30. package/lib/api/openapi/components/document/validate.yaml +1 -1
  31. package/lib/api/openapi/components/index.d.ts +2 -2
  32. package/lib/api/openapi/components/index.js +1 -1
  33. package/lib/api/openapi/components/security/index.js +1 -1
  34. package/lib/api/openapi/components/security/upsertUser.yaml +2 -3
  35. package/lib/api/openapi/index.d.ts +1 -1
  36. package/lib/api/openapi/openApiGenerator.d.ts +1 -1
  37. package/lib/api/openapi/openApiGenerator.js +7 -7
  38. package/lib/api/rateLimiter.js +12 -13
  39. package/lib/api/request/index.d.ts +4 -4
  40. package/lib/api/request/kuzzleRequest.d.ts +9 -9
  41. package/lib/api/request/kuzzleRequest.js +89 -87
  42. package/lib/api/request/requestContext.d.ts +2 -2
  43. package/lib/api/request/requestContext.js +17 -17
  44. package/lib/api/request/requestInput.d.ts +1 -1
  45. package/lib/api/request/requestInput.js +19 -19
  46. package/lib/api/request/requestResponse.d.ts +4 -4
  47. package/lib/api/request/requestResponse.js +31 -33
  48. package/lib/cluster/command.js +48 -44
  49. package/lib/cluster/idCardHandler.d.ts +1 -1
  50. package/lib/cluster/idCardHandler.js +15 -15
  51. package/lib/cluster/index.js +2 -2
  52. package/lib/cluster/node.js +301 -269
  53. package/lib/cluster/publisher.js +45 -46
  54. package/lib/cluster/state.d.ts +5 -5
  55. package/lib/cluster/state.js +8 -8
  56. package/lib/cluster/subscriber.js +163 -113
  57. package/lib/cluster/workers/IDCardRenewer.js +33 -32
  58. package/lib/config/default.config.d.ts +1 -1
  59. package/lib/config/default.config.js +212 -171
  60. package/lib/config/documentEventAliases.js +6 -6
  61. package/lib/config/index.js +161 -98
  62. package/lib/config/sdkCompatibility.json +8 -8
  63. package/lib/core/auth/formatProcessing.js +7 -7
  64. package/lib/core/auth/passportResponse.js +7 -7
  65. package/lib/core/auth/passportWrapper.js +34 -30
  66. package/lib/core/auth/tokenManager.d.ts +2 -2
  67. package/lib/core/auth/tokenManager.js +11 -10
  68. package/lib/core/backend/applicationManager.d.ts +1 -1
  69. package/lib/core/backend/applicationManager.js +2 -2
  70. package/lib/core/backend/backend.d.ts +3 -3
  71. package/lib/core/backend/backend.js +34 -31
  72. package/lib/core/backend/backendCluster.d.ts +2 -2
  73. package/lib/core/backend/backendCluster.js +5 -5
  74. package/lib/core/backend/backendConfig.d.ts +2 -2
  75. package/lib/core/backend/backendConfig.js +3 -3
  76. package/lib/core/backend/backendController.d.ts +2 -2
  77. package/lib/core/backend/backendController.js +9 -10
  78. package/lib/core/backend/backendErrors.d.ts +3 -3
  79. package/lib/core/backend/backendErrors.js +2 -1
  80. package/lib/core/backend/backendHook.d.ts +2 -2
  81. package/lib/core/backend/backendHook.js +5 -5
  82. package/lib/core/backend/backendImport.d.ts +3 -3
  83. package/lib/core/backend/backendImport.js +23 -23
  84. package/lib/core/backend/backendOpenApi.d.ts +2 -2
  85. package/lib/core/backend/backendOpenApi.js +16 -16
  86. package/lib/core/backend/backendPipe.d.ts +2 -2
  87. package/lib/core/backend/backendPipe.js +6 -6
  88. package/lib/core/backend/backendPlugin.d.ts +4 -4
  89. package/lib/core/backend/backendPlugin.js +14 -14
  90. package/lib/core/backend/backendStorage.d.ts +2 -2
  91. package/lib/core/backend/backendStorage.js +1 -2
  92. package/lib/core/backend/backendVault.d.ts +2 -2
  93. package/lib/core/backend/backendVault.js +3 -3
  94. package/lib/core/backend/index.d.ts +14 -14
  95. package/lib/core/backend/internalLogger.d.ts +1 -1
  96. package/lib/core/backend/internalLogger.js +5 -5
  97. package/lib/core/cache/cacheDbEnum.js +4 -4
  98. package/lib/core/cache/cacheEngine.js +79 -85
  99. package/lib/core/network/accessLogger.js +126 -120
  100. package/lib/core/network/clientConnection.js +5 -5
  101. package/lib/core/network/context.js +8 -8
  102. package/lib/core/network/entryPoint.js +100 -85
  103. package/lib/core/network/httpRouter/index.js +63 -60
  104. package/lib/core/network/httpRouter/routeHandler.js +18 -19
  105. package/lib/core/network/httpRouter/routePart.js +23 -19
  106. package/lib/core/network/protocolManifest.js +3 -3
  107. package/lib/core/network/protocols/httpMessage.js +8 -10
  108. package/lib/core/network/protocols/httpwsProtocol.js +305 -250
  109. package/lib/core/network/protocols/internalProtocol.js +27 -24
  110. package/lib/core/network/protocols/mqttProtocol.js +106 -96
  111. package/lib/core/network/protocols/protocol.js +20 -17
  112. package/lib/core/network/router.js +56 -46
  113. package/lib/core/plugin/plugin.js +151 -120
  114. package/lib/core/plugin/pluginContext.d.ts +7 -7
  115. package/lib/core/plugin/pluginContext.js +48 -44
  116. package/lib/core/plugin/pluginManifest.js +13 -12
  117. package/lib/core/plugin/pluginRepository.js +26 -27
  118. package/lib/core/plugin/pluginsManager.js +425 -304
  119. package/lib/core/plugin/privilegedContext.js +3 -3
  120. package/lib/core/realtime/actionEnum.js +1 -1
  121. package/lib/core/realtime/channel.d.ts +1 -1
  122. package/lib/core/realtime/channel.js +22 -22
  123. package/lib/core/realtime/connectionRooms.d.ts +1 -1
  124. package/lib/core/realtime/hotelClerk.d.ts +2 -2
  125. package/lib/core/realtime/hotelClerk.js +53 -50
  126. package/lib/core/realtime/index.js +5 -5
  127. package/lib/core/realtime/notification/document.js +25 -25
  128. package/lib/core/realtime/notification/index.js +4 -4
  129. package/lib/core/realtime/notification/server.js +3 -3
  130. package/lib/core/realtime/notification/user.js +4 -4
  131. package/lib/core/realtime/notifier.js +113 -75
  132. package/lib/core/realtime/room.d.ts +1 -1
  133. package/lib/core/realtime/subscription.d.ts +1 -1
  134. package/lib/core/realtime/subscription.js +1 -1
  135. package/lib/core/security/index.js +8 -8
  136. package/lib/core/security/profileRepository.d.ts +6 -6
  137. package/lib/core/security/profileRepository.js +48 -45
  138. package/lib/core/security/roleRepository.js +127 -115
  139. package/lib/core/security/securityLoader.js +70 -63
  140. package/lib/core/security/tokenRepository.js +132 -118
  141. package/lib/core/security/userRepository.js +104 -88
  142. package/lib/core/shared/KoncordeWrapper.d.ts +1 -1
  143. package/lib/core/shared/KoncordeWrapper.js +3 -1
  144. package/lib/core/shared/abstractManifest.js +22 -23
  145. package/lib/core/shared/repository.js +69 -67
  146. package/lib/core/shared/sdk/embeddedSdk.d.ts +2 -2
  147. package/lib/core/shared/sdk/embeddedSdk.js +36 -32
  148. package/lib/core/shared/sdk/funnelProtocol.d.ts +1 -1
  149. package/lib/core/shared/sdk/funnelProtocol.js +11 -11
  150. package/lib/core/shared/sdk/impersonatedSdk.js +19 -18
  151. package/lib/core/shared/store.js +127 -32
  152. package/lib/core/statistics/index.js +2 -2
  153. package/lib/core/statistics/statistics.js +99 -85
  154. package/lib/core/storage/clientAdapter.js +219 -136
  155. package/lib/core/storage/indexCache.js +3 -3
  156. package/lib/core/storage/storageEngine.js +10 -13
  157. package/lib/core/storage/storeScopeEnum.js +3 -3
  158. package/lib/core/validation/baseType.js +12 -10
  159. package/lib/core/validation/index.js +2 -2
  160. package/lib/core/validation/types/anything.js +4 -4
  161. package/lib/core/validation/types/boolean.js +7 -7
  162. package/lib/core/validation/types/date.js +165 -131
  163. package/lib/core/validation/types/email.js +18 -21
  164. package/lib/core/validation/types/enum.js +34 -21
  165. package/lib/core/validation/types/geoPoint.js +7 -7
  166. package/lib/core/validation/types/geoShape.js +148 -125
  167. package/lib/core/validation/types/integer.js +9 -9
  168. package/lib/core/validation/types/ipAddress.js +17 -19
  169. package/lib/core/validation/types/numeric.js +36 -29
  170. package/lib/core/validation/types/object.js +19 -19
  171. package/lib/core/validation/types/string.js +36 -29
  172. package/lib/core/validation/types/url.js +17 -19
  173. package/lib/core/validation/validation.js +422 -378
  174. package/lib/kerror/codes/1-services.json +7 -1
  175. package/lib/kerror/codes/4-plugin.json +2 -2
  176. package/lib/kerror/codes/index.js +85 -63
  177. package/lib/kerror/errors/badRequestError.d.ts +1 -1
  178. package/lib/kerror/errors/externalServiceError.d.ts +1 -1
  179. package/lib/kerror/errors/forbiddenError.d.ts +1 -1
  180. package/lib/kerror/errors/gatewayTimeoutError.d.ts +1 -1
  181. package/lib/kerror/errors/index.d.ts +15 -15
  182. package/lib/kerror/errors/internalError.d.ts +1 -1
  183. package/lib/kerror/errors/kuzzleError.d.ts +1 -1
  184. package/lib/kerror/errors/multipleErrorsError.d.ts +1 -1
  185. package/lib/kerror/errors/multipleErrorsError.js +1 -1
  186. package/lib/kerror/errors/notFoundError.d.ts +1 -1
  187. package/lib/kerror/errors/partialError.d.ts +1 -1
  188. package/lib/kerror/errors/partialError.js +1 -1
  189. package/lib/kerror/errors/pluginImplementationError.d.ts +1 -1
  190. package/lib/kerror/errors/pluginImplementationError.js +2 -1
  191. package/lib/kerror/errors/preconditionError.d.ts +1 -1
  192. package/lib/kerror/errors/serviceUnavailableError.d.ts +1 -1
  193. package/lib/kerror/errors/sizeLimitError.d.ts +1 -1
  194. package/lib/kerror/errors/tooManyRequestsError.d.ts +1 -1
  195. package/lib/kerror/errors/unauthorizedError.d.ts +1 -1
  196. package/lib/kerror/index.d.ts +3 -3
  197. package/lib/kerror/index.js +17 -16
  198. package/lib/kuzzle/dumpGenerator.js +130 -114
  199. package/lib/kuzzle/event/kuzzleEventEmitter.js +96 -70
  200. package/lib/kuzzle/event/pipeRunner.js +25 -24
  201. package/lib/kuzzle/event/waterfall.js +13 -15
  202. package/lib/kuzzle/index.js +2 -2
  203. package/lib/kuzzle/internalIndexHandler.js +80 -59
  204. package/lib/kuzzle/kuzzle.js +99 -99
  205. package/lib/kuzzle/kuzzleStateEnum.js +1 -1
  206. package/lib/kuzzle/log.js +23 -18
  207. package/lib/kuzzle/vault.js +34 -19
  208. package/lib/model/security/profile.d.ts +3 -3
  209. package/lib/model/security/profile.js +38 -37
  210. package/lib/model/security/rights.js +5 -5
  211. package/lib/model/security/role.d.ts +3 -3
  212. package/lib/model/security/role.js +25 -26
  213. package/lib/model/security/token.d.ts +1 -1
  214. package/lib/model/security/token.js +4 -4
  215. package/lib/model/security/user.d.ts +2 -2
  216. package/lib/model/security/user.js +9 -9
  217. package/lib/model/storage/apiKey.js +43 -33
  218. package/lib/model/storage/baseModel.js +49 -45
  219. package/lib/service/cache/redis.js +60 -55
  220. package/lib/service/service.js +17 -17
  221. package/lib/service/storage/elasticsearch.js +839 -755
  222. package/lib/service/storage/esWrapper.js +103 -86
  223. package/lib/service/storage/queryTranslator.js +52 -59
  224. package/lib/types/Controller.d.ts +3 -3
  225. package/lib/types/ControllerDefinition.d.ts +3 -3
  226. package/lib/types/DebugModule.d.ts +2 -2
  227. package/lib/types/DebugModule.js +1 -1
  228. package/lib/types/Global.d.ts +1 -1
  229. package/lib/types/HttpStream.d.ts +2 -1
  230. package/lib/types/HttpStream.js +7 -5
  231. package/lib/types/Kuzzle.d.ts +1 -1
  232. package/lib/types/KuzzleDocument.d.ts +1 -1
  233. package/lib/types/OpenApiDefinition.d.ts +1 -1
  234. package/lib/types/PasswordPolicy.d.ts +1 -1
  235. package/lib/types/Plugin.d.ts +6 -6
  236. package/lib/types/Plugin.js +2 -2
  237. package/lib/types/Policy.d.ts +1 -1
  238. package/lib/types/RequestPayload.d.ts +1 -1
  239. package/lib/types/ResponsePayload.d.ts +1 -1
  240. package/lib/types/Token.d.ts +1 -1
  241. package/lib/types/User.d.ts +1 -1
  242. package/lib/types/config/DumpConfiguration.d.ts +8 -8
  243. package/lib/types/config/HttpConfiguration.d.ts +1 -1
  244. package/lib/types/config/KuzzleConfiguration.d.ts +1 -1
  245. package/lib/types/config/LimitsConfiguration.d.ts +8 -8
  246. package/lib/types/config/PluginsConfiguration.d.ts +4 -4
  247. package/lib/types/config/SecurityConfiguration.d.ts +62 -62
  248. package/lib/types/config/ServerConfiguration.d.ts +55 -55
  249. package/lib/types/config/ServicesConfiguration.d.ts +2 -2
  250. package/lib/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +10 -10
  251. package/lib/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +3 -3
  252. package/lib/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +194 -110
  253. package/lib/types/errors/ErrorDefinition.d.ts +1 -1
  254. package/lib/types/errors/ErrorDomains.d.ts +1 -1
  255. package/lib/types/index.d.ts +38 -38
  256. package/lib/types/realtime/RealtimeScope.d.ts +1 -1
  257. package/lib/types/realtime/RealtimeUsers.d.ts +1 -1
  258. package/lib/util/assertType.js +13 -11
  259. package/lib/util/async.d.ts +1 -0
  260. package/lib/util/async.js +61 -0
  261. package/lib/util/asyncStore.js +19 -21
  262. package/lib/util/bufferedPassThrough.d.ts +2 -2
  263. package/lib/util/bufferedPassThrough.js +4 -4
  264. package/lib/util/bytes.js +9 -13
  265. package/lib/util/crypto.js +1 -1
  266. package/lib/util/debug.js +5 -5
  267. package/lib/util/deprecate.js +24 -21
  268. package/lib/util/didYouMean.js +7 -7
  269. package/lib/util/dump-collection.d.ts +2 -2
  270. package/lib/util/dump-collection.js +26 -26
  271. package/lib/util/esRequest.d.ts +1 -0
  272. package/lib/util/esRequest.js +62 -0
  273. package/lib/util/extractFields.js +24 -25
  274. package/lib/util/inflector.js +5 -5
  275. package/lib/util/koncordeCompat.d.ts +2 -2
  276. package/lib/util/koncordeCompat.js +5 -5
  277. package/lib/util/memoize.js +3 -5
  278. package/lib/util/mutex.d.ts +19 -1
  279. package/lib/util/mutex.js +39 -12
  280. package/lib/util/name-generator.js +1331 -1331
  281. package/lib/util/promback.js +8 -10
  282. package/lib/util/readYamlFile.d.ts +1 -1
  283. package/lib/util/readYamlFile.js +1 -1
  284. package/lib/util/requestAssertions.js +34 -34
  285. package/lib/util/safeObject.js +5 -5
  286. package/lib/util/stackTrace.js +20 -22
  287. package/lib/util/wildcard.js +15 -15
  288. package/package.json +6 -6
  289. package/npm-shrinkwrap.json +0 -19422
@@ -19,22 +19,21 @@
19
19
  * limitations under the License.
20
20
  */
21
21
 
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- const
25
- kerror = require('../../../kerror').wrap('validation', 'assert'),
26
- BaseType = require('../baseType'),
27
- validator = require('validator');
24
+ const kerror = require("../../../kerror").wrap("validation", "assert"),
25
+ BaseType = require("../baseType"),
26
+ validator = require("validator");
28
27
 
29
28
  /**
30
29
  * @class EmailType
31
30
  */
32
31
  class EmailType extends BaseType {
33
- constructor () {
32
+ constructor() {
34
33
  super();
35
- this.typeName = 'email';
34
+ this.typeName = "email";
36
35
  this.allowChildren = false;
37
- this.allowedTypeOptions = ['notEmpty'];
36
+ this.allowedTypeOptions = ["notEmpty"];
38
37
  }
39
38
 
40
39
  /**
@@ -43,31 +42,31 @@ class EmailType extends BaseType {
43
42
  * @param {string[]} errorMessages
44
43
  * @returns {boolean}
45
44
  */
46
- validate (typeOptions, fieldValue, errorMessages) {
45
+ validate(typeOptions, fieldValue, errorMessages) {
47
46
  if (fieldValue === undefined || fieldValue === null) {
48
47
  if (typeOptions.notEmpty) {
49
- errorMessages.push('Field cannot be undefined or null');
48
+ errorMessages.push("Field cannot be undefined or null");
50
49
  return false;
51
50
  }
52
51
 
53
52
  return true;
54
53
  }
55
54
 
56
- if (typeof fieldValue !== 'string') {
57
- errorMessages.push('The field must be a string.');
55
+ if (typeof fieldValue !== "string") {
56
+ errorMessages.push("The field must be a string.");
58
57
  return false;
59
58
  }
60
59
 
61
60
  if (fieldValue.length === 0) {
62
61
  if (typeOptions.notEmpty === true) {
63
- errorMessages.push('The string must not be empty.');
62
+ errorMessages.push("The string must not be empty.");
64
63
  return false;
65
64
  }
66
65
  return true;
67
66
  }
68
67
 
69
- if (! validator.isEmail(fieldValue)) {
70
- errorMessages.push('The string must be a valid email address.');
68
+ if (!validator.isEmail(fieldValue)) {
69
+ errorMessages.push("The string must be a valid email address.");
71
70
  return false;
72
71
  }
73
72
 
@@ -79,14 +78,12 @@ class EmailType extends BaseType {
79
78
  * @returns {TypeOptions}
80
79
  * @throws {PreconditionError}
81
80
  */
82
- validateFieldSpecification (typeOptions) {
83
- if (! Object.prototype.hasOwnProperty.call(typeOptions, 'notEmpty')) {
81
+ validateFieldSpecification(typeOptions) {
82
+ if (!Object.prototype.hasOwnProperty.call(typeOptions, "notEmpty")) {
84
83
  typeOptions.notEmpty = false;
84
+ } else if (typeof typeOptions.notEmpty !== "boolean") {
85
+ throw kerror.get("invalid_type", "notEmpty", "boolean");
85
86
  }
86
- else if (typeof typeOptions.notEmpty !== 'boolean') {
87
- throw kerror.get('invalid_type', 'notEmpty', 'boolean');
88
- }
89
-
90
87
 
91
88
  return typeOptions;
92
89
  }
@@ -19,21 +19,20 @@
19
19
  * limitations under the License.
20
20
  */
21
21
 
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- const
25
- kerror = require('../../../kerror'),
26
- BaseType = require('../baseType');
24
+ const kerror = require("../../../kerror"),
25
+ BaseType = require("../baseType");
27
26
 
28
27
  /**
29
28
  * @class EnumType
30
29
  */
31
30
  class EnumType extends BaseType {
32
- constructor () {
31
+ constructor() {
33
32
  super();
34
- this.typeName = 'enum';
33
+ this.typeName = "enum";
35
34
  this.allowChildren = false;
36
- this.allowedTypeOptions = ['values'];
35
+ this.allowedTypeOptions = ["values"];
37
36
  }
38
37
 
39
38
  /**
@@ -42,15 +41,18 @@ class EnumType extends BaseType {
42
41
  * @param {string[]} errorMessages
43
42
  * @returns {boolean}
44
43
  */
45
- validate (typeOptions, fieldValue, errorMessages) {
46
- if (typeof fieldValue !== 'string') {
47
- errorMessages.push('The field must be a string.');
44
+ validate(typeOptions, fieldValue, errorMessages) {
45
+ if (typeof fieldValue !== "string") {
46
+ errorMessages.push("The field must be a string.");
48
47
  return false;
49
48
  }
50
49
 
51
- if (! typeOptions.values.includes(fieldValue)) {
50
+ if (!typeOptions.values.includes(fieldValue)) {
52
51
  errorMessages.push(
53
- `The field only accepts following values: "${typeOptions.values.join(', ')}".`);
52
+ `The field only accepts following values: "${typeOptions.values.join(
53
+ ", "
54
+ )}".`
55
+ );
54
56
  return false;
55
57
  }
56
58
 
@@ -62,22 +64,33 @@ class EnumType extends BaseType {
62
64
  * @returns {TypeOptions}
63
65
  * @throws {PreconditionError}
64
66
  */
65
- validateFieldSpecification (typeOptions) {
66
- if (! Object.prototype.hasOwnProperty.call(typeOptions, 'values')) {
67
- throw kerror.get('validation', 'types', 'missing_enum_values');
67
+ validateFieldSpecification(typeOptions) {
68
+ if (!Object.prototype.hasOwnProperty.call(typeOptions, "values")) {
69
+ throw kerror.get("validation", "types", "missing_enum_values");
68
70
  }
69
71
 
70
- if (! Array.isArray(typeOptions.values)
71
- || typeOptions.values.length === 0
72
- ) {
73
- throw kerror.get('validation', 'assert', 'invalid_type', 'values', 'string[]');
72
+ if (!Array.isArray(typeOptions.values) || typeOptions.values.length === 0) {
73
+ throw kerror.get(
74
+ "validation",
75
+ "assert",
76
+ "invalid_type",
77
+ "values",
78
+ "string[]"
79
+ );
74
80
  }
75
81
 
76
82
  const nonString = typeOptions.values.filter(
77
- value => typeof value !== 'string');
83
+ (value) => typeof value !== "string"
84
+ );
78
85
 
79
86
  if (nonString.length > 0) {
80
- throw kerror.get('validation', 'assert', 'invalid_type', 'values', 'string[]');
87
+ throw kerror.get(
88
+ "validation",
89
+ "assert",
90
+ "invalid_type",
91
+ "values",
92
+ "string[]"
93
+ );
81
94
  }
82
95
 
83
96
  return typeOptions;
@@ -19,18 +19,18 @@
19
19
  * limitations under the License.
20
20
  */
21
21
 
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- const BaseType = require('../baseType');
25
- const { Koncorde } = require('../../shared/KoncordeWrapper');
24
+ const BaseType = require("../baseType");
25
+ const { Koncorde } = require("../../shared/KoncordeWrapper");
26
26
 
27
27
  /**
28
28
  * @class GeoPointType
29
29
  */
30
30
  class GeoPointType extends BaseType {
31
- constructor () {
31
+ constructor() {
32
32
  super();
33
- this.typeName = 'geo_point';
33
+ this.typeName = "geo_point";
34
34
  this.allowChildren = false;
35
35
  this.allowedTypeOptions = [];
36
36
  }
@@ -41,9 +41,9 @@ class GeoPointType extends BaseType {
41
41
  * @param {string[]} errorMessages
42
42
  * @returns {boolean}
43
43
  */
44
- validate (typeOptions, fieldValue, errorMessages) {
44
+ validate(typeOptions, fieldValue, errorMessages) {
45
45
  if (Koncorde.convertGeopoint(fieldValue) === null) {
46
- errorMessages.push('Invalid GeoPoint format');
46
+ errorMessages.push("Invalid GeoPoint format");
47
47
  return false;
48
48
  }
49
49
 
@@ -19,55 +19,50 @@
19
19
  * limitations under the License.
20
20
  */
21
21
 
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- const { Koncorde } = require('koncorde');
24
+ const { Koncorde } = require("koncorde");
25
25
 
26
- const kerror = require('../../../kerror');
27
- const BaseType = require('../baseType');
26
+ const kerror = require("../../../kerror");
27
+ const BaseType = require("../baseType");
28
28
 
29
- const
30
- allowedShapeProperties = [
31
- 'type',
32
- 'coordinates',
33
- 'radius',
34
- 'orientation',
35
- 'geometries'
29
+ const allowedShapeProperties = [
30
+ "type",
31
+ "coordinates",
32
+ "radius",
33
+ "orientation",
34
+ "geometries",
36
35
  ],
37
36
  allowedOrientations = [
38
- 'right',
39
- 'ccw',
40
- 'counterclockwise',
41
- 'left',
42
- 'cw',
43
- 'clockwise'
44
- ],
45
- multiTypes = [
46
- 'multipoint',
47
- 'multilinestring',
48
- 'multipolygon'
37
+ "right",
38
+ "ccw",
39
+ "counterclockwise",
40
+ "left",
41
+ "cw",
42
+ "clockwise",
49
43
  ],
44
+ multiTypes = ["multipoint", "multilinestring", "multipolygon"],
50
45
  allowedShapeTypes = [
51
- 'point',
52
- 'linestring',
53
- 'polygon',
54
- 'multipoint',
55
- 'multilinestring',
56
- 'multipolygon',
57
- 'geometrycollection',
58
- 'envelope',
59
- 'circle'
46
+ "point",
47
+ "linestring",
48
+ "polygon",
49
+ "multipoint",
50
+ "multilinestring",
51
+ "multipolygon",
52
+ "geometrycollection",
53
+ "envelope",
54
+ "circle",
60
55
  ];
61
56
 
62
57
  /**
63
58
  * @class GeoShapeType
64
59
  */
65
60
  class GeoShapeType extends BaseType {
66
- constructor () {
61
+ constructor() {
67
62
  super();
68
- this.typeName = 'geo_shape';
63
+ this.typeName = "geo_shape";
69
64
  this.allowChildren = false;
70
- this.allowedTypeOptions = ['shapeTypes'];
65
+ this.allowedTypeOptions = ["shapeTypes"];
71
66
  }
72
67
 
73
68
  /**
@@ -76,7 +71,7 @@ class GeoShapeType extends BaseType {
76
71
  * @param {string[]} errorMessages
77
72
  * @returns {boolean}
78
73
  */
79
- validate (typeOptions, fieldValue, errorMessages) {
74
+ validate(typeOptions, fieldValue, errorMessages) {
80
75
  return this.recursiveShapeValidation(
81
76
  typeOptions.shapeTypes,
82
77
  fieldValue,
@@ -90,67 +85,67 @@ class GeoShapeType extends BaseType {
90
85
  * @param {string[]} errorMessages
91
86
  * @returns {boolean}
92
87
  */
93
- recursiveShapeValidation (allowedShapes, shape, errorMessages) {
94
- if (! this.checkStructure(allowedShapes, shape, errorMessages)) {
88
+ recursiveShapeValidation(allowedShapes, shape, errorMessages) {
89
+ if (!this.checkStructure(allowedShapes, shape, errorMessages)) {
95
90
  return false;
96
91
  }
97
92
 
98
93
  const isMulti = multiTypes.indexOf(shape.type) !== -1;
99
- let
100
- coordinateValidation,
94
+ let coordinateValidation,
101
95
  result = true;
102
96
 
103
97
  switch (shape.type) {
104
- case 'point':
105
- case 'multipoint':
98
+ case "point":
99
+ case "multipoint":
106
100
  coordinateValidation = isPoint;
107
101
  break;
108
- case 'linestring':
109
- case 'multilinestring':
102
+ case "linestring":
103
+ case "multilinestring":
110
104
  coordinateValidation = isLine;
111
105
  break;
112
- case 'polygon':
113
- case 'multipolygon':
106
+ case "polygon":
107
+ case "multipolygon":
114
108
  coordinateValidation = isPolygon;
115
- if (shape.orientation
116
- && ! allowedOrientations.includes(shape.orientation)
109
+ if (
110
+ shape.orientation &&
111
+ !allowedOrientations.includes(shape.orientation)
117
112
  ) {
118
- errorMessages.push('The orientation property has not a valid value.');
113
+ errorMessages.push("The orientation property has not a valid value.");
119
114
  result = false;
120
115
  }
121
116
  break;
122
- case 'geometrycollection':
117
+ case "geometrycollection":
123
118
  coordinateValidation = () => true;
124
119
 
125
120
  for (let i = 0; i < shape.geometries.length; i++) {
126
- if (! this.recursiveShapeValidation(
127
- allowedShapes,
128
- shape.geometries[i],
129
- errorMessages)
121
+ if (
122
+ !this.recursiveShapeValidation(
123
+ allowedShapes,
124
+ shape.geometries[i],
125
+ errorMessages
126
+ )
130
127
  ) {
131
128
  result = false;
132
129
  }
133
130
  }
134
131
  break;
135
- case 'envelope':
132
+ case "envelope":
136
133
  coordinateValidation = isEnvelope;
137
134
  break;
138
- case 'circle':
135
+ case "circle":
139
136
  coordinateValidation = isPoint;
140
- if (typeof shape.radius === 'string') {
137
+ if (typeof shape.radius === "string") {
141
138
  try {
142
- if (typeof Koncorde.convertDistance(shape.radius) !== 'number') {
143
- errorMessages.push('The radius property has not a valid format.');
139
+ if (typeof Koncorde.convertDistance(shape.radius) !== "number") {
140
+ errorMessages.push("The radius property has not a valid format.");
144
141
  result = false;
145
142
  }
146
- }
147
- catch (error) {
148
- errorMessages.push('The radius property has not a valid format.');
143
+ } catch (error) {
144
+ errorMessages.push("The radius property has not a valid format.");
149
145
  result = false;
150
146
  }
151
- }
152
- else if (typeof shape.radius !== 'number') {
153
- errorMessages.push('The radius property has not a valid format.');
147
+ } else if (typeof shape.radius !== "number") {
148
+ errorMessages.push("The radius property has not a valid format.");
154
149
  result = false;
155
150
  }
156
151
  break;
@@ -162,16 +157,17 @@ class GeoShapeType extends BaseType {
162
157
  }
163
158
 
164
159
  if (isMulti) {
165
- if (shape.coordinates.some(
166
- coordinate => ! coordinateValidation(coordinate)
167
- )) {
160
+ if (
161
+ shape.coordinates.some(
162
+ (coordinate) => !coordinateValidation(coordinate)
163
+ )
164
+ ) {
168
165
  errorMessages.push(
169
166
  `One of the shapes in the shape type "${shape.type}" has bad coordinates.`
170
167
  );
171
168
  result = false;
172
169
  }
173
- }
174
- else if (! coordinateValidation(shape.coordinates)) {
170
+ } else if (!coordinateValidation(shape.coordinates)) {
175
171
  errorMessages.push(`The shape type "${shape.type}" has bad coordinates.`);
176
172
  return false;
177
173
  }
@@ -185,63 +181,80 @@ class GeoShapeType extends BaseType {
185
181
  * @param {string[]} errorMessages
186
182
  * @returns {boolean}
187
183
  */
188
- checkStructure (allowedShapes, shape, errorMessages) {
184
+ checkStructure(allowedShapes, shape, errorMessages) {
189
185
  let result = true;
190
186
 
191
- if (! shape.type) {
192
- errorMessages.push('The shape object has no type defined.');
187
+ if (!shape.type) {
188
+ errorMessages.push("The shape object has no type defined.");
193
189
  return false;
194
190
  }
195
191
 
196
- if (! this.checkAllowedProperties(shape, allowedShapeProperties)) {
197
- errorMessages.push('The shape object has a not allowed property.');
192
+ if (!this.checkAllowedProperties(shape, allowedShapeProperties)) {
193
+ errorMessages.push("The shape object has a not allowed property.");
198
194
  result = false;
199
195
  }
200
196
 
201
197
  if (allowedShapes.indexOf(shape.type) === -1) {
202
- errorMessages.push('The provided shape type is not allowed.');
198
+ errorMessages.push("The provided shape type is not allowed.");
203
199
  result = false;
204
200
  }
205
201
 
206
- if (shape.type === 'geometrycollection' && shape.coordinates) {
207
- errorMessages.push('The coordinates property must not be provided for the "geometrycollection" shape type.');
202
+ if (shape.type === "geometrycollection" && shape.coordinates) {
203
+ errorMessages.push(
204
+ 'The coordinates property must not be provided for the "geometrycollection" shape type.'
205
+ );
208
206
  result = false;
209
207
  }
210
208
 
211
- if (shape.type !== 'geometrycollection'
212
- && (! shape.coordinates || ! Array.isArray(shape.coordinates)
213
- )) {
214
- errorMessages.push(`The coordinates property must be provided for the "${shape.type}" shape type.`);
209
+ if (
210
+ shape.type !== "geometrycollection" &&
211
+ (!shape.coordinates || !Array.isArray(shape.coordinates))
212
+ ) {
213
+ errorMessages.push(
214
+ `The coordinates property must be provided for the "${shape.type}" shape type.`
215
+ );
215
216
  result = false;
216
217
  }
217
218
 
218
- if (shape.type === 'circle' && ! shape.radius) {
219
- errorMessages.push('The radius property is mandatory for the "circle" shape type.');
219
+ if (shape.type === "circle" && !shape.radius) {
220
+ errorMessages.push(
221
+ 'The radius property is mandatory for the "circle" shape type.'
222
+ );
220
223
  result = false;
221
224
  }
222
225
 
223
- if (shape.type !== 'circle' && shape.radius) {
224
- errorMessages.push(`The radius property must not be provided for the "${shape.type}" shape type.`);
226
+ if (shape.type !== "circle" && shape.radius) {
227
+ errorMessages.push(
228
+ `The radius property must not be provided for the "${shape.type}" shape type.`
229
+ );
225
230
  result = false;
226
231
  }
227
232
 
228
- if (shape.type !== 'polygon'
229
- && shape.type !== 'multipolygon'
230
- && shape.orientation
233
+ if (
234
+ shape.type !== "polygon" &&
235
+ shape.type !== "multipolygon" &&
236
+ shape.orientation
231
237
  ) {
232
- errorMessages.push(`The orientation property must not be provided for the "${shape.type}" shape type.`);
238
+ errorMessages.push(
239
+ `The orientation property must not be provided for the "${shape.type}" shape type.`
240
+ );
233
241
  result = false;
234
242
  }
235
243
 
236
- if (shape.type !== 'geometrycollection' && shape.geometries) {
237
- errorMessages.push(`The geometries property must not be provided for the "${shape.type}" shape type.`);
244
+ if (shape.type !== "geometrycollection" && shape.geometries) {
245
+ errorMessages.push(
246
+ `The geometries property must not be provided for the "${shape.type}" shape type.`
247
+ );
238
248
  result = false;
239
249
  }
240
250
 
241
- if (shape.type === 'geometrycollection'
242
- && (! shape.geometries || ! Array.isArray(shape.geometries)
243
- )) {
244
- errorMessages.push('The geometries property must be provided for the "geometrycollection" shape type.');
251
+ if (
252
+ shape.type === "geometrycollection" &&
253
+ (!shape.geometries || !Array.isArray(shape.geometries))
254
+ ) {
255
+ errorMessages.push(
256
+ 'The geometries property must be provided for the "geometrycollection" shape type.'
257
+ );
245
258
  result = false;
246
259
  }
247
260
 
@@ -253,22 +266,29 @@ class GeoShapeType extends BaseType {
253
266
  * @returns {TypeOptions}
254
267
  * @throws {PreconditionError}
255
268
  */
256
- validateFieldSpecification (typeOptions) {
257
- if (Object.prototype.hasOwnProperty.call(typeOptions, 'shapeTypes')) {
258
- if (! Array.isArray(typeOptions.shapeTypes)
259
- || typeOptions.shapeTypes.length === 0
269
+ validateFieldSpecification(typeOptions) {
270
+ if (Object.prototype.hasOwnProperty.call(typeOptions, "shapeTypes")) {
271
+ if (
272
+ !Array.isArray(typeOptions.shapeTypes) ||
273
+ typeOptions.shapeTypes.length === 0
260
274
  ) {
261
- throw kerror.get('validation', 'assert', 'invalid_type', 'shapeTypes', 'string[]');
275
+ throw kerror.get(
276
+ "validation",
277
+ "assert",
278
+ "invalid_type",
279
+ "shapeTypes",
280
+ "string[]"
281
+ );
262
282
  }
263
283
 
264
284
  const invalid = typeOptions.shapeTypes.filter(
265
- shape => ! allowedShapeTypes.includes(shape));
285
+ (shape) => !allowedShapeTypes.includes(shape)
286
+ );
266
287
 
267
288
  if (invalid.length > 0) {
268
- throw kerror.get('validation', 'types', 'invalid_geoshape', invalid);
289
+ throw kerror.get("validation", "types", "invalid_geoshape", invalid);
269
290
  }
270
- }
271
- else {
291
+ } else {
272
292
  typeOptions.shapeTypes = allowedShapeTypes;
273
293
  }
274
294
 
@@ -280,16 +300,17 @@ class GeoShapeType extends BaseType {
280
300
  * @param {GeoShapePointCoordinates} point
281
301
  * @returns {boolean}
282
302
  */
283
- function isPoint (point) {
284
- if (! Array.isArray(point) || point.length !== 2) {
303
+ function isPoint(point) {
304
+ if (!Array.isArray(point) || point.length !== 2) {
285
305
  return false;
286
306
  }
287
307
 
288
- return ! (
289
- point[0] < -180
290
- || point[0] > 180
291
- || point[1] < -90
292
- || point[1] > 90);
308
+ return !(
309
+ point[0] < -180 ||
310
+ point[0] > 180 ||
311
+ point[1] < -90 ||
312
+ point[1] > 90
313
+ );
293
314
  }
294
315
 
295
316
  /**
@@ -297,7 +318,7 @@ function isPoint (point) {
297
318
  * @param {GeoShapePointCoordinates} pointB
298
319
  * @returns {boolean}
299
320
  */
300
- function isPointEqual (pointA, pointB) {
321
+ function isPointEqual(pointA, pointB) {
301
322
  return pointA[0] === pointB[0] && pointA[1] === pointB[1];
302
323
  }
303
324
 
@@ -305,39 +326,41 @@ function isPointEqual (pointA, pointB) {
305
326
  * @param {GeoShapeLineCoordinates} line
306
327
  * @returns {boolean}
307
328
  */
308
- function isLine (line) {
309
- if (! Array.isArray(line) || line.length < 2) {
329
+ function isLine(line) {
330
+ if (!Array.isArray(line) || line.length < 2) {
310
331
  return false;
311
332
  }
312
333
 
313
- return line.every(point => isPoint(point));
334
+ return line.every((point) => isPoint(point));
314
335
  }
315
336
 
316
337
  /**
317
338
  * @param {GeoShapePolygonPart} polygonPart
318
339
  * @returns {boolean}
319
340
  */
320
- function isPolygonPart (polygonPart) {
321
- return Array.isArray(polygonPart)
322
- && polygonPart.length >= 4
323
- && isLine(polygonPart)
324
- && isPointEqual(polygonPart[0], polygonPart[polygonPart.length - 1]);
341
+ function isPolygonPart(polygonPart) {
342
+ return (
343
+ Array.isArray(polygonPart) &&
344
+ polygonPart.length >= 4 &&
345
+ isLine(polygonPart) &&
346
+ isPointEqual(polygonPart[0], polygonPart[polygonPart.length - 1])
347
+ );
325
348
  }
326
349
 
327
350
  /**
328
351
  * @param {GeoShapePolygon} polygon
329
352
  * @returns {boolean}
330
353
  */
331
- function isPolygon (polygon) {
332
- if (! Array.isArray(polygon)) {
354
+ function isPolygon(polygon) {
355
+ if (!Array.isArray(polygon)) {
333
356
  return false;
334
357
  }
335
358
 
336
- return polygon.every(polygonPart => isPolygonPart(polygonPart));
359
+ return polygon.every((polygonPart) => isPolygonPart(polygonPart));
337
360
  }
338
361
 
339
- function isEnvelope (envelope) {
340
- if (! Array.isArray(envelope) || envelope.length !== 2) {
362
+ function isEnvelope(envelope) {
363
+ if (!Array.isArray(envelope) || envelope.length !== 2) {
341
364
  return false;
342
365
  }
343
366