vsrepo 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +54 -10
  2. package/README.pt-BR.md +54 -10
  3. package/dist/VSRepoAdapter.js +1 -0
  4. package/dist/VSRepoAdapter.js.map +1 -0
  5. package/dist/VSRepository.d.ts +9 -6
  6. package/dist/VSRepository.js +14 -1
  7. package/dist/VSRepository.js.map +1 -0
  8. package/dist/decorators/dynamic-method.decorator.js +1 -0
  9. package/dist/decorators/dynamic-method.decorator.js.map +1 -0
  10. package/dist/decorators/query-method.decorator.d.ts +26 -3
  11. package/dist/decorators/query-method.decorator.js +26 -2
  12. package/dist/decorators/query-method.decorator.js.map +1 -0
  13. package/dist/errors/VSRepoAdapterError.js +1 -0
  14. package/dist/errors/VSRepoAdapterError.js.map +1 -0
  15. package/dist/errors/VSRepoError.js +1 -0
  16. package/dist/errors/VSRepoError.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.js +7 -1
  19. package/dist/index.js.map +1 -0
  20. package/dist/internal/constants/debug-arg-symbol.constant.js +1 -0
  21. package/dist/internal/constants/debug-arg-symbol.constant.js.map +1 -0
  22. package/dist/internal/constants/dynamic-methods-key.constant.js +1 -0
  23. package/dist/internal/constants/dynamic-methods-key.constant.js.map +1 -0
  24. package/dist/internal/constants/query-methods-key.constant.js +1 -0
  25. package/dist/internal/constants/query-methods-key.constant.js.map +1 -0
  26. package/dist/internal/enums/adapter-error-code.enum.js +1 -0
  27. package/dist/internal/enums/adapter-error-code.enum.js.map +1 -0
  28. package/dist/internal/enums/transaction-isolation-level.enum.js +1 -0
  29. package/dist/internal/enums/transaction-isolation-level.enum.js.map +1 -0
  30. package/dist/internal/enums/vs-log-level.enum.js +1 -0
  31. package/dist/internal/enums/vs-log-level.enum.js.map +1 -0
  32. package/dist/internal/enums/vsrepo-error-type.enum.d.ts +1 -1
  33. package/dist/internal/enums/vsrepo-error-type.enum.js +2 -1
  34. package/dist/internal/enums/vsrepo-error-type.enum.js.map +1 -0
  35. package/dist/internal/resolvers/dynamic-methods.resolver.js +33 -6
  36. package/dist/internal/resolvers/dynamic-methods.resolver.js.map +1 -0
  37. package/dist/internal/resolvers/merge-wheres.resolver.js +1 -0
  38. package/dist/internal/resolvers/merge-wheres.resolver.js.map +1 -0
  39. package/dist/internal/utils/db-arg.util.d.ts +15 -0
  40. package/dist/internal/utils/db-arg.util.js +23 -0
  41. package/dist/internal/utils/db-arg.util.js.map +1 -0
  42. package/dist/internal/utils/uncapitalize.util.js +1 -0
  43. package/dist/internal/utils/uncapitalize.util.js.map +1 -0
  44. package/dist/internal/utils/vs-logger.util.js +1 -0
  45. package/dist/internal/utils/vs-logger.util.js.map +1 -0
  46. package/dist/internal/utils/with-db.util.d.ts +19 -0
  47. package/dist/internal/utils/with-db.util.js +24 -0
  48. package/dist/internal/utils/with-db.util.js.map +1 -0
  49. package/dist/internal/validators/decorators.validator.js +3 -0
  50. package/dist/internal/validators/decorators.validator.js.map +1 -0
  51. package/dist/internal/validators/schemas/ordering.schema.js +1 -0
  52. package/dist/internal/validators/schemas/ordering.schema.js.map +1 -0
  53. package/dist/internal/validators/schemas/pagination.schema.js +1 -0
  54. package/dist/internal/validators/schemas/pagination.schema.js.map +1 -0
  55. package/dist/internal/validators/schemas/where.schema.js +1 -0
  56. package/dist/internal/validators/schemas/where.schema.js.map +1 -0
  57. package/dist/internal/validators/vsrepo.validator.d.ts +1 -1
  58. package/dist/internal/validators/vsrepo.validator.js +2 -0
  59. package/dist/internal/validators/vsrepo.validator.js.map +1 -0
  60. package/dist/types/adapter/adapter-method-options.type.js +1 -0
  61. package/dist/types/adapter/adapter-method-options.type.js.map +1 -0
  62. package/dist/types/adapter/adapter-query-options.type.js +1 -0
  63. package/dist/types/adapter/adapter-query-options.type.js.map +1 -0
  64. package/dist/types/decorators/dynamic-method-options.type.js +1 -0
  65. package/dist/types/decorators/dynamic-method-options.type.js.map +1 -0
  66. package/dist/types/decorators/query-method-options.type.d.ts +35 -1
  67. package/dist/types/decorators/query-method-options.type.js +1 -0
  68. package/dist/types/decorators/query-method-options.type.js.map +1 -0
  69. package/dist/types/dynamic-methods/dynamic-method-customization.type.js +1 -0
  70. package/dist/types/dynamic-methods/dynamic-method-customization.type.js.map +1 -0
  71. package/dist/types/dynamic-methods/dynamic-method-info.type.js +1 -0
  72. package/dist/types/dynamic-methods/dynamic-method-info.type.js.map +1 -0
  73. package/dist/types/dynamic-methods/dynamic-method-where-ops.type.js +1 -0
  74. package/dist/types/dynamic-methods/dynamic-method-where-ops.type.js.map +1 -0
  75. package/dist/types/utils/count-result.type.js +1 -0
  76. package/dist/types/utils/count-result.type.js.map +1 -0
  77. package/dist/types/utils/decimal-like.type.js +1 -0
  78. package/dist/types/utils/decimal-like.type.js.map +1 -0
  79. package/dist/types/utils/deep-partial.type.js +1 -0
  80. package/dist/types/utils/deep-partial.type.js.map +1 -0
  81. package/dist/types/utils/keys-of-type.type.js +1 -0
  82. package/dist/types/utils/keys-of-type.type.js.map +1 -0
  83. package/dist/types/utils/methods-options.type.js +1 -0
  84. package/dist/types/utils/methods-options.type.js.map +1 -0
  85. package/dist/types/utils/numeric-keys.type.js +1 -0
  86. package/dist/types/utils/numeric-keys.type.js.map +1 -0
  87. package/dist/types/utils/numeric-like.type.js +1 -0
  88. package/dist/types/utils/numeric-like.type.js.map +1 -0
  89. package/dist/types/utils/ordering.type.js +1 -0
  90. package/dist/types/utils/ordering.type.js.map +1 -0
  91. package/dist/types/utils/pagination.type.js +1 -0
  92. package/dist/types/utils/pagination.type.js.map +1 -0
  93. package/dist/types/utils/perform-data.type.js +1 -0
  94. package/dist/types/utils/perform-data.type.js.map +1 -0
  95. package/dist/types/utils/primitive.type.js +1 -0
  96. package/dist/types/utils/primitive.type.js.map +1 -0
  97. package/dist/types/utils/query-args.type.d.ts +30 -0
  98. package/dist/types/utils/query-args.type.js +3 -0
  99. package/dist/types/utils/query-args.type.js.map +1 -0
  100. package/dist/types/utils/query-method-arg.type.d.ts +3 -2
  101. package/dist/types/utils/query-method-arg.type.js +1 -0
  102. package/dist/types/utils/query-method-arg.type.js.map +1 -0
  103. package/dist/types/utils/restrict-method-options.type.js +1 -0
  104. package/dist/types/utils/restrict-method-options.type.js.map +1 -0
  105. package/dist/types/utils/see-mode.type.js +1 -0
  106. package/dist/types/utils/see-mode.type.js.map +1 -0
  107. package/dist/types/vsrepo/vsrepo-args.type.js +1 -0
  108. package/dist/types/vsrepo/vsrepo-args.type.js.map +1 -0
  109. package/dist/types/vsrepo/vsrepo-method.type.js +1 -0
  110. package/dist/types/vsrepo/vsrepo-method.type.js.map +1 -0
  111. package/dist/types/vsrepo/vsrepo-options.type.js +1 -0
  112. package/dist/types/vsrepo/vsrepo-options.type.js.map +1 -0
  113. package/dist/types/vsrepo/vsrepo-orm-types.type.js +1 -0
  114. package/dist/types/vsrepo/vsrepo-orm-types.type.js.map +1 -0
  115. package/dist/types/vsrepo/vsrepo-pretty-where.type.js +1 -0
  116. package/dist/types/vsrepo/vsrepo-pretty-where.type.js.map +1 -0
  117. package/dist/types/vsrepo/vsrepo-query-options.type.d.ts +14 -0
  118. package/dist/types/vsrepo/vsrepo-query-options.type.js +1 -0
  119. package/dist/types/vsrepo/vsrepo-query-options.type.js.map +1 -0
  120. package/dist/types/vsrepo/vsrepo-query.type.js +1 -0
  121. package/dist/types/vsrepo/vsrepo-query.type.js.map +1 -0
  122. package/dist/types/vsrepo/vsrepo-relations.type.js +1 -0
  123. package/dist/types/vsrepo/vsrepo-relations.type.js.map +1 -0
  124. package/dist/types/vsrepo/vsrepo-resolve-args-data.type.js +1 -0
  125. package/dist/types/vsrepo/vsrepo-resolve-args-data.type.js.map +1 -0
  126. package/dist/types/vsrepo/vsrepo-select.type.js +1 -0
  127. package/dist/types/vsrepo/vsrepo-select.type.js.map +1 -0
  128. package/dist/types/vsrepo/vsrepo-transaction-options.type.js +1 -0
  129. package/dist/types/vsrepo/vsrepo-transaction-options.type.js.map +1 -0
  130. package/dist/types/vsrepo/vsrepo-ugly-where.type.js +1 -0
  131. package/dist/types/vsrepo/vsrepo-ugly-where.type.js.map +1 -0
  132. package/dist/types/vsrepo/vsrepo-where.type.js +1 -0
  133. package/dist/types/vsrepo/vsrepo-where.type.js.map +1 -0
  134. package/package.json +1 -1
package/README.md CHANGED
@@ -51,6 +51,7 @@ VSRepository lets you create strongly-typed repositories with:
51
51
  - [Ordering, pagination and distinct](#ordering-pagination-and-distinct)
52
52
  - [Decorator options](#decorator-options)
53
53
  - [Query methods (raw SQL)](#query-methods-raw-sql)
54
+ - [Spread arguments with `spreadArgs`](#spread-arguments-with-spreadargs)
54
55
  - [Ad-hoc raw queries with `query()`](#ad-hoc-raw-queries-with-query)
55
56
  - [Transactions](#transactions)
56
57
  - [Utility types](#utility-types)
@@ -598,21 +599,54 @@ class UserRepository extends VSRepository<User, string> {
598
599
 
599
600
  @QueryMethod('UPDATE "user" SET active = true WHERE id = $1', { modifying: true })
600
601
  declare activateUser: (arg: QueryMethodArg<[id: string]>) => Promise<number>;
602
+
603
+ // Only one row is ever expected here, so `singleResult` collapses the
604
+ // array into a single object (or `null` when no row matches).
605
+ @QueryMethod('SELECT * FROM "user" WHERE id = $1 LIMIT 1', { singleResult: true })
606
+ declare findByIdRaw: (arg: QueryMethodArg<[id: string]>) => Promise<User | null>;
601
607
  }
602
608
  ```
603
609
 
604
- | Option | Type | Default | Description |
605
- | ----------- | --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
606
- | `modifying` | `boolean` | `false` | When `true`, runs as `INSERT`/`UPDATE`/`DELETE` and the method resolves to the number of affected rows. When `false`, runs as a read query and resolves to the declared return type. |
610
+ | Option | Type | Default | Description |
611
+ | -------------- | --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
612
+ | `modifying` | `boolean` | `false` | When `true`, runs as `INSERT`/`UPDATE`/`DELETE` and the method resolves to the number of affected rows. When `false`, runs as a read query and resolves to the declared return type. |
613
+ | `singleResult` | `boolean` | `false` | When `true`, collapses an array result into its first element (`null` if empty), so you can declare the return type as a single object instead of an array. Has no effect on non-array results (e.g. a `modifying` query's affected-row count). |
607
614
 
608
615
  Query methods accept `{ args, db? }` at the call site — `db` lets them participate in a `transaction()` block just like base and dynamic methods.
609
616
 
617
+ ### Spread arguments with `spreadArgs`
618
+
619
+ By default, a `@QueryMethod` receives its placeholder values through a single `QueryMethodArg` object (`method({ args: [...] })`). Set `spreadArgs: true` to receive them as separate positional arguments instead, JpaRepository style:
620
+
621
+ ```typescript
622
+ class UserRepository extends VSRepository<User, string> {
623
+ @QueryMethod('SELECT * FROM "user" WHERE email = $1 AND "userType" = $2', {
624
+ spreadArgs: true,
625
+ })
626
+ declare findByEmailAndType: (
627
+ ...args: QueryArgs<[email: string, userType: string]>
628
+ ) => Promise<User[]>;
629
+ }
630
+
631
+ const admins = await userRepository.findByEmailAndType("joao@email.com", "admin");
632
+ ```
633
+
634
+ To run the query against a specific client or transaction instead of the repository's default one, pass `withDb(tx)` as the trailing argument — it wraps `tx` in a `DbArg`, which the resolver recognizes with `instanceof`, so it's never confused with a regular positional argument even if that argument happens to be an object:
635
+
636
+ ```typescript
637
+ await userRepository.transaction(async (tx) => {
638
+ await userRepository.findByEmailAndType("joao@email.com", "admin", withDb(tx));
639
+ });
640
+ ```
641
+
642
+ `spreadArgs` only affects `@QueryMethod`-declared fields — it's `false` by default, and calling a method declared without it using more than one argument throws, since the single-`QueryMethodArg` call style is expected instead. It has no effect on `query()`, which always accepts `{ args, db? }`.
643
+
610
644
  ### Ad-hoc raw queries with `query()`
611
645
 
612
646
  For one-off raw SQL that doesn't warrant declaring a `@QueryMethod` on the repository class, call `query()` directly — it's available on every `VSRepository` instance and goes through the same adapter's `query()` implementation under the hood:
613
647
 
614
648
  ```typescript
615
- query<T = any>(query: string, options?: { args?: any[]; db?: any; modifying?: boolean }): Promise<T>;
649
+ query<T = any>(query: string, options?: { args?: any[]; db?: any; modifying?: boolean; singleResult?: boolean }): Promise<T>;
616
650
  ```
617
651
 
618
652
  ```typescript
@@ -624,13 +658,21 @@ const affectedRows = await userRepository.query<number>(
624
658
  'UPDATE "user" SET active = true WHERE id = $1',
625
659
  { args: ["123"], modifying: true },
626
660
  );
661
+
662
+ // Only one row is ever expected here, so `singleResult` collapses the
663
+ // array into a single object (or `null` when no row matches).
664
+ const user = await userRepository.query<User | null>(
665
+ 'SELECT * FROM "user" WHERE id = $1 LIMIT 1',
666
+ { args: ["123"], singleResult: true },
667
+ );
627
668
  ```
628
669
 
629
- | Option | Type | Default | Description |
630
- | ----------- | --------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
631
- | `args` | `any[]` | `undefined` | Positional parameters injected into `$1`, `$2`, ... placeholders. Never interpolate values directly into the SQL string. |
632
- | `db` | `any` | Repository's default client | Database client or transaction to run this query in. |
633
- | `modifying` | `boolean` | `false` | When `true`, treats the statement as `INSERT`/`UPDATE`/`DELETE`. |
670
+ | Option | Type | Default | Description |
671
+ | -------------- | --------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
672
+ | `args` | `any[]` | `undefined` | Positional parameters injected into `$1`, `$2`, ... placeholders. Never interpolate values directly into the SQL string. |
673
+ | `db` | `any` | Repository's default client | Database client or transaction to run this query in. |
674
+ | `modifying` | `boolean` | `false` | When `true`, treats the statement as `INSERT`/`UPDATE`/`DELETE`. |
675
+ | `singleResult` | `boolean` | `false` | When `true`, collapses an array result into its first element (`null` if empty). Has no effect on non-array results (e.g. a `modifying` query's affected-row count). |
634
676
 
635
677
  Just like base, dynamic and query methods, `query()` accepts `db` in `options` to participate in a `transaction()` block.
636
678
 
@@ -691,6 +733,7 @@ import type {
691
733
  DeepPartial,
692
734
  CountResult,
693
735
  QueryMethodArg,
736
+ QueryArgs,
694
737
  KeysOfType,
695
738
  NumericKeys,
696
739
  NumericLike,
@@ -713,6 +756,7 @@ import type {
713
756
  | `DeepPartial<T>` | Recursively makes every property of `T` optional, including nested objects and array elements. | `save`, `saveList`, `patch`, `merge`, and every write method on `VSRepoAdapter`. |
714
757
  | `CountResult` | `{ count: number }` — the shape returned by batch operations. | `removeList`, `softRemoveList`, `restoreList`, `createManyIgnoreConflicts`. |
715
758
  | `QueryMethodArg<T>` | `{ args?: T, db? }` — positional SQL parameters (`$1`, `$2`, ...) and transaction client for `@QueryMethod`. | [Query methods (raw SQL)](#query-methods-raw-sql). |
759
+ | `QueryArgs<T, O>` | Types the spread parameter list of a `@QueryMethod` declared with `{ spreadArgs: true }`: `T`'s values in order, followed by an optional trailing `DbArg<O>` built via `withDb()`. | [Spread arguments with `spreadArgs`](#spread-arguments-with-spreadargs). |
716
760
  | `KeysOfType<T, K>` | Extracts the keys of `T` whose value type is assignable to `K`. | Constrains `pkName` in [Constructor options](#constructor-options) to fields of the entity matching the configured primary-key type. |
717
761
  | `NumericKeys<T>` | Extracts the keys of `T` whose (non-nullable) value type is assignable to `NumericLike`. Nullable numeric fields (`number \| null`) are included. | Constrains `field` in [Atomic and aggregate methods](#atomic-and-aggregate-methods) (`increment`, `sum`, etc). |
718
762
  | `NumericLike` | `number \| bigint \| DecimalLike`. | [Atomic and aggregate methods](#atomic-and-aggregate-methods). |
@@ -932,7 +976,7 @@ try {
932
976
  | ----------------- | -------------------------------------------------------------------------------------------------------------------------- |
933
977
  | `DECORATOR` | Invalid arguments were passed to `@DynamicMethod` or `@QueryMethod`. |
934
978
  | `RESOLVER` | The library failed to resolve a dynamic/query method's configuration into a callable method (e.g. an unknown method name). |
935
- | `DYNAMIC` | A resolved dynamic method failed at runtime (e.g. missing arguments). |
979
+ | `DYNAMIC` | A resolved dynamic/query method failed at runtime (e.g. missing arguments). |
936
980
  | `VALIDATOR` | Invalid method options or arguments were detected during validation. |
937
981
  | `BASE` | Invalid usage of a base method (`get`, `save`, `remove`, etc). |
938
982
  | `ADAPTER` | A `VSRepoAdapter` failed while talking to the underlying ORM/database — always thrown as `VSRepoAdapterError`. |
package/README.pt-BR.md CHANGED
@@ -51,6 +51,7 @@ O VSRepository permite criar repositories fortemente tipados com:
51
51
  - [Ordenação, paginação e distinct](#ordenação-paginação-e-distinct)
52
52
  - [Options do decorador](#options-do-decorador)
53
53
  - [Query methods (SQL raw)](#query-methods-sql-raw)
54
+ - [Argumentos via spread com `spreadArgs`](#argumentos-via-spread-com-spreadargs)
54
55
  - [Queries raw pontuais com `query()`](#queries-raw-pontuais-com-query)
55
56
  - [Transações](#transações)
56
57
  - [Tipos utilitários](#tipos-utilitários)
@@ -598,21 +599,54 @@ class UserRepository extends VSRepository<User, string> {
598
599
 
599
600
  @QueryMethod('UPDATE "user" SET active = true WHERE id = $1', { modifying: true })
600
601
  declare activateUser: (arg: QueryMethodArg<[id: string]>) => Promise<number>;
602
+
603
+ // Aqui só se espera uma linha, então `singleResult` transforma o array
604
+ // em um único objeto (ou `null` quando nenhuma linha corresponde).
605
+ @QueryMethod('SELECT * FROM "user" WHERE id = $1 LIMIT 1', { singleResult: true })
606
+ declare findByIdRaw: (arg: QueryMethodArg<[id: string]>) => Promise<User | null>;
601
607
  }
602
608
  ```
603
609
 
604
- | Option | Tipo | Padrão | Descrição |
605
- | ----------- | --------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
606
- | `modifying` | `boolean` | `false` | Quando `true`, executa como `INSERT`/`UPDATE`/`DELETE` e o método resolve para o número de linhas afetadas. Quando `false`, executa como query de leitura e resolve para o tipo de retorno declarado. |
610
+ | Option | Tipo | Padrão | Descrição |
611
+ | -------------- | --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
612
+ | `modifying` | `boolean` | `false` | Quando `true`, executa como `INSERT`/`UPDATE`/`DELETE` e o método resolve para o número de linhas afetadas. Quando `false`, executa como query de leitura e resolve para o tipo de retorno declarado. |
613
+ | `singleResult` | `boolean` | `false` | Quando `true`, transforma um resultado em array no seu primeiro elemento (`null` se vazio), permitindo declarar o tipo de retorno como um objeto único em vez de array. Não tem efeito em resultados que não são array (ex.: o número de linhas afetadas de uma query `modifying`). |
607
614
 
608
615
  Query methods aceitam `{ args, db? }` na chamada — `db` permite que participem de um bloco `transaction()`, assim como os métodos base e dinâmicos.
609
616
 
617
+ ### Argumentos via spread com `spreadArgs`
618
+
619
+ Por padrão, um `@QueryMethod` recebe seus valores de placeholder através de um único objeto `QueryMethodArg` (`method({ args: [...] })`). Defina `spreadArgs: true` para recebê-los como argumentos posicionais separados, no estilo do JpaRepository:
620
+
621
+ ```typescript
622
+ class UserRepository extends VSRepository<User, string> {
623
+ @QueryMethod('SELECT * FROM "user" WHERE email = $1 AND "userType" = $2', {
624
+ spreadArgs: true,
625
+ })
626
+ declare findByEmailAndType: (
627
+ ...args: QueryArgs<[email: string, userType: string]>
628
+ ) => Promise<User[]>;
629
+ }
630
+
631
+ const admins = await userRepository.findByEmailAndType("joao@email.com", "admin");
632
+ ```
633
+
634
+ Para rodar a query com um client ou transação específico em vez do client padrão do repository, passe `withDb(tx)` como argumento final — ele embrulha `tx` em um `DbArg`, que o resolver reconhece via `instanceof`, então nunca é confundido com um argumento posicional comum, mesmo que esse argumento seja um objeto:
635
+
636
+ ```typescript
637
+ await userRepository.transaction(async (tx) => {
638
+ await userRepository.findByEmailAndType("joao@email.com", "admin", withDb(tx));
639
+ });
640
+ ```
641
+
642
+ `spreadArgs` afeta apenas campos declarados com `@QueryMethod` — o padrão é `false`, e chamar um método declarado sem essa opção usando mais de um argumento lança erro, já que se espera o estilo de chamada com um único `QueryMethodArg`. Não tem efeito sobre `query()`, que sempre aceita `{ args, db? }`.
643
+
610
644
  ### Queries raw pontuais com `query()`
611
645
 
612
646
  Para SQL raw pontual que não justifica declarar um `@QueryMethod` na classe do repository, chame `query()` diretamente — ele está disponível em toda instância de `VSRepository` e passa pela mesma implementação de `query()` do adapter por baixo dos panos:
613
647
 
614
648
  ```typescript
615
- query<T = any>(query: string, options?: { args?: any[]; db?: any; modifying?: boolean }): Promise<T>;
649
+ query<T = any>(query: string, options?: { args?: any[]; db?: any; modifying?: boolean; singleResult?: boolean }): Promise<T>;
616
650
  ```
617
651
 
618
652
  ```typescript
@@ -624,13 +658,21 @@ const linhasAfetadas = await userRepository.query<number>(
624
658
  'UPDATE "user" SET active = true WHERE id = $1',
625
659
  { args: ["123"], modifying: true },
626
660
  );
661
+
662
+ // Aqui só se espera uma linha, então `singleResult` transforma o array
663
+ // em um único objeto (ou `null` quando nenhuma linha corresponde).
664
+ const user = await userRepository.query<User | null>(
665
+ 'SELECT * FROM "user" WHERE id = $1 LIMIT 1',
666
+ { args: ["123"], singleResult: true },
667
+ );
627
668
  ```
628
669
 
629
- | Option | Tipo | Padrão | Descrição |
630
- | ----------- | --------- | --------------------------- | -------------------------------------------------------------------------------------------------------------------- |
631
- | `args` | `any[]` | `undefined` | Parâmetros posicionais injetados nos placeholders `$1`, `$2`, ... Nunca interpole valores diretamente na string SQL. |
632
- | `db` | `any` | Client padrão do repository | Client ou transação do banco em que essa query deve rodar. |
633
- | `modifying` | `boolean` | `false` | Quando `true`, trata a instrução como `INSERT`/`UPDATE`/`DELETE`. |
670
+ | Option | Tipo | Padrão | Descrição |
671
+ | -------------- | --------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
672
+ | `args` | `any[]` | `undefined` | Parâmetros posicionais injetados nos placeholders `$1`, `$2`, ... Nunca interpole valores diretamente na string SQL. |
673
+ | `db` | `any` | Client padrão do repository | Client ou transação do banco em que essa query deve rodar. |
674
+ | `modifying` | `boolean` | `false` | Quando `true`, trata a instrução como `INSERT`/`UPDATE`/`DELETE`. |
675
+ | `singleResult` | `boolean` | `false` | Quando `true`, transforma um resultado em array no seu primeiro elemento (`null` se vazio). Não tem efeito em resultados que não são array (ex.: o número de linhas afetadas de uma query `modifying`). |
634
676
 
635
677
  Assim como os métodos base, dinâmicos e query, `query()` aceita `db` em `options` para participar de um bloco `transaction()`.
636
678
 
@@ -694,6 +736,7 @@ import type {
694
736
  DeepPartial,
695
737
  CountResult,
696
738
  QueryMethodArg,
739
+ QueryArgs,
697
740
  KeysOfType,
698
741
  NumericKeys,
699
742
  NumericLike,
@@ -716,6 +759,7 @@ import type {
716
759
  | `DeepPartial<T>` | Torna todas as propriedades de `T` opcionais recursivamente, incluindo objetos aninhados e elementos de array. | `save`, `saveList`, `patch`, `merge`, e todo método de escrita do `VSRepoAdapter`. |
717
760
  | `CountResult` | `{ count: number }` — o formato retornado por operações em lote. | `removeList`, `softRemoveList`, `restoreList`, `createManyIgnoreConflicts`. |
718
761
  | `QueryMethodArg<T>` | `{ args?: T, db? }` — parâmetros posicionais do SQL (`$1`, `$2`, ...) e cliente de transação para o `@QueryMethod`. | [Query methods (SQL raw)](#query-methods-sql-raw). |
762
+ | `QueryArgs<T, O>` | Tipa a lista de parâmetros via spread de um `@QueryMethod` declarado com `{ spreadArgs: true }`: os valores de `T`, em ordem, seguidos de um `DbArg<O>` opcional construído via `withDb()`. | [Argumentos via spread com `spreadArgs`](#argumentos-via-spread-com-spreadargs). |
719
763
  | `KeysOfType<T, K>` | Extrai as chaves de `T` cujo tipo de valor é atribuível a `K`. | Restringe `pkName`, em [Options do construtor](#options-do-construtor), aos campos da entidade compatíveis com o tipo de chave primária configurado. |
720
764
  | `NumericKeys<T>` | Extrai as chaves de `T` cujo tipo de valor (ignorando `null`/`undefined`) é atribuível a `NumericLike`. Campos numéricos nullable (`number \| null`) são incluídos. | Restringe `field` em [Métodos atômicos e de agregação](#métodos-atômicos-e-de-agregação) (`increment`, `sum`, etc). |
721
765
  | `NumericLike` | `number \| bigint \| DecimalLike`. | [Métodos atômicos e de agregação](#métodos-atômicos-e-de-agregação). |
@@ -935,7 +979,7 @@ try {
935
979
  | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
936
980
  | `DECORATOR` | Argumentos inválidos foram passados para `@DynamicMethod` ou `@QueryMethod`. |
937
981
  | `RESOLVER` | A biblioteca falhou ao resolver a configuração de um método dinâmico/de query em um método chamável (ex.: um nome de método desconhecido). |
938
- | `DYNAMIC` | Um método dinâmico já resolvido falhou em tempo de execução (ex.: argumentos faltando). |
982
+ | `DYNAMIC` | Um dynamic/query method já resolvido falhou em tempo de execução (ex.: argumentos faltando). |
939
983
  | `VALIDATOR` | Options ou argumentos de método inválidos foram detectados durante a validação. |
940
984
  | `BASE` | Uso inválido de um método base (`get`, `save`, `remove`, etc). |
941
985
  | `ADAPTER` | Um `VSRepoAdapter` falhou ao falar com o ORM/banco subjacente — sempre é lançado como `VSRepoAdapterError`. |
@@ -16,3 +16,4 @@ exports.VSRepoAdapter = void 0;
16
16
  class VSRepoAdapter {
17
17
  }
18
18
  exports.VSRepoAdapter = VSRepoAdapter;
19
+ //# sourceMappingURL=VSRepoAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VSRepoAdapter.js","sourceRoot":"","sources":["../src/VSRepoAdapter.ts"],"names":[],"mappings":";;;AAQA;;;;;;;;;;;GAWG;AACH,MAAsB,aAAa;CAyMlC;AAzMD,sCAyMC"}
@@ -9,7 +9,6 @@ import { VSRepoTransactionOptions } from "./types/vsrepo/vsrepo-transaction-opti
9
9
  import { MethodOptions } from "./types/utils/methods-options.type";
10
10
  import { Ordering } from "./types/utils/ordering.type";
11
11
  import { Pagination } from "./types/utils/pagination.type";
12
- import { VSRepoArgs } from "./types/vsrepo/vsrepo-args.type";
13
12
  import { VSRepoQueryOptions } from "./types/vsrepo/vsrepo-query-options.type";
14
13
  import { NumericKeys } from "./types/utils/numeric-keys.type";
15
14
  import { RestrictMethodOptions } from "./types/utils/restrict-method-options.type";
@@ -52,11 +51,6 @@ export declare abstract class VSRepository<Entity, PKType, OrmTypes extends VSRe
52
51
  private readonly validator;
53
52
  private readonly softRemoveKey?;
54
53
  private readonly defaultOrdering?;
55
- /**
56
- * This is a property managed by VSRepository, please don't modify it!!
57
- * @internal
58
- */
59
- $vsrepocache: Map<string, (args: any[], methodOptions?: MethodOptions<Entity, OrmTypes>) => VSRepoArgs<Entity>>;
60
54
  /**
61
55
  * Creates a configured instance of `VSRepository`, resolving and validating
62
56
  * every `@DynamicMethod`/`@QueryMethod` declared on the subclass.
@@ -79,6 +73,8 @@ export declare abstract class VSRepository<Entity, PKType, OrmTypes extends VSRe
79
73
  * Use `$1`, `$2`, ... placeholders for values passed via `options.args` —
80
74
  * never interpolate values directly into `query`, to avoid SQL injection.
81
75
  * Set `options.modifying: true` for `INSERT`/`UPDATE`/`DELETE` statements.
76
+ * Set `options.singleResult: true` to collapse an array result into its
77
+ * first element (`null` if empty) — see {@link VSRepoQueryOptions.singleResult}.
82
78
  *
83
79
  * @example
84
80
  * ```typescript
@@ -91,6 +87,13 @@ export declare abstract class VSRepository<Entity, PKType, OrmTypes extends VSRe
91
87
  * 'UPDATE "user" SET active = true WHERE id = $1',
92
88
  * { args: ["123"], modifying: true },
93
89
  * );
90
+ *
91
+ * // Only one row is ever expected here, so `singleResult` collapses the
92
+ * // array into a single object (or `null` when no row matches).
93
+ * const user = await userRepository.query<User | null>(
94
+ * 'SELECT * FROM "user" WHERE id = $1 LIMIT 1',
95
+ * { args: ["123"], singleResult: true },
96
+ * );
94
97
  * ```
95
98
  */
96
99
  query<T = any>(query: string, options?: VSRepoQueryOptions<OrmTypes>): Promise<T>;
@@ -141,6 +141,8 @@ class VSRepository {
141
141
  * Use `$1`, `$2`, ... placeholders for values passed via `options.args` —
142
142
  * never interpolate values directly into `query`, to avoid SQL injection.
143
143
  * Set `options.modifying: true` for `INSERT`/`UPDATE`/`DELETE` statements.
144
+ * Set `options.singleResult: true` to collapse an array result into its
145
+ * first element (`null` if empty) — see {@link VSRepoQueryOptions.singleResult}.
144
146
  *
145
147
  * @example
146
148
  * ```typescript
@@ -153,6 +155,13 @@ class VSRepository {
153
155
  * 'UPDATE "user" SET active = true WHERE id = $1',
154
156
  * { args: ["123"], modifying: true },
155
157
  * );
158
+ *
159
+ * // Only one row is ever expected here, so `singleResult` collapses the
160
+ * // array into a single object (or `null` when no row matches).
161
+ * const user = await userRepository.query<User | null>(
162
+ * 'SELECT * FROM "user" WHERE id = $1 LIMIT 1',
163
+ * { args: ["123"], singleResult: true },
164
+ * );
156
165
  * ```
157
166
  */
158
167
  async query(query, options) {
@@ -168,8 +177,11 @@ class VSRepository {
168
177
  db: optionsValidated.db,
169
178
  modifying: optionsValidated.modifying ?? false,
170
179
  });
180
+ const resolved = optionsValidated.singleResult && Array.isArray(result)
181
+ ? (result[0] ?? null)
182
+ : result;
171
183
  this.logger.endPerformLog(start);
172
- return result;
184
+ return resolved;
173
185
  }
174
186
  catch (err) {
175
187
  this.logger.endPerformLog(start);
@@ -333,3 +345,4 @@ class VSRepository {
333
345
  }
334
346
  }
335
347
  exports.VSRepository = VSRepository;
348
+ //# sourceMappingURL=VSRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VSRepository.js","sourceRoot":"","sources":["../src/VSRepository.ts"],"names":[],"mappings":"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"}
@@ -36,3 +36,4 @@ function DynamicMethod(options) {
36
36
  Reflect.defineMetadata(dynamic_methods_key_constant_1.DYNAMIC_METHODS_KEY, methods, target);
37
37
  };
38
38
  }
39
+ //# sourceMappingURL=dynamic-method.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-method.decorator.js","sourceRoot":"","sources":["../../src/decorators/dynamic-method.decorator.ts"],"names":[],"mappings":";;AA4BA,sCAYC;AAxCD,qGAAyF;AACzF,sFAAkF;AAIlF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,SAAgB,aAAa,CAAU,OAAiC;IACpE,MAAM,gBAAgB,GAAG,OAAO;QAC5B,CAAC,CAAC,0CAAmB,CAAC,4BAA4B,CAAC,OAAO,CAAC;QAC3D,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO,CAAC,MAAc,EAAE,WAA4B,EAAE,EAAE;QACpD,MAAM,OAAO,GAAmB,OAAO,CAAC,WAAW,CAAC,kDAAmB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAEvF,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;QAEnD,OAAO,CAAC,cAAc,CAAC,kDAAmB,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC;AACN,CAAC"}
@@ -1,15 +1,20 @@
1
- import { QueryMethodOptions } from "../types/decorators/query-method-options.type";
1
+ import type { QueryMethodOptions } from "../types/decorators/query-method-options.type";
2
2
  /**
3
3
  * Property decorator used to declare a raw SQL query method on a `VSRepository`
4
4
  * subclass, bypassing name-based method parsing entirely.
5
5
  *
6
6
  * Applied to a `declare` class field, it executes `value` directly through the
7
7
  * adapter's `query()` method, with parameters injected positionally via the
8
- * `args` array passed at the call site (`$1`, `$2`, ... placeholders).
8
+ * `args` array passed at the call site (`$1`, `$2`, ... placeholders) — or,
9
+ * with `spreadArgs: true`, via separate positional arguments instead.
9
10
  *
10
11
  * @param value Raw SQL statement to execute. Use `$1`, `$2`, ... placeholders for
11
12
  * the values that will be passed via `args` — never interpolate values directly into `value`.
12
- * @param options Optional configuration; set `modifying: true` for `INSERT`/`UPDATE`/`DELETE` statements.
13
+ * @param options Optional configuration; set `modifying: true` for `INSERT`/`UPDATE`/`DELETE` statements,
14
+ * `singleResult: true` to collapse an array result into its first element, and
15
+ * `spreadArgs: true` to receive placeholder values as separate arguments instead of a
16
+ * single `QueryMethodArg` object — see {@link QueryMethodOptions.singleResult} and
17
+ * {@link QueryMethodOptions.spreadArgs}.
13
18
  *
14
19
  * @example
15
20
  * ```typescript
@@ -19,7 +24,25 @@ import { QueryMethodOptions } from "../types/decorators/query-method-options.typ
19
24
  *
20
25
  * @QueryMethod('UPDATE "user" SET active = true WHERE id = $1', { modifying: true })
21
26
  * declare activateUser: (arg: QueryMethodArg<[id: string]>) => Promise<number>;
27
+ *
28
+ * // Only one row is ever expected here, so `singleResult` collapses the
29
+ * // array into a single object (or `null` when no row matches).
30
+ * @QueryMethod('SELECT * FROM "user" WHERE id = $1 LIMIT 1', { singleResult: true })
31
+ * declare findByIdRaw: (arg: QueryMethodArg<[id: string]>) => Promise<User | null>;
32
+ *
33
+ * // `spreadArgs: true` takes placeholder values as separate arguments,
34
+ * // JpaRepository style, instead of a single `{ args: [...] }` object.
35
+ * // An optional trailing `withDb(tx)` runs the query in a transaction.
36
+ * @QueryMethod('SELECT * FROM "user" WHERE email = $1 AND "userType" = $2', {
37
+ * spreadArgs: true,
38
+ * })
39
+ * declare findByEmailAndType: (
40
+ * ...args: QueryArgs<[email: string, userType: string]>
41
+ * ) => Promise<User[]>;
22
42
  * }
43
+ *
44
+ * await userRepository.findByEmailAndType("joao@email.com", "admin");
45
+ * await userRepository.findByEmailAndType("joao@email.com", "admin", withDb(tx));
23
46
  * ```
24
47
  *
25
48
  * @publicApi
@@ -11,11 +11,16 @@ const decorators_validator_1 = require("../internal/validators/decorators.valida
11
11
  *
12
12
  * Applied to a `declare` class field, it executes `value` directly through the
13
13
  * adapter's `query()` method, with parameters injected positionally via the
14
- * `args` array passed at the call site (`$1`, `$2`, ... placeholders).
14
+ * `args` array passed at the call site (`$1`, `$2`, ... placeholders) — or,
15
+ * with `spreadArgs: true`, via separate positional arguments instead.
15
16
  *
16
17
  * @param value Raw SQL statement to execute. Use `$1`, `$2`, ... placeholders for
17
18
  * the values that will be passed via `args` — never interpolate values directly into `value`.
18
- * @param options Optional configuration; set `modifying: true` for `INSERT`/`UPDATE`/`DELETE` statements.
19
+ * @param options Optional configuration; set `modifying: true` for `INSERT`/`UPDATE`/`DELETE` statements,
20
+ * `singleResult: true` to collapse an array result into its first element, and
21
+ * `spreadArgs: true` to receive placeholder values as separate arguments instead of a
22
+ * single `QueryMethodArg` object — see {@link QueryMethodOptions.singleResult} and
23
+ * {@link QueryMethodOptions.spreadArgs}.
19
24
  *
20
25
  * @example
21
26
  * ```typescript
@@ -25,7 +30,25 @@ const decorators_validator_1 = require("../internal/validators/decorators.valida
25
30
  *
26
31
  * @QueryMethod('UPDATE "user" SET active = true WHERE id = $1', { modifying: true })
27
32
  * declare activateUser: (arg: QueryMethodArg<[id: string]>) => Promise<number>;
33
+ *
34
+ * // Only one row is ever expected here, so `singleResult` collapses the
35
+ * // array into a single object (or `null` when no row matches).
36
+ * @QueryMethod('SELECT * FROM "user" WHERE id = $1 LIMIT 1', { singleResult: true })
37
+ * declare findByIdRaw: (arg: QueryMethodArg<[id: string]>) => Promise<User | null>;
38
+ *
39
+ * // `spreadArgs: true` takes placeholder values as separate arguments,
40
+ * // JpaRepository style, instead of a single `{ args: [...] }` object.
41
+ * // An optional trailing `withDb(tx)` runs the query in a transaction.
42
+ * @QueryMethod('SELECT * FROM "user" WHERE email = $1 AND "userType" = $2', {
43
+ * spreadArgs: true,
44
+ * })
45
+ * declare findByEmailAndType: (
46
+ * ...args: QueryArgs<[email: string, userType: string]>
47
+ * ) => Promise<User[]>;
28
48
  * }
49
+ *
50
+ * await userRepository.findByEmailAndType("joao@email.com", "admin");
51
+ * await userRepository.findByEmailAndType("joao@email.com", "admin", withDb(tx));
29
52
  * ```
30
53
  *
31
54
  * @publicApi
@@ -43,3 +66,4 @@ function QueryMethod(value, options) {
43
66
  Reflect.defineMetadata(query_methods_key_constant_1.QUERY_METHODS_KEY, methods, target);
44
67
  };
45
68
  }
69
+ //# sourceMappingURL=query-method.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-method.decorator.js","sourceRoot":"","sources":["../../src/decorators/query-method.decorator.ts"],"names":[],"mappings":";;AAuDA,kCAgBC;AAvED,uDAAoD;AACpD,iGAAqF;AACrF,qFAA2E;AAC3E,sFAAkF;AAIlF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,SAAgB,WAAW,CAAC,KAAa,EAAE,OAA4B;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,yBAAW,CAAC,gCAAgC,EAAE,wCAAe,CAAC,SAAS,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,eAAe,GAAuB,OAAO;QAC/C,CAAC,CAAC,0CAAmB,CAAC,0BAA0B,CAAC,OAAO,CAAC;QACzD,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAE3B,OAAO,CAAC,MAAc,EAAE,WAA4B,EAAE,EAAE;QACpD,MAAM,OAAO,GAAkB,OAAO,CAAC,WAAW,CAAC,8CAAiB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAEpF,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAEzD,OAAO,CAAC,cAAc,CAAC,8CAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC,CAAC;AACN,CAAC"}
@@ -29,3 +29,4 @@ class VSRepoAdapterError extends VSRepoError_1.VSRepoError {
29
29
  }
30
30
  }
31
31
  exports.VSRepoAdapterError = VSRepoAdapterError;
32
+ //# sourceMappingURL=VSRepoAdapterError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VSRepoAdapterError.js","sourceRoot":"","sources":["../../src/errors/VSRepoAdapterError.ts"],"names":[],"mappings":";;;AACA,qFAA2E;AAC3E,+CAA4C;AAE5C;;;;;;;GAOG;AACH,MAAa,kBAAmB,SAAQ,yBAAW;IAU3B;IACA;IAVpB;;;;;;OAMG;IACH,YACI,OAAe,EACC,IAAsB,EACtB,aAAsB,EACtC,KAAe;QAEf,KAAK,CAAC,OAAO,EAAE,wCAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAJ/B,SAAI,GAAJ,IAAI,CAAkB;QACtB,kBAAa,GAAb,aAAa,CAAS;QAItC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACrC,CAAC;CACJ;AAjBD,gDAiBC"}
@@ -19,3 +19,4 @@ class VSRepoError extends Error {
19
19
  }
20
20
  }
21
21
  exports.VSRepoError = VSRepoError;
22
+ //# sourceMappingURL=VSRepoError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VSRepoError.js","sourceRoot":"","sources":["../../src/errors/VSRepoError.ts"],"names":[],"mappings":";;;AAEA;;;;;;GAMG;AACH,MAAa,WAAY,SAAQ,KAAK;IAId;IAHpB,YACI,OAAe;IACf,sEAAsE;IACtD,IAAqB,EACrC,KAAe;QAEf,KAAK,CAAC,yBAAyB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAHrC,SAAI,GAAJ,IAAI,CAAiB;QAIrC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC9B,CAAC;CACJ;AAVD,kCAUC"}
package/dist/index.d.ts CHANGED
@@ -3,12 +3,14 @@ export { VSRepository } from "./VSRepository.js";
3
3
  export { VSRepoAdapter } from "./VSRepoAdapter.js";
4
4
  export { VSRepoError } from "./errors/VSRepoError.js";
5
5
  export { VSRepoAdapterError } from "./errors/VSRepoAdapterError.js";
6
+ export { DbArg } from "./internal/utils/db-arg.util.js";
6
7
  export { DynamicMethod } from "./decorators/dynamic-method.decorator.js";
7
8
  export { QueryMethod } from "./decorators/query-method.decorator.js";
8
9
  export { VSRepoErrorType } from "./internal/enums/vsrepo-error-type.enum.js";
9
10
  export { VSLogLevel } from "./internal/enums/vs-log-level.enum.js";
10
11
  export { TransactionIsolationLevel } from "./internal/enums/transaction-isolation-level.enum.js";
11
12
  export { AdapterErrorCode } from "./internal/enums/adapter-error-code.enum.js";
13
+ export { withDb } from "./internal/utils/with-db.util.js";
12
14
  export type { VSRepoOptions } from "./types/vsrepo/vsrepo-options.type.js";
13
15
  export type { VSRepoOrmTypes } from "./types/vsrepo/vsrepo-orm-types.type.js";
14
16
  export type { VSRepoArgs } from "./types/vsrepo/vsrepo-args.type.js";
@@ -35,4 +37,5 @@ export type { DecimalLike } from "./types/utils/decimal-like.type.js";
35
37
  export type { NumericKeys } from "./types/utils/numeric-keys.type.js";
36
38
  export type { NumericLike } from "./types/utils/numeric-like.type.js";
37
39
  export type { RestrictMethodOptions } from "./types/utils/restrict-method-options.type.js";
40
+ export type { QueryArgs } from "./types/utils/query-args.type.js";
38
41
  export { VSLogger } from "./internal/utils/vs-logger.util.js";
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VSLogger = exports.AdapterErrorCode = exports.TransactionIsolationLevel = exports.VSLogLevel = exports.VSRepoErrorType = exports.QueryMethod = exports.DynamicMethod = exports.VSRepoAdapterError = exports.VSRepoError = exports.VSRepoAdapter = exports.VSRepository = void 0;
3
+ exports.VSLogger = exports.withDb = exports.AdapterErrorCode = exports.TransactionIsolationLevel = exports.VSLogLevel = exports.VSRepoErrorType = exports.QueryMethod = exports.DynamicMethod = exports.DbArg = exports.VSRepoAdapterError = exports.VSRepoError = exports.VSRepoAdapter = exports.VSRepository = void 0;
4
4
  require("reflect-metadata");
5
5
  // Public classes / constructors
6
6
  var VSRepository_js_1 = require("./VSRepository.js");
@@ -11,6 +11,8 @@ var VSRepoError_js_1 = require("./errors/VSRepoError.js");
11
11
  Object.defineProperty(exports, "VSRepoError", { enumerable: true, get: function () { return VSRepoError_js_1.VSRepoError; } });
12
12
  var VSRepoAdapterError_js_1 = require("./errors/VSRepoAdapterError.js");
13
13
  Object.defineProperty(exports, "VSRepoAdapterError", { enumerable: true, get: function () { return VSRepoAdapterError_js_1.VSRepoAdapterError; } });
14
+ var db_arg_util_js_1 = require("./internal/utils/db-arg.util.js");
15
+ Object.defineProperty(exports, "DbArg", { enumerable: true, get: function () { return db_arg_util_js_1.DbArg; } });
14
16
  // Decorators
15
17
  var dynamic_method_decorator_js_1 = require("./decorators/dynamic-method.decorator.js");
16
18
  Object.defineProperty(exports, "DynamicMethod", { enumerable: true, get: function () { return dynamic_method_decorator_js_1.DynamicMethod; } });
@@ -25,6 +27,10 @@ var transaction_isolation_level_enum_js_1 = require("./internal/enums/transactio
25
27
  Object.defineProperty(exports, "TransactionIsolationLevel", { enumerable: true, get: function () { return transaction_isolation_level_enum_js_1.TransactionIsolationLevel; } });
26
28
  var adapter_error_code_enum_js_1 = require("./internal/enums/adapter-error-code.enum.js");
27
29
  Object.defineProperty(exports, "AdapterErrorCode", { enumerable: true, get: function () { return adapter_error_code_enum_js_1.AdapterErrorCode; } });
30
+ // Public functions
31
+ var with_db_util_js_1 = require("./internal/utils/with-db.util.js");
32
+ Object.defineProperty(exports, "withDb", { enumerable: true, get: function () { return with_db_util_js_1.withDb; } });
28
33
  // Internal features
29
34
  var vs_logger_util_js_1 = require("./internal/utils/vs-logger.util.js");
30
35
  Object.defineProperty(exports, "VSLogger", { enumerable: true, get: function () { return vs_logger_util_js_1.VSLogger; } });
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAE1B,gCAAgC;AAChC,qDAAiD;AAAxC,+GAAA,YAAY,OAAA;AACrB,uDAAmD;AAA1C,iHAAA,aAAa,OAAA;AACtB,0DAAsD;AAA7C,6GAAA,WAAW,OAAA;AACpB,wEAAoE;AAA3D,2HAAA,kBAAkB,OAAA;AAC3B,kEAAwD;AAA/C,uGAAA,KAAK,OAAA;AAEd,aAAa;AACb,wFAAyE;AAAhE,4HAAA,aAAa,OAAA;AACtB,oFAAqE;AAA5D,wHAAA,WAAW,OAAA;AAEpB,eAAe;AACf,wFAA6E;AAApE,4HAAA,eAAe,OAAA;AACxB,8EAAmE;AAA1D,kHAAA,UAAU,OAAA;AACnB,4GAAiG;AAAxF,gJAAA,yBAAyB,OAAA;AAClC,0FAA+E;AAAtE,8HAAA,gBAAgB,OAAA;AAEzB,mBAAmB;AACnB,oEAA0D;AAAjD,yGAAA,MAAM,OAAA;AAoCf,oBAAoB;AACpB,wEAA8D;AAArD,6GAAA,QAAQ,OAAA"}
@@ -2,3 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DEBUG_ARG_SYMBOL = void 0;
4
4
  exports.DEBUG_ARG_SYMBOL = Symbol("DEBUG_ARG_SYMBOL");
5
+ //# sourceMappingURL=debug-arg-symbol.constant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-arg-symbol.constant.js","sourceRoot":"","sources":["../../../src/internal/constants/debug-arg-symbol.constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC"}
@@ -2,3 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DYNAMIC_METHODS_KEY = void 0;
4
4
  exports.DYNAMIC_METHODS_KEY = Symbol("dynamic-methods-key");
5
+ //# sourceMappingURL=dynamic-methods-key.constant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-methods-key.constant.js","sourceRoot":"","sources":["../../../src/internal/constants/dynamic-methods-key.constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC"}
@@ -2,3 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.QUERY_METHODS_KEY = void 0;
4
4
  exports.QUERY_METHODS_KEY = Symbol("query-methods-key");
5
+ //# sourceMappingURL=query-methods-key.constant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-methods-key.constant.js","sourceRoot":"","sources":["../../../src/internal/constants/query-methods-key.constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC"}
@@ -127,3 +127,4 @@ var AdapterErrorCode;
127
127
  */
128
128
  AdapterErrorCode["INTERNAL"] = "INTERNAL";
129
129
  })(AdapterErrorCode || (exports.AdapterErrorCode = AdapterErrorCode = {}));
130
+ //# sourceMappingURL=adapter-error-code.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-error-code.enum.js","sourceRoot":"","sources":["../../../src/internal/enums/adapter-error-code.enum.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,IAAY,gBAqJX;AArJD,WAAY,gBAAgB;IACxB;;;OAGG;IACH,uCAAmB,CAAA;IAEnB;;;OAGG;IACH,2DAAuC,CAAA;IAEvC;;;OAGG;IACH,2DAAuC,CAAA;IAEvC;;;OAGG;IACH,2EAAuD,CAAA;IAEvD;;;OAGG;IACH,uCAAmB,CAAA;IAEnB;;;OAGG;IACH,+EAA2D,CAAA;IAE3D,sEAAsE;IACtE,mEAA+C,CAAA;IAE/C,0CAA0C;IAC1C,6DAAyC,CAAA;IAEzC,uCAAuC;IACvC,uDAAmC,CAAA;IAEnC,mFAAmF;IACnF,iEAA6C,CAAA;IAE7C,oFAAoF;IACpF,2CAAuB,CAAA;IAEvB;;;OAGG;IACH,iDAA6B,CAAA;IAE7B;;OAEG;IACH,qDAAiC,CAAA;IAEjC;;;OAGG;IACH,yDAAqC,CAAA;IAErC,8DAA8D;IAC9D,mDAA+B,CAAA;IAE/B,2DAA2D;IAC3D,2EAAuD,CAAA;IAEvD;;;OAGG;IACH,yCAAqB,CAAA;IAErB,wEAAwE;IACxE,iDAA6B,CAAA;IAE7B,mDAAmD;IACnD,qCAAiB,CAAA;IAEjB,+EAA+E;IAC/E,mDAA+B,CAAA;IAE/B,oEAAoE;IACpE,+DAA2C,CAAA;IAE3C,uFAAuF;IACvF,uDAAmC,CAAA;IAEnC;;;OAGG;IACH,uDAAmC,CAAA;IAEnC;;;OAGG;IACH,uDAAmC,CAAA;IAEnC,iEAAiE;IACjE,6DAAyC,CAAA;IAEzC,oFAAoF;IACpF,+EAA2D,CAAA;IAE3D,yFAAyF;IACzF,iEAA6C,CAAA;IAE7C,qEAAqE;IACrE,uEAAmD,CAAA;IAEnD;;;OAGG;IACH,2DAAuC,CAAA;IAEvC;;;OAGG;IACH,uDAAmC,CAAA;IAEnC;;;OAGG;IACH,mDAA+B,CAAA;IAE/B;;;OAGG;IACH,qEAAiD,CAAA;IAEjD;;;OAGG;IACH,yCAAqB,CAAA;AACzB,CAAC,EArJW,gBAAgB,gCAAhB,gBAAgB,QAqJ3B"}