vsrepo 2.5.0 → 2.7.0

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 (64) hide show
  1. package/CHANGELOG.md +611 -531
  2. package/LICENSE +20 -20
  3. package/README.md +221 -1243
  4. package/README.pt-BR.md +221 -1246
  5. package/dist/VSRepoAdapter.d.ts +12 -0
  6. package/dist/VSRepoAdapter.js.map +1 -1
  7. package/dist/VSRepository.d.ts +93 -5
  8. package/dist/VSRepository.js +116 -35
  9. package/dist/VSRepository.js.map +1 -1
  10. package/dist/decorators/dynamic-method.decorator.d.ts +1 -1
  11. package/dist/decorators/dynamic-method.decorator.js +2 -4
  12. package/dist/decorators/dynamic-method.decorator.js.map +1 -1
  13. package/dist/decorators/query-method.decorator.d.ts +3 -24
  14. package/dist/decorators/query-method.decorator.js +4 -27
  15. package/dist/decorators/query-method.decorator.js.map +1 -1
  16. package/dist/index.d.ts +5 -0
  17. package/dist/index.js +7 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/internal/enums/vsrepo-error-type.enum.d.ts +3 -1
  20. package/dist/internal/enums/vsrepo-error-type.enum.js +2 -0
  21. package/dist/internal/enums/vsrepo-error-type.enum.js.map +1 -1
  22. package/dist/internal/resolvers/dynamic-methods.resolver.d.ts +7 -1
  23. package/dist/internal/resolvers/dynamic-methods.resolver.js +191 -112
  24. package/dist/internal/resolvers/dynamic-methods.resolver.js.map +1 -1
  25. package/dist/internal/utils/vs-logger.util.js.map +1 -1
  26. package/dist/internal/utils/vs-placeholder-parser.util.d.ts +2 -0
  27. package/dist/internal/utils/vs-placeholder-parser.util.js +62 -0
  28. package/dist/internal/utils/vs-placeholder-parser.util.js.map +1 -0
  29. package/dist/internal/utils/vs-query-builder.util.d.ts +239 -0
  30. package/dist/internal/utils/vs-query-builder.util.js +401 -0
  31. package/dist/internal/utils/vs-query-builder.util.js.map +1 -0
  32. package/dist/internal/utils/vs-raw-query-builder.util.d.ts +238 -0
  33. package/dist/internal/utils/vs-raw-query-builder.util.js +433 -0
  34. package/dist/internal/utils/vs-raw-query-builder.util.js.map +1 -0
  35. package/dist/internal/utils/vs-sql.util.d.ts +100 -0
  36. package/dist/internal/utils/vs-sql.util.js +151 -0
  37. package/dist/internal/utils/vs-sql.util.js.map +1 -0
  38. package/dist/internal/utils/with-db.util.js.map +1 -1
  39. package/dist/internal/validators/decorators.validator.js +3 -7
  40. package/dist/internal/validators/decorators.validator.js.map +1 -1
  41. package/dist/internal/validators/schemas/pagination.schema.d.ts +2 -2
  42. package/dist/internal/validators/schemas/pagination.schema.js +2 -2
  43. package/dist/internal/validators/schemas/pagination.schema.js.map +1 -1
  44. package/dist/internal/validators/schemas/relations.schema.d.ts +4 -0
  45. package/dist/internal/validators/schemas/relations.schema.js +39 -0
  46. package/dist/internal/validators/schemas/relations.schema.js.map +1 -0
  47. package/dist/internal/validators/schemas/see-mode.schema.d.ts +3 -0
  48. package/dist/internal/validators/schemas/see-mode.schema.js +38 -0
  49. package/dist/internal/validators/schemas/see-mode.schema.js.map +1 -0
  50. package/dist/internal/validators/schemas/select.schema.d.ts +4 -0
  51. package/dist/internal/validators/schemas/select.schema.js +39 -0
  52. package/dist/internal/validators/schemas/select.schema.js.map +1 -0
  53. package/dist/internal/validators/vsrepo.validator.js +7 -5
  54. package/dist/internal/validators/vsrepo.validator.js.map +1 -1
  55. package/dist/types/dynamic-methods/dynamic-method-info.type.d.ts +1 -0
  56. package/dist/types/utils/query-args.type.d.ts +1 -4
  57. package/dist/types/vsrepo/vs-raw-query-builder-cte-query.type.d.ts +8 -0
  58. package/dist/types/vsrepo/vs-raw-query-builder-cte-query.type.js +3 -0
  59. package/dist/types/vsrepo/vs-raw-query-builder-cte-query.type.js.map +1 -0
  60. package/dist/types/vsrepo/vs-raw-query-builder-target.type.d.ts +7 -0
  61. package/dist/types/vsrepo/vs-raw-query-builder-target.type.js +3 -0
  62. package/dist/types/vsrepo/vs-raw-query-builder-target.type.js.map +1 -0
  63. package/dist/types/vsrepo/vsrepo-options.type.d.ts +27 -0
  64. package/package.json +88 -80
@@ -13,25 +13,75 @@ const deepmerge_1 = __importDefault(require("deepmerge"));
13
13
  const vsrepo_error_type_enum_1 = require("../enums/vsrepo-error-type.enum");
14
14
  const debug_arg_symbol_constant_1 = require("../constants/debug-arg-symbol.constant");
15
15
  const db_arg_util_1 = require("../utils/db-arg.util");
16
+ const vs_placeholder_parser_util_1 = require("../utils/vs-placeholder-parser.util");
16
17
  class DynamicMethodsResolver {
17
18
  logger;
18
19
  adapter;
19
20
  mergeWheresResolver;
20
21
  validator;
21
22
  defaultOrdering;
22
- constructor(logger, adapter, mergeWheresResolver, validator, defaultOrdering) {
23
+ vsPlaceholders;
24
+ constructor(logger, adapter, mergeWheresResolver, validator, defaultOrdering, vsPlaceholders = false) {
23
25
  this.logger = logger;
24
26
  this.adapter = adapter;
25
27
  this.mergeWheresResolver = mergeWheresResolver;
26
28
  this.validator = validator;
27
29
  this.defaultOrdering = defaultOrdering;
30
+ this.vsPlaceholders = vsPlaceholders;
28
31
  }
29
- validateIndexedArg(args, positionIndex, validate, parseDebugToString = true) {
32
+ static keywordTemplate = (keyword, allowAtTheEnd = false) => new RegExp(`${keyword}(?=[\\p{Lu}]|[^\\p{ASCII}]${allowAtTheEnd ? "|$" : ""})`, "u");
33
+ static fieldModifiers = {
34
+ IsNull: this.keywordTemplate("IsNull", true),
35
+ IsNotNull: this.keywordTemplate("IsNotNull", true),
36
+ IsTrue: this.keywordTemplate("IsTrue", true),
37
+ IsFalse: this.keywordTemplate("IsFalse", true),
38
+ IgnoreCase: this.keywordTemplate("IgnoreCase", true),
39
+ Optional: this.keywordTemplate("Optional", true),
40
+ NotBetween: this.keywordTemplate("NotBetween", true),
41
+ Between: this.keywordTemplate("Between", true),
42
+ NotStartsWith: this.keywordTemplate("NotStartsWith", true),
43
+ StartsWith: this.keywordTemplate("StartsWith", true),
44
+ NotEndsWith: this.keywordTemplate("NotEndsWith", true),
45
+ EndsWith: this.keywordTemplate("EndsWith", true),
46
+ NotContains: this.keywordTemplate("NotContains", true),
47
+ Contains: this.keywordTemplate("Contains", true),
48
+ LessThanEqual: this.keywordTemplate("LessThanEqual", true),
49
+ LessThan: this.keywordTemplate("LessThan", true),
50
+ GreaterThanEqual: this.keywordTemplate("GreaterThanEqual", true),
51
+ GreaterThan: this.keywordTemplate("GreaterThan", true),
52
+ NotIn: this.keywordTemplate("NotIn", true),
53
+ In: this.keywordTemplate("In", true),
54
+ Not: this.keywordTemplate("Not", true),
55
+ Equals: this.keywordTemplate("Equals", true),
56
+ NotEquals: this.keywordTemplate("NotEquals", true),
57
+ Without: this.keywordTemplate("Without", true),
58
+ With: this.keywordTemplate("With", true),
59
+ Some: this.keywordTemplate("Some", true),
60
+ Every: this.keywordTemplate("Every", true),
61
+ None: this.keywordTemplate("None", true),
62
+ };
63
+ static operators = {
64
+ And: this.keywordTemplate("And"),
65
+ Or: this.keywordTemplate("Or"),
66
+ AND: this.keywordTemplate("AND"),
67
+ };
68
+ static customizationModifiers = {
69
+ Distinct: this.keywordTemplate("Distinct"),
70
+ OrderBy: this.keywordTemplate("OrderBy"),
71
+ PaginatedAndOrdered: /PaginatedAndOrdered$/,
72
+ OrderedAndPaginated: /OrderedAndPaginated$/,
73
+ Paginated: /Paginated$/,
74
+ Ordered: /Ordered$/,
75
+ IgnoreConflicts: /IgnoreConflicts$/,
76
+ };
77
+ logAndThrowError(errorMessage) {
78
+ this.logger.logError(errorMessage);
79
+ throw new VSRepoError_1.VSRepoError(errorMessage, vsrepo_error_type_enum_1.VSRepoErrorType.RESOLVER);
80
+ }
81
+ validateIndexedArg(args, positionIndex, validate) {
30
82
  const value = args.at(positionIndex);
31
83
  if (value === debug_arg_symbol_constant_1.DEBUG_ARG_SYMBOL) {
32
- return (parseDebugToString
33
- ? `<args>[${positionIndex < 0 ? args.length + positionIndex : positionIndex}]`
34
- : value);
84
+ return `<args>[${positionIndex < 0 ? args.length + positionIndex : positionIndex}]`;
35
85
  }
36
86
  return validate(value);
37
87
  }
@@ -49,6 +99,7 @@ class DynamicMethodsResolver {
49
99
  ignoreDistinct: true,
50
100
  whereParams: [],
51
101
  otherParams: [],
102
+ originalDynamicMethodName: dynamicMethod,
52
103
  };
53
104
  if (dynamicMethod.startsWith("findOneBy")) {
54
105
  dynamicMethodInfo.keyToMapReplaced = dynamicMethod.replace("findOneBy", "");
@@ -61,14 +112,6 @@ class DynamicMethodsResolver {
61
112
  dynamicMethodInfo.ignoreDistinct = false;
62
113
  dynamicMethodInfo.method = "findMany";
63
114
  }
64
- // else if (dynamicMethod === "groupBy") {
65
- // dynamicMethodInfo.keyToMapReplaced = dynamicMethod.replace("groupBy", "");
66
- // dynamicMethodInfo.ignoreSelect = true;
67
- // dynamicMethodInfo.ignoreWhere = true;
68
- // dynamicMethodInfo.method = "groupBy";
69
- // dynamicMethodInfo.otherParams.push("prismaArgs"); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
70
- // dynamicMethodInfo.argsCount++;
71
- // }
72
115
  else if (dynamicMethod.startsWith("findOneOrThrowBy")) {
73
116
  dynamicMethodInfo.keyToMapReplaced = dynamicMethod.replace("findOneOrThrowBy", "");
74
117
  dynamicMethodInfo.ignoreOrderByAndPagination = false;
@@ -302,59 +345,65 @@ class DynamicMethodsResolver {
302
345
  dynamicMethodInfo.method = "findOne";
303
346
  }
304
347
  else {
305
- const errorMessage = `Unknown dynamic method: ${dynamicMethod}.`;
306
- this.logger.logError(errorMessage);
307
- throw new VSRepoError_1.VSRepoError(errorMessage, vsrepo_error_type_enum_1.VSRepoErrorType.RESOLVER);
348
+ this.logAndThrowError(`Unknown dynamic method: ${dynamicMethod}.`);
308
349
  }
309
350
  return dynamicMethodInfo;
310
351
  }
311
352
  resolveDynamicMethodCustomization(dynamicMethodInfo, methodData) {
312
353
  const dynamicMethodCustomization = {};
313
354
  if (!dynamicMethodInfo.ignoreIgnoreConflicts) {
314
- if (dynamicMethodInfo.keyToMapReplaced.endsWith("IgnoreConflicts")) {
315
- dynamicMethodInfo.keyToMapReplaced = dynamicMethodInfo.keyToMapReplaced.replace("IgnoreConflicts", "");
355
+ if (DynamicMethodsResolver.customizationModifiers.IgnoreConflicts.test(dynamicMethodInfo.keyToMapReplaced)) {
356
+ dynamicMethodInfo.keyToMapReplaced = dynamicMethodInfo.keyToMapReplaced.replace(DynamicMethodsResolver.customizationModifiers.IgnoreConflicts, "");
316
357
  dynamicMethodCustomization.ignoreConflicts = true;
317
358
  }
318
359
  }
360
+ else if (DynamicMethodsResolver.customizationModifiers.IgnoreConflicts.test(dynamicMethodInfo.keyToMapReplaced)) {
361
+ this.logAndThrowError(`This dynamic method prefix doesn't support the "IgnoreConflicts" modifier: ${dynamicMethodInfo.originalDynamicMethodName}.`);
362
+ }
319
363
  if (!dynamicMethodInfo.ignoreOrderByAndPagination) {
320
- if (dynamicMethodInfo.keyToMapReplaced.endsWith("PaginatedAndOrdered")) {
364
+ if (DynamicMethodsResolver.customizationModifiers.PaginatedAndOrdered.test(dynamicMethodInfo.keyToMapReplaced)) {
321
365
  dynamicMethodCustomization.orderPosition = -2;
322
366
  dynamicMethodCustomization.paginationPosition = -3;
323
367
  dynamicMethodInfo.otherParams.push("pagination");
324
368
  dynamicMethodInfo.otherParams.push("order");
325
- dynamicMethodInfo.keyToMapReplaced = dynamicMethodInfo.keyToMapReplaced.replace("PaginatedAndOrdered", "");
369
+ dynamicMethodInfo.keyToMapReplaced = dynamicMethodInfo.keyToMapReplaced.replace(DynamicMethodsResolver.customizationModifiers.PaginatedAndOrdered, "");
326
370
  dynamicMethodInfo.argsCount += 2;
327
371
  }
328
- else if (dynamicMethodInfo.keyToMapReplaced.endsWith("OrderedAndPaginated")) {
372
+ else if (DynamicMethodsResolver.customizationModifiers.OrderedAndPaginated.test(dynamicMethodInfo.keyToMapReplaced)) {
329
373
  dynamicMethodCustomization.orderPosition = -3;
330
374
  dynamicMethodCustomization.paginationPosition = -2;
331
375
  dynamicMethodInfo.otherParams.push("order");
332
376
  dynamicMethodInfo.otherParams.push("pagination");
333
- dynamicMethodInfo.keyToMapReplaced = dynamicMethodInfo.keyToMapReplaced.replace("OrderedAndPaginated", "");
377
+ dynamicMethodInfo.keyToMapReplaced = dynamicMethodInfo.keyToMapReplaced.replace(DynamicMethodsResolver.customizationModifiers.OrderedAndPaginated, "");
334
378
  dynamicMethodInfo.argsCount += 2;
335
379
  }
336
- else if (dynamicMethodInfo.keyToMapReplaced.endsWith("Paginated")) {
380
+ else if (DynamicMethodsResolver.customizationModifiers.Paginated.test(dynamicMethodInfo.keyToMapReplaced)) {
337
381
  dynamicMethodCustomization.paginationPosition = -2;
338
382
  dynamicMethodInfo.otherParams.push("pagination");
339
- dynamicMethodInfo.keyToMapReplaced = dynamicMethodInfo.keyToMapReplaced.replace("Paginated", "");
383
+ dynamicMethodInfo.keyToMapReplaced = dynamicMethodInfo.keyToMapReplaced.replace(DynamicMethodsResolver.customizationModifiers.Paginated, "");
340
384
  dynamicMethodInfo.argsCount++;
341
385
  }
342
- else if (dynamicMethodInfo.keyToMapReplaced.endsWith("Ordered")) {
386
+ else if (DynamicMethodsResolver.customizationModifiers.Ordered.test(dynamicMethodInfo.keyToMapReplaced)) {
343
387
  dynamicMethodCustomization.orderPosition = -2;
344
388
  dynamicMethodInfo.otherParams.push("order");
345
- dynamicMethodInfo.keyToMapReplaced = dynamicMethodInfo.keyToMapReplaced.replace("Ordered", "");
389
+ dynamicMethodInfo.keyToMapReplaced = dynamicMethodInfo.keyToMapReplaced.replace(DynamicMethodsResolver.customizationModifiers.Ordered, "");
346
390
  dynamicMethodInfo.argsCount++;
347
391
  }
348
- const keySplitedOrderBy = dynamicMethodInfo.keyToMapReplaced.split("OrderBy");
392
+ const keySplitedOrderBy = dynamicMethodInfo.keyToMapReplaced.split(DynamicMethodsResolver.customizationModifiers.OrderBy);
349
393
  if (keySplitedOrderBy[1]) {
350
- const orderByFields = keySplitedOrderBy[1].split("And").map(uncapitalize_util_1.uncapitalize);
394
+ if (DynamicMethodsResolver.customizationModifiers.Distinct.test(keySplitedOrderBy[1])) {
395
+ this.logAndThrowError(`The "Distinct" modifier cannot appear after the "OrderBy" modifier: ${dynamicMethodInfo.originalDynamicMethodName}.`);
396
+ }
397
+ const orderByFields = keySplitedOrderBy[1]
398
+ .split(DynamicMethodsResolver.operators.And)
399
+ .map(uncapitalize_util_1.uncapitalize);
351
400
  dynamicMethodCustomization.injectOrdering = orderByFields.map(field => {
352
401
  if (field.endsWith("Asc")) {
353
- field = field.replace("Asc", "");
402
+ field = field.replace(/Asc$/, "");
354
403
  return { [field]: "ASC" };
355
404
  }
356
405
  else if (field.endsWith("Desc")) {
357
- field = field.replace("Desc", "");
406
+ field = field.replace(/Desc$/, "");
358
407
  return { [field]: "DESC" };
359
408
  }
360
409
  return { [field]: "ASC" };
@@ -363,119 +412,135 @@ class DynamicMethodsResolver {
363
412
  dynamicMethodInfo.keyToMapReplaced = keySplitedOrderBy[0];
364
413
  dynamicMethodCustomization.injectOrdering ??= methodData.injectOrdering;
365
414
  }
415
+ else if (DynamicMethodsResolver.customizationModifiers.Paginated.test(dynamicMethodInfo.keyToMapReplaced) ||
416
+ DynamicMethodsResolver.customizationModifiers.Ordered.test(dynamicMethodInfo.keyToMapReplaced) ||
417
+ DynamicMethodsResolver.customizationModifiers.OrderBy.test(dynamicMethodInfo.keyToMapReplaced)) {
418
+ this.logAndThrowError(`This dynamic method prefix doesn't support the ordering or pagination modifiers: ${dynamicMethodInfo.originalDynamicMethodName}.`);
419
+ }
366
420
  if (!dynamicMethodInfo.ignoreDistinct) {
367
- const keySplitedDistinct = dynamicMethodInfo.keyToMapReplaced.split("Distinct");
421
+ const keySplitedDistinct = dynamicMethodInfo.keyToMapReplaced.split(DynamicMethodsResolver.customizationModifiers.Distinct);
368
422
  if (keySplitedDistinct[1]) {
369
423
  dynamicMethodCustomization.distinctKeys = keySplitedDistinct[1]
370
- .split("And")
424
+ .split(DynamicMethodsResolver.operators.And)
371
425
  .map(uncapitalize_util_1.uncapitalize);
372
426
  }
373
427
  dynamicMethodInfo.keyToMapReplaced = keySplitedDistinct[0];
374
428
  }
429
+ else if (DynamicMethodsResolver.customizationModifiers.Distinct.test(dynamicMethodInfo.keyToMapReplaced)) {
430
+ this.logAndThrowError(`This dynamic method prefix doesn't support the "Distinct" modifier: ${dynamicMethodInfo.originalDynamicMethodName}.`);
431
+ }
375
432
  return dynamicMethodCustomization;
376
433
  }
377
434
  resolveUglyWhere(keySplitedAnd) {
378
435
  const uglyWhere = { name: "", pushProperty: "$$$" };
379
436
  let nullMode = undefined;
380
- if (keySplitedAnd.includes("IsNull")) {
437
+ if (DynamicMethodsResolver.fieldModifiers.IsNull.test(keySplitedAnd)) {
381
438
  uglyWhere.pushProperty = "$$$";
382
439
  uglyWhere.autoInjectVal = null;
383
440
  nullMode = "is";
384
- keySplitedAnd = keySplitedAnd.replace("IsNull", "");
441
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.IsNull, "");
385
442
  }
386
- else if (keySplitedAnd.includes("IsNotNull")) {
443
+ else if (DynamicMethodsResolver.fieldModifiers.IsNotNull.test(keySplitedAnd)) {
387
444
  uglyWhere.pushProperty = "not";
388
445
  uglyWhere.autoInjectVal = null;
389
446
  nullMode = "not";
390
- keySplitedAnd = keySplitedAnd.replace("IsNotNull", "");
447
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.IsNotNull, "");
391
448
  }
392
- else if (keySplitedAnd.includes("IsTrue")) {
449
+ else if (DynamicMethodsResolver.fieldModifiers.IsTrue.test(keySplitedAnd)) {
393
450
  uglyWhere.pushProperty = "$$$";
394
451
  uglyWhere.autoInjectVal = true;
395
- keySplitedAnd = keySplitedAnd.replace("IsTrue", "");
452
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.IsTrue, "");
396
453
  }
397
- else if (keySplitedAnd.includes("IsFalse")) {
454
+ else if (DynamicMethodsResolver.fieldModifiers.IsFalse.test(keySplitedAnd)) {
398
455
  uglyWhere.pushProperty = "$$$";
399
456
  uglyWhere.autoInjectVal = false;
400
- keySplitedAnd = keySplitedAnd.replace("IsFalse", "");
457
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.IsFalse, "");
401
458
  }
402
459
  else {
403
- if (keySplitedAnd.includes("IgnoreCase")) {
460
+ if (DynamicMethodsResolver.fieldModifiers.IgnoreCase.test(keySplitedAnd)) {
404
461
  uglyWhere.properties = {};
405
462
  uglyWhere.properties.ignoreCase = true;
406
- keySplitedAnd = keySplitedAnd.replace("IgnoreCase", "");
463
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.IgnoreCase, "");
407
464
  }
408
- if (keySplitedAnd.includes("Optional")) {
409
- keySplitedAnd = keySplitedAnd.replace("Optional", "");
465
+ if (DynamicMethodsResolver.fieldModifiers.Optional.test(keySplitedAnd)) {
466
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.Optional, "");
410
467
  }
411
- if (keySplitedAnd.includes("NotBetween")) {
468
+ if (DynamicMethodsResolver.fieldModifiers.NotBetween.test(keySplitedAnd)) {
412
469
  uglyWhere.pushProperty = "not";
413
470
  uglyWhere.betweenMode = true;
414
- keySplitedAnd = keySplitedAnd.replace("NotBetween", "");
471
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.NotBetween, "");
415
472
  }
416
- else if (keySplitedAnd.includes("Between")) {
473
+ else if (DynamicMethodsResolver.fieldModifiers.Between.test(keySplitedAnd)) {
417
474
  uglyWhere.pushProperty = "$$$";
418
475
  uglyWhere.betweenMode = true;
419
- keySplitedAnd = keySplitedAnd.replace("Between", "");
476
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.Between, "");
420
477
  }
421
- else if (keySplitedAnd.includes("NotStartsWith")) {
478
+ else if (DynamicMethodsResolver.fieldModifiers.NotStartsWith.test(keySplitedAnd)) {
422
479
  uglyWhere.pushProperty = "not.startsWith";
423
- keySplitedAnd = keySplitedAnd.replace("NotStartsWith", "");
480
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.NotStartsWith, "");
424
481
  }
425
- else if (keySplitedAnd.includes("StartsWith")) {
482
+ else if (DynamicMethodsResolver.fieldModifiers.StartsWith.test(keySplitedAnd)) {
426
483
  uglyWhere.pushProperty = "startsWith";
427
- keySplitedAnd = keySplitedAnd.replace("StartsWith", "");
484
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.StartsWith, "");
428
485
  }
429
- else if (keySplitedAnd.includes("NotEndsWith")) {
486
+ else if (DynamicMethodsResolver.fieldModifiers.NotEndsWith.test(keySplitedAnd)) {
430
487
  uglyWhere.pushProperty = "not.endsWith";
431
- keySplitedAnd = keySplitedAnd.replace("NotEndsWith", "");
488
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.NotEndsWith, "");
432
489
  }
433
- else if (keySplitedAnd.includes("EndsWith")) {
490
+ else if (DynamicMethodsResolver.fieldModifiers.EndsWith.test(keySplitedAnd)) {
434
491
  uglyWhere.pushProperty = "endsWith";
435
- keySplitedAnd = keySplitedAnd.replace("EndsWith", "");
492
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.EndsWith, "");
436
493
  }
437
- else if (keySplitedAnd.includes("NotContains")) {
494
+ else if (DynamicMethodsResolver.fieldModifiers.NotContains.test(keySplitedAnd)) {
438
495
  uglyWhere.pushProperty = "not.contains";
439
- keySplitedAnd = keySplitedAnd.replace("NotContains", "");
496
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.NotContains, "");
440
497
  }
441
- else if (keySplitedAnd.includes("Contains")) {
498
+ else if (DynamicMethodsResolver.fieldModifiers.Contains.test(keySplitedAnd)) {
442
499
  uglyWhere.pushProperty = "contains";
443
- keySplitedAnd = keySplitedAnd.replace("Contains", "");
500
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.Contains, "");
501
+ }
502
+ else if (DynamicMethodsResolver.fieldModifiers.NotEquals.test(keySplitedAnd)) {
503
+ uglyWhere.pushProperty = "not";
504
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.NotEquals, "");
444
505
  }
445
- else if (keySplitedAnd.includes("LessThanEqual")) {
506
+ else if (DynamicMethodsResolver.fieldModifiers.Equals.test(keySplitedAnd)) {
507
+ uglyWhere.pushProperty = "$$$";
508
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.Equals, "");
509
+ }
510
+ else if (DynamicMethodsResolver.fieldModifiers.LessThanEqual.test(keySplitedAnd)) {
446
511
  uglyWhere.pushProperty = "lte";
447
- keySplitedAnd = keySplitedAnd.replace("LessThanEqual", "");
512
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.LessThanEqual, "");
448
513
  }
449
- else if (keySplitedAnd.includes("LessThan")) {
514
+ else if (DynamicMethodsResolver.fieldModifiers.LessThan.test(keySplitedAnd)) {
450
515
  uglyWhere.pushProperty = "lt";
451
- keySplitedAnd = keySplitedAnd.replace("LessThan", "");
516
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.LessThan, "");
452
517
  }
453
- else if (keySplitedAnd.includes("GreaterThanEqual")) {
518
+ else if (DynamicMethodsResolver.fieldModifiers.GreaterThanEqual.test(keySplitedAnd)) {
454
519
  uglyWhere.pushProperty = "gte";
455
- keySplitedAnd = keySplitedAnd.replace("GreaterThanEqual", "");
520
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.GreaterThanEqual, "");
456
521
  }
457
- else if (keySplitedAnd.includes("GreaterThan")) {
522
+ else if (DynamicMethodsResolver.fieldModifiers.GreaterThan.test(keySplitedAnd)) {
458
523
  uglyWhere.pushProperty = "gt";
459
- keySplitedAnd = keySplitedAnd.replace("GreaterThan", "");
524
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.GreaterThan, "");
460
525
  }
461
- else if (keySplitedAnd.includes("NotIn")) {
526
+ else if (DynamicMethodsResolver.fieldModifiers.NotIn.test(keySplitedAnd)) {
462
527
  uglyWhere.pushProperty = "notIn";
463
- keySplitedAnd = keySplitedAnd.replace("NotIn", "");
528
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.NotIn, "");
464
529
  }
465
- else if (keySplitedAnd.includes("In")) {
530
+ else if (DynamicMethodsResolver.fieldModifiers.In.test(keySplitedAnd)) {
466
531
  uglyWhere.pushProperty = "in";
467
- keySplitedAnd = keySplitedAnd.replace("In", "");
532
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.In, "");
468
533
  }
469
- else if (keySplitedAnd.includes("Not")) {
534
+ else if (DynamicMethodsResolver.fieldModifiers.Not.test(keySplitedAnd)) {
470
535
  uglyWhere.pushProperty = "not";
471
- keySplitedAnd = keySplitedAnd.replace("Not", "");
536
+ keySplitedAnd = keySplitedAnd.replace(DynamicMethodsResolver.fieldModifiers.Not, "");
472
537
  }
473
538
  else {
474
539
  uglyWhere.pushProperty = "$$$";
475
540
  }
476
541
  }
477
- if (keySplitedAnd.includes("Without")) {
478
- const keySplitedConector = keySplitedAnd.split("Without");
542
+ if (DynamicMethodsResolver.fieldModifiers.Without.test(keySplitedAnd)) {
543
+ const keySplitedConector = keySplitedAnd.split(DynamicMethodsResolver.fieldModifiers.Without);
479
544
  const specificField = keySplitedConector[1];
480
545
  if (!specificField) {
481
546
  if (nullMode) {
@@ -487,12 +552,12 @@ class DynamicMethodsResolver {
487
552
  }
488
553
  }
489
554
  else {
490
- uglyWhere.pushProperty = `_without.${(0, uncapitalize_util_1.uncapitalize)(specificField)}${uglyWhere.pushProperty === "$$$" ? "" : `.${uglyWhere.pushProperty}`}`;
555
+ uglyWhere.pushProperty = `_without.${(0, uncapitalize_util_1.uncapitalize)(specificField)}${uglyWhere.pushProperty === "$$$" ? (uglyWhere.properties ? ".equals" : "") : `.${uglyWhere.pushProperty}`}`;
491
556
  }
492
557
  keySplitedAnd = keySplitedConector[0];
493
558
  }
494
- else if (keySplitedAnd.includes("With")) {
495
- const keySplitedConector = keySplitedAnd.split("With");
559
+ else if (DynamicMethodsResolver.fieldModifiers.With.test(keySplitedAnd)) {
560
+ const keySplitedConector = keySplitedAnd.split(DynamicMethodsResolver.fieldModifiers.With);
496
561
  const specificField = keySplitedConector[1];
497
562
  if (!specificField) {
498
563
  if (nullMode) {
@@ -504,43 +569,43 @@ class DynamicMethodsResolver {
504
569
  }
505
570
  }
506
571
  else {
507
- uglyWhere.pushProperty = `_with.${(0, uncapitalize_util_1.uncapitalize)(specificField)}${uglyWhere.pushProperty === "$$$" ? "" : `.${uglyWhere.pushProperty}`}`;
572
+ uglyWhere.pushProperty = `_with.${(0, uncapitalize_util_1.uncapitalize)(specificField)}${uglyWhere.pushProperty === "$$$" ? (uglyWhere.properties ? ".equals" : "") : `.${uglyWhere.pushProperty}`}`;
508
573
  }
509
574
  keySplitedAnd = keySplitedConector[0];
510
575
  }
511
- else if (keySplitedAnd.includes("Some")) {
512
- const keySplitedConector = keySplitedAnd.split("Some");
576
+ else if (DynamicMethodsResolver.fieldModifiers.Some.test(keySplitedAnd)) {
577
+ const keySplitedConector = keySplitedAnd.split(DynamicMethodsResolver.fieldModifiers.Some);
513
578
  const specificField = keySplitedConector[1];
514
579
  if (!specificField) {
515
580
  uglyWhere.pushProperty = "_some";
516
581
  uglyWhere.autoInjectVal = {};
517
582
  }
518
583
  else {
519
- uglyWhere.pushProperty = `_some.${(0, uncapitalize_util_1.uncapitalize)(specificField)}${uglyWhere.pushProperty === "$$$" ? "" : `.${uglyWhere.pushProperty}`}`;
584
+ uglyWhere.pushProperty = `_some.${(0, uncapitalize_util_1.uncapitalize)(specificField)}${uglyWhere.pushProperty === "$$$" ? (uglyWhere.properties ? ".equals" : "") : `.${uglyWhere.pushProperty}`}`;
520
585
  }
521
586
  keySplitedAnd = keySplitedConector[0];
522
587
  }
523
- else if (keySplitedAnd.includes("Every")) {
524
- const keySplitedConector = keySplitedAnd.split("Every");
588
+ else if (DynamicMethodsResolver.fieldModifiers.Every.test(keySplitedAnd)) {
589
+ const keySplitedConector = keySplitedAnd.split(DynamicMethodsResolver.fieldModifiers.Every);
525
590
  const specificField = keySplitedConector[1];
526
591
  if (!specificField) {
527
592
  uglyWhere.pushProperty = "_every";
528
593
  uglyWhere.autoInjectVal = {};
529
594
  }
530
595
  else {
531
- uglyWhere.pushProperty = `_every.${(0, uncapitalize_util_1.uncapitalize)(specificField)}${uglyWhere.pushProperty === "$$$" ? "" : `.${uglyWhere.pushProperty}`}`;
596
+ uglyWhere.pushProperty = `_every.${(0, uncapitalize_util_1.uncapitalize)(specificField)}${uglyWhere.pushProperty === "$$$" ? (uglyWhere.properties ? ".equals" : "") : `.${uglyWhere.pushProperty}`}`;
532
597
  }
533
598
  keySplitedAnd = keySplitedConector[0];
534
599
  }
535
- else if (keySplitedAnd.includes("None")) {
536
- const keySplitedConector = keySplitedAnd.split("None");
600
+ else if (DynamicMethodsResolver.fieldModifiers.None.test(keySplitedAnd)) {
601
+ const keySplitedConector = keySplitedAnd.split(DynamicMethodsResolver.fieldModifiers.None);
537
602
  const specificField = keySplitedConector[1];
538
603
  if (!specificField) {
539
604
  uglyWhere.pushProperty = "_none";
540
605
  uglyWhere.autoInjectVal = {};
541
606
  }
542
607
  else {
543
- uglyWhere.pushProperty = `_none.${(0, uncapitalize_util_1.uncapitalize)(specificField)}${uglyWhere.pushProperty === "$$$" ? "" : `.${uglyWhere.pushProperty}`}`;
608
+ uglyWhere.pushProperty = `_none.${(0, uncapitalize_util_1.uncapitalize)(specificField)}${uglyWhere.pushProperty === "$$$" ? (uglyWhere.properties ? ".equals" : "") : `.${uglyWhere.pushProperty}`}`;
544
609
  }
545
610
  keySplitedAnd = keySplitedConector[0];
546
611
  }
@@ -554,20 +619,29 @@ class DynamicMethodsResolver {
554
619
  prettyWheres: [],
555
620
  };
556
621
  let ANDMode = false;
557
- let keysSplitedAND = dynamicMethodInfo.keyToMapReplaced.split("AND");
622
+ let keysSplitedAND = dynamicMethodInfo.keyToMapReplaced.split(DynamicMethodsResolver.operators.AND);
558
623
  if (keysSplitedAND.length > 1) {
559
624
  ANDMode = true;
560
625
  }
561
626
  keysSplitedAND.forEach((keySplitedAND, idx) => {
562
627
  let orMode = false;
563
- let keysSplitedOr = idx === 0 ? keySplitedAND.split("Or") : [keySplitedAND];
628
+ let keysSplitedOr;
629
+ if (idx === 0) {
630
+ keysSplitedOr = keySplitedAND.split(DynamicMethodsResolver.operators.Or);
631
+ }
632
+ else {
633
+ if (DynamicMethodsResolver.operators.Or.test(keySplitedAND)) {
634
+ this.logAndThrowError(`The logical operator "Or" cannot appear after an "AND" (all caps): ${dynamicMethodInfo.originalDynamicMethodName}.`);
635
+ }
636
+ keysSplitedOr = [keySplitedAND];
637
+ }
564
638
  if (keysSplitedOr.length > 1) {
565
639
  orMode = true;
566
640
  }
567
641
  for (let i = 0; i < keysSplitedOr.length; i++) {
568
642
  if (keysSplitedOr[i] === "")
569
643
  continue;
570
- const keysSplitedAnd = keysSplitedOr[i].split("And");
644
+ const keysSplitedAnd = keysSplitedOr[i].split(DynamicMethodsResolver.operators.And);
571
645
  for (const keySplitedAnd of keysSplitedAnd) {
572
646
  if (keySplitedAnd === "")
573
647
  continue;
@@ -643,10 +717,9 @@ class DynamicMethodsResolver {
643
717
  vsrepoArgs.options = { db: options.db ?? this.adapter.getDbClient() };
644
718
  if (!withoutWhere) {
645
719
  vsrepoArgs.where =
646
- // * Essa validação é so para o debug mode
647
- specificWhere === debug_arg_symbol_constant_1.DEBUG_ARG_SYMBOL
648
- ? // * 0 pois o whereIndex sempre vem no 0, se algum dia ele puder aparecer em outro lugar irá precisar corrigir isso
649
- "<args>[0]"
720
+ // * Validação necessária para o DEBUG MODE
721
+ typeof specificWhere === "string"
722
+ ? specificWhere
650
723
  : this.mergeWheresResolver.resolve(options.see, specificWhere);
651
724
  }
652
725
  if (!withoutSelect) {
@@ -718,9 +791,7 @@ class DynamicMethodsResolver {
718
791
  adjust++;
719
792
  continue;
720
793
  }
721
- const arg = args[j - adjust] === debug_arg_symbol_constant_1.DEBUG_ARG_SYMBOL
722
- ? `<args>[${j - adjust}]`
723
- : args[j - adjust];
794
+ const arg = args[j - adjust] === debug_arg_symbol_constant_1.DEBUG_ARG_SYMBOL ? `<args>[${j - adjust}]` : args[j - adjust];
724
795
  // ? Avaliar necessidade dessa validação; era usada por compatibilidade direta com o prisma
725
796
  if (currentWhereRslvd.betweenMode && arg !== undefined) {
726
797
  current[context[i]] = { between: arg };
@@ -782,7 +853,7 @@ class DynamicMethodsResolver {
782
853
  if (!dynamicMethodInfo.ignoreWhere) {
783
854
  dynamicMethodWhereOps = this.resolvePrettyWheres(dynamicMethodInfo);
784
855
  }
785
- instance.$vsrepocache.set(originalKey, (args, methodOptions) => {
856
+ instance._vsrepocache.set(originalKey, (args, methodOptions) => {
786
857
  const vsrepoResolveArgsData = {
787
858
  instance,
788
859
  options: methodOptions ?? {},
@@ -796,9 +867,7 @@ class DynamicMethodsResolver {
796
867
  pagination: dynamicMethodCustomization.paginationPosition !== undefined
797
868
  ? this.validateIndexedArg(args, dynamicMethodCustomization.paginationPosition, value => this.validator.validatePagination(value))
798
869
  : undefined,
799
- dataPayload: dynamicMethodInfo.dataIndex !== undefined
800
- ? args.at(dynamicMethodInfo.dataIndex)
801
- : undefined,
870
+ dataPayload: dynamicMethodInfo.dataIndex !== undefined ? args.at(dynamicMethodInfo.dataIndex) : undefined,
802
871
  createPayload: dynamicMethodInfo.createIndex !== undefined
803
872
  ? args.at(dynamicMethodInfo.createIndex)
804
873
  : undefined,
@@ -814,7 +883,7 @@ class DynamicMethodsResolver {
814
883
  else if (dynamicMethodInfo.onlyBaseWheres) {
815
884
  vsrepoResolveArgsData.specificWhere =
816
885
  dynamicMethodInfo.whereIndex !== undefined
817
- ? this.validateIndexedArg(args, dynamicMethodInfo.whereIndex, value => this.validator.validateWhere(value), false)
886
+ ? this.validateIndexedArg(args, dynamicMethodInfo.whereIndex, value => this.validator.validateWhere(value))
818
887
  : {};
819
888
  }
820
889
  return this.resolveVSRepoArgs(vsrepoResolveArgsData);
@@ -825,7 +894,7 @@ class DynamicMethodsResolver {
825
894
  for (let i = 0; i <= dynamicMethodInfo.argsCount; i++) {
826
895
  argsSimulation.push(debug_arg_symbol_constant_1.DEBUG_ARG_SYMBOL);
827
896
  }
828
- const vsrepoArgs = instance.$vsrepocache.get(originalKey)(argsSimulation);
897
+ const vsrepoArgs = instance._vsrepocache.get(originalKey)(argsSimulation);
829
898
  const { db: _, ...options } = vsrepoArgs.options ?? {};
830
899
  this.logger.logDebug(`Args preview for ${originalKey}:`, {
831
900
  ...vsrepoArgs,
@@ -833,7 +902,6 @@ class DynamicMethodsResolver {
833
902
  });
834
903
  }
835
904
  instance[originalKey] = async (...args) => {
836
- let db = this.adapter.getDbClient();
837
905
  let methodOptions;
838
906
  if (args.length < dynamicMethodInfo.argsCount) {
839
907
  const missingParams = dynamicMethodInfo.whereParams
@@ -846,12 +914,11 @@ class DynamicMethodsResolver {
846
914
  else if (args.length > dynamicMethodInfo.argsCount) {
847
915
  const optionsArg = args[args.length - 1];
848
916
  methodOptions = this.validator.validateMethodOptions(optionsArg);
849
- db = methodOptions.db ?? db;
850
917
  }
851
918
  else {
852
919
  args.push("1");
853
920
  }
854
- const vsrepoArgs = instance.$vsrepocache.get(originalKey)(args, methodOptions);
921
+ const vsrepoArgs = instance._vsrepocache.get(originalKey)(args, methodOptions);
855
922
  const start = this.logger.startPerformLog(`run ${String(originalKey)} (-> ${dynamicMethodInfo.method})`);
856
923
  try {
857
924
  // * Todos os métodos do adapter seguem essa precedencia de parametros
@@ -867,7 +934,6 @@ class DynamicMethodsResolver {
867
934
  return result;
868
935
  }
869
936
  catch (err) {
870
- // ? Deixar o catch para se quiser fazer algum tratamento antes de lançar o erro
871
937
  this.logger.endPerformLog(start);
872
938
  this.logger.logError(`Failed to run dynamic method '${String(originalKey)}' (-> ${dynamicMethodInfo.method})`, err);
873
939
  throw err;
@@ -883,7 +949,7 @@ class DynamicMethodsResolver {
883
949
  const originalKey = method.propertyKey;
884
950
  const modifyingQueryMethod = method.modifying ?? false;
885
951
  const valueQueryMethod = method.value;
886
- const singleResult = method.singleResult;
952
+ const singleResult = method.singleResult ?? false;
887
953
  const spreadArgsMode = method.spreadArgs;
888
954
  instance[originalKey] = async (...args) => {
889
955
  let db;
@@ -909,11 +975,24 @@ class DynamicMethodsResolver {
909
975
  queryArgs = queryArgValidated.args;
910
976
  }
911
977
  db ??= this.adapter.getDbClient();
978
+ let finalQuery = valueQueryMethod;
979
+ let finalArgs = queryArgs;
980
+ if (this.vsPlaceholders) {
981
+ const compiled = vs_placeholder_parser_util_1.VSPlaceholdersParser.parse(valueQueryMethod, queryArgs ?? []).compile(index => this.adapter.getPlaceholder(index));
982
+ finalQuery = compiled.text;
983
+ finalArgs = compiled.args;
984
+ }
985
+ this.logger.logDebug(`QueryMethod '${String(originalKey)}':`, {
986
+ query: finalQuery,
987
+ args: finalArgs ?? [],
988
+ modifying: modifyingQueryMethod,
989
+ singleResult,
990
+ });
912
991
  const start = this.logger.startPerformLog(`run ${String(originalKey)} (Modifying: ${modifyingQueryMethod})`);
913
992
  try {
914
- const result = await this.adapter.query(valueQueryMethod, {
993
+ const result = await this.adapter.query(finalQuery, {
915
994
  db,
916
- args: queryArgs,
995
+ args: finalArgs,
917
996
  modifying: modifyingQueryMethod,
918
997
  });
919
998
  const resolved = singleResult && Array.isArray(result) ? (result[0] ?? null) : result;