@koalarx/nest 1.18.4 → 1.18.6
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/core/constants/query-params.d.ts +1 -1
- package/core/controllers/pagination.request.d.ts +1 -1
- package/core/database/repository.base.d.ts +2 -2
- package/core/database/repository.base.js +6 -4
- package/core/dtos/pagination.dto.d.ts +1 -1
- package/core/mapping/auto-mapping-list.d.ts +1 -0
- package/core/mapping/auto-mapping-list.js +19 -7
- package/package.json +1 -1
- package/test/utils/create-e2e-database.d.ts +1 -1
- package/test/utils/create-e2e-database.js +23 -2
- package/test/utils/drop-e2e-database.d.ts +1 -1
- package/test/utils/drop-e2e-database.js +25 -9
- package/tsconfig.lib.tsbuildinfo +1 -1
|
@@ -26,8 +26,8 @@ export declare abstract class RepositoryBase<TEntity extends EntityBase<TEntity>
|
|
|
26
26
|
protected findMany<T>(where: T, pagination?: PaginationDto): Promise<TEntity[]>;
|
|
27
27
|
protected findManyAndCount<T>(where: T, pagination?: PaginationDto): Promise<ListResponse<TEntity>>;
|
|
28
28
|
protected saveChanges<TWhere = any>(entity: TEntity, updateWhere?: TWhere): Promise<TEntity>;
|
|
29
|
-
protected remove<TWhere = any>(where: TWhere, externalServices?: Promise<any>): Promise<any>;
|
|
30
|
-
protected removeMany<TWhere = any>(where: TWhere, externalServices?: Promise<any>): Promise<void>;
|
|
29
|
+
protected remove<TWhere = any>(where: TWhere, externalServices?: Promise<any>, notCascadeEntityProps?: Array<keyof TEntity>): Promise<any>;
|
|
30
|
+
protected removeMany<TWhere = any>(where: TWhere, externalServices?: Promise<any>, notCascadeEntityProps?: Array<keyof TEntity>): Promise<void>;
|
|
31
31
|
private listToRelationActionList;
|
|
32
32
|
private entityToPrisma;
|
|
33
33
|
private context;
|
|
@@ -98,14 +98,15 @@ class RepositoryBase {
|
|
|
98
98
|
})).then(() => this.findFirst(where));
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
|
-
async remove(where, externalServices) {
|
|
101
|
+
async remove(where, externalServices, notCascadeEntityProps) {
|
|
102
102
|
const entity = await this.findUnique(where);
|
|
103
103
|
if (!entity) {
|
|
104
104
|
throw new Error(`Entity not found for where: ${JSON.stringify(where)}`);
|
|
105
105
|
}
|
|
106
106
|
const relationEntity = [];
|
|
107
107
|
Object.keys(entity).forEach((key) => {
|
|
108
|
-
if (entity[key] instanceof entity_base_1.EntityBase
|
|
108
|
+
if (entity[key] instanceof entity_base_1.EntityBase &&
|
|
109
|
+
!notCascadeEntityProps?.includes(key)) {
|
|
109
110
|
relationEntity.push(entity[key]);
|
|
110
111
|
}
|
|
111
112
|
});
|
|
@@ -115,7 +116,7 @@ class RepositoryBase {
|
|
|
115
116
|
.delete({ where })
|
|
116
117
|
.then((response) => Promise.all(relationEntity.map((entity) => this.orphanRemoval(client, entity))).then(() => response))));
|
|
117
118
|
}
|
|
118
|
-
async removeMany(where, externalServices) {
|
|
119
|
+
async removeMany(where, externalServices, notCascadeEntityProps) {
|
|
119
120
|
const entities = await this.findMany(where);
|
|
120
121
|
if (entities.length === 0) {
|
|
121
122
|
throw new Error(`Entities not found for where: ${JSON.stringify(where)}`);
|
|
@@ -126,7 +127,8 @@ class RepositoryBase {
|
|
|
126
127
|
const relationEntity = [];
|
|
127
128
|
for (const entity of entities) {
|
|
128
129
|
Object.keys(entity).forEach((key) => {
|
|
129
|
-
if (entity[key] instanceof entity_base_1.EntityBase
|
|
130
|
+
if (entity[key] instanceof entity_base_1.EntityBase &&
|
|
131
|
+
!notCascadeEntityProps?.includes(key)) {
|
|
130
132
|
relationEntity.push(entity[key]);
|
|
131
133
|
}
|
|
132
134
|
});
|
|
@@ -10,6 +10,7 @@ interface AutoMappingGetContext {
|
|
|
10
10
|
export declare class AutoMappingList {
|
|
11
11
|
private static _mappedPropList;
|
|
12
12
|
private static _mappingProfileList;
|
|
13
|
+
private static initializeLists;
|
|
13
14
|
static add(source: Type<any>, target: Type<any>, ...forMember: ForMemberDefinition<any, any>): void;
|
|
14
15
|
static get(source: Type<any>, target: Type<any>): AutoMappingGetContext;
|
|
15
16
|
static getSourceByName(sourceName: string): Type<any> | undefined;
|
|
@@ -6,9 +6,18 @@ const auto_mapping_class_context_1 = require("./auto-mapping-class-context");
|
|
|
6
6
|
const auto_mapping_context_1 = require("./auto-mapping-context");
|
|
7
7
|
const find_on_list_1 = require("../utils/find-on-list");
|
|
8
8
|
class AutoMappingList {
|
|
9
|
-
static _mappedPropList
|
|
10
|
-
static _mappingProfileList
|
|
9
|
+
static _mappedPropList;
|
|
10
|
+
static _mappingProfileList;
|
|
11
|
+
static initializeLists() {
|
|
12
|
+
if (!this._mappedPropList) {
|
|
13
|
+
this._mappedPropList = new list_1.List(auto_mapping_class_context_1.AutoMappingClassContext);
|
|
14
|
+
}
|
|
15
|
+
if (!this._mappingProfileList) {
|
|
16
|
+
this._mappingProfileList = new list_1.List(auto_mapping_context_1.AutoMappingContext);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
11
19
|
static add(source, target, ...forMember) {
|
|
20
|
+
this.initializeLists();
|
|
12
21
|
this._mappingProfileList.add(new auto_mapping_context_1.AutoMappingContext(source, target, forMember));
|
|
13
22
|
this._mappedPropList.add(new auto_mapping_class_context_1.AutoMappingClassContext(source));
|
|
14
23
|
this._mappedPropList.add(new auto_mapping_class_context_1.AutoMappingClassContext(target));
|
|
@@ -16,6 +25,7 @@ class AutoMappingList {
|
|
|
16
25
|
this.addExtendedPropsIntoSubClass(target);
|
|
17
26
|
}
|
|
18
27
|
static get(source, target) {
|
|
28
|
+
this.initializeLists();
|
|
19
29
|
return {
|
|
20
30
|
mapContext: (0, find_on_list_1.findOnList)(this._mappingProfileList, (mp) => mp.source.name === source.name && mp.target.name === target.name, (mp) => Object.getPrototypeOf(mp.source.prototype.constructor) === source &&
|
|
21
31
|
mp.target.name === target.name),
|
|
@@ -24,22 +34,23 @@ class AutoMappingList {
|
|
|
24
34
|
};
|
|
25
35
|
}
|
|
26
36
|
static getSourceByName(sourceName) {
|
|
37
|
+
this.initializeLists();
|
|
27
38
|
return this._mappedPropList.find((mp) => mp.source.name === sourceName)
|
|
28
39
|
?.source;
|
|
29
40
|
}
|
|
30
41
|
static getPropDefinitions(source, propName) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
?.props.find((prop) => prop.name === propName);
|
|
42
|
+
this.initializeLists();
|
|
43
|
+
return this._mappedPropList.find((mp) => mp.source.name === source.name)?.props.find((prop) => prop.name === propName);
|
|
34
44
|
}
|
|
35
45
|
static getTargets(source) {
|
|
36
|
-
|
|
37
|
-
|
|
46
|
+
this.initializeLists();
|
|
47
|
+
return this._mappingProfileList.filter((mp) => mp.source.name === source.name ||
|
|
38
48
|
Object.getPrototypeOf(mp.source.prototype.constructor) === source)
|
|
39
49
|
.map((mp) => mp.target)
|
|
40
50
|
.toArray();
|
|
41
51
|
}
|
|
42
52
|
static addMappedProp(source, propName) {
|
|
53
|
+
this.initializeLists();
|
|
43
54
|
let mappedClass = this._mappedPropList.find((mp) => mp.source.name === source.name);
|
|
44
55
|
if (!mappedClass) {
|
|
45
56
|
mappedClass = new auto_mapping_class_context_1.AutoMappingClassContext(source);
|
|
@@ -61,6 +72,7 @@ class AutoMappingList {
|
|
|
61
72
|
});
|
|
62
73
|
}
|
|
63
74
|
static addExtendedPropsIntoSubClass(source) {
|
|
75
|
+
this.initializeLists();
|
|
64
76
|
const mappedExtendedClass = this._mappedPropList.find((mp) => mp.source === Object.getPrototypeOf(source.prototype.constructor));
|
|
65
77
|
if (mappedExtendedClass) {
|
|
66
78
|
const mappedClass = this._mappedPropList.find((mp) => mp.source.name === source.name);
|
package/package.json
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import 'dotenv/config';
|
|
2
|
-
export declare function createE2EDatabase():
|
|
2
|
+
export declare function createE2EDatabase(runtime?: 'node' | 'bun'): Promise<`${string}-${string}-${string}-${string}-${string}`>;
|
|
@@ -4,6 +4,7 @@ exports.createE2EDatabase = createE2EDatabase;
|
|
|
4
4
|
require("dotenv/config");
|
|
5
5
|
const node_child_process_1 = require("node:child_process");
|
|
6
6
|
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const pg_1 = require("pg");
|
|
7
8
|
function generateUniqueDatabaseURL() {
|
|
8
9
|
const schemaId = (0, node_crypto_1.randomUUID)();
|
|
9
10
|
if (!process.env.DATABASE_URL) {
|
|
@@ -16,11 +17,31 @@ function generateUniqueDatabaseURL() {
|
|
|
16
17
|
schemaId,
|
|
17
18
|
};
|
|
18
19
|
}
|
|
19
|
-
function createE2EDatabase() {
|
|
20
|
+
async function createE2EDatabase(runtime = 'node') {
|
|
20
21
|
const { url, schemaId } = generateUniqueDatabaseURL();
|
|
21
22
|
process.env.DATABASE_URL = url;
|
|
22
23
|
process.env.DIRECT_URL = url;
|
|
23
24
|
process.env.PRISMA_SCHEMA_DISABLE_ADVISORY_LOCK = 'true';
|
|
24
|
-
|
|
25
|
+
try {
|
|
26
|
+
const baseUrl = new URL(process.env.DATABASE_URL);
|
|
27
|
+
baseUrl.pathname = '/postgres';
|
|
28
|
+
const pool = new pg_1.Pool({ connectionString: baseUrl.toString() });
|
|
29
|
+
try {
|
|
30
|
+
await pool.query(`CREATE DATABASE "${schemaId}"`);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
await pool.end();
|
|
34
|
+
}
|
|
35
|
+
const env = { ...process.env, DATABASE_URL: url, DIRECT_URL: url };
|
|
36
|
+
(0, node_child_process_1.execSync)(`${runtime}x prisma migrate deploy`, {
|
|
37
|
+
cwd: process.cwd(),
|
|
38
|
+
env,
|
|
39
|
+
stdio: 'inherit',
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error('Erro ao criar banco de dados e2e:', error);
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
25
46
|
return schemaId;
|
|
26
47
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import 'dotenv/config';
|
|
2
|
-
export declare function dropE2EDatabase(schemaId: string): Promise<
|
|
2
|
+
export declare function dropE2EDatabase(schemaId: string): Promise<void>;
|
|
@@ -1,17 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.dropE2EDatabase = dropE2EDatabase;
|
|
4
|
-
const adapter_pg_1 = require("@prisma/adapter-pg");
|
|
5
4
|
require("dotenv/config");
|
|
6
5
|
const pg_1 = require("pg");
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
async function dropE2EDatabase(schemaId) {
|
|
7
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
8
|
+
const baseUrl = new URL(process.env.DATABASE_URL || '');
|
|
9
|
+
baseUrl.pathname = '/postgres';
|
|
9
10
|
const pool = new pg_1.Pool({
|
|
10
|
-
connectionString:
|
|
11
|
+
connectionString: baseUrl.toString(),
|
|
12
|
+
idleTimeoutMillis: 100,
|
|
11
13
|
});
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
try {
|
|
15
|
+
await pool.query(`
|
|
16
|
+
SELECT pg_terminate_backend(pg_stat_activity.pid)
|
|
17
|
+
FROM pg_stat_activity
|
|
18
|
+
WHERE pg_stat_activity.datname = '${schemaId}'
|
|
19
|
+
AND pid <> pg_backend_pid()
|
|
20
|
+
`);
|
|
21
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
22
|
+
await pool.query(`DROP DATABASE IF EXISTS "${schemaId}"`);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
try {
|
|
28
|
+
await pool.end();
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
}
|
|
32
|
+
}
|
|
17
33
|
}
|