@hichchi/nest-crud 0.0.2 → 0.0.4
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/CHANGELOG.md +36 -12
- package/README.md +2475 -2085
- package/base/base-entity-extension.js +10 -6
- package/base/base-entity-extension.js.map +1 -1
- package/base/base-entity.js +47 -43
- package/base/base-entity.js.map +1 -1
- package/base/base-repository.js +16 -12
- package/base/base-repository.js.map +1 -1
- package/base/base-user.entity.js +85 -81
- package/base/base-user.entity.js.map +1 -1
- package/base/index.js +7 -4
- package/base/index.js.map +1 -1
- package/constants.js +10 -7
- package/constants.js.map +1 -1
- package/crud.module.js +29 -26
- package/crud.module.js.map +1 -1
- package/decorators/entity-extension.decorator.js +20 -17
- package/decorators/entity-extension.decorator.js.map +1 -1
- package/decorators/entity.decorator.js +30 -27
- package/decorators/entity.decorator.js.map +1 -1
- package/decorators/filter.decorator.js +8 -5
- package/decorators/filter.decorator.js.map +1 -1
- package/decorators/index.js +11 -8
- package/decorators/index.js.map +1 -1
- package/decorators/join-column.decorator.js +11 -8
- package/decorators/join-column.decorator.js.map +1 -1
- package/decorators/page.decorator.js +8 -5
- package/decorators/page.decorator.js.map +1 -1
- package/decorators/repository.decorator.js +14 -11
- package/decorators/repository.decorator.js.map +1 -1
- package/decorators/search.decorator.js +8 -5
- package/decorators/search.decorator.js.map +1 -1
- package/decorators/sort.decorator.js +8 -5
- package/decorators/sort.decorator.js.map +1 -1
- package/dtos/bulk-delete.dto.js +15 -12
- package/dtos/bulk-delete.dto.js.map +1 -1
- package/dtos/bulk-update.dto.js +18 -15
- package/dtos/bulk-update.dto.js.map +1 -1
- package/dtos/ids.dto.js +15 -12
- package/dtos/ids.dto.js.map +1 -1
- package/dtos/index.js +5 -2
- package/dtos/index.js.map +1 -1
- package/enums/crud.enums.js +7 -4
- package/enums/crud.enums.js.map +1 -1
- package/enums/index.js +4 -1
- package/enums/index.js.map +1 -1
- package/enums/metadata-keys.enum.js +5 -2
- package/enums/metadata-keys.enum.js.map +1 -1
- package/exceptions/index.js +4 -1
- package/exceptions/index.js.map +1 -1
- package/exceptions/typeorm.exception.js +9 -4
- package/exceptions/typeorm.exception.js.map +1 -1
- package/index.js +19 -12
- package/index.js.map +1 -1
- package/interfaces/connection-options.interface.js +2 -1
- package/interfaces/crud-options.interfaces.js +2 -1
- package/interfaces/index.js +5 -2
- package/interfaces/index.js.map +1 -1
- package/package.json +7 -6
- package/readme-top.md +1 -5
- package/responses/crud.error.responses.js +31 -28
- package/responses/crud.error.responses.js.map +1 -1
- package/responses/crud.success.responses.js +24 -21
- package/responses/crud.success.responses.js.map +1 -1
- package/responses/index.js +5 -2
- package/responses/index.js.map +1 -1
- package/services/crud.service.js +43 -39
- package/services/crud.service.js.map +1 -1
- package/services/index.js +4 -1
- package/services/index.js.map +1 -1
- package/tokens.js +5 -2
- package/tokens.js.map +1 -1
- package/types/database.types.d.ts +1 -1
- package/types/database.types.js +2 -1
- package/types/decorator.types.js +2 -1
- package/types/decorator.types.js.map +1 -1
- package/types/entity-option-unique.js +2 -1
- package/types/error-handler.type.js +2 -1
- package/types/filter-options.type.js +2 -1
- package/types/find-conditions.type.js +2 -1
- package/types/index.js +11 -8
- package/types/index.js.map +1 -1
- package/types/repository-decorator.type.js +2 -1
- package/types/sort-options.type.js +2 -1
- package/utils/entity.utils.js +46 -42
- package/utils/entity.utils.js.map +1 -1
- package/utils/http.utils.js +11 -6
- package/utils/http.utils.js.map +1 -1
- package/utils/index.js +5 -2
- package/utils/index.js.map +1 -1
- package/utils/repository.utils.js +12 -7
- package/utils/repository.utils.js.map +1 -1
package/crud.module.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
// noinspection JSUnusedGlobalSymbols
|
|
2
3
|
var HichchiCrudModule_1;
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.HichchiCrudModule = void 0;
|
|
6
|
+
const tslib_1 = require("tslib");
|
|
7
|
+
const common_1 = require("@nestjs/common");
|
|
8
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
9
|
+
const tokens_1 = require("./tokens");
|
|
10
|
+
const utils_1 = require("./utils");
|
|
11
|
+
const base_1 = require("./base");
|
|
12
|
+
const nest_core_1 = require("@hichchi/nest-core");
|
|
13
|
+
const nest_connector_1 = require("@hichchi/nest-connector");
|
|
11
14
|
/**
|
|
12
15
|
* Module for integrating TypeORM with NestJS and providing CRUD functionality
|
|
13
16
|
*
|
|
@@ -73,30 +76,30 @@ let HichchiCrudModule = HichchiCrudModule_1 = class HichchiCrudModule {
|
|
|
73
76
|
return {
|
|
74
77
|
module: HichchiCrudModule_1,
|
|
75
78
|
imports: [
|
|
76
|
-
TypeOrmModule.forRoot({
|
|
79
|
+
typeorm_1.TypeOrmModule.forRoot({
|
|
77
80
|
type: options.type || "mysql",
|
|
78
81
|
host: options.host || "localhost",
|
|
79
|
-
port: options.port || DEFAULT_MYSQL_PORT,
|
|
82
|
+
port: options.port || nest_connector_1.DEFAULT_MYSQL_PORT,
|
|
80
83
|
username: options.username || "root",
|
|
81
84
|
password: options.password || "",
|
|
82
85
|
database: options.database,
|
|
83
86
|
entities: options.entities,
|
|
84
87
|
migrations: options.migrations,
|
|
85
|
-
charset: options.charset || "utf8mb4",
|
|
88
|
+
charset: options.type === "mysql" ? options.charset || "utf8mb4" : undefined,
|
|
86
89
|
extra: {
|
|
87
90
|
charset: options.charset || "utf8mb4",
|
|
88
91
|
},
|
|
89
92
|
synchronize: Boolean(options.synchronize),
|
|
90
|
-
legacySpatialSupport: Boolean(options.legacySpatialSupport),
|
|
93
|
+
legacySpatialSupport: options.type === "mysql" ? Boolean(options.legacySpatialSupport) : undefined,
|
|
91
94
|
autoLoadEntities: options.autoLoadEntities === undefined ? true : options.autoLoadEntities,
|
|
92
95
|
}),
|
|
93
96
|
],
|
|
94
97
|
providers: [
|
|
95
98
|
{
|
|
96
|
-
provide: CONNECTION_OPTIONS,
|
|
99
|
+
provide: tokens_1.CONNECTION_OPTIONS,
|
|
97
100
|
useValue: options,
|
|
98
101
|
},
|
|
99
|
-
EntityUtils,
|
|
102
|
+
utils_1.EntityUtils,
|
|
100
103
|
],
|
|
101
104
|
};
|
|
102
105
|
}
|
|
@@ -128,8 +131,8 @@ let HichchiCrudModule = HichchiCrudModule_1 = class HichchiCrudModule {
|
|
|
128
131
|
this.validateEntities(entities);
|
|
129
132
|
return {
|
|
130
133
|
module: HichchiCrudModule_1,
|
|
131
|
-
imports: [TypeOrmModule.forFeature(entities)],
|
|
132
|
-
exports: [TypeOrmModule],
|
|
134
|
+
imports: [typeorm_1.TypeOrmModule.forFeature(entities)],
|
|
135
|
+
exports: [typeorm_1.TypeOrmModule],
|
|
133
136
|
};
|
|
134
137
|
}
|
|
135
138
|
/**
|
|
@@ -162,7 +165,7 @@ let HichchiCrudModule = HichchiCrudModule_1 = class HichchiCrudModule {
|
|
|
162
165
|
option = "migrations";
|
|
163
166
|
}
|
|
164
167
|
if (option) {
|
|
165
|
-
throw new ImplementationException("Missing connection option", `Connection option '${option}' cannot be empty in HichchiCrudModule.forRoot()'.`, `Please provide a valid value for the '${option}' connection option.`);
|
|
168
|
+
throw new nest_core_1.ImplementationException("Missing connection option", `Connection option '${option}' cannot be empty in HichchiCrudModule.forRoot()'.`, `Please provide a valid value for the '${option}' connection option.`);
|
|
166
169
|
}
|
|
167
170
|
return true;
|
|
168
171
|
}
|
|
@@ -189,21 +192,21 @@ let HichchiCrudModule = HichchiCrudModule_1 = class HichchiCrudModule {
|
|
|
189
192
|
*/
|
|
190
193
|
static validateEntities(entities) {
|
|
191
194
|
for (const entity of entities) {
|
|
192
|
-
if (!hichchiMetadata().isHichchiEntity(entity)) {
|
|
193
|
-
throw new ImplementationException("Invalid entity", `'${entity.name}' must be decorated with '@HichchiEntity()'.`);
|
|
195
|
+
if (!(0, nest_core_1.hichchiMetadata)().isHichchiEntity(entity)) {
|
|
196
|
+
throw new nest_core_1.ImplementationException("Invalid entity", `'${entity.name}' must be decorated with '@HichchiEntity()'.`);
|
|
194
197
|
}
|
|
195
|
-
if (Object.getPrototypeOf(entity) !== BaseEntity &&
|
|
196
|
-
Object.getPrototypeOf(entity) !== BaseEntityExtension &&
|
|
197
|
-
Object.getPrototypeOf(entity) !== HichchiUserEntity) {
|
|
198
|
-
throw new ImplementationException("Invalid entity", `'${entity.name}' must extend 'BaseEntity' or 'BaseEntityExtension' or 'HichchiUserEntity'.`);
|
|
198
|
+
if (Object.getPrototypeOf(entity) !== base_1.BaseEntity &&
|
|
199
|
+
Object.getPrototypeOf(entity) !== base_1.BaseEntityExtension &&
|
|
200
|
+
Object.getPrototypeOf(entity) !== base_1.HichchiUserEntity) {
|
|
201
|
+
throw new nest_core_1.ImplementationException("Invalid entity", `'${entity.name}' must extend 'BaseEntity' or 'BaseEntityExtension' or 'HichchiUserEntity'.`);
|
|
199
202
|
}
|
|
200
203
|
}
|
|
201
204
|
}
|
|
202
205
|
};
|
|
203
|
-
HichchiCrudModule =
|
|
204
|
-
|
|
206
|
+
exports.HichchiCrudModule = HichchiCrudModule;
|
|
207
|
+
exports.HichchiCrudModule = HichchiCrudModule = HichchiCrudModule_1 = tslib_1.__decorate([
|
|
208
|
+
(0, common_1.Module)({})
|
|
205
209
|
], HichchiCrudModule);
|
|
206
|
-
export { HichchiCrudModule };
|
|
207
210
|
// TODO: need to update doc to say install `@nestjs/cache-manager, @keyv/redis, cacheable` to use cache
|
|
208
211
|
// TODO: winston, @nestjs/axios, @nestjs/passport, passport-jwt, bcrypt, @nestjs/jwt, passport-local, passport-google-oauth2
|
|
209
212
|
//# sourceMappingURL=crud.module.js.map
|
package/crud.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud.module.js","sourceRoot":"","sources":["../../../libs/nest-crud/src/crud.module.ts"],"names":[],"mappings":"AAAA,qCAAqC
|
|
1
|
+
{"version":3,"file":"crud.module.js","sourceRoot":"","sources":["../../../libs/nest-crud/src/crud.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
// noinspection JSUnusedGlobalSymbols
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.HichchiEntityExtension = HichchiEntityExtension;
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const constants_1 = require("../constants");
|
|
7
|
+
const base_1 = require("../base");
|
|
8
|
+
const nest_core_1 = require("@hichchi/nest-core");
|
|
9
|
+
const metadata_keys_enum_1 = require("../enums/metadata-keys.enum");
|
|
7
10
|
/**
|
|
8
11
|
* Decorator for creating entity extensions with enhanced validation
|
|
9
12
|
*
|
|
@@ -47,37 +50,37 @@ import { MetadataKeys } from "../enums/metadata-keys.enum";
|
|
|
47
50
|
* @see {@link HichchiJoinColumn} The decorator required for entity relationships
|
|
48
51
|
* @see {@link HichchiEntity} The decorator for standard entities with full audit tracking
|
|
49
52
|
*/
|
|
50
|
-
|
|
53
|
+
function HichchiEntityExtension(tableName) {
|
|
51
54
|
return function (target) {
|
|
52
|
-
if (!(target.prototype instanceof BaseEntityExtension)) {
|
|
53
|
-
throw new ImplementationException(`Extension entities must extend BaseEntityExtension: '${target.name}'`, `@HichchiEntityExtension("${tableName}") was used on a class that does not extend BaseEntityExtension.`, "Add `extends BaseEntityExtension` to extension entities to ensure proper behavior.");
|
|
55
|
+
if (!(target.prototype instanceof base_1.BaseEntityExtension)) {
|
|
56
|
+
throw new nest_core_1.ImplementationException(`Extension entities must extend BaseEntityExtension: '${target.name}'`, `@HichchiEntityExtension("${tableName}") was used on a class that does not extend BaseEntityExtension.`, "Add `extends BaseEntityExtension` to extension entities to ensure proper behavior.");
|
|
54
57
|
}
|
|
55
|
-
Entity(tableName)(target);
|
|
56
|
-
const metadataArgs = getMetadataArgsStorage();
|
|
58
|
+
(0, typeorm_1.Entity)(tableName)(target);
|
|
59
|
+
const metadataArgs = (0, typeorm_1.getMetadataArgsStorage)();
|
|
57
60
|
// Validate OneToOne relation with an @HichchiEntity
|
|
58
61
|
const oneToOneRelations = metadataArgs.relations.filter(relation => relation.target === target && relation.relationType === "one-to-one");
|
|
59
62
|
if (oneToOneRelations.length === 0) {
|
|
60
|
-
throw new ImplementationException("Missing @OneToOne relation", `No @OneToOne relation defined in @HichchiEntityExtension("${tableName}").`, "HichchiEntityExtension must have a OneToOne relation to an entity decorated with @HichchiEntity.");
|
|
63
|
+
throw new nest_core_1.ImplementationException("Missing @OneToOne relation", `No @OneToOne relation defined in @HichchiEntityExtension("${tableName}").`, "HichchiEntityExtension must have a OneToOne relation to an entity decorated with @HichchiEntity.");
|
|
61
64
|
}
|
|
62
65
|
oneToOneRelations.forEach(relation => {
|
|
63
66
|
const joinColumns = metadataArgs.joinColumns.filter(joinColumn => joinColumn.target === target && joinColumn.propertyName === relation.propertyName);
|
|
64
67
|
if (joinColumns.length === 0) {
|
|
65
|
-
throw new ImplementationException("Missing @HichchiJoinColumn", `Missing @HichchiJoinColumn on OneToOne property '${relation.propertyName}' in @HichchiEntityExtension("${tableName}").`, "Please use @HichchiJoinColumn instead of @JoinColumn for consistent foreign key validation.");
|
|
68
|
+
throw new nest_core_1.ImplementationException("Missing @HichchiJoinColumn", `Missing @HichchiJoinColumn on OneToOne property '${relation.propertyName}' in @HichchiEntityExtension("${tableName}").`, "Please use @HichchiJoinColumn instead of @JoinColumn for consistent foreign key validation.");
|
|
66
69
|
}
|
|
67
70
|
// Validate HichchiJoinColumn usage
|
|
68
71
|
joinColumns.forEach(joinColumn => {
|
|
69
|
-
const isHichchiJoinColumn = Reflect.getMetadata(MetadataKeys.HICHCHI_FOREIGN_KEY, target.prototype, joinColumn.propertyName);
|
|
72
|
+
const isHichchiJoinColumn = Reflect.getMetadata(metadata_keys_enum_1.MetadataKeys.HICHCHI_FOREIGN_KEY, target.prototype, joinColumn.propertyName);
|
|
70
73
|
if (!isHichchiJoinColumn) {
|
|
71
|
-
throw new ImplementationException("Invalid JoinColumn", `@JoinColumn used instead of @HichchiJoinColumn on '${joinColumn.propertyName}' in @HichchiEntityExtension("${tableName}").`, "Use @HichchiJoinColumn to maintain naming and validation consistency.");
|
|
74
|
+
throw new nest_core_1.ImplementationException("Invalid JoinColumn", `@JoinColumn used instead of @HichchiJoinColumn on '${joinColumn.propertyName}' in @HichchiEntityExtension("${tableName}").`, "Use @HichchiJoinColumn to maintain naming and validation consistency.");
|
|
72
75
|
}
|
|
73
76
|
if (joinColumn.foreignKeyConstraintName &&
|
|
74
|
-
!FK_CONSTRAINT_REGEX.test(joinColumn.foreignKeyConstraintName)) {
|
|
75
|
-
throw new ImplementationException(`Invalid foreign key constraint: '${joinColumn.foreignKeyConstraintName}'`, "Foreign key name must follow 'FK_entity_entity' format.", "Ensure constraint names are valid according to the FK naming pattern.");
|
|
77
|
+
!constants_1.FK_CONSTRAINT_REGEX.test(joinColumn.foreignKeyConstraintName)) {
|
|
78
|
+
throw new nest_core_1.ImplementationException(`Invalid foreign key constraint: '${joinColumn.foreignKeyConstraintName}'`, "Foreign key name must follow 'FK_entity_entity' format.", "Ensure constraint names are valid according to the FK naming pattern.");
|
|
76
79
|
}
|
|
77
80
|
});
|
|
78
81
|
});
|
|
79
82
|
// Register in app metadata
|
|
80
|
-
hichchiMetadata().addEntity(target, tableName, []);
|
|
83
|
+
(0, nest_core_1.hichchiMetadata)().addEntity(target, tableName, []);
|
|
81
84
|
};
|
|
82
85
|
}
|
|
83
86
|
// TODO: v2.0 Improve this when have better usage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-extension.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/entity-extension.decorator.ts"],"names":[],"mappings":"AAAA,qCAAqC;
|
|
1
|
+
{"version":3,"file":"entity-extension.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/entity-extension.decorator.ts"],"names":[],"mappings":";AAAA,qCAAqC;;AAqDrC,wDAuEC;AA1HD,qCAAyD;AAEzD,4CAAmD;AACnD,kCAA8C;AAC9C,kDAA8E;AAC9E,oEAA2D;AAG3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,SAAgB,sBAAsB,CAAC,SAAiB;IACpD,OAAO,UAAU,MAAiC;QAC9C,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,YAAY,0BAAmB,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,mCAAuB,CAC7B,wDAAwD,MAAM,CAAC,IAAI,GAAG,EACtE,4BAA4B,SAAS,kEAAkE,EACvG,oFAAoF,CACvF,CAAC;QACN,CAAC;QAED,IAAA,gBAAM,EAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,YAAY,GAAG,IAAA,gCAAsB,GAAE,CAAC;QAE9C,oDAAoD;QACpD,MAAM,iBAAiB,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CACnD,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,YAAY,KAAK,YAAY,CACnF,CAAC;QAEF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,mCAAuB,CAC7B,4BAA4B,EAC5B,6DAA6D,SAAS,KAAK,EAC3E,kGAAkG,CACrG,CAAC;QACN,CAAC;QAED,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YACjC,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC,MAAM,CAC/C,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,YAAY,KAAK,QAAQ,CAAC,YAAY,CAClG,CAAC;YAEF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,mCAAuB,CAC7B,4BAA4B,EAC5B,oDAAoD,QAAQ,CAAC,YAAY,iCAAiC,SAAS,KAAK,EACxH,6FAA6F,CAChG,CAAC;YACN,CAAC;YAED,mCAAmC;YACnC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;gBAC7B,MAAM,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAC3C,iCAAY,CAAC,mBAAmB,EAChC,MAAM,CAAC,SAAiB,EACxB,UAAU,CAAC,YAAY,CACP,CAAC;gBAErB,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBACvB,MAAM,IAAI,mCAAuB,CAC7B,oBAAoB,EACpB,sDAAsD,UAAU,CAAC,YAAY,iCAAiC,SAAS,KAAK,EAC5H,uEAAuE,CAC1E,CAAC;gBACN,CAAC;gBAED,IACI,UAAU,CAAC,wBAAwB;oBACnC,CAAC,+BAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAChE,CAAC;oBACC,MAAM,IAAI,mCAAuB,CAC7B,oCAAoC,UAAU,CAAC,wBAAwB,GAAG,EAC1E,yDAAyD,EACzD,uEAAuE,CAC1E,CAAC;gBACN,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,2BAA2B;QAC3B,IAAA,2BAAe,GAAE,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC;AACN,CAAC;AAED,iDAAiD;AACjD,qFAAqF"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
// noinspection JSUnusedGlobalSymbols
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.HichchiEntity = HichchiEntity;
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const constants_1 = require("../constants");
|
|
7
|
+
const base_1 = require("../base");
|
|
8
|
+
const nest_core_1 = require("@hichchi/nest-core");
|
|
9
|
+
const utils_1 = require("@hichchi/utils");
|
|
10
|
+
const tokens_1 = require("../tokens");
|
|
11
|
+
const metadata_keys_enum_1 = require("../enums/metadata-keys.enum");
|
|
9
12
|
/**
|
|
10
13
|
* Decorator for creating a new entity with enhanced validation and metadata registration
|
|
11
14
|
*
|
|
@@ -101,40 +104,40 @@ import { MetadataKeys } from "../enums/metadata-keys.enum";
|
|
|
101
104
|
* @see {@link HichchiJoinColumn} The decorator required for entity relationships
|
|
102
105
|
* @see {@link EntityOptionUnique} The type definition for unique constraint configuration
|
|
103
106
|
*/
|
|
104
|
-
|
|
107
|
+
function HichchiEntity(tableName, unique, skipFkValidation) {
|
|
105
108
|
return function (target) {
|
|
106
109
|
if (!target.name.endsWith("Entity")) {
|
|
107
|
-
throw new ImplementationException(`Invalid entity class name: '${target.name}'`, `Invalid entity class name assigned the class decorated with @HichchiEntity("${tableName}").`, "Entity names must end with 'Entity'.");
|
|
110
|
+
throw new nest_core_1.ImplementationException(`Invalid entity class name: '${target.name}'`, `Invalid entity class name assigned the class decorated with @HichchiEntity("${tableName}").`, "Entity names must end with 'Entity'.");
|
|
108
111
|
}
|
|
109
|
-
if (Object.getPrototypeOf(target) === HichchiUserEntity && tableName !== USER_ENTITY_TABLE_NAME) {
|
|
110
|
-
throw new ImplementationException(`Invalid table name: '${tableName}'`, `The table name assigned to the class decorated with @HichchiEntity("${tableName}") is invalid.`, `The table name for an entity that extends HichchiUserEntity must be '${USER_ENTITY_TABLE_NAME}'.\n` +
|
|
112
|
+
if (Object.getPrototypeOf(target) === base_1.HichchiUserEntity && tableName !== tokens_1.USER_ENTITY_TABLE_NAME) {
|
|
113
|
+
throw new nest_core_1.ImplementationException(`Invalid table name: '${tableName}'`, `The table name assigned to the class decorated with @HichchiEntity("${tableName}") is invalid.`, `The table name for an entity that extends HichchiUserEntity must be '${tokens_1.USER_ENTITY_TABLE_NAME}'.\n` +
|
|
111
114
|
"You can import the correct table name from the constant 'USER_ENTITY_TABLE_NAME' in the '@hichchi/nest-crud' package.");
|
|
112
115
|
}
|
|
113
|
-
Entity(tableName)(target);
|
|
114
|
-
const metadataArgs = getMetadataArgsStorage();
|
|
116
|
+
(0, typeorm_1.Entity)(tableName)(target);
|
|
117
|
+
const metadataArgs = (0, typeorm_1.getMetadataArgsStorage)();
|
|
115
118
|
const entityRelations = metadataArgs.relations.filter(relation => relation.target === target);
|
|
116
119
|
const tableUnique = [];
|
|
117
120
|
if (unique) {
|
|
118
121
|
if (Array.isArray(unique)) {
|
|
119
122
|
unique.forEach(unique => {
|
|
120
123
|
const uq = (Array.isArray(unique) ? unique : [unique]);
|
|
121
|
-
const entityName = toCamelCase(toCamelCase(target.name.split("Entity")[0]));
|
|
122
|
-
const fields = uq.map(field => toCamelCase(field)).join("And");
|
|
123
|
-
Unique(`UNIQUE_${entityName}_${fields}`, uq)(target);
|
|
124
|
+
const entityName = (0, utils_1.toCamelCase)((0, utils_1.toCamelCase)(target.name.split("Entity")[0]));
|
|
125
|
+
const fields = uq.map(field => (0, utils_1.toCamelCase)(field)).join("And");
|
|
126
|
+
(0, typeorm_1.Unique)(`UNIQUE_${entityName}_${fields}`, uq)(target);
|
|
124
127
|
tableUnique.push(...uq);
|
|
125
128
|
});
|
|
126
129
|
}
|
|
127
130
|
else {
|
|
128
131
|
Object.entries(unique).forEach(([constraintName, columns]) => {
|
|
129
|
-
if (!constraintName.match(UNIQUE_CONSTRAINT_REGEX)) {
|
|
130
|
-
throw new ImplementationException(`Invalid unique constraint: '${constraintName}'`, `Invalid unique constraint format provided to @HichchiEntity("${tableName}").`, "Unique constraints must follow the format 'UNIQUE_entityName_fieldName'.");
|
|
132
|
+
if (!constraintName.match(constants_1.UNIQUE_CONSTRAINT_REGEX)) {
|
|
133
|
+
throw new nest_core_1.ImplementationException(`Invalid unique constraint: '${constraintName}'`, `Invalid unique constraint format provided to @HichchiEntity("${tableName}").`, "Unique constraints must follow the format 'UNIQUE_entityName_fieldName'.");
|
|
131
134
|
}
|
|
132
|
-
Unique(constraintName, Array.isArray(columns) ? columns : [columns])(target);
|
|
135
|
+
(0, typeorm_1.Unique)(constraintName, Array.isArray(columns) ? columns : [columns])(target);
|
|
133
136
|
tableUnique.push(...(Array.isArray(columns) ? columns : [columns]));
|
|
134
137
|
});
|
|
135
138
|
}
|
|
136
139
|
}
|
|
137
|
-
if (target !== HichchiUserEntity) {
|
|
140
|
+
if (target !== base_1.HichchiUserEntity) {
|
|
138
141
|
const uniques = metadataArgs.uniques.find(unique => unique.target === target);
|
|
139
142
|
if (Array.isArray(uniques?.columns)) {
|
|
140
143
|
tableUnique.push(...uniques.columns);
|
|
@@ -143,7 +146,7 @@ export function HichchiEntity(tableName, unique, skipFkValidation) {
|
|
|
143
146
|
const columns = uniques.columns();
|
|
144
147
|
tableUnique.push(...(typeof columns === "object" ? Object.keys(columns) : []));
|
|
145
148
|
}
|
|
146
|
-
hichchiMetadata().addEntity(target, tableName, tableUnique);
|
|
149
|
+
(0, nest_core_1.hichchiMetadata)().addEntity(target, tableName, tableUnique);
|
|
147
150
|
}
|
|
148
151
|
if (!skipFkValidation) {
|
|
149
152
|
entityRelations.forEach(() => {
|
|
@@ -152,21 +155,21 @@ export function HichchiEntity(tableName, unique, skipFkValidation) {
|
|
|
152
155
|
relevantRelations.forEach((relation) => {
|
|
153
156
|
const joinColumns = metadataArgs.joinColumns.filter(joinColumn => joinColumn.target === target && joinColumn.propertyName === relation.propertyName);
|
|
154
157
|
// Validate ManyToOne and OneToOne relations for HichchiJoinColumn
|
|
155
|
-
if (!BaseEntityTemplateRelations.includes(relation.propertyName) &&
|
|
158
|
+
if (!base_1.BaseEntityTemplateRelations.includes(relation.propertyName) &&
|
|
156
159
|
(relation.relationType === "many-to-one" || relation.relationType === "one-to-one") &&
|
|
157
160
|
joinColumns.length === 0) {
|
|
158
|
-
throw new ImplementationException("Missing @HichchiJoinColumn", `Missing @HichchiJoinColumn on @${relation.relationType} relation '${relation.propertyName}' in @HichchiEntity("${tableName}").`, "Please use @HichchiJoinColumn to specify a foreign key constraint for this relation.");
|
|
161
|
+
throw new nest_core_1.ImplementationException("Missing @HichchiJoinColumn", `Missing @HichchiJoinColumn on @${relation.relationType} relation '${relation.propertyName}' in @HichchiEntity("${tableName}").`, "Please use @HichchiJoinColumn to specify a foreign key constraint for this relation.");
|
|
159
162
|
}
|
|
160
163
|
// Validate HichchiJoinColumn usage
|
|
161
164
|
joinColumns.forEach(joinColumn => {
|
|
162
|
-
const isHichchiJoinColumn = Reflect.getMetadata(MetadataKeys.HICHCHI_FOREIGN_KEY, target.prototype, joinColumn.propertyName);
|
|
165
|
+
const isHichchiJoinColumn = Reflect.getMetadata(metadata_keys_enum_1.MetadataKeys.HICHCHI_FOREIGN_KEY, target.prototype, joinColumn.propertyName);
|
|
163
166
|
if (!isHichchiJoinColumn) {
|
|
164
|
-
throw new ImplementationException("Missing @HichchiJoinColumn", `@JoinColumn detected on property '${joinColumn.propertyName}' in @HichchiEntity("${tableName}").`, "Please use @HichchiJoinColumn instead of @JoinColumn for consistent foreign key constraint validation.");
|
|
167
|
+
throw new nest_core_1.ImplementationException("Missing @HichchiJoinColumn", `@JoinColumn detected on property '${joinColumn.propertyName}' in @HichchiEntity("${tableName}").`, "Please use @HichchiJoinColumn instead of @JoinColumn for consistent foreign key constraint validation.");
|
|
165
168
|
}
|
|
166
169
|
// Validate foreignKeyConstraintName
|
|
167
170
|
const foreignKeyConstraintName = joinColumn.foreignKeyConstraintName;
|
|
168
|
-
if (foreignKeyConstraintName && !FK_CONSTRAINT_REGEX.test(foreignKeyConstraintName)) {
|
|
169
|
-
throw new ImplementationException(`Invalid foreign key constraint: '${foreignKeyConstraintName}'`, "Invalid foreign key constraint format provided to @HichchiJoinColumn()" +
|
|
171
|
+
if (foreignKeyConstraintName && !constants_1.FK_CONSTRAINT_REGEX.test(foreignKeyConstraintName)) {
|
|
172
|
+
throw new nest_core_1.ImplementationException(`Invalid foreign key constraint: '${foreignKeyConstraintName}'`, "Invalid foreign key constraint format provided to @HichchiJoinColumn()" +
|
|
170
173
|
` on property '${joinColumn.propertyName}' in @HichchiEntity("${tableName}").`, "Foreign key constraints must follow the format 'FK_entityName_entityName'.");
|
|
171
174
|
}
|
|
172
175
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/entity.decorator.ts"],"names":[],"mappings":"AAAA,qCAAqC;
|
|
1
|
+
{"version":3,"file":"entity.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/entity.decorator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
// noinspection JSUnusedGlobalSymbols
|
|
2
|
-
|
|
3
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Filters = Filters;
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const utils_1 = require("../utils");
|
|
4
7
|
/**
|
|
5
8
|
* Filter parameter decorator
|
|
6
9
|
*
|
|
@@ -77,12 +80,12 @@ import { parseFilterObject } from "../utils";
|
|
|
77
80
|
* @see {@link Sorter} Related decorator for extracting sort parameters
|
|
78
81
|
* @see {@link Pager} Related decorator for extracting pagination parameters
|
|
79
82
|
*/
|
|
80
|
-
|
|
81
|
-
return createParamDecorator((_data, ctx) => {
|
|
83
|
+
function Filters() {
|
|
84
|
+
return (0, common_1.createParamDecorator)((_data, ctx) => {
|
|
82
85
|
const req = ctx.switchToHttp().getRequest();
|
|
83
86
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
84
87
|
const { page, limit, sort, searchValue, searchFields, ...filters } = req.query;
|
|
85
|
-
return parseFilterObject(filters);
|
|
88
|
+
return (0, utils_1.parseFilterObject)(filters);
|
|
86
89
|
})();
|
|
87
90
|
}
|
|
88
91
|
//# sourceMappingURL=filter.decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/filter.decorator.ts"],"names":[],"mappings":"AAAA,qCAAqC;
|
|
1
|
+
{"version":3,"file":"filter.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/filter.decorator.ts"],"names":[],"mappings":";AAAA,qCAAqC;;AAoFrC,0BAOC;AAzFD,2CAAwE;AAExE,oCAA6C;AAI7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AACH,SAAgB,OAAO;IACnB,OAAO,IAAA,6BAAoB,EAAC,CAAC,KAAc,EAAE,GAAqB,EAAgC,EAAE;QAChG,MAAM,GAAG,GAAY,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACrD,6DAA6D;QAC7D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,CAAC,KAA8B,CAAC;QACxG,OAAO,IAAA,yBAAiB,EAAC,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,EAAE,CAAC;AACT,CAAC"}
|
package/decorators/index.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./page.decorator"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./sort.decorator"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./entity.decorator"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./filter.decorator"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./search.decorator"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./repository.decorator"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./join-column.decorator"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./entity-extension.decorator"), exports);
|
|
9
12
|
//# sourceMappingURL=index.js.map
|
package/decorators/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/index.ts"],"names":[],"mappings":";;;AAAA,2DAAiC;AACjC,2DAAiC;AACjC,6DAAmC;AACnC,6DAAmC;AACnC,6DAAmC;AACnC,iEAAuC;AACvC,kEAAwC;AACxC,uEAA6C"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
// noinspection JSUnusedGlobalSymbols
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.HichchiJoinColumn = HichchiJoinColumn;
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const utils_1 = require("@hichchi/utils");
|
|
7
|
+
const metadata_keys_enum_1 = require("../enums/metadata-keys.enum");
|
|
5
8
|
/**
|
|
6
9
|
* Decorator for creating a join column with automatic foreign key constraint naming
|
|
7
10
|
*
|
|
@@ -46,16 +49,16 @@ import { MetadataKeys } from "../enums/metadata-keys.enum";
|
|
|
46
49
|
*
|
|
47
50
|
* @see {@link JoinColumn} TypeORM's JoinColumn decorator that this extends
|
|
48
51
|
*/
|
|
49
|
-
|
|
52
|
+
function HichchiJoinColumn(options) {
|
|
50
53
|
return function (target, propertyKey) {
|
|
51
54
|
// Get the constructor of the actual class, which may be a derived class
|
|
52
|
-
const entityName = toCamelCase(target.constructor.name.split("Entity")[0]);
|
|
53
|
-
const foreignKeyConstraintName = `FK_${entityName}_${toCamelCase(String(propertyKey))}`;
|
|
54
|
-
JoinColumn({
|
|
55
|
+
const entityName = (0, utils_1.toCamelCase)(target.constructor.name.split("Entity")[0]);
|
|
56
|
+
const foreignKeyConstraintName = `FK_${entityName}_${(0, utils_1.toCamelCase)(String(propertyKey))}`;
|
|
57
|
+
(0, typeorm_1.JoinColumn)({
|
|
55
58
|
...options,
|
|
56
59
|
foreignKeyConstraintName,
|
|
57
60
|
})(target, propertyKey);
|
|
58
|
-
Reflect.defineMetadata(MetadataKeys.HICHCHI_FOREIGN_KEY, true, target, propertyKey);
|
|
61
|
+
Reflect.defineMetadata(metadata_keys_enum_1.MetadataKeys.HICHCHI_FOREIGN_KEY, true, target, propertyKey);
|
|
59
62
|
};
|
|
60
63
|
}
|
|
61
64
|
//# sourceMappingURL=join-column.decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"join-column.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/join-column.decorator.ts"],"names":[],"mappings":"AAAA,qCAAqC;
|
|
1
|
+
{"version":3,"file":"join-column.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/join-column.decorator.ts"],"names":[],"mappings":";AAAA,qCAAqC;;AAkDrC,8CAaC;AA7DD,qCAAwD;AACxD,0CAA6C;AAC7C,oEAA2D;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,SAAgB,iBAAiB,CAAC,OAA6D;IAC3F,OAAO,UAAU,MAAc,EAAE,WAA4B;QACzD,wEAAwE;QAExE,MAAM,UAAU,GAAG,IAAA,mBAAW,EAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,wBAAwB,GAAG,MAAM,UAAU,IAAI,IAAA,mBAAW,EAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QAExF,IAAA,oBAAU,EAAC;YACP,GAAG,OAAO;YACV,wBAAwB;SAC3B,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACxB,OAAO,CAAC,cAAc,CAAC,iCAAY,CAAC,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACxF,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
// noinspection JSUnusedGlobalSymbols
|
|
2
|
-
|
|
3
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Pager = Pager;
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const nest_connector_1 = require("@hichchi/nest-connector");
|
|
4
7
|
/**
|
|
5
8
|
* Implementation overload for extracting pagination from request query params.
|
|
6
9
|
*/
|
|
7
|
-
|
|
8
|
-
return createParamDecorator((_data, ctx) => {
|
|
10
|
+
function Pager(input, limit) {
|
|
11
|
+
return (0, common_1.createParamDecorator)((_data, ctx) => {
|
|
9
12
|
const req = ctx.switchToHttp().getRequest();
|
|
10
13
|
if (req.query?.page && req.query?.limit) {
|
|
11
14
|
const p = Number(req.query.page || (typeof input === "number" ? input : input?.page));
|
|
12
15
|
const l = Number(req.query.limit || (typeof input === "number" ? input : input?.limit) || limit);
|
|
13
16
|
const page = p ? p : 1;
|
|
14
|
-
const take = l ? l : DEFAULT_ITEMS_PER_PAGE;
|
|
17
|
+
const take = l ? l : nest_connector_1.DEFAULT_ITEMS_PER_PAGE;
|
|
15
18
|
delete req.query.page;
|
|
16
19
|
delete req.query.limit;
|
|
17
20
|
return { page: p, limit: l, take, skip: (page - 1) * take };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/page.decorator.ts"],"names":[],"mappings":"AAAA,qCAAqC;
|
|
1
|
+
{"version":3,"file":"page.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/page.decorator.ts"],"names":[],"mappings":";AAAA,qCAAqC;;AA2HrC,sBAgBC;AAzID,2CAAwE;AAExE,4DAAiE;AAoHjE;;GAEG;AACH,SAAgB,KAAK,CAAC,KAAkC,EAAE,KAAc;IACpE,OAAO,IAAA,6BAAoB,EAAC,CAAC,KAAc,EAAE,GAAqB,EAA0B,EAAE;QAC1F,MAAM,GAAG,GAA0C,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QAEnF,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;YACtF,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;YACjG,MAAM,IAAI,GAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uCAAsB,CAAC;YACpD,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YACtB,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;QAChE,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC,CAAC,EAAE,CAAC;AACT,CAAC"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
// noinspection JSUnusedGlobalSymbols
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.HichchiRepository = HichchiRepository;
|
|
5
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
6
|
+
const nest_core_1 = require("@hichchi/nest-core");
|
|
7
|
+
const base_1 = require("../base");
|
|
8
|
+
const common_1 = require("@nestjs/common");
|
|
9
|
+
const metadata_keys_enum_1 = require("../enums/metadata-keys.enum");
|
|
7
10
|
/**
|
|
8
11
|
* Decorator for creating a repository with automatic dependency injection
|
|
9
12
|
*
|
|
@@ -57,14 +60,14 @@ import { MetadataKeys } from "../enums/metadata-keys.enum";
|
|
|
57
60
|
* @see {@link Injectable} NestJS decorator that marks a class as injectable
|
|
58
61
|
* @see {@link InjectRepository} TypeORM decorator that injects a repository
|
|
59
62
|
*/
|
|
60
|
-
|
|
63
|
+
function HichchiRepository(entity) {
|
|
61
64
|
return function (target) {
|
|
62
|
-
if (Object.getPrototypeOf(target) !== BaseRepository) {
|
|
63
|
-
throw new ImplementationException("Invalid repository", `'${target.name}' must extend BaseRepository`);
|
|
65
|
+
if (Object.getPrototypeOf(target) !== base_1.BaseRepository) {
|
|
66
|
+
throw new nest_core_1.ImplementationException("Invalid repository", `'${target.name}' must extend BaseRepository`);
|
|
64
67
|
}
|
|
65
|
-
Injectable()(target);
|
|
66
|
-
Reflect.defineMetadata(MetadataKeys.HICHCHI_ENTITY, entity, target);
|
|
67
|
-
InjectRepository(entity)(target, undefined, 0);
|
|
68
|
+
(0, common_1.Injectable)()(target);
|
|
69
|
+
Reflect.defineMetadata(metadata_keys_enum_1.MetadataKeys.HICHCHI_ENTITY, entity, target);
|
|
70
|
+
(0, typeorm_1.InjectRepository)(entity)(target, undefined, 0);
|
|
68
71
|
};
|
|
69
72
|
}
|
|
70
73
|
//# sourceMappingURL=repository.decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/repository.decorator.ts"],"names":[],"mappings":"AAAA,qCAAqC;
|
|
1
|
+
{"version":3,"file":"repository.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/repository.decorator.ts"],"names":[],"mappings":";AAAA,qCAAqC;;AA8DrC,8CAYC;AAxED,6CAAmD;AACnD,kDAA6D;AAC7D,kCAA0E;AAC1E,2CAA4C;AAE5C,oEAA2D;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,SAAgB,iBAAiB,CAC7B,MAAc;IAEd,OAAO,UAA8E,MAAS;QAC1F,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,qBAAc,EAAE,CAAC;YACnD,MAAM,IAAI,mCAAuB,CAAC,oBAAoB,EAAE,IAAI,MAAM,CAAC,IAAI,8BAA8B,CAAC,CAAC;QAC3G,CAAC;QAED,IAAA,mBAAU,GAAE,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,CAAC,cAAc,CAAC,iCAAY,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACpE,IAAA,0BAAgB,EAAC,MAAM,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
// noinspection JSUnusedGlobalSymbols
|
|
2
|
-
|
|
3
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Search = Search;
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const utils_1 = require("../utils");
|
|
4
7
|
/**
|
|
5
8
|
* Search parameter decorator
|
|
6
9
|
*
|
|
@@ -79,11 +82,11 @@ import { parseSearchString } from "../utils";
|
|
|
79
82
|
* @see {@link parseSearchString} The utility function used to parse search parameters
|
|
80
83
|
* @see {@link Filters} Related decorator for extracting filter parameters
|
|
81
84
|
*/
|
|
82
|
-
|
|
83
|
-
return createParamDecorator((_data, ctx) => {
|
|
85
|
+
function Search() {
|
|
86
|
+
return (0, common_1.createParamDecorator)((_data, ctx) => {
|
|
84
87
|
const req = ctx.switchToHttp().getRequest();
|
|
85
88
|
const { searchValue, searchFields } = req.query;
|
|
86
|
-
return typeof searchValue === "string" ? parseSearchString(searchValue, searchFields) : undefined;
|
|
89
|
+
return typeof searchValue === "string" ? (0, utils_1.parseSearchString)(searchValue, searchFields) : undefined;
|
|
87
90
|
})();
|
|
88
91
|
}
|
|
89
92
|
//# sourceMappingURL=search.decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/search.decorator.ts"],"names":[],"mappings":"AAAA,qCAAqC;
|
|
1
|
+
{"version":3,"file":"search.decorator.js","sourceRoot":"","sources":["../../../../libs/nest-crud/src/decorators/search.decorator.ts"],"names":[],"mappings":";AAAA,qCAAqC;;AAoFrC,wBAMC;AAxFD,2CAAwE;AACxE,oCAA6C;AAG7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EG;AACH,SAAgB,MAAM;IAClB,OAAO,IAAA,6BAAoB,EAAC,CAAC,KAAc,EAAE,GAAqB,EAAgC,EAAE;QAChG,MAAM,GAAG,GAA+D,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACxG,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;QAChD,OAAO,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,yBAAiB,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtG,CAAC,CAAC,EAAE,CAAC;AACT,CAAC"}
|