@schafevormfenster/rest-commons 0.1.9 → 0.1.10
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/.turbo/turbo-check.log +131 -119
- package/package.json +8 -8
- package/src/api-schemas/error.schema.test.ts +20 -14
- package/src/api-schemas/health.schema.test.ts +116 -112
- package/src/api-schemas/okay.schema.test.ts +10 -6
- package/src/api-schemas/result.schema.test.ts +13 -9
- package/src/api-schemas/results.schema.test.ts +27 -7
- package/src/helpers/correlation/get-correlation-id.test.ts +1 -1
- package/src/helpers/correlation/get-header.test.ts +2 -2
- package/src/helpers/detect-mime-type.test.ts +85 -81
- package/src/helpers/detect-suspicious-patterns.test.ts +34 -28
- package/src/helpers/eventify-constants.test.ts +54 -34
- package/src/helpers/eventify-constants.types.test.ts +54 -34
- package/src/helpers/hash-binary.test.ts +50 -46
- package/src/helpers/mime-types/detect-image-mime-type.test.ts +59 -55
- package/src/helpers/mime-types/detect-ole-mime-type.test.ts +73 -69
- package/src/helpers/mime-types/detect-pdf-mime-type.test.ts +30 -26
- package/src/helpers/mime-types/detect-zip-mime-type.test.ts +76 -72
- package/src/helpers/parameter-validation.test.ts +27 -23
- package/src/helpers/slugify.test.ts +62 -58
- package/src/normalization/normalize-list.test.ts +36 -32
- package/src/normalization/normalize-location.test.ts +1 -1
- package/src/primitives/coordinate-precision.test.ts +38 -32
- package/src/primitives/geo-point.schema.test.ts +60 -56
- package/src/primitives/geoname-id.schema.test.ts +50 -46
- package/src/primitives/international-zip.schema.test.ts +175 -121
- package/src/primitives/latitude.schema.test.ts +67 -61
- package/src/primitives/location.schema.test.ts +15 -11
- package/src/primitives/longitude.schema.test.ts +67 -61
- package/src/primitives/numeric-id.schema.test.ts +24 -20
- package/src/primitives/slug.schema.test.ts +93 -85
- package/src/primitives/uuid.schema.test.ts +37 -33
- package/src/primitives/wikidata-id.schema.test.ts +48 -44
- package/src/time/boundary-enforcement.test.ts +1 -1
- package/src/time/bounded-time.schema.test.ts +2 -2
- package/src/time/flexible-time-parser.test.ts +3 -3
- package/src/time/flexible-time.schema.test.ts +6 -6
- package/src/time/is-relative-time.test.ts +18 -14
- package/src/time/iso8601.types.test.ts +4 -4
- package/src/time/parse-relative-time.test.ts +37 -33
- package/src/time/relative-time.schema.test.ts +18 -14
- package/src/time/since-parameter.schema.test.ts +46 -42
- package/src/time/time-helpers.test.ts +2 -2
- package/src/time/time-schemas.test.ts +5 -5
- package/src/time/time.schema.test.ts +19 -15
- package/src/time/timezone-independence.test.ts +2 -2
- package/src/time/timezone.types.test.ts +49 -43
package/.turbo/turbo-check.log
CHANGED
|
@@ -1,174 +1,186 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @schafevormfenster/rest-commons@0.1.
|
|
3
|
+
> @schafevormfenster/rest-commons@0.1.10 check /Users/jan-henrik.hempel/Projects/commons/packages/rest-commons
|
|
4
4
|
> pnpm run typecheck && pnpm run lint && pnpm run test && pnpm run build
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
> @schafevormfenster/rest-commons@0.1.
|
|
7
|
+
> @schafevormfenster/rest-commons@0.1.10 typecheck /Users/jan-henrik.hempel/Projects/commons/packages/rest-commons
|
|
8
8
|
> tsc --noEmit
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
> @schafevormfenster/rest-commons@0.1.
|
|
11
|
+
> @schafevormfenster/rest-commons@0.1.10 lint /Users/jan-henrik.hempel/Projects/commons/packages/rest-commons
|
|
12
12
|
> eslint
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
> @schafevormfenster/rest-commons@0.1.
|
|
15
|
+
> @schafevormfenster/rest-commons@0.1.10 test /Users/jan-henrik.hempel/Projects/commons/packages/rest-commons
|
|
16
16
|
> TZ=UTC vitest run
|
|
17
17
|
|
|
18
18
|
[?25l
|
|
19
|
-
[1m[46m RUN [49m[22m [36mv4.0.
|
|
19
|
+
[1m[46m RUN [49m[22m [36mv4.0.18 [39m[90m/Users/jan-henrik.hempel/Projects/commons/packages/rest-commons[39m
|
|
20
20
|
|
|
21
21
|
[?2026h
|
|
22
22
|
[1m[33m ❯ [39m[22msrc/helpers/correlation/get-header.test.ts[2m [queued][22m
|
|
23
23
|
|
|
24
24
|
[2m Test Files [22m[1m[32m0 passed[39m[22m[90m (45)[39m
|
|
25
25
|
[2m Tests [22m[1m[32m0 passed[39m[22m[90m (0)[39m
|
|
26
|
-
[2m Start at [
|
|
27
|
-
[2m Duration [
|
|
26
|
+
[2m Start at [22m11:59:38
|
|
27
|
+
[2m Duration [22m103ms
|
|
28
28
|
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/helpers/correlation/get-header.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 12[2mms[22m[39m
|
|
29
|
-
[32m✓[39m src/time/
|
|
30
|
-
[32m✓[39m src/helpers/correlation/get-correlation-id.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m
|
|
29
|
+
[32m✓[39m src/time/time-schemas.test.ts [2m([22m[2m24 tests[22m[2m)[22m[32m 12[2mms[22m[39m
|
|
30
|
+
[32m✓[39m src/helpers/correlation/get-correlation-id.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 19[2mms[22m[39m
|
|
31
|
+
[32m✓[39m src/time/since-parameter.schema.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
32
|
+
[32m✓[39m src/time/flexible-time-parser.test.ts [2m([22m[2m63 tests[22m[2m)[22m[32m 15[2mms[22m[39m
|
|
31
33
|
|
|
32
34
|
[1m[33m ❯ [39m[22msrc/helpers/correlation/get-correlation-id.test.ts[2m 11/11[22m
|
|
33
35
|
[1m[33m ❯ [39m[22msrc/helpers/correlation/get-header.test.ts[2m 15/15[22m
|
|
34
36
|
[1m[33m ❯ [39m[22msrc/normalization/normalize-list.test.ts[2m [queued][22m
|
|
35
|
-
[1m[33m ❯ [39m[22msrc/time/bounded-time.schema.test.ts[2m
|
|
36
|
-
[1m[33m ❯ [39m[22msrc/time/flexible-time-parser.test.ts[2m
|
|
37
|
+
[1m[33m ❯ [39m[22msrc/time/bounded-time.schema.test.ts[2m 1/33[22m
|
|
38
|
+
[1m[33m ❯ [39m[22msrc/time/flexible-time-parser.test.ts[2m 63/63[22m
|
|
37
39
|
[1m[33m ❯ [39m[22msrc/time/since-parameter.schema.test.ts[2m 6/6[22m
|
|
38
|
-
[1m[33m ❯ [39m[22msrc/time/time-
|
|
39
|
-
[1m[33m ❯ [39m[22msrc/time/time.schema.test.ts[2m
|
|
40
|
+
[1m[33m ❯ [39m[22msrc/time/time-schemas.test.ts[2m 24/24[22m
|
|
41
|
+
[1m[33m ❯ [39m[22msrc/time/time.schema.test.ts[2m 0/26[22m
|
|
40
42
|
[1m[33m ❯ [39m[22msrc/time/timezone-independence.test.ts[2m [queued][22m
|
|
41
43
|
|
|
42
|
-
[2m Test Files [22m[1m[
|
|
43
|
-
[2m Tests [22m[1m[
|
|
44
|
-
[2m Start at [
|
|
45
|
-
[2m Duration [
|
|
46
|
-
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/time/time
|
|
47
|
-
[32m✓[39m src/time/
|
|
48
|
-
[32m✓[39m src/time/
|
|
49
|
-
[32m✓[39m src/time/
|
|
50
|
-
|
|
44
|
+
[2m Test Files [22m[1m[32m5 passed[39m[22m[90m (45)[39m
|
|
45
|
+
[2m Tests [22m[1m[32m120 passed[39m[22m[90m (178)[39m
|
|
46
|
+
[2m Start at [22m11:59:38
|
|
47
|
+
[2m Duration [22m203ms
|
|
48
|
+
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/time/bounded-time.schema.test.ts [2m([22m[2m33 tests[22m[2m)[22m[32m 9[2mms[22m[39m
|
|
49
|
+
[32m✓[39m src/time/time.schema.test.ts [2m([22m[2m26 tests[22m[2m)[22m[32m 14[2mms[22m[39m
|
|
50
|
+
[32m✓[39m src/time/timezone-independence.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 18[2mms[22m[39m
|
|
51
|
+
[32m✓[39m src/time/iso8601.types.test.ts [2m([22m[2m17 tests[22m[2m)[22m[32m 7[2mms[22m[39m
|
|
52
|
+
{"level":50,"time":1722007200000,"pid":48199,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"rest.helpers.relative-time-parser","error":{"message":"{\"relativeTime\":\"invalid\",\"error\":\"Invalid relative time format: invalid\"}","name":"ObjectError"},"msg":"Invalid relative time format: invalid"}
|
|
53
|
+
{"level":50,"time":1722007200000,"pid":48199,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"rest.helpers.relative-time-parser","error":{"message":"{\"relativeTime\":\"1x\",\"error\":\"Invalid relative time format: 1x\"}","name":"ObjectError"},"msg":"Invalid relative time format: 1x"}
|
|
54
|
+
{"level":50,"time":1722007200000,"pid":48199,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"rest.helpers.relative-time-parser","error":{"message":"{\"relativeTime\":\"\",\"error\":\"Invalid relative time format: \"}","name":"ObjectError"},"msg":"Invalid relative time format: "}
|
|
55
|
+
[32m✓[39m src/time/parse-relative-time.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
56
|
+
[32m✓[39m src/primitives/latitude.schema.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
51
57
|
|
|
58
|
+
[1m[33m ❯ [39m[22msrc/api-schemas/health.schema.test.ts[2m 0/9[22m
|
|
52
59
|
[1m[33m ❯ [39m[22msrc/normalization/normalize-list.test.ts[2m [queued][22m
|
|
53
|
-
[1m[33m ❯ [39m[22msrc/
|
|
54
|
-
[1m[33m ❯ [39m[22msrc/
|
|
55
|
-
[1m[33m ❯ [39m[22msrc/
|
|
56
|
-
[1m[33m ❯ [39m[22msrc/time/
|
|
57
|
-
[1m[33m ❯ [39m[22msrc/time/parse-relative-time.test.ts[2m
|
|
58
|
-
[1m[33m ❯ [39m[22msrc/time/time-
|
|
59
|
-
[1m[33m ❯ [39m[22msrc/time/time.schema.test.ts[2m 26/26[22m
|
|
60
|
+
[1m[33m ❯ [39m[22msrc/primitives/geo-point.schema.test.ts[2m [queued][22m
|
|
61
|
+
[1m[33m ❯ [39m[22msrc/primitives/latitude.schema.test.ts[2m 8/8[22m
|
|
62
|
+
[1m[33m ❯ [39m[22msrc/primitives/slug.schema.test.ts[2m [queued][22m
|
|
63
|
+
[1m[33m ❯ [39m[22msrc/time/iso8601.types.test.ts[2m 17/17[22m
|
|
64
|
+
[1m[33m ❯ [39m[22msrc/time/parse-relative-time.test.ts[2m 6/6[22m
|
|
65
|
+
[1m[33m ❯ [39m[22msrc/time/time-helpers.test.ts[2m [queued][22m
|
|
60
66
|
[1m[33m ❯ [39m[22msrc/time/timezone-independence.test.ts[2m 13/13[22m
|
|
61
67
|
|
|
62
|
-
[2m Test Files [22m[1m[
|
|
63
|
-
[2m Tests [22m[1m[
|
|
64
|
-
[2m Start at [
|
|
65
|
-
[2m Duration [
|
|
66
|
-
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/
|
|
67
|
-
[32m✓[39m src/time/time-
|
|
68
|
-
[32m✓[39m src/
|
|
69
|
-
{"level":
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
{"level":40,"time":
|
|
73
|
-
{"level":40,"time":
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
{"level":50,"time":1722007200000,"pid":42819,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"rest.helpers.relative-time-parser","error":{"message":"{\"relativeTime\":\"1x\",\"error\":\"Invalid relative time format: 1x\"}","name":"ObjectError"},"msg":"Invalid relative time format: 1x"}
|
|
78
|
-
{"level":50,"time":1722007200000,"pid":42819,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"rest.helpers.relative-time-parser","error":{"message":"{\"relativeTime\":\"\",\"error\":\"Invalid relative time format: \"}","name":"ObjectError"},"msg":"Invalid relative time format: "}
|
|
79
|
-
[32m✓[39m src/time/parse-relative-time.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
80
|
-
[32m✓[39m src/primitives/longitude.schema.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
81
|
-
[32m✓[39m src/primitives/latitude.schema.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 3[2mms[22m[39m
|
|
82
|
-
{"level":40,"time":1769518036133,"pid":42780,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"security.sanitizeTag","original":" banana ","sanitized":"banana","reason":"tag-sanitized","msg":"Tag input sanitized"}
|
|
83
|
-
{"level":40,"time":1769518036144,"pid":42780,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"security.sanitizeTag","original":" apple ","sanitized":"apple","reason":"tag-sanitized","msg":"Tag input sanitized"}
|
|
84
|
-
[32m✓[39m src/normalization/normalize-list.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 13[2mms[22m[39m
|
|
85
|
-
[32m✓[39m src/primitives/uuid.schema.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 3[2mms[22m[39m
|
|
86
|
-
|
|
87
|
-
[1m[33m ❯ [39m[22msrc/api-schemas/health.schema.test.ts[2m [queued][22m
|
|
68
|
+
[2m Test Files [22m[1m[32m11 passed[39m[22m[90m (45)[39m
|
|
69
|
+
[2m Tests [22m[1m[32m222 passed[39m[22m[90m (231)[39m
|
|
70
|
+
[2m Start at [22m11:59:38
|
|
71
|
+
[2m Duration [22m303ms
|
|
72
|
+
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/api-schemas/health.schema.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
73
|
+
[32m✓[39m src/time/time-helpers.test.ts [2m([22m[2m42 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
74
|
+
[32m✓[39m src/primitives/geo-point.schema.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
75
|
+
{"level":50,"time":1770724778401,"pid":48200,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"rest.helpers.parameter-validation","error":{"message":"{\"parameterName\":\"slug\",\"suspiciousPatterns\":[\"html.script_tag\"],\"error\":\"Parameter 'slug' contains suspicious patterns\"}","name":"ObjectError"},"msg":"Parameter 'slug' contains suspicious patterns: html.script_tag"}
|
|
76
|
+
[32m✓[39m src/api-schemas/results.schema.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
77
|
+
[32m✓[39m src/primitives/slug.schema.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 9[2mms[22m[39m
|
|
78
|
+
{"level":40,"time":1770724778409,"pid":48194,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"security.sanitizeTag","original":" banana ","sanitized":"banana","reason":"tag-sanitized","msg":"Tag input sanitized"}
|
|
79
|
+
{"level":40,"time":1770724778416,"pid":48194,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"security.sanitizeTag","original":" apple ","sanitized":"apple","reason":"tag-sanitized","msg":"Tag input sanitized"}
|
|
80
|
+
[32m✓[39m src/normalization/normalize-list.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
|
|
81
|
+
|
|
82
|
+
[1m[33m ❯ [39m[22msrc/api-schemas/results.schema.test.ts[2m 3/3[22m
|
|
88
83
|
[1m[33m ❯ [39m[22msrc/normalization/normalize-list.test.ts[2m 4/4[22m
|
|
89
|
-
[1m[33m ❯ [39m[22msrc/primitives/
|
|
90
|
-
[1m[33m ❯ [39m[22msrc/primitives/
|
|
91
|
-
[1m[33m ❯ [39m[22msrc/primitives/
|
|
92
|
-
[1m[33m ❯ [39m[22msrc/
|
|
93
|
-
[1m[33m ❯ [39m[22msrc/time/
|
|
94
|
-
[1m[33m ❯ [39m[22msrc/time/
|
|
95
|
-
[1m[33m ❯ [39m[22msrc/time/time-
|
|
84
|
+
[1m[33m ❯ [39m[22msrc/primitives/geo-point.schema.test.ts[2m 7/7[22m
|
|
85
|
+
[1m[33m ❯ [39m[22msrc/primitives/geoname-id.schema.test.ts[2m [queued][22m
|
|
86
|
+
[1m[33m ❯ [39m[22msrc/primitives/slug.schema.test.ts[2m 15/15[22m
|
|
87
|
+
[1m[33m ❯ [39m[22msrc/primitives/wikidata-id.schema.test.ts[2m [queued][22m
|
|
88
|
+
[1m[33m ❯ [39m[22msrc/time/boundary-enforcement.test.ts[2m 0/12[22m
|
|
89
|
+
[1m[33m ❯ [39m[22msrc/time/flexible-time.schema.test.ts[2m [queued][22m
|
|
90
|
+
[1m[33m ❯ [39m[22msrc/time/time-helpers.test.ts[2m 42/42[22m
|
|
96
91
|
|
|
97
92
|
[2m Test Files [22m[1m[32m17 passed[39m[22m[90m (45)[39m
|
|
98
|
-
[2m Tests [22m[1m[
|
|
99
|
-
[2m Start at [
|
|
100
|
-
[2m Duration [
|
|
101
|
-
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
{"level":
|
|
93
|
+
[2m Tests [22m[1m[32m302 passed[39m[22m[90m (314)[39m
|
|
94
|
+
[2m Start at [22m11:59:38
|
|
95
|
+
[2m Duration [22m403ms
|
|
96
|
+
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K{"level":40,"time":1770724778473,"pid":48206,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"helpers.time.boundary-enforcement","field":"testField","originalValue":"2024-01-01T12:00:00.000Z","clampedValue":"2024-01-08T12:00:00.000Z","boundary":"minimum (-1w)","msg":"Calendar update query testField clamped to minimum boundary"}
|
|
97
|
+
{"level":40,"time":1770724778473,"pid":48206,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"helpers.time.boundary-enforcement","field":"testField","originalValue":"2020-01-01T12:00:00.000Z","clampedValue":"2024-01-08T12:00:00.000Z","boundary":"minimum (-1w)","msg":"Calendar update query testField clamped to minimum boundary"}
|
|
98
|
+
{"level":40,"time":1770724778473,"pid":48206,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"helpers.time.boundary-enforcement","field":"testField","originalValue":"2025-02-15T12:00:00.000Z","clampedValue":"2025-01-15T12:00:00.000Z","boundary":"maximum (+12m)","msg":"Calendar update query testField clamped to maximum boundary"}
|
|
99
|
+
{"level":40,"time":1770724778473,"pid":48206,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"helpers.time.boundary-enforcement","field":"testField","originalValue":"2030-01-01T12:00:00.000Z","clampedValue":"2025-01-15T12:00:00.000Z","boundary":"maximum (+12m)","msg":"Calendar update query testField clamped to maximum boundary"}
|
|
100
|
+
{"level":40,"time":1770724778473,"pid":48206,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"helpers.time.boundary-enforcement","field":"testField","originalValue":"2024-01-10T12:00:00.000Z","clampedValue":"2026-02-03T11:59:38.473Z","boundary":"minimum (-1w)","msg":"Calendar update query testField clamped to minimum boundary"}
|
|
101
|
+
{"level":40,"time":1770724778473,"pid":48206,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"helpers.time.boundary-enforcement","field":"customFieldName","originalValue":"2024-01-01T12:00:00.000Z","clampedValue":"2024-01-08T12:00:00.000Z","boundary":"minimum (-1w)","msg":"Calendar update query customFieldName clamped to minimum boundary"}
|
|
102
|
+
[32m✓[39m src/time/boundary-enforcement.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
103
|
+
[32m✓[39m src/primitives/geoname-id.schema.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
104
|
+
[32m✓[39m src/primitives/wikidata-id.schema.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 3[2mms[22m[39m
|
|
105
|
+
[32m✓[39m src/time/flexible-time.schema.test.ts [2m([22m[2m36 tests[22m[2m)[22m[32m 10[2mms[22m[39m
|
|
106
|
+
[32m✓[39m src/helpers/mime-types/detect-ole-mime-type.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
107
|
+
[32m✓[39m src/helpers/eventify-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
108
|
+
[32m✓[39m src/api-schemas/okay.schema.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
109
|
+
{"level":50,"time":1770724778538,"pid":48218,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"rest.helpers.parameter-validation","error":{"message":"{\"parameterName\":\"location\",\"suspiciousPatterns\":[\"html.script_tag\"],\"error\":\"Parameter 'location' contains suspicious patterns\"}","name":"ObjectError"},"msg":"Parameter 'location' contains suspicious patterns: html.script_tag"}
|
|
107
110
|
[32m✓[39m src/primitives/location.schema.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
[32m✓[39m src/helpers/parameter-validation.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
115
|
-
[32m✓[39m src/api-schemas/results.schema.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
116
|
-
|
|
117
|
-
[1m[33m ❯ [39m[22msrc/api-schemas/health.schema.test.ts[2m 7/7[22m
|
|
118
|
-
[1m[33m ❯ [39m[22msrc/api-schemas/result.schema.test.ts[2m 2/2[22m
|
|
119
|
-
[1m[33m ❯ [39m[22msrc/api-schemas/results.schema.test.ts[2m 1/1[22m
|
|
120
|
-
[1m[33m ❯ [39m[22msrc/helpers/eventify-constants.test.ts[2m 5/5[22m
|
|
121
|
-
[1m[33m ❯ [39m[22msrc/helpers/mime-types/detect-image-mime-type.test.ts[2m [queued][22m
|
|
122
|
-
[1m[33m ❯ [39m[22msrc/helpers/parameter-validation.test.ts[2m 5/5[22m
|
|
111
|
+
[32m✓[39m src/primitives/international-zip.schema.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 8[2mms[22m[39m
|
|
112
|
+
|
|
113
|
+
[1m[33m ❯ [39m[22msrc/api-schemas/okay.schema.test.ts[2m 2/2[22m
|
|
114
|
+
[1m[33m ❯ [39m[22msrc/helpers/eventify-constants.test.ts[2m 9/9[22m
|
|
115
|
+
[1m[33m ❯ [39m[22msrc/helpers/mime-types/detect-ole-mime-type.test.ts[2m 10/10[22m
|
|
116
|
+
[1m[33m ❯ [39m[22msrc/primitives/geoname-id.schema.test.ts[2m 7/7[22m
|
|
123
117
|
[1m[33m ❯ [39m[22msrc/primitives/international-zip.schema.test.ts[2m 29/29[22m
|
|
124
118
|
[1m[33m ❯ [39m[22msrc/primitives/location.schema.test.ts[2m 3/3[22m
|
|
125
|
-
[1m[33m ❯ [39m[22msrc/primitives/
|
|
119
|
+
[1m[33m ❯ [39m[22msrc/primitives/wikidata-id.schema.test.ts[2m 8/8[22m
|
|
120
|
+
[1m[33m ❯ [39m[22msrc/time/flexible-time.schema.test.ts[2m 36/36[22m
|
|
121
|
+
[1m[33m ❯ [39m[22msrc/time/relative-time.schema.test.ts[2m [queued][22m
|
|
126
122
|
|
|
127
123
|
[2m Test Files [22m[1m[32m26 passed[39m[22m[90m (45)[39m
|
|
128
|
-
[2m Tests [22m[1m[
|
|
129
|
-
[2m Start at [
|
|
130
|
-
[2m Duration [
|
|
131
|
-
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/primitives/
|
|
132
|
-
[32m✓[39m src/
|
|
133
|
-
[32m✓[39m src/api-schemas/error.schema.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
124
|
+
[2m Tests [22m[1m[32m418 passed[39m[22m[90m (418)[39m
|
|
125
|
+
[2m Start at [22m11:59:38
|
|
126
|
+
[2m Duration [22m503ms
|
|
127
|
+
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/primitives/uuid.schema.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
128
|
+
[32m✓[39m src/time/relative-time.schema.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
134
129
|
[32m✓[39m src/time/timezone.types.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
135
|
-
[32m✓[39m src/
|
|
136
|
-
[32m✓[39m src/
|
|
137
|
-
[32m✓[39m src/api-schemas/
|
|
138
|
-
[32m✓[39m src/helpers/eventify-constants.types.test.ts [2m([22m[
|
|
139
|
-
|
|
130
|
+
[32m✓[39m src/helpers/hash-binary.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
|
|
131
|
+
[32m✓[39m src/primitives/longitude.schema.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
132
|
+
[32m✓[39m src/api-schemas/result.schema.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
133
|
+
[32m✓[39m src/helpers/eventify-constants.types.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
134
|
+
{"level":50,"time":1770724778675,"pid":48230,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"rest.helpers.parameter-validation","error":{"message":"{\"parameterName\":\"location\",\"suspiciousPatterns\":[\"html.script_tag\"],\"error\":\"Parameter 'location' contains suspicious patterns\"}","name":"ObjectError"},"msg":"Parameter 'location' contains suspicious patterns: html.script_tag"}
|
|
135
|
+
{"level":50,"time":1770724778676,"pid":48230,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"rest.helpers.parameter-validation","error":{"message":"{\"parameterName\":\"location\",\"suspiciousPatterns\":[\"sql.drop_table\"],\"error\":\"Parameter 'location' contains suspicious patterns\"}","name":"ObjectError"},"msg":"Parameter 'location' contains suspicious patterns: sql.drop_table"}
|
|
136
|
+
{"level":50,"time":1770724778676,"pid":48230,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"rest.helpers.parameter-validation","error":{"message":"{\"parameterName\":\"slug\",\"suspiciousPatterns\":[\"url.embedded\"],\"error\":\"Parameter 'slug' contains suspicious patterns\"}","name":"ObjectError"},"msg":"Parameter 'slug' contains suspicious patterns: url.embedded"}
|
|
137
|
+
{"level":50,"time":1770724778676,"pid":48230,"hostname":"Jan--Schafe-vorm-Fenster.local","name":"rest.helpers.parameter-validation","error":{"message":"{\"parameterName\":\"id\",\"suspiciousPatterns\":[\"prompt.injection.language\"],\"error\":\"Parameter 'id' contains suspicious patterns\"}","name":"ObjectError"},"msg":"Parameter 'id' contains suspicious patterns: prompt.injection.language"}
|
|
140
138
|
|
|
141
|
-
[1m[33m ❯ [39m[22msrc/api-schemas/
|
|
142
|
-
[1m[33m ❯ [39m[22msrc/
|
|
143
|
-
[1m[33m ❯ [39m[22msrc/helpers/eventify-constants.types.test.ts[2m 5/5[22m
|
|
139
|
+
[1m[33m ❯ [39m[22msrc/api-schemas/result.schema.test.ts[2m 2/2[22m
|
|
140
|
+
[1m[33m ❯ [39m[22msrc/helpers/eventify-constants.types.test.ts[2m 9/9[22m
|
|
144
141
|
[1m[33m ❯ [39m[22msrc/helpers/hash-binary.test.ts[2m 7/7[22m
|
|
145
|
-
[1m[33m ❯ [39m[22msrc/helpers/
|
|
146
|
-
[1m[33m ❯ [39m[22msrc/
|
|
147
|
-
[1m[33m ❯ [39m[22msrc/primitives/
|
|
148
|
-
[1m[33m ❯ [39m[22msrc/primitives/
|
|
142
|
+
[1m[33m ❯ [39m[22msrc/helpers/parameter-validation.test.ts[2m 0/5[22m
|
|
143
|
+
[1m[33m ❯ [39m[22msrc/primitives/longitude.schema.test.ts[2m 8/8[22m
|
|
144
|
+
[1m[33m ❯ [39m[22msrc/primitives/numeric-id.schema.test.ts[2m 0/5[22m
|
|
145
|
+
[1m[33m ❯ [39m[22msrc/primitives/uuid.schema.test.ts[2m 5/5[22m
|
|
146
|
+
[1m[33m ❯ [39m[22msrc/time/relative-time.schema.test.ts[2m 2/2[22m
|
|
149
147
|
[1m[33m ❯ [39m[22msrc/time/timezone.types.test.ts[2m 4/4[22m
|
|
150
148
|
|
|
151
|
-
[2m Test Files [22m[1m[
|
|
152
|
-
[2m Tests [22m[1m[
|
|
153
|
-
[2m Start at [
|
|
154
|
-
[2m Duration [
|
|
155
|
-
[?2026l[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/helpers/
|
|
149
|
+
[2m Test Files [22m[1m[32m33 passed[39m[22m[90m (45)[39m
|
|
150
|
+
[2m Tests [22m[1m[32m455 passed[39m[22m[90m (465)[39m
|
|
151
|
+
[2m Start at [22m11:59:38
|
|
152
|
+
[2m Duration [22m603ms
|
|
153
|
+
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/helpers/parameter-validation.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
154
|
+
[32m✓[39m src/primitives/numeric-id.schema.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
155
|
+
[32m✓[39m src/primitives/coordinate-precision.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 3[2mms[22m[39m
|
|
156
156
|
[32m✓[39m src/helpers/slugify.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
157
|
-
[32m✓[39m src/
|
|
157
|
+
[32m✓[39m src/helpers/detect-suspicious-patterns.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
158
|
+
[32m✓[39m src/api-schemas/error.schema.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
159
|
+
[32m✓[39m src/helpers/mime-types/detect-image-mime-type.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 1[2mms[22m[39m
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
[1m[33m ❯ [39m[22msrc/helpers/detect-mime-type.test.ts[2m [queued][22m
|
|
164
|
+
[1m[33m ❯ [39m[22msrc/helpers/mime-types/detect-pdf-mime-type.test.ts[2m [queued][22m
|
|
165
|
+
[1m[33m ❯ [39m[22msrc/helpers/mime-types/detect-zip-mime-type.test.ts[2m 0/9[22m
|
|
166
|
+
[1m[33m ❯ [39m[22msrc/normalization/normalize-location.test.ts[2m 0/13[22m
|
|
167
|
+
|
|
168
|
+
[2m Test Files [22m[1m[32m40 passed[39m[22m[90m (45)[39m
|
|
169
|
+
[2m Tests [22m[1m[32m504 passed[39m[22m[90m (526)[39m
|
|
170
|
+
[2m Start at [22m11:59:38
|
|
171
|
+
[2m Duration [22m703ms
|
|
172
|
+
[?2026l[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/helpers/mime-types/detect-pdf-mime-type.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 1[2mms[22m[39m
|
|
158
173
|
[32m✓[39m src/helpers/mime-types/detect-zip-mime-type.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 1[2mms[22m[39m
|
|
159
|
-
[32m✓[39m src/
|
|
160
|
-
[32m✓[39m src/primitives/numeric-id.schema.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
161
|
-
[32m✓[39m src/helpers/mime-types/detect-ole-mime-type.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
174
|
+
[32m✓[39m src/normalization/normalize-location.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
162
175
|
[32m✓[39m src/helpers/detect-mime-type.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
163
|
-
[32m✓[39m src/time/relative-time.schema.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
164
176
|
[32m✓[39m src/time/is-relative-time.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 1[2mms[22m[39m
|
|
165
177
|
|
|
166
178
|
[2m Test Files [22m [1m[32m45 passed[39m[22m[90m (45)[39m
|
|
167
|
-
[2m Tests [22m [1m[
|
|
168
|
-
[2m Start at [22m
|
|
169
|
-
[2m Duration [22m
|
|
179
|
+
[2m Tests [22m [1m[32m546 passed[39m[22m[90m (546)[39m
|
|
180
|
+
[2m Start at [22m 11:59:38
|
|
181
|
+
[2m Duration [22m 803ms[2m (transform 1.04s, setup 0ms, import 1.87s, tests 269ms, environment 3ms)[22m
|
|
170
182
|
|
|
171
183
|
[?25h
|
|
172
|
-
> @schafevormfenster/rest-commons@0.1.
|
|
184
|
+
> @schafevormfenster/rest-commons@0.1.10 build /Users/jan-henrik.hempel/Projects/commons/packages/rest-commons
|
|
173
185
|
> tsc
|
|
174
186
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schafevormfenster/rest-commons",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"description": "Centralized authority for REST standards and schemas - XSD schemas, parsing functions, and coding instructions",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -20,20 +20,20 @@
|
|
|
20
20
|
"node": ">=24"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@types/node": "^22.19.
|
|
24
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
25
|
-
"@typescript-eslint/parser": "^8.
|
|
23
|
+
"@types/node": "^22.19.10",
|
|
24
|
+
"@typescript-eslint/eslint-plugin": "^8.55.0",
|
|
25
|
+
"@typescript-eslint/parser": "^8.55.0",
|
|
26
26
|
"eslint": "^9.39.2",
|
|
27
27
|
"typescript": "^5.9.3",
|
|
28
|
-
"vitest": "^4.0.
|
|
29
|
-
"@schafevormfenster/eslint-config": "0.0.
|
|
28
|
+
"vitest": "^4.0.18",
|
|
29
|
+
"@schafevormfenster/eslint-config": "0.0.11"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"dayjs": "^1.11.19",
|
|
33
33
|
"slugify": "^1.6.6",
|
|
34
34
|
"zod": "^3.25.76",
|
|
35
|
-
"@schafevormfenster/logging": "0.1.
|
|
36
|
-
"@schafevormfenster/security": "0.1.
|
|
35
|
+
"@schafevormfenster/logging": "0.1.8",
|
|
36
|
+
"@schafevormfenster/security": "0.1.5"
|
|
37
37
|
},
|
|
38
38
|
"scripts": {
|
|
39
39
|
"typecheck": "tsc --noEmit",
|
|
@@ -3,25 +3,31 @@ import { describe, it, expect } from "vitest";
|
|
|
3
3
|
import { ApiErrorSchema, ApiErrorConstructor } from "./error.schema";
|
|
4
4
|
|
|
5
5
|
describe("ApiErrorSchema", () => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
describe("Happy Path", () => {
|
|
7
|
+
it("validates error shape for 4xx/5xx", () => {
|
|
8
|
+
const parsed = ApiErrorSchema.parse({ status: 404, error: "Not Found" });
|
|
9
|
+
expect(parsed.status).toBe(404);
|
|
10
|
+
expect(parsed.error).toMatch(/not found/i);
|
|
11
|
+
});
|
|
10
12
|
});
|
|
11
13
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
describe("Error Handling", () => {
|
|
15
|
+
it("rejects non-error status codes", () => {
|
|
16
|
+
expect(() => ApiErrorSchema.parse({ status: 200, error: "ok" })).toThrow();
|
|
17
|
+
expect(() =>
|
|
18
|
+
ApiErrorSchema.parse({ status: 600, error: "invalid" })
|
|
19
|
+
).toThrow();
|
|
20
|
+
});
|
|
17
21
|
});
|
|
18
22
|
});
|
|
19
23
|
|
|
20
24
|
describe("ApiError class", () => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
describe("Happy Path", () => {
|
|
26
|
+
it("sets status and name", () => {
|
|
27
|
+
const error = new ApiErrorConstructor(418, "I'm a teapot");
|
|
28
|
+
expect(error.status).toBe(418);
|
|
29
|
+
expect(error.message).toMatch(/i'm a teapot/i);
|
|
30
|
+
expect(error.name).toBe("ApiError");
|
|
31
|
+
});
|
|
26
32
|
});
|
|
27
33
|
});
|