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.
- package/README.md +54 -10
- package/README.pt-BR.md +54 -10
- package/dist/VSRepoAdapter.js +1 -0
- package/dist/VSRepoAdapter.js.map +1 -0
- package/dist/VSRepository.d.ts +9 -6
- package/dist/VSRepository.js +14 -1
- package/dist/VSRepository.js.map +1 -0
- package/dist/decorators/dynamic-method.decorator.js +1 -0
- package/dist/decorators/dynamic-method.decorator.js.map +1 -0
- package/dist/decorators/query-method.decorator.d.ts +26 -3
- package/dist/decorators/query-method.decorator.js +26 -2
- package/dist/decorators/query-method.decorator.js.map +1 -0
- package/dist/errors/VSRepoAdapterError.js +1 -0
- package/dist/errors/VSRepoAdapterError.js.map +1 -0
- package/dist/errors/VSRepoError.js +1 -0
- package/dist/errors/VSRepoError.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -0
- package/dist/internal/constants/debug-arg-symbol.constant.js +1 -0
- package/dist/internal/constants/debug-arg-symbol.constant.js.map +1 -0
- package/dist/internal/constants/dynamic-methods-key.constant.js +1 -0
- package/dist/internal/constants/dynamic-methods-key.constant.js.map +1 -0
- package/dist/internal/constants/query-methods-key.constant.js +1 -0
- package/dist/internal/constants/query-methods-key.constant.js.map +1 -0
- package/dist/internal/enums/adapter-error-code.enum.js +1 -0
- package/dist/internal/enums/adapter-error-code.enum.js.map +1 -0
- package/dist/internal/enums/transaction-isolation-level.enum.js +1 -0
- package/dist/internal/enums/transaction-isolation-level.enum.js.map +1 -0
- package/dist/internal/enums/vs-log-level.enum.js +1 -0
- package/dist/internal/enums/vs-log-level.enum.js.map +1 -0
- package/dist/internal/enums/vsrepo-error-type.enum.d.ts +1 -1
- package/dist/internal/enums/vsrepo-error-type.enum.js +2 -1
- package/dist/internal/enums/vsrepo-error-type.enum.js.map +1 -0
- package/dist/internal/resolvers/dynamic-methods.resolver.js +33 -6
- package/dist/internal/resolvers/dynamic-methods.resolver.js.map +1 -0
- package/dist/internal/resolvers/merge-wheres.resolver.js +1 -0
- package/dist/internal/resolvers/merge-wheres.resolver.js.map +1 -0
- package/dist/internal/utils/db-arg.util.d.ts +15 -0
- package/dist/internal/utils/db-arg.util.js +23 -0
- package/dist/internal/utils/db-arg.util.js.map +1 -0
- package/dist/internal/utils/uncapitalize.util.js +1 -0
- package/dist/internal/utils/uncapitalize.util.js.map +1 -0
- package/dist/internal/utils/vs-logger.util.js +1 -0
- package/dist/internal/utils/vs-logger.util.js.map +1 -0
- package/dist/internal/utils/with-db.util.d.ts +19 -0
- package/dist/internal/utils/with-db.util.js +24 -0
- package/dist/internal/utils/with-db.util.js.map +1 -0
- package/dist/internal/validators/decorators.validator.js +3 -0
- package/dist/internal/validators/decorators.validator.js.map +1 -0
- package/dist/internal/validators/schemas/ordering.schema.js +1 -0
- package/dist/internal/validators/schemas/ordering.schema.js.map +1 -0
- package/dist/internal/validators/schemas/pagination.schema.js +1 -0
- package/dist/internal/validators/schemas/pagination.schema.js.map +1 -0
- package/dist/internal/validators/schemas/where.schema.js +1 -0
- package/dist/internal/validators/schemas/where.schema.js.map +1 -0
- package/dist/internal/validators/vsrepo.validator.d.ts +1 -1
- package/dist/internal/validators/vsrepo.validator.js +2 -0
- package/dist/internal/validators/vsrepo.validator.js.map +1 -0
- package/dist/types/adapter/adapter-method-options.type.js +1 -0
- package/dist/types/adapter/adapter-method-options.type.js.map +1 -0
- package/dist/types/adapter/adapter-query-options.type.js +1 -0
- package/dist/types/adapter/adapter-query-options.type.js.map +1 -0
- package/dist/types/decorators/dynamic-method-options.type.js +1 -0
- package/dist/types/decorators/dynamic-method-options.type.js.map +1 -0
- package/dist/types/decorators/query-method-options.type.d.ts +35 -1
- package/dist/types/decorators/query-method-options.type.js +1 -0
- package/dist/types/decorators/query-method-options.type.js.map +1 -0
- package/dist/types/dynamic-methods/dynamic-method-customization.type.js +1 -0
- package/dist/types/dynamic-methods/dynamic-method-customization.type.js.map +1 -0
- package/dist/types/dynamic-methods/dynamic-method-info.type.js +1 -0
- package/dist/types/dynamic-methods/dynamic-method-info.type.js.map +1 -0
- package/dist/types/dynamic-methods/dynamic-method-where-ops.type.js +1 -0
- package/dist/types/dynamic-methods/dynamic-method-where-ops.type.js.map +1 -0
- package/dist/types/utils/count-result.type.js +1 -0
- package/dist/types/utils/count-result.type.js.map +1 -0
- package/dist/types/utils/decimal-like.type.js +1 -0
- package/dist/types/utils/decimal-like.type.js.map +1 -0
- package/dist/types/utils/deep-partial.type.js +1 -0
- package/dist/types/utils/deep-partial.type.js.map +1 -0
- package/dist/types/utils/keys-of-type.type.js +1 -0
- package/dist/types/utils/keys-of-type.type.js.map +1 -0
- package/dist/types/utils/methods-options.type.js +1 -0
- package/dist/types/utils/methods-options.type.js.map +1 -0
- package/dist/types/utils/numeric-keys.type.js +1 -0
- package/dist/types/utils/numeric-keys.type.js.map +1 -0
- package/dist/types/utils/numeric-like.type.js +1 -0
- package/dist/types/utils/numeric-like.type.js.map +1 -0
- package/dist/types/utils/ordering.type.js +1 -0
- package/dist/types/utils/ordering.type.js.map +1 -0
- package/dist/types/utils/pagination.type.js +1 -0
- package/dist/types/utils/pagination.type.js.map +1 -0
- package/dist/types/utils/perform-data.type.js +1 -0
- package/dist/types/utils/perform-data.type.js.map +1 -0
- package/dist/types/utils/primitive.type.js +1 -0
- package/dist/types/utils/primitive.type.js.map +1 -0
- package/dist/types/utils/query-args.type.d.ts +30 -0
- package/dist/types/utils/query-args.type.js +3 -0
- package/dist/types/utils/query-args.type.js.map +1 -0
- package/dist/types/utils/query-method-arg.type.d.ts +3 -2
- package/dist/types/utils/query-method-arg.type.js +1 -0
- package/dist/types/utils/query-method-arg.type.js.map +1 -0
- package/dist/types/utils/restrict-method-options.type.js +1 -0
- package/dist/types/utils/restrict-method-options.type.js.map +1 -0
- package/dist/types/utils/see-mode.type.js +1 -0
- package/dist/types/utils/see-mode.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-args.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-args.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-method.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-method.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-options.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-options.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-orm-types.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-orm-types.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-pretty-where.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-pretty-where.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-query-options.type.d.ts +14 -0
- package/dist/types/vsrepo/vsrepo-query-options.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-query-options.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-query.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-query.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-relations.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-relations.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-resolve-args-data.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-resolve-args-data.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-select.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-select.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-transaction-options.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-transaction-options.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-ugly-where.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-ugly-where.type.js.map +1 -0
- package/dist/types/vsrepo/vsrepo-where.type.js +1 -0
- package/dist/types/vsrepo/vsrepo-where.type.js.map +1 -0
- 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
|
|
605
|
-
|
|
|
606
|
-
| `modifying`
|
|
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
|
|
630
|
-
|
|
|
631
|
-
| `args`
|
|
632
|
-
| `db`
|
|
633
|
-
| `modifying`
|
|
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
|
|
605
|
-
|
|
|
606
|
-
| `modifying`
|
|
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
|
|
630
|
-
|
|
|
631
|
-
| `args`
|
|
632
|
-
| `db`
|
|
633
|
-
| `modifying`
|
|
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
|
|
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`. |
|
package/dist/VSRepoAdapter.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VSRepoAdapter.js","sourceRoot":"","sources":["../src/VSRepoAdapter.ts"],"names":[],"mappings":";;;AAQA;;;;;;;;;;;GAWG;AACH,MAAsB,aAAa;CAyMlC;AAzMD,sCAyMC"}
|
package/dist/VSRepository.d.ts
CHANGED
|
@@ -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>;
|
package/dist/VSRepository.js
CHANGED
|
@@ -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
|
|
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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"}
|
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -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"}
|