@nest-yalc-2/field-middleware 1.0.0

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 (63) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +9 -0
  3. package/package.json +29 -0
  4. package/src/__tests__/class-transformer.helper.spec.ts +337 -0
  5. package/src/__tests__/decimal-middleware.helper.spec.ts +35 -0
  6. package/src/__tests__/field-error.enum.spec.ts +7 -0
  7. package/src/__tests__/fields-error.enum.spec.ts +17 -0
  8. package/src/__tests__/nullable-timestamp-middleware.helper.spec.ts +36 -0
  9. package/src/__tests__/string-format.enum.spec.ts +17 -0
  10. package/src/__tests__/transformer.helper.spec.ts +38 -0
  11. package/src/__tests__/tsconfig.json +3 -0
  12. package/src/__tests__/typeorm-transformer.helper.spec.ts +51 -0
  13. package/src/__tests__/validator.decorator.spec.ts +57 -0
  14. package/src/__tests__/validator.helper.spec.ts +92 -0
  15. package/src/__tests__/validator.interface.spec.ts +42 -0
  16. package/src/class-transformer.helper.d.ts +10 -0
  17. package/src/class-transformer.helper.js +63 -0
  18. package/src/class-transformer.helper.js.map +1 -0
  19. package/src/class-transformer.helper.ts +69 -0
  20. package/src/decimal-middleware.helper.d.ts +2 -0
  21. package/src/decimal-middleware.helper.js +8 -0
  22. package/src/decimal-middleware.helper.js.map +1 -0
  23. package/src/decimal-middleware.helper.ts +12 -0
  24. package/src/field-error.enum.d.ts +3 -0
  25. package/src/field-error.enum.js +8 -0
  26. package/src/field-error.enum.js.map +1 -0
  27. package/src/field-error.enum.ts +3 -0
  28. package/src/fields-error.enum.d.ts +3 -0
  29. package/src/fields-error.enum.js +8 -0
  30. package/src/fields-error.enum.js.map +1 -0
  31. package/src/fields-error.enum.ts +3 -0
  32. package/src/index.d.ts +9 -0
  33. package/src/index.js +26 -0
  34. package/src/index.js.map +1 -0
  35. package/src/index.ts +9 -0
  36. package/src/nullable-timestamp-middleware.helper.d.ts +2 -0
  37. package/src/nullable-timestamp-middleware.helper.js +9 -0
  38. package/src/nullable-timestamp-middleware.helper.js.map +1 -0
  39. package/src/nullable-timestamp-middleware.helper.ts +12 -0
  40. package/src/string-format.enum.d.ts +3 -0
  41. package/src/string-format.enum.js +8 -0
  42. package/src/string-format.enum.js.map +1 -0
  43. package/src/string-format.enum.ts +3 -0
  44. package/src/transformer.helper.d.ts +6 -0
  45. package/src/transformer.helper.js +29 -0
  46. package/src/transformer.helper.js.map +1 -0
  47. package/src/transformer.helper.ts +39 -0
  48. package/src/typeorm-transformer.helper.d.ts +6 -0
  49. package/src/typeorm-transformer.helper.js +29 -0
  50. package/src/typeorm-transformer.helper.js.map +1 -0
  51. package/src/typeorm-transformer.helper.ts +36 -0
  52. package/src/validator.decorator.d.ts +10 -0
  53. package/src/validator.decorator.js +53 -0
  54. package/src/validator.decorator.js.map +1 -0
  55. package/src/validator.decorator.ts +56 -0
  56. package/src/validator.helper.d.ts +7 -0
  57. package/src/validator.helper.js +53 -0
  58. package/src/validator.helper.js.map +1 -0
  59. package/src/validator.helper.ts +61 -0
  60. package/src/validator.interface.d.ts +17 -0
  61. package/src/validator.interface.js +9 -0
  62. package/src/validator.interface.js.map +1 -0
  63. package/src/validator.interface.ts +19 -0
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@nest-yalc-2/field-middleware",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "./src/index.js",
6
+ "exports": {
7
+ "./": "./src/"
8
+ },
9
+ "author": "",
10
+ "license": "AGPL-3.0-or-later",
11
+ "types": "./src/index.d.ts",
12
+ "files": [
13
+ "src"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/Nek97/nestjs-yalc.git"
18
+ },
19
+ "bugs": {
20
+ "url": "https://github.com/Nek97/nestjs-yalc/issues"
21
+ },
22
+ "homepage": "https://github.com/Nek97/nestjs-yalc#readme",
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "dependencies": {
27
+ "tslib": "^2.8.1"
28
+ }
29
+ }
@@ -0,0 +1,337 @@
1
+ import { describe, it, expect } from '@jest/globals';
2
+ import {
3
+ ParseArray,
4
+ parseArray,
5
+ ParseBoolean,
6
+ ParseInt,
7
+ ParseNumber,
8
+ parseBoolean,
9
+ parseInt,
10
+ parseNumber,
11
+ } from '../class-transformer.helper.js'; // change this to your actual file name
12
+ import { plainToClass } from 'class-transformer';
13
+
14
+ describe('ParseArray', () => {
15
+ it('should transform a comma separated string to an array', () => {
16
+ class TestClass {
17
+ @ParseArray()
18
+ field: string[];
19
+ }
20
+
21
+ const payload = {
22
+ field: 'a,b,c',
23
+ };
24
+
25
+ const transformed = plainToClass(TestClass, payload);
26
+ expect(transformed.field).toEqual(['a', 'b', 'c']);
27
+ });
28
+
29
+ it('should transform a semi colon separated string to an array', () => {
30
+ class TestClass {
31
+ @ParseArray({ separator: ';' })
32
+ field: string[];
33
+ }
34
+
35
+ const payload = {
36
+ field: 'a;b;c',
37
+ };
38
+
39
+ const transformed = plainToClass(TestClass, payload);
40
+ expect(transformed.field).toEqual(['a', 'b', 'c']);
41
+ });
42
+
43
+ it('should ignore empty string', () => {
44
+ class TestClass {
45
+ @ParseArray()
46
+ field: string[];
47
+ }
48
+
49
+ const payload = {
50
+ field: 'a,b,,c',
51
+ };
52
+
53
+ const transformed = plainToClass(TestClass, payload);
54
+ expect(transformed.field).toEqual(['a', 'b', 'c']);
55
+ });
56
+ });
57
+
58
+ describe('parseArray', () => {
59
+ it('should split a string into array by a comma', () => {
60
+ const result = parseArray('a,b,c');
61
+ expect(result).toEqual(['a', 'b', 'c']);
62
+ });
63
+
64
+ it('should split a string into array by a semi colon', () => {
65
+ const result = parseArray('a;b;c', ';');
66
+ expect(result).toEqual(['a', 'b', 'c']);
67
+ });
68
+
69
+ it('should ignore empty string', () => {
70
+ const result = parseArray('a,b,,c');
71
+ expect(result).toEqual(['a', 'b', 'c']);
72
+ });
73
+
74
+ it('should return empty array for empty string', () => {
75
+ const result = parseArray('');
76
+ expect(result).toEqual([]);
77
+ });
78
+
79
+ it('should return empty array for undefined', () => {
80
+ const result = parseArray(undefined);
81
+ expect(result).toEqual([]);
82
+ });
83
+
84
+ it('should return empty array for null', () => {
85
+ const result = parseArray(null);
86
+ expect(result).toEqual([]);
87
+ });
88
+
89
+ it('should return empty array for number', () => {
90
+ const result = parseArray(123);
91
+ expect(result).toEqual([123]);
92
+ });
93
+
94
+ it('should return array for array', () => {
95
+ const result = parseArray(['a', 'b', 'c']);
96
+ expect(result).toEqual(['a', 'b', 'c']);
97
+ });
98
+ });
99
+
100
+ describe('ParseBoolean', () => {
101
+ it('should transform a string to boolean', () => {
102
+ class TestClass {
103
+ @ParseBoolean()
104
+ field: boolean;
105
+ }
106
+
107
+ const payload = {
108
+ field: 'true',
109
+ };
110
+
111
+ const transformed = plainToClass(TestClass, payload);
112
+ expect(transformed.field).toEqual(true);
113
+ });
114
+
115
+ it('should transform a boolean to boolean', () => {
116
+ class TestClass {
117
+ @ParseBoolean()
118
+ field: boolean;
119
+ }
120
+
121
+ const payload = {
122
+ field: true,
123
+ };
124
+
125
+ const transformed = plainToClass(TestClass, payload);
126
+ expect(transformed.field).toEqual(true);
127
+ });
128
+
129
+ it('should transform a string to boolean', () => {
130
+ class TestClass {
131
+ @ParseBoolean()
132
+ field: boolean;
133
+ }
134
+
135
+ const payload = {
136
+ field: 'false',
137
+ };
138
+
139
+ const transformed = plainToClass(TestClass, payload);
140
+ expect(transformed.field).toEqual(false);
141
+ });
142
+
143
+ it('should transform a boolean to boolean', () => {
144
+ class TestClass {
145
+ @ParseBoolean()
146
+ field: boolean;
147
+ }
148
+
149
+ const payload = {
150
+ field: false,
151
+ };
152
+
153
+ const transformed = plainToClass(TestClass, payload);
154
+ expect(transformed.field).toEqual(false);
155
+ });
156
+ });
157
+
158
+ describe('parseBoolean', () => {
159
+ it('should transform a string to boolean', () => {
160
+ const result = parseBoolean('true');
161
+ expect(result).toEqual(true);
162
+ });
163
+
164
+ it('should transform a boolean to boolean', () => {
165
+ const result = parseBoolean(true);
166
+ expect(result).toEqual(true);
167
+ });
168
+
169
+ it('should transform a string to boolean', () => {
170
+ const result = parseBoolean('false');
171
+ expect(result).toEqual(false);
172
+ });
173
+
174
+ it('should transform a boolean to boolean', () => {
175
+ const result = parseBoolean(false);
176
+ expect(result).toEqual(false);
177
+ });
178
+
179
+ it('should return false for undefined', () => {
180
+ const result = parseBoolean(undefined);
181
+ expect(result).toEqual(false);
182
+ });
183
+
184
+ it('should return false for null', () => {
185
+ const result = parseBoolean(null);
186
+ expect(result).toEqual(false);
187
+ });
188
+
189
+ it('should return false for number', () => {
190
+ const result = parseBoolean(123);
191
+ expect(result).toEqual(false);
192
+ });
193
+
194
+ it('should return false for empty string', () => {
195
+ const result = parseBoolean('');
196
+ expect(result).toEqual(false);
197
+ });
198
+ });
199
+
200
+ describe('ParseNumber', () => {
201
+ it('should transform a string to number', () => {
202
+ class TestClass {
203
+ @ParseNumber()
204
+ field: number;
205
+ }
206
+
207
+ const payload = {
208
+ field: '123',
209
+ };
210
+
211
+ const transformed = plainToClass(TestClass, payload);
212
+ expect(transformed.field).toEqual(123);
213
+ });
214
+
215
+ it('should transform a number to number', () => {
216
+ class TestClass {
217
+ @ParseNumber()
218
+ field: number;
219
+ }
220
+
221
+ const payload = {
222
+ field: 123,
223
+ };
224
+
225
+ const transformed = plainToClass(TestClass, payload);
226
+ expect(transformed.field).toEqual(123);
227
+ });
228
+ });
229
+
230
+ describe('parseNumber', () => {
231
+ it('should transform a string to number', () => {
232
+ const result = parseNumber('123');
233
+ expect(result).toEqual(123);
234
+ });
235
+
236
+ it('should transform a number to number', () => {
237
+ const result = parseNumber(123);
238
+ expect(result).toEqual(123);
239
+ });
240
+
241
+ it('should transform a float to float', () => {
242
+ const result = parseNumber(123.123);
243
+ expect(result).toEqual(123.123);
244
+ });
245
+
246
+ it('should transform a string to float', () => {
247
+ const result = parseNumber('123.123');
248
+ expect(result).toEqual(123.123);
249
+ });
250
+
251
+ it('should return NaN for undefined', () => {
252
+ const result = parseNumber(undefined);
253
+ expect(result).toEqual(NaN);
254
+ });
255
+
256
+ it('should return NaN for null', () => {
257
+ const result = parseNumber(null);
258
+ expect(result).toEqual(NaN);
259
+ });
260
+
261
+ it('should return NaN for boolean', () => {
262
+ const result = parseNumber(true);
263
+ expect(result).toEqual(NaN);
264
+ });
265
+
266
+ it('should return NaN for empty string', () => {
267
+ const result = parseNumber('');
268
+ expect(result).toEqual(NaN);
269
+ });
270
+ });
271
+
272
+ describe('ParseInt', () => {
273
+ it('should transform a string to number', () => {
274
+ class TestClass {
275
+ @ParseInt()
276
+ field: number;
277
+ }
278
+
279
+ const payload = {
280
+ field: '123',
281
+ };
282
+
283
+ const transformed = plainToClass(TestClass, payload);
284
+ expect(transformed.field).toEqual(123);
285
+ });
286
+
287
+ it('should transform a number to number', () => {
288
+ class TestClass {
289
+ @ParseInt()
290
+ field: number;
291
+ }
292
+
293
+ const payload = {
294
+ field: 123,
295
+ };
296
+
297
+ const transformed = plainToClass(TestClass, payload);
298
+ expect(transformed.field).toEqual(123);
299
+ });
300
+ });
301
+
302
+ describe('parseInt', () => {
303
+ it('should transform a string to number', () => {
304
+ const result = parseInt('123');
305
+ expect(result).toEqual(123);
306
+ });
307
+
308
+ it('should transform a number to number', () => {
309
+ const result = parseInt(123);
310
+ expect(result).toEqual(123);
311
+ });
312
+
313
+ it('should return NaN for undefined', () => {
314
+ const result = parseInt(undefined);
315
+ expect(result).toEqual(NaN);
316
+ });
317
+
318
+ it('should return NaN for null', () => {
319
+ const result = parseInt(null);
320
+ expect(result).toEqual(NaN);
321
+ });
322
+
323
+ it('should return NaN for boolean', () => {
324
+ const result = parseInt(true);
325
+ expect(result).toEqual(NaN);
326
+ });
327
+
328
+ it('should return NaN for empty string', () => {
329
+ const result = parseInt('');
330
+ expect(result).toEqual(NaN);
331
+ });
332
+
333
+ it('should return NaN for float', () => {
334
+ const result = parseInt('123.123');
335
+ expect(result).toEqual(NaN);
336
+ });
337
+ });
@@ -0,0 +1,35 @@
1
+ import {
2
+ expect,
3
+ jest,
4
+ describe,
5
+ it,
6
+ beforeEach,
7
+ beforeAll,
8
+ afterAll,
9
+ afterEach,
10
+ } from '@jest/globals';
11
+
12
+ import { createMock } from '@golevelup/ts-jest';
13
+ import { MiddlewareContext } from '@nestjs/graphql';
14
+ import { decimalMiddleware } from '../decimal-middleware.helper.js';
15
+
16
+ describe('Decimal middleware helper test', () => {
17
+ // it('should return the value as float', async () => {
18
+ // const ctx = createMock<MiddlewareContext>();
19
+ // const next = jest.fn().mockResolvedValue('500.2');
20
+ // const float = await decimalMiddleware(ctx, next);
21
+
22
+ // expect(float).not.toEqual(expect.any(String));
23
+ // expect(float).toEqual(expect.any(Number));
24
+ // expect(float).toEqual(500.2);
25
+ // });
26
+
27
+ it('should return the value a', async () => {
28
+ const ctx = createMock<MiddlewareContext>();
29
+ const next = jest.fn().mockResolvedValue('500.2');
30
+ const float = await decimalMiddleware(ctx, next);
31
+
32
+ expect(float).toEqual(expect.any(String));
33
+ expect(float).toEqual('500.2');
34
+ });
35
+ });
@@ -0,0 +1,7 @@
1
+ import { FieldErrorsEnum } from '../field-error.enum';
2
+
3
+ describe('Shared enum test', () => {
4
+ it('Gender enum definition', async () => {
5
+ expect(FieldErrorsEnum).toBeDefined();
6
+ });
7
+ });
@@ -0,0 +1,17 @@
1
+ import {
2
+ expect,
3
+ jest,
4
+ describe,
5
+ it,
6
+ beforeEach,
7
+ beforeAll,
8
+ afterAll,
9
+ afterEach,
10
+ } from '@jest/globals';
11
+ import { FieldErrorsEnum } from '../fields-error.enum.js';
12
+
13
+ describe('Shared enum test', () => {
14
+ it('Gender enum definition', async () => {
15
+ expect(FieldErrorsEnum).toBeDefined();
16
+ });
17
+ });
@@ -0,0 +1,36 @@
1
+ import {
2
+ expect,
3
+ jest,
4
+ describe,
5
+ it,
6
+ beforeEach,
7
+ beforeAll,
8
+ afterAll,
9
+ afterEach,
10
+ } from '@jest/globals';
11
+
12
+ import { createMock } from '@golevelup/ts-jest';
13
+ import { MiddlewareContext } from '@nestjs/graphql';
14
+ import { nullableTimestampMiddleware } from '../nullable-timestamp-middleware.helper.js';
15
+
16
+ describe('Date middleware helper test', () => {
17
+ it('should return the value as null', async () => {
18
+ const ctx = createMock<MiddlewareContext>();
19
+ let next = jest.fn().mockResolvedValue('0000-00-00 00:00:00');
20
+ const date = await nullableTimestampMiddleware(ctx, next);
21
+ expect(date).toEqual(null);
22
+
23
+ next = jest.fn().mockResolvedValue('');
24
+ const date2 = await nullableTimestampMiddleware(ctx, next);
25
+ expect(date2).toEqual(null);
26
+ });
27
+
28
+ it('should return the date correctly', async () => {
29
+ const testingDate = '2021-06-21 11:43:54';
30
+ const ctx = createMock<MiddlewareContext>();
31
+ const next = jest.fn().mockResolvedValue(testingDate);
32
+ const date = await nullableTimestampMiddleware(ctx, next);
33
+
34
+ expect(date).toEqual(testingDate);
35
+ });
36
+ });
@@ -0,0 +1,17 @@
1
+ import {
2
+ expect,
3
+ jest,
4
+ describe,
5
+ it,
6
+ beforeEach,
7
+ beforeAll,
8
+ afterAll,
9
+ afterEach,
10
+ } from '@jest/globals';
11
+ import { StringFormatEnum } from '../string-format.enum.js';
12
+
13
+ describe('Shared enum test', () => {
14
+ it('Gender enum definition', async () => {
15
+ expect(StringFormatEnum).toBeDefined();
16
+ });
17
+ });
@@ -0,0 +1,38 @@
1
+ import { defaultDateTransformer, enumTransformer } from '../transformer.helper';
2
+
3
+ enum TestEnum {
4
+ TEST = 'test',
5
+ }
6
+
7
+ const testString = 'test';
8
+
9
+ describe('Transformer helper', () => {
10
+ it('should not transform enum value to null if it belongs to a specific enumObj', () => {
11
+ const transformer = enumTransformer(TestEnum);
12
+
13
+ expect(transformer.to).toBeDefined();
14
+ expect(transformer.from).toBeDefined();
15
+
16
+ expect(transformer.to(testString)).toBe(testString);
17
+ expect(transformer.from(testString)).toBe(testString);
18
+ });
19
+
20
+ it('should transform enum value to null if it not belongs to a specific enumObj', () => {
21
+ const transformer = enumTransformer(TestEnum);
22
+
23
+ expect(transformer.to).toBeDefined();
24
+ expect(transformer.from).toBeDefined();
25
+
26
+ expect(transformer.from('')).toBeNull();
27
+ });
28
+
29
+ it('defaultDateTransformer work', () => {
30
+ const transformer = defaultDateTransformer();
31
+
32
+ expect(transformer.from(new Date())).toBeDefined();
33
+ expect(transformer.to(undefined)).toBeDefined();
34
+
35
+ const fixedDate = new Date('01 01 01');
36
+ expect(transformer.to(fixedDate)).toEqual(fixedDate);
37
+ });
38
+ });
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "../../../tsconfig.test.json"
3
+ }
@@ -0,0 +1,51 @@
1
+ import {
2
+ expect,
3
+ jest,
4
+ describe,
5
+ it,
6
+ beforeEach,
7
+ beforeAll,
8
+ afterAll,
9
+ afterEach,
10
+ } from '@jest/globals';
11
+ import {
12
+ defaultDateTransformer,
13
+ enumTransformer,
14
+ } from '../typeorm-transformer.helper.js';
15
+
16
+ enum TestEnum {
17
+ TEST = 'test',
18
+ }
19
+
20
+ const testString = 'test';
21
+
22
+ describe('Transformer helper', () => {
23
+ it('should not transform enum value to null if it belongs to a specific enumObj', () => {
24
+ const transformer = enumTransformer(TestEnum);
25
+
26
+ expect(transformer.to).toBeDefined();
27
+ expect(transformer.from).toBeDefined();
28
+
29
+ expect(transformer.to(testString)).toBe(testString);
30
+ expect(transformer.from(testString)).toBe(testString);
31
+ });
32
+
33
+ it('should transform enum value to null if it not belongs to a specific enumObj', () => {
34
+ const transformer = enumTransformer(TestEnum);
35
+
36
+ expect(transformer.to).toBeDefined();
37
+ expect(transformer.from).toBeDefined();
38
+
39
+ expect(transformer.from('')).toBeNull();
40
+ });
41
+
42
+ it('defaultDateTransformer work', () => {
43
+ const transformer = defaultDateTransformer();
44
+
45
+ expect(transformer.from(new Date())).toBeDefined();
46
+ expect(transformer.to(undefined)).toBeDefined();
47
+
48
+ const fixedDate = new Date('01 01 01');
49
+ expect(transformer.to(fixedDate)).toEqual(fixedDate);
50
+ });
51
+ });
@@ -0,0 +1,57 @@
1
+ import {
2
+ expect,
3
+ jest,
4
+ describe,
5
+ it,
6
+ beforeEach,
7
+ beforeAll,
8
+ afterAll,
9
+ afterEach,
10
+ } from '@jest/globals';
11
+
12
+ import * as Validator from '../validator.decorator.js';
13
+
14
+ import { StringFormatEnum } from '../string-format.enum.js';
15
+
16
+ describe('validator decorator test', () => {
17
+ it('StringFormatMatchValidation is defined', async () => {
18
+ let testData = Validator.StringFormatMatchValidation();
19
+ expect(testData('', '')).not.toBeDefined(); //This is only for the coverage
20
+
21
+ testData = Validator.StringFormatMatchValidation({});
22
+ expect(testData).toBeDefined();
23
+ });
24
+
25
+ it('DateValidation is defined', async () => {
26
+ let testData = Validator.DateValidation();
27
+ expect(testData('', '')).not.toBeDefined(); //This is only for the coverage
28
+
29
+ testData = Validator.DateValidation({});
30
+ expect(testData).toBeDefined();
31
+ });
32
+
33
+ it('stringFormatMatchValidatorFactory return the correct result', async () => {
34
+ const testDataFunctionMatch = Validator.stringFormatMatchValidatorFactory({
35
+ toMatch: true,
36
+ pattern: '^valid$',
37
+ });
38
+ const testDataFunctionDontMatch =
39
+ Validator.stringFormatMatchValidatorFactory({
40
+ toMatch: false,
41
+ pattern: '^valid$',
42
+ });
43
+
44
+ expect(testDataFunctionMatch.validate('valid')).toEqual(true);
45
+ expect(testDataFunctionDontMatch.validate('valid')).toEqual(false);
46
+
47
+ expect(testDataFunctionMatch.validate('invalid')).toEqual(false);
48
+ expect(testDataFunctionDontMatch.validate('invalid')).toEqual(true);
49
+ });
50
+
51
+ it("dateValidatorFactory return validateDate's result", async () => {
52
+ const testDataFunction = Validator.dateValidatorFactory();
53
+
54
+ expect(testDataFunction.validate('2023-01-01')).toEqual(true);
55
+ expect(testDataFunction.validate('not-a-date')).toEqual(false);
56
+ });
57
+ });