@outfoxx/sunday 1.0.8 → 1.1.0-alpha.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.
Files changed (151) hide show
  1. package/README.md +35 -2
  2. package/dist/any-type.d.ts +2 -0
  3. package/dist/class-type.d.ts +2 -2
  4. package/dist/date-time-types.d.ts +2 -7
  5. package/dist/date-time-types.js +2 -4
  6. package/dist/date-time-types.js.map +1 -1
  7. package/dist/event-parser.d.ts +17 -0
  8. package/dist/event-parser.js +140 -0
  9. package/dist/event-parser.js.map +1 -0
  10. package/dist/fetch-event-source.d.ts +12 -10
  11. package/dist/fetch-event-source.js +141 -138
  12. package/dist/fetch-event-source.js.map +1 -1
  13. package/dist/fetch-request-factory.d.ts +10 -5
  14. package/dist/fetch-request-factory.js +87 -71
  15. package/dist/fetch-request-factory.js.map +1 -1
  16. package/dist/fetch.d.ts +7 -1
  17. package/dist/fetch.js +61 -8
  18. package/dist/fetch.js.map +1 -1
  19. package/dist/header-parameters.d.ts +3 -0
  20. package/dist/header-parameters.js +40 -0
  21. package/dist/header-parameters.js.map +1 -0
  22. package/dist/index.d.ts +12 -12
  23. package/dist/index.js +12 -12
  24. package/dist/index.js.map +1 -1
  25. package/dist/{binary-decoder.d.ts → media-type-codecs/binary-decoder.d.ts} +2 -2
  26. package/dist/{binary-decoder.js → media-type-codecs/binary-decoder.js} +0 -0
  27. package/dist/media-type-codecs/binary-decoder.js.map +1 -0
  28. package/dist/{binary-encoder.d.ts → media-type-codecs/binary-encoder.d.ts} +0 -0
  29. package/dist/{binary-encoder.js → media-type-codecs/binary-encoder.js} +0 -0
  30. package/dist/media-type-codecs/binary-encoder.js.map +1 -0
  31. package/dist/media-type-codecs/cbor-decoder.d.ts +39 -0
  32. package/dist/media-type-codecs/cbor-decoder.js +413 -0
  33. package/dist/media-type-codecs/cbor-decoder.js.map +1 -0
  34. package/dist/media-type-codecs/cbor-encoder.d.ts +43 -0
  35. package/dist/media-type-codecs/cbor-encoder.js +226 -0
  36. package/dist/media-type-codecs/cbor-encoder.js.map +1 -0
  37. package/dist/media-type-codecs/cbor-tags.d.ts +4 -0
  38. package/dist/media-type-codecs/cbor-tags.js +5 -0
  39. package/dist/media-type-codecs/cbor-tags.js.map +1 -0
  40. package/dist/media-type-codecs/json-decoder.d.ts +39 -0
  41. package/dist/media-type-codecs/json-decoder.js +367 -0
  42. package/dist/media-type-codecs/json-decoder.js.map +1 -0
  43. package/dist/media-type-codecs/json-encoder.d.ts +44 -0
  44. package/dist/media-type-codecs/json-encoder.js +263 -0
  45. package/dist/media-type-codecs/json-encoder.js.map +1 -0
  46. package/dist/media-type-codecs/media-type-decoder.d.ts +11 -0
  47. package/dist/media-type-codecs/media-type-decoder.js +6 -0
  48. package/dist/media-type-codecs/media-type-decoder.js.map +1 -0
  49. package/dist/{media-type-decoders.d.ts → media-type-codecs/media-type-decoders.d.ts} +5 -4
  50. package/dist/{media-type-decoders.js → media-type-codecs/media-type-decoders.js} +6 -6
  51. package/dist/media-type-codecs/media-type-decoders.js.map +1 -0
  52. package/dist/{media-type-encoder.d.ts → media-type-codecs/media-type-encoder.d.ts} +5 -1
  53. package/dist/media-type-codecs/media-type-encoder.js +11 -0
  54. package/dist/media-type-codecs/media-type-encoder.js.map +1 -0
  55. package/dist/{media-type-encoders.d.ts → media-type-codecs/media-type-encoders.d.ts} +5 -4
  56. package/dist/{media-type-encoders.js → media-type-codecs/media-type-encoders.js} +8 -8
  57. package/dist/media-type-codecs/media-type-encoders.js.map +1 -0
  58. package/dist/{url-encoder.d.ts → media-type-codecs/www-form-url-encoder.d.ts} +8 -8
  59. package/dist/{url-encoder.js → media-type-codecs/www-form-url-encoder.js} +38 -37
  60. package/dist/media-type-codecs/www-form-url-encoder.js.map +1 -0
  61. package/dist/media-type.d.ts +91 -13
  62. package/dist/media-type.js +273 -15
  63. package/dist/media-type.js.map +1 -1
  64. package/dist/problem.d.ts +24 -9
  65. package/dist/problem.js +140 -6
  66. package/dist/problem.js.map +1 -1
  67. package/dist/request-factory.d.ts +10 -10
  68. package/dist/sunday-error.d.ts +11 -0
  69. package/dist/sunday-error.js +18 -0
  70. package/dist/sunday-error.js.map +1 -0
  71. package/dist/util/any.d.ts +2 -0
  72. package/dist/util/any.js +11 -0
  73. package/dist/util/any.js.map +1 -0
  74. package/dist/util/error.d.ts +2 -0
  75. package/dist/util/error.js +13 -0
  76. package/dist/util/error.js.map +1 -0
  77. package/dist/util/hex.js +3 -2
  78. package/dist/util/hex.js.map +1 -1
  79. package/dist/util/rxjs.d.ts +3 -0
  80. package/dist/util/rxjs.js +9 -5
  81. package/dist/util/rxjs.js.map +1 -1
  82. package/dist/util/temporal.d.ts +2 -0
  83. package/dist/util/temporal.js +18 -0
  84. package/dist/util/temporal.js.map +1 -0
  85. package/package.json +27 -21
  86. package/src/any-type.ts +4 -0
  87. package/src/class-type.ts +6 -2
  88. package/src/date-time-types.ts +22 -9
  89. package/src/event-parser.ts +190 -0
  90. package/src/fetch-event-source.ts +149 -159
  91. package/src/fetch-request-factory.ts +129 -101
  92. package/src/fetch.ts +65 -14
  93. package/src/header-parameters.ts +52 -0
  94. package/src/index.ts +12 -12
  95. package/src/{binary-decoder.ts → media-type-codecs/binary-decoder.ts} +3 -3
  96. package/src/{binary-encoder.ts → media-type-codecs/binary-encoder.ts} +0 -0
  97. package/src/media-type-codecs/cbor-decoder.ts +515 -0
  98. package/src/media-type-codecs/cbor-encoder.ts +307 -0
  99. package/src/media-type-codecs/cbor-tags.ts +4 -0
  100. package/src/media-type-codecs/json-decoder.ts +470 -0
  101. package/src/media-type-codecs/json-encoder.ts +328 -0
  102. package/src/media-type-codecs/media-type-decoder.ts +20 -0
  103. package/src/{media-type-decoders.ts → media-type-codecs/media-type-decoders.ts} +21 -13
  104. package/src/media-type-codecs/media-type-encoder.ts +31 -0
  105. package/src/{media-type-encoders.ts → media-type-codecs/media-type-encoders.ts} +23 -15
  106. package/src/{url-encoder.ts → media-type-codecs/www-form-url-encoder.ts} +53 -47
  107. package/src/media-type.ts +326 -22
  108. package/src/problem.ts +144 -12
  109. package/src/request-factory.ts +21 -12
  110. package/src/sunday-error.ts +37 -0
  111. package/src/util/any.ts +10 -0
  112. package/src/util/error.ts +14 -0
  113. package/src/util/hex.ts +3 -2
  114. package/src/util/rxjs.ts +16 -5
  115. package/src/util/temporal.ts +18 -0
  116. package/dist/binary-decoder.js.map +0 -1
  117. package/dist/binary-encoder.js.map +0 -1
  118. package/dist/cbor-decoder.d.ts +0 -15
  119. package/dist/cbor-decoder.js +0 -126
  120. package/dist/cbor-decoder.js.map +0 -1
  121. package/dist/cbor-encoder.d.ts +0 -29
  122. package/dist/cbor-encoder.js +0 -81
  123. package/dist/cbor-encoder.js.map +0 -1
  124. package/dist/cbor-tags.d.ts +0 -3
  125. package/dist/cbor-tags.js +0 -4
  126. package/dist/cbor-tags.js.map +0 -1
  127. package/dist/http-error.d.ts +0 -10
  128. package/dist/http-error.js +0 -45
  129. package/dist/http-error.js.map +0 -1
  130. package/dist/json-decoder.d.ts +0 -31
  131. package/dist/json-decoder.js +0 -139
  132. package/dist/json-decoder.js.map +0 -1
  133. package/dist/json-encoder.d.ts +0 -35
  134. package/dist/json-encoder.js +0 -116
  135. package/dist/json-encoder.js.map +0 -1
  136. package/dist/media-type-decoder.d.ts +0 -4
  137. package/dist/media-type-decoder.js +0 -2
  138. package/dist/media-type-decoder.js.map +0 -1
  139. package/dist/media-type-decoders.js.map +0 -1
  140. package/dist/media-type-encoder.js +0 -6
  141. package/dist/media-type-encoder.js.map +0 -1
  142. package/dist/media-type-encoders.js.map +0 -1
  143. package/dist/url-encoder.js.map +0 -1
  144. package/src/cbor-decoder.ts +0 -148
  145. package/src/cbor-encoder.ts +0 -95
  146. package/src/cbor-tags.ts +0 -3
  147. package/src/http-error.ts +0 -55
  148. package/src/json-decoder.ts +0 -164
  149. package/src/json-encoder.ts +0 -144
  150. package/src/media-type-decoder.ts +0 -5
  151. package/src/media-type-encoder.ts +0 -16
@@ -1,164 +0,0 @@
1
- import { JsonParser } from '@outfoxx/jackson-js';
2
- import { CustomMapper, Deserializer } from '@outfoxx/jackson-js/dist/@types';
3
- import { DateTime } from 'luxon';
4
- import { AnyType } from './any-type';
5
- import { MediaTypeDecoder } from './media-type-decoder';
6
- import { Base64 } from './util/base64';
7
-
8
- export class JSONDecoder implements MediaTypeDecoder {
9
- static get default(): JSONDecoder {
10
- return new JSONDecoder(
11
- JSONDecoder.NumericDateDecoding.MILLISECONDS_SINCE_EPOCH
12
- );
13
- }
14
-
15
- private readonly customDeserializers: CustomMapper<Deserializer>[];
16
- private readonly parser = new JsonParser();
17
-
18
- constructor(readonly numericDateDecoding: JSONDecoder.NumericDateDecoding) {
19
- this.customDeserializers = [
20
- {
21
- type: () => Date,
22
- mapper: this.dateDeserializer,
23
- },
24
- {
25
- type: () => DateTime,
26
- mapper: this.dateTimeDeserializer,
27
- },
28
- {
29
- type: () => URL,
30
- mapper: this.urlDeserializer,
31
- },
32
- {
33
- type: () => ArrayBuffer,
34
- mapper: this.arrayBufferDeserializer,
35
- },
36
- ];
37
- }
38
-
39
- async decode<T>(response: Response, type: AnyType): Promise<T> {
40
- return this.decodeJSON(await response.json(), type);
41
- }
42
-
43
- decodeText<T>(text: string, type: AnyType): T {
44
- return this.parser.parse(text, {
45
- deserializers: this.customDeserializers,
46
- mainCreator: () => type,
47
- }) as T;
48
- }
49
-
50
- decodeJSON<T, U>(value: T, type: AnyType): Promise<U> {
51
- return this.parser.transform(value, {
52
- deserializers: this.customDeserializers,
53
- mainCreator: () => type,
54
- });
55
- }
56
-
57
- private dateTimeDeserializer: Deserializer = (
58
- key: string,
59
- value: unknown
60
- ) => {
61
- if (value == null) {
62
- return value;
63
- }
64
- if (DateTime.isDateTime(value)) {
65
- return value;
66
- }
67
- if (value instanceof Date) {
68
- return DateTime.fromJSDate(value, { zone: 'UTC' });
69
- }
70
- if (typeof value === 'number') {
71
- if (
72
- this.numericDateDecoding ===
73
- JSONDecoder.NumericDateDecoding.MILLISECONDS_SINCE_EPOCH
74
- ) {
75
- return DateTime.fromMillis(value, { zone: 'UTC' });
76
- } else if (
77
- this.numericDateDecoding ===
78
- JSONDecoder.NumericDateDecoding.SECONDS_SINCE_EPOCH
79
- ) {
80
- return DateTime.fromSeconds(value, { zone: 'UTC' });
81
- } else {
82
- console.error('Unsupported date decoding format');
83
- }
84
- }
85
- if (typeof value === 'string') {
86
- return DateTime.fromISO(value, { setZone: true });
87
- }
88
- throw new Error(`Invalid date value for property ${key}`);
89
- };
90
-
91
- private dateDeserializer: Deserializer = (key: string, value: unknown) => {
92
- if (value == null) {
93
- return value;
94
- }
95
- if (value instanceof Date) {
96
- return value;
97
- }
98
- if (typeof value === 'number') {
99
- if (
100
- this.numericDateDecoding ===
101
- JSONDecoder.NumericDateDecoding.MILLISECONDS_SINCE_EPOCH
102
- ) {
103
- return new Date(value);
104
- } else if (
105
- this.numericDateDecoding ===
106
- JSONDecoder.NumericDateDecoding.SECONDS_SINCE_EPOCH
107
- ) {
108
- return new Date(value * 1000);
109
- } else {
110
- console.error('Unsupported date decoding format');
111
- }
112
- }
113
- if (typeof value === 'string') {
114
- return new Date(value);
115
- }
116
- throw new Error(`Invalid date value for property ${key}`);
117
- };
118
-
119
- private urlDeserializer: Deserializer = (key: string, value: unknown) => {
120
- if (value == null) {
121
- return value;
122
- }
123
- if (value instanceof URL) {
124
- return value;
125
- }
126
- if (typeof value === 'string') {
127
- return new URL(value);
128
- }
129
- throw Error(`Invalid URL value for property ${key}`);
130
- };
131
-
132
- private arrayBufferDeserializer: Deserializer = (
133
- key: string,
134
- value: unknown
135
- ) => {
136
- if (value == null) {
137
- return value;
138
- }
139
- if (value instanceof ArrayBuffer) {
140
- return value;
141
- }
142
- if (typeof value === 'string') {
143
- return Base64.decode(value);
144
- }
145
- throw Error(`Invalid ArrayBuffer value for property ${key}`);
146
- };
147
- }
148
-
149
- export namespace JSONDecoder {
150
- /**
151
- * Configures how numeric `Date` & `DateTime` parameters are decoded.
152
- */
153
- export enum NumericDateDecoding {
154
- /**
155
- * Decode the `Date`/`DateTime` as a UNIX timestamp (floating point seconds since epoch).
156
- */
157
- SECONDS_SINCE_EPOCH,
158
-
159
- /**
160
- * Decode the `Date`/`DateTime` as UNIX millisecond timestamp (integer milliseconds since epoch).
161
- */
162
- MILLISECONDS_SINCE_EPOCH,
163
- }
164
- }
@@ -1,144 +0,0 @@
1
- import { CustomMapper, Serializer } from '@outfoxx/jackson-js/dist/@types';
2
- import { DateTime } from 'luxon';
3
- import { MediaTypeEncoder } from './media-type-encoder';
4
- import { AnyType } from './any-type';
5
- import { JsonStringifier } from '@outfoxx/jackson-js';
6
- import { Base64 } from './util/base64';
7
- import 'reflect-metadata';
8
-
9
- export class JSONEncoder implements MediaTypeEncoder {
10
- static get default(): JSONEncoder {
11
- return new JSONEncoder(JSONEncoder.DateEncoding.ISO8601);
12
- }
13
-
14
- private readonly customSerializers: CustomMapper<Serializer>[];
15
- private stringifier = new JsonStringifier();
16
-
17
- constructor(readonly dateEncoding: JSONEncoder.DateEncoding) {
18
- this.customSerializers = [
19
- {
20
- type: () => Date,
21
- mapper: this.dateSerializer,
22
- },
23
- {
24
- type: () => DateTime,
25
- mapper: this.dateTimeSerializer,
26
- },
27
- {
28
- type: () => URL,
29
- mapper: this.urlSerializer,
30
- },
31
- {
32
- type: () => ArrayBuffer,
33
- mapper: this.arrayBufferSerializer,
34
- },
35
- ];
36
- }
37
-
38
- encode<T>(value: T, type?: AnyType): string {
39
- // Use natural type when subtypes exist
40
- if (
41
- Reflect.hasMetadata(
42
- 'jackson:defaultContextGroup:JsonSubTypes',
43
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
- (value as any).constructor ?? {}
45
- )
46
- ) {
47
- type = [Object];
48
- }
49
-
50
- return this.stringifier.stringify(value, {
51
- serializers: this.customSerializers,
52
- mainCreator: () => type ?? [Object],
53
- });
54
- }
55
-
56
- encodeJSON<T>(value: T, type?: AnyType): unknown {
57
- // Use natural type when subtypes exist
58
- if (
59
- Reflect.hasMetadata(
60
- 'jackson:defaultContextGroup:JsonSubTypes',
61
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
- (value as any).constructor ?? {}
63
- )
64
- ) {
65
- type = [Object];
66
- }
67
-
68
- return this.stringifier.transform(value, {
69
- serializers: this.customSerializers,
70
- mainCreator: () => type ?? [Object],
71
- });
72
- }
73
-
74
- private dateTimeSerializer: Serializer = (key: string, value: DateTime) => {
75
- if (value == null) {
76
- return null;
77
- }
78
-
79
- switch (this.dateEncoding) {
80
- case JSONEncoder.DateEncoding.ISO8601:
81
- return value.toISO();
82
- case JSONEncoder.DateEncoding.MILLISECONDS_SINCE_EPOCH:
83
- return value.toMillis();
84
- case JSONEncoder.DateEncoding.SECONDS_SINCE_EPOCH:
85
- return value.toSeconds();
86
- }
87
- };
88
-
89
- private dateSerializer: Serializer = (key: string, value: Date) => {
90
- if (value == null) {
91
- return null;
92
- }
93
-
94
- switch (this.dateEncoding) {
95
- case JSONEncoder.DateEncoding.ISO8601:
96
- return value.toISOString();
97
- case JSONEncoder.DateEncoding.MILLISECONDS_SINCE_EPOCH:
98
- return value.getTime();
99
- case JSONEncoder.DateEncoding.SECONDS_SINCE_EPOCH:
100
- return value.getTime() / 1000;
101
- }
102
- };
103
-
104
- private urlSerializer: Serializer = (key: string, value: URL) => {
105
- if (value == null) {
106
- return null;
107
- }
108
-
109
- return value.toString();
110
- };
111
-
112
- private arrayBufferSerializer: Serializer = (
113
- key: string,
114
- value: ArrayBuffer
115
- ) => {
116
- if (value == null) {
117
- return null;
118
- }
119
-
120
- return Base64.encode(value);
121
- };
122
- }
123
-
124
- export namespace JSONEncoder {
125
- /**
126
- * Configures how `Date` & `DateTime` parameters are encoded.
127
- */
128
- export enum DateEncoding {
129
- /**
130
- * Encode `Date`/`DateTime` values as a UNIX timestamp (floating point seconds since epoch).
131
- */
132
- SECONDS_SINCE_EPOCH,
133
-
134
- /**
135
- * Encode `Date`/`DateTime` values as UNIX millisecond timestamp (integer milliseconds since epoch).
136
- */
137
- MILLISECONDS_SINCE_EPOCH,
138
-
139
- /**
140
- * Encode `Date`/`DateTime` values as an ISO-8601-formatted string (in RFC 3339 format). This is the default behavior.
141
- */
142
- ISO8601,
143
- }
144
- }
@@ -1,5 +0,0 @@
1
- import { AnyType } from './any-type';
2
-
3
- export interface MediaTypeDecoder {
4
- decode<T>(response: Response, type: AnyType): Promise<T>;
5
- }
@@ -1,16 +0,0 @@
1
- import { AnyType } from './any-type';
2
-
3
- export interface MediaTypeEncoder {
4
- encode<T = unknown>(value: T, type: AnyType | undefined): BodyInit;
5
- }
6
-
7
- export interface URLQueryParamsEncoder extends MediaTypeEncoder {
8
- encodeQueryString(value: Record<string, unknown>): string;
9
- }
10
-
11
- export function isURLQueryParamsEncoder(
12
- encoder: MediaTypeEncoder | URLQueryParamsEncoder | undefined
13
- ): encoder is URLQueryParamsEncoder {
14
- const rec = (encoder as unknown) as Record<string, unknown>;
15
- return !!rec.encodeQueryString ?? false;
16
- }