@mee4dy/crud-nestjs 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/constants/index.d.ts +1 -0
  2. package/dist/constants/index.js +5 -0
  3. package/dist/constants/index.js.map +1 -0
  4. package/dist/crud.controller.d.ts +22 -0
  5. package/dist/crud.controller.js +134 -0
  6. package/dist/crud.controller.js.map +1 -0
  7. package/dist/crud.service.d.ts +15 -0
  8. package/dist/crud.service.js +55 -0
  9. package/dist/crud.service.js.map +1 -0
  10. package/dist/decorators/crud-params.decorator.d.ts +5 -0
  11. package/dist/decorators/crud-params.decorator.js +53 -0
  12. package/dist/decorators/crud-params.decorator.js.map +1 -0
  13. package/dist/decorators/crud.decorator.d.ts +3 -0
  14. package/dist/decorators/crud.decorator.js +77 -0
  15. package/dist/decorators/crud.decorator.js.map +1 -0
  16. package/dist/decorators/index.d.ts +2 -0
  17. package/dist/decorators/index.js +19 -0
  18. package/dist/decorators/index.js.map +1 -0
  19. package/dist/exceptions/endpoint-disabled.exception.d.ts +4 -0
  20. package/dist/exceptions/endpoint-disabled.exception.js +14 -0
  21. package/dist/exceptions/endpoint-disabled.exception.js.map +1 -0
  22. package/dist/filters/crud-exception.filter.d.ts +4 -0
  23. package/dist/filters/crud-exception.filter.js +48 -0
  24. package/dist/filters/crud-exception.filter.js.map +1 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.js +19 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/services/crud-params-adapter.service.d.ts +14 -0
  29. package/dist/services/crud-params-adapter.service.js +147 -0
  30. package/dist/services/crud-params-adapter.service.js.map +1 -0
  31. package/dist/services/query-params-extractor.service.d.ts +14 -0
  32. package/dist/services/query-params-extractor.service.js +112 -0
  33. package/dist/services/query-params-extractor.service.js.map +1 -0
  34. package/dist/types/crud-config.types.d.ts +25 -0
  35. package/dist/types/crud-config.types.js +3 -0
  36. package/dist/types/crud-config.types.js.map +1 -0
  37. package/dist/types/crud-params.types.d.ts +40 -0
  38. package/dist/types/crud-params.types.js +3 -0
  39. package/dist/types/crud-params.types.js.map +1 -0
  40. package/dist/types/crud-query.types.d.ts +16 -0
  41. package/dist/types/crud-query.types.js +3 -0
  42. package/dist/types/crud-query.types.js.map +1 -0
  43. package/dist/types/crud-response.types.d.ts +9 -0
  44. package/dist/types/crud-response.types.js +3 -0
  45. package/dist/types/crud-response.types.js.map +1 -0
  46. package/dist/utils/merge.util.d.ts +1 -0
  47. package/dist/utils/merge.util.js +45 -0
  48. package/dist/utils/merge.util.js.map +1 -0
  49. package/dist/utils/replace-pk.util.d.ts +1 -0
  50. package/dist/utils/replace-pk.util.js +25 -0
  51. package/dist/utils/replace-pk.util.js.map +1 -0
  52. package/package.json +34 -0
  53. package/readme.md +426 -0
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CrudParamsAdapterService = void 0;
4
+ const sequelize_1 = require("sequelize");
5
+ class CrudParamsAdapterService {
6
+ constructor(params) {
7
+ this.params = params;
8
+ }
9
+ adapt() {
10
+ const attributes = this.getAttributes();
11
+ const where = this.getWhere();
12
+ const group = this.getGroup();
13
+ const order = this.getOrder();
14
+ const limit = this.getLimit();
15
+ const offset = this.getOffset();
16
+ const include = this.getInclude();
17
+ return {
18
+ attributes,
19
+ include,
20
+ where,
21
+ group,
22
+ order,
23
+ limit,
24
+ offset,
25
+ };
26
+ }
27
+ getInclude(joinList = this.params.join) {
28
+ const result = [];
29
+ if (joinList === null || joinList === void 0 ? void 0 : joinList.length) {
30
+ for (const joinItem of joinList) {
31
+ const includeObj = {
32
+ model: joinItem.repository(),
33
+ };
34
+ if (joinItem.attributes) {
35
+ includeObj.attributes = joinItem.attributes;
36
+ }
37
+ if (joinItem.join) {
38
+ if (Array.isArray(joinItem.join)) {
39
+ includeObj.include = this.getInclude(joinItem.join);
40
+ }
41
+ else {
42
+ includeObj.include = this.getInclude([joinItem.join]);
43
+ }
44
+ }
45
+ result.push(includeObj);
46
+ }
47
+ }
48
+ return result;
49
+ }
50
+ getAttributes() {
51
+ const fields = this.params.fields;
52
+ const resultInclude = [];
53
+ const resultExclude = [];
54
+ if ((fields === null || fields === void 0 ? void 0 : fields.include) && fields.include.length) {
55
+ for (const [fieldQuery, fieldKey] of fields.include) {
56
+ resultInclude.push([fieldQuery, fieldKey]);
57
+ }
58
+ }
59
+ if ((fields === null || fields === void 0 ? void 0 : fields.exclude) && fields.exclude.length) {
60
+ for (const fieldKey of fields.exclude) {
61
+ resultExclude.push(fieldKey);
62
+ }
63
+ }
64
+ return {
65
+ include: resultInclude,
66
+ exclude: resultExclude,
67
+ };
68
+ }
69
+ getWhere() {
70
+ const result = {};
71
+ const filters = this.params.filters;
72
+ if (filters && Object.keys(filters).length) {
73
+ for (const filterItem of Object.entries(filters)) {
74
+ const fieldKey = filterItem[0];
75
+ const filter = filterItem[1];
76
+ const filterOp = typeof filter !== 'object' ? 'eq' : filter.op;
77
+ const whereField = fieldKey;
78
+ const whereValue = typeof filter === 'object' && filter !== null && 'value' in filter ? filter.value : filter;
79
+ switch (filterOp) {
80
+ case 'like':
81
+ if (whereValue !== undefined && whereValue !== null) {
82
+ result[whereField] = { [sequelize_1.Op.like]: `%${whereValue}%` };
83
+ }
84
+ break;
85
+ case 'period':
86
+ case 'range':
87
+ const range = {};
88
+ const whereValueFrom = typeof filter === 'object' && filter !== null && 'from' in filter ? filter.from : undefined;
89
+ const whereValueTo = typeof filter === 'object' && filter !== null && 'to' in filter ? filter.to : undefined;
90
+ if (whereValueFrom !== undefined) {
91
+ range[sequelize_1.Op.gte] = whereValueFrom;
92
+ }
93
+ if (whereValueTo !== undefined) {
94
+ range[sequelize_1.Op.lte] = whereValueTo;
95
+ }
96
+ if (Reflect.ownKeys(range).length) {
97
+ result[whereField] = range;
98
+ }
99
+ break;
100
+ default:
101
+ case 'eq':
102
+ if (whereValue !== undefined && whereValue !== null) {
103
+ result[whereField] = whereValue;
104
+ }
105
+ break;
106
+ }
107
+ }
108
+ }
109
+ return result;
110
+ }
111
+ getGroup() {
112
+ const result = [];
113
+ const groups = this.params.groups;
114
+ if (groups && groups.length) {
115
+ for (const fieldKey of groups) {
116
+ result.push(fieldKey);
117
+ }
118
+ }
119
+ return result;
120
+ }
121
+ getOrder() {
122
+ const result = [];
123
+ const orders = this.params.orders;
124
+ if (orders && orders.length) {
125
+ for (const [fieldKey, direction] of orders) {
126
+ result.push([fieldKey, direction]);
127
+ }
128
+ }
129
+ return result;
130
+ }
131
+ getLimit() {
132
+ const limit = this.params.limit;
133
+ if (limit && typeof limit === 'number' && limit > 0) {
134
+ return limit;
135
+ }
136
+ return undefined;
137
+ }
138
+ getOffset() {
139
+ const offset = this.params.offset;
140
+ if (offset && typeof offset === 'number' && offset >= 0) {
141
+ return offset;
142
+ }
143
+ return undefined;
144
+ }
145
+ }
146
+ exports.CrudParamsAdapterService = CrudParamsAdapterService;
147
+ //# sourceMappingURL=crud-params-adapter.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud-params-adapter.service.js","sourceRoot":"","sources":["../../src/services/crud-params-adapter.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { CrudParams } from '../types/crud-params.types';
2
+ import { CrudQuery, CrudQueryAllowedParams } from '../types/crud-query.types';
3
+ export declare class QueryParamsExtractorService {
4
+ private query;
5
+ private allowedParams?;
6
+ constructor(query: CrudQuery, allowedParams?: CrudQueryAllowedParams);
7
+ extract(): CrudParams;
8
+ private checkAllow;
9
+ private extractFilters;
10
+ private extractGroups;
11
+ private extractOrders;
12
+ private extractOffset;
13
+ private extractLimit;
14
+ }
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueryParamsExtractorService = void 0;
4
+ class QueryParamsExtractorService {
5
+ constructor(query, allowedParams) {
6
+ this.query = query;
7
+ this.allowedParams = allowedParams;
8
+ }
9
+ extract() {
10
+ const filters = this.extractFilters();
11
+ const groups = this.extractGroups();
12
+ const orders = this.extractOrders();
13
+ const offset = this.extractOffset();
14
+ const limit = this.extractLimit();
15
+ return {
16
+ filters,
17
+ groups,
18
+ orders,
19
+ offset,
20
+ limit,
21
+ };
22
+ }
23
+ checkAllow(allowedValues, value) {
24
+ return ((typeof allowedValues === 'boolean' && allowedValues) ||
25
+ (typeof allowedValues === 'object' && allowedValues.includes(value)));
26
+ }
27
+ // ?filters[field]=2222
28
+ // ?filters[field][eq]=2222
29
+ // ?filters[field][like]=2222
30
+ // ?filters[field][range][from]=2222&filters[field][range][to]=2222
31
+ extractFilters() {
32
+ var _a;
33
+ const result = {};
34
+ const filters = this.query.filters;
35
+ if (!filters || !Object.keys(filters).length) {
36
+ return result;
37
+ }
38
+ for (const [fieldKey, value] of Object.entries(filters)) {
39
+ if (!this.checkAllow((_a = this.allowedParams) === null || _a === void 0 ? void 0 : _a.filters, fieldKey)) {
40
+ continue;
41
+ }
42
+ // 1. ?filters[field]=2222 → eq
43
+ if (typeof value !== 'object' || value === null) {
44
+ result[fieldKey] = { op: 'eq', value };
45
+ continue;
46
+ }
47
+ // 2. ?filters[field][eq]=2222
48
+ if ('eq' in value) {
49
+ result[fieldKey] = { op: 'eq', value: value.eq };
50
+ continue;
51
+ }
52
+ // 3. ?filters[field][like]=2222
53
+ if ('like' in value) {
54
+ result[fieldKey] = { op: 'like', value: value.like };
55
+ continue;
56
+ }
57
+ // 4. ?filters[field][range][from]=2222&filters[field][range][to]=2222
58
+ if ('range' in value && typeof value.range === 'object') {
59
+ const { from, to } = value.range;
60
+ if (from !== undefined && to !== undefined) {
61
+ result[fieldKey] = { op: 'range', from, to };
62
+ continue;
63
+ }
64
+ }
65
+ }
66
+ return result;
67
+ }
68
+ extractGroups() {
69
+ var _a;
70
+ const result = [];
71
+ const groups = this.query.groups;
72
+ if (groups && groups.length) {
73
+ for (const fieldKey of groups) {
74
+ if (!this.checkAllow((_a = this.allowedParams) === null || _a === void 0 ? void 0 : _a.groups, fieldKey)) {
75
+ continue;
76
+ }
77
+ result.push(fieldKey);
78
+ }
79
+ }
80
+ return result;
81
+ }
82
+ extractOrders() {
83
+ var _a;
84
+ const result = [];
85
+ const orders = this.query.orders;
86
+ if (orders && orders.length) {
87
+ for (const [fieldKey, direction] of orders) {
88
+ if (!this.checkAllow((_a = this.allowedParams) === null || _a === void 0 ? void 0 : _a.orders, fieldKey)) {
89
+ continue;
90
+ }
91
+ result.push([fieldKey, direction]);
92
+ }
93
+ }
94
+ return result;
95
+ }
96
+ extractOffset() {
97
+ var _a;
98
+ if (!this.checkAllow((_a = this.allowedParams) === null || _a === void 0 ? void 0 : _a.offset)) {
99
+ return;
100
+ }
101
+ return this.query.offset ? +this.query.offset : undefined;
102
+ }
103
+ extractLimit() {
104
+ var _a;
105
+ if (!this.checkAllow((_a = this.allowedParams) === null || _a === void 0 ? void 0 : _a.limit)) {
106
+ return;
107
+ }
108
+ return this.query.limit ? +this.query.limit : undefined;
109
+ }
110
+ }
111
+ exports.QueryParamsExtractorService = QueryParamsExtractorService;
112
+ //# sourceMappingURL=query-params-extractor.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-params-extractor.service.js","sourceRoot":"","sources":["../../src/services/query-params-extractor.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { CrudQueryAllowedParams } from './crud-query.types';
2
+ import { CrudParams } from './crud-params.types';
3
+ export type CrudConfig = {
4
+ repository: () => any;
5
+ pk?: string;
6
+ endpoints?: {
7
+ meta?: boolean;
8
+ item?: boolean;
9
+ items?: boolean;
10
+ create?: boolean;
11
+ update?: boolean;
12
+ delete?: boolean;
13
+ };
14
+ query?: {
15
+ allowedParams?: CrudQueryAllowedParams;
16
+ };
17
+ params?: {
18
+ default?: Partial<CrudParams>;
19
+ };
20
+ scopes?: {
21
+ [key: string]: (req: any) => Partial<{
22
+ params: Partial<CrudParams>;
23
+ }>;
24
+ };
25
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=crud-config.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud-config.types.js","sourceRoot":"","sources":["../../src/types/crud-config.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { Literal } from 'sequelize/types/utils';
2
+ export type CrudField = string;
3
+ export type CrudLimit = number;
4
+ export type CrudOffset = number;
5
+ export type CrudOrderDirection = 'asc' | 'desc';
6
+ export type CrudOrder = [CrudField, CrudOrderDirection];
7
+ export type CrudGroup = CrudField;
8
+ export type CrudFilterOp = 'eq' | 'like' | 'range' | 'period';
9
+ export type CrudFieldFilter = string | number | boolean | {
10
+ op: 'eq';
11
+ value: string | number | boolean;
12
+ } | {
13
+ op: 'like';
14
+ value: string;
15
+ } | {
16
+ op: 'range' | 'period';
17
+ from: number | string;
18
+ to: number | string;
19
+ };
20
+ export type CrudParamsFilter = {
21
+ [field: CrudField]: CrudFieldFilter;
22
+ };
23
+ export type CrudFields = {
24
+ include?: [Literal, CrudField][];
25
+ exclude?: CrudField[];
26
+ };
27
+ export type CrudJoin = {
28
+ repository: () => any;
29
+ attributes?: CrudFields;
30
+ join?: CrudJoin[];
31
+ };
32
+ export type CrudParams = {
33
+ filters?: CrudParamsFilter;
34
+ join?: CrudJoin[];
35
+ fields?: CrudFields;
36
+ orders?: CrudOrder[];
37
+ groups?: CrudGroup[];
38
+ limit?: CrudLimit;
39
+ offset?: CrudOffset;
40
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=crud-params.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud-params.types.js","sourceRoot":"","sources":["../../src/types/crud-params.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ export interface CrudQuery {
2
+ filters?: object;
3
+ includes?: string[];
4
+ orders?: [string, 'asc' | 'desc'][];
5
+ groups?: string[];
6
+ limit?: number | string;
7
+ offset?: number | string;
8
+ }
9
+ export interface CrudQueryAllowedParams {
10
+ filters?: boolean | string[];
11
+ fields?: boolean | string[];
12
+ orders?: boolean | string[];
13
+ groups?: boolean | string[];
14
+ limit?: boolean;
15
+ offset?: boolean;
16
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=crud-query.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud-query.types.js","sourceRoot":"","sources":["../../src/types/crud-query.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export interface CrudResponse {
2
+ status: boolean;
3
+ data?: any;
4
+ error?: {
5
+ message?: string;
6
+ statusCode?: number;
7
+ errorType?: string;
8
+ };
9
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=crud-response.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud-response.types.js","sourceRoot":"","sources":["../../src/types/crud-response.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export declare function merge(objA: any, objB: any): any;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.merge = merge;
37
+ const _ = __importStar(require("lodash"));
38
+ function merge(objA, objB) {
39
+ return _.mergeWith({}, objA, objB, (a, b) => {
40
+ if (Array.isArray(a) && Array.isArray(b)) {
41
+ return [...a, ...b];
42
+ }
43
+ });
44
+ }
45
+ //# sourceMappingURL=merge.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.util.js","sourceRoot":"","sources":["../../src/utils/merge.util.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,sBAMC;AARD,0CAA4B;AAE5B,SAAgB,KAAK,CAAC,IAAI,EAAE,IAAI;IAC9B,OAAO,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function replacePkRecursive(obj: any, pk: string): any;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.replacePkRecursive = replacePkRecursive;
4
+ function replacePkRecursive(obj, pk) {
5
+ if (Array.isArray(obj)) {
6
+ return obj.map((item) => replacePkRecursive(item, pk));
7
+ }
8
+ if (typeof obj === 'object' && obj !== null) {
9
+ const isPlainObject = Object.getPrototypeOf(obj) === Object.prototype;
10
+ if (!isPlainObject) {
11
+ return obj;
12
+ }
13
+ const result = {};
14
+ for (const key in obj) {
15
+ const newKey = key === 'pk' ? pk : key;
16
+ result[newKey] = replacePkRecursive(obj[key], pk);
17
+ }
18
+ return result;
19
+ }
20
+ if (typeof obj === 'string' && obj === 'pk') {
21
+ return pk;
22
+ }
23
+ return obj;
24
+ }
25
+ //# sourceMappingURL=replace-pk.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-pk.util.js","sourceRoot":"","sources":["../../src/utils/replace-pk.util.ts"],"names":[],"mappings":";;AAAA,gDA4BC;AA5BD,SAAgB,kBAAkB,CAAC,GAAQ,EAAE,EAAU;IACrD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC;QAEtE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,MAAM,GAAQ,EAAE,CAAC;QAEvB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAEvC,MAAM,CAAC,MAAM,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@mee4dy/crud-nestjs",
3
+ "version": "1.0.3",
4
+ "main": "./dist/index.js",
5
+ "types": "./dist/index.d.ts",
6
+ "scripts": {
7
+ "build": "tsc",
8
+ "dev": "tsc --watch",
9
+ "test": "jest",
10
+ "prepublishOnly": "npm run test && npm run build"
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "author": "Mikhail Rybka",
16
+ "license": "ISC",
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "description": "",
21
+ "dependencies": {
22
+ "@nestjs/common": "^11.1.4",
23
+ "@nestjs/core": "^11.0.0",
24
+ "lodash": "^4.17.21",
25
+ "qs": "^6.14.0",
26
+ "sequelize": "^6.37.1",
27
+ "typescript": "^5.8.3"
28
+ },
29
+ "devDependencies": {
30
+ "@types/jest": "^29.5.14",
31
+ "jest": "^29.7.0",
32
+ "ts-jest": "^29.4.0"
33
+ }
34
+ }