@pagopa/interop-outbound-models 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 (135) hide show
  1. package/.eslintrc.cjs +24 -0
  2. package/.github/workflows/ci.yml +74 -0
  3. package/.github/workflows/release.yml +26 -0
  4. package/.prettierignore +2 -0
  5. package/.vscode/settings.json +11 -0
  6. package/CODEOWNERS +2 -0
  7. package/README.md +0 -0
  8. package/dist/agreement/eventsV1.d.ts +216 -0
  9. package/dist/agreement/eventsV1.d.ts.map +1 -0
  10. package/dist/agreement/eventsV1.js +100 -0
  11. package/dist/agreement/eventsV2.d.ts +405 -0
  12. package/dist/agreement/eventsV2.d.ts.map +1 -0
  13. package/dist/agreement/eventsV2.js +181 -0
  14. package/dist/agreement/index.d.ts +228 -0
  15. package/dist/agreement/index.d.ts.map +1 -0
  16. package/dist/agreement/index.js +36 -0
  17. package/dist/eservice/eventsV1.d.ts +237 -0
  18. package/dist/eservice/eventsV1.d.ts.map +1 -0
  19. package/dist/eservice/eventsV1.js +109 -0
  20. package/dist/eservice/eventsV2.d.ts +405 -0
  21. package/dist/eservice/eventsV2.d.ts.map +1 -0
  22. package/dist/eservice/eventsV2.js +181 -0
  23. package/dist/eservice/index.d.ts +235 -0
  24. package/dist/eservice/index.d.ts.map +1 -0
  25. package/dist/eservice/index.js +36 -0
  26. package/dist/gen/v1/agreement/agreement.d.ts +294 -0
  27. package/dist/gen/v1/agreement/agreement.d.ts.map +1 -0
  28. package/dist/gen/v1/agreement/agreement.js +587 -0
  29. package/dist/gen/v1/agreement/events.d.ts +212 -0
  30. package/dist/gen/v1/agreement/events.d.ts.map +1 -0
  31. package/dist/gen/v1/agreement/events.js +492 -0
  32. package/dist/gen/v1/eservice/eservice.d.ts +338 -0
  33. package/dist/gen/v1/eservice/eservice.d.ts.map +1 -0
  34. package/dist/gen/v1/eservice/eservice.js +629 -0
  35. package/dist/gen/v1/eservice/events.d.ts +272 -0
  36. package/dist/gen/v1/eservice/events.d.ts.map +1 -0
  37. package/dist/gen/v1/eservice/events.js +619 -0
  38. package/dist/gen/v1/purpose/events.d.ts +235 -0
  39. package/dist/gen/v1/purpose/events.d.ts.map +1 -0
  40. package/dist/gen/v1/purpose/events.js +546 -0
  41. package/dist/gen/v1/purpose/purpose.d.ts +155 -0
  42. package/dist/gen/v1/purpose/purpose.d.ts.map +1 -0
  43. package/dist/gen/v1/purpose/purpose.js +274 -0
  44. package/dist/gen/v1/tenant/events.d.ts +66 -0
  45. package/dist/gen/v1/tenant/events.d.ts.map +1 -0
  46. package/dist/gen/v1/tenant/events.js +144 -0
  47. package/dist/gen/v1/tenant/tenant.d.ts +364 -0
  48. package/dist/gen/v1/tenant/tenant.d.ts.map +1 -0
  49. package/dist/gen/v1/tenant/tenant.js +727 -0
  50. package/dist/gen/v2/agreement/agreement.d.ts +290 -0
  51. package/dist/gen/v2/agreement/agreement.d.ts.map +1 -0
  52. package/dist/gen/v2/agreement/agreement.js +583 -0
  53. package/dist/gen/v2/agreement/events.d.ts +378 -0
  54. package/dist/gen/v2/agreement/events.d.ts.map +1 -0
  55. package/dist/gen/v2/agreement/events.js +895 -0
  56. package/dist/gen/v2/eservice/eservice.d.ts +314 -0
  57. package/dist/gen/v2/eservice/eservice.d.ts.map +1 -0
  58. package/dist/gen/v2/eservice/eservice.js +603 -0
  59. package/dist/gen/v2/eservice/events.d.ts +462 -0
  60. package/dist/gen/v2/eservice/events.d.ts.map +1 -0
  61. package/dist/gen/v2/eservice/events.js +1062 -0
  62. package/dist/gen/v2/purpose/events.d.ts +403 -0
  63. package/dist/gen/v2/purpose/events.d.ts.map +1 -0
  64. package/dist/gen/v2/purpose/events.js +937 -0
  65. package/dist/gen/v2/purpose/purpose.d.ts +147 -0
  66. package/dist/gen/v2/purpose/purpose.d.ts.map +1 -0
  67. package/dist/gen/v2/purpose/purpose.js +264 -0
  68. package/dist/gen/v2/tenant/events.d.ts +278 -0
  69. package/dist/gen/v2/tenant/events.d.ts.map +1 -0
  70. package/dist/gen/v2/tenant/events.js +638 -0
  71. package/dist/gen/v2/tenant/tenant.d.ts +356 -0
  72. package/dist/gen/v2/tenant/tenant.d.ts.map +1 -0
  73. package/dist/gen/v2/tenant/tenant.js +722 -0
  74. package/dist/index.d.ts +21 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +20 -0
  77. package/dist/purpose/eventsV1.d.ts +237 -0
  78. package/dist/purpose/eventsV1.d.ts.map +1 -0
  79. package/dist/purpose/eventsV1.js +109 -0
  80. package/dist/purpose/eventsV2.d.ts +384 -0
  81. package/dist/purpose/eventsV2.d.ts.map +1 -0
  82. package/dist/purpose/eventsV2.js +172 -0
  83. package/dist/purpose/index.d.ts +228 -0
  84. package/dist/purpose/index.d.ts.map +1 -0
  85. package/dist/purpose/index.js +36 -0
  86. package/dist/tenant/eventsV1.d.ts +69 -0
  87. package/dist/tenant/eventsV1.d.ts.map +1 -0
  88. package/dist/tenant/eventsV1.js +37 -0
  89. package/dist/tenant/eventsV2.d.ts +258 -0
  90. package/dist/tenant/eventsV2.d.ts.map +1 -0
  91. package/dist/tenant/eventsV2.js +118 -0
  92. package/dist/tenant/index.d.ts +130 -0
  93. package/dist/tenant/index.d.ts.map +1 -0
  94. package/dist/tenant/index.js +36 -0
  95. package/dist/utils.d.ts +17 -0
  96. package/dist/utils.d.ts.map +1 -0
  97. package/dist/utils.js +18 -0
  98. package/package.json +48 -0
  99. package/proto/v1/agreement/agreement.proto +70 -0
  100. package/proto/v1/agreement/events.proto +48 -0
  101. package/proto/v1/eservice/eservice.proto +84 -0
  102. package/proto/v1/eservice/events.proto +63 -0
  103. package/proto/v1/purpose/events.proto +53 -0
  104. package/proto/v1/purpose/purpose.proto +39 -0
  105. package/proto/v1/tenant/events.proto +17 -0
  106. package/proto/v1/tenant/tenant.proto +87 -0
  107. package/proto/v2/agreement/agreement.proto +70 -0
  108. package/proto/v2/agreement/events.proto +83 -0
  109. package/proto/v2/eservice/eservice.proto +82 -0
  110. package/proto/v2/eservice/events.proto +104 -0
  111. package/proto/v2/purpose/events.proto +90 -0
  112. package/proto/v2/purpose/purpose.proto +38 -0
  113. package/proto/v2/tenant/events.proto +63 -0
  114. package/proto/v2/tenant/tenant.proto +85 -0
  115. package/src/agreement/eventsV1.ts +136 -0
  116. package/src/agreement/eventsV2.ts +246 -0
  117. package/src/agreement/index.ts +45 -0
  118. package/src/eservice/eventsV1.ts +149 -0
  119. package/src/eservice/eventsV2.ts +245 -0
  120. package/src/eservice/index.ts +45 -0
  121. package/src/index.ts +22 -0
  122. package/src/purpose/eventsV1.ts +146 -0
  123. package/src/purpose/eventsV2.ts +228 -0
  124. package/src/purpose/index.ts +42 -0
  125. package/src/tenant/eventsV1.ts +51 -0
  126. package/src/tenant/eventsV2.ts +159 -0
  127. package/src/tenant/index.ts +43 -0
  128. package/src/utils.ts +25 -0
  129. package/tests/agreement.test.ts +28 -0
  130. package/tests/eservice.test.ts +28 -0
  131. package/tests/purpose.test.ts +28 -0
  132. package/tests/tenant.test.ts +28 -0
  133. package/tsconfig.check.json +7 -0
  134. package/tsconfig.eslint.json +11 -0
  135. package/tsconfig.json +13 -0
@@ -0,0 +1,228 @@
1
+ import { match } from "ts-pattern";
2
+ import { z } from "zod";
3
+ import {
4
+ PurposeAddedV2,
5
+ DraftPurposeUpdatedV2,
6
+ PurposeWaitingForApprovalV2,
7
+ PurposeActivatedV2,
8
+ DraftPurposeDeletedV2,
9
+ WaitingForApprovalPurposeDeletedV2,
10
+ NewPurposeVersionActivatedV2,
11
+ PurposeVersionActivatedV2,
12
+ PurposeVersionUnsuspendedByProducerV2,
13
+ PurposeVersionUnsuspendedByConsumerV2,
14
+ PurposeVersionSuspendedByProducerV2,
15
+ PurposeVersionSuspendedByConsumerV2,
16
+ NewPurposeVersionWaitingForApprovalV2,
17
+ PurposeVersionOverQuotaUnsuspendedV2,
18
+ PurposeArchivedV2,
19
+ WaitingForApprovalPurposeVersionDeletedV2,
20
+ PurposeVersionRejectedV2,
21
+ PurposeClonedV2,
22
+ } from "../gen/v2/purpose/events.js";
23
+ import { protobufDecoder } from "../utils.js";
24
+
25
+ export function purposeEventToBinaryDataV2(event: PurposeEventV2): Uint8Array {
26
+ return match(event)
27
+ .with({ type: "PurposeAdded" }, ({ data }) => PurposeAddedV2.toBinary(data))
28
+ .with({ type: "DraftPurposeUpdated" }, ({ data }) =>
29
+ DraftPurposeUpdatedV2.toBinary(data)
30
+ )
31
+ .with({ type: "PurposeWaitingForApproval" }, ({ data }) =>
32
+ PurposeWaitingForApprovalV2.toBinary(data)
33
+ )
34
+ .with({ type: "PurposeActivated" }, ({ data }) =>
35
+ PurposeActivatedV2.toBinary(data)
36
+ )
37
+ .with({ type: "DraftPurposeDeleted" }, ({ data }) =>
38
+ DraftPurposeDeletedV2.toBinary(data)
39
+ )
40
+ .with({ type: "WaitingForApprovalPurposeDeleted" }, ({ data }) =>
41
+ WaitingForApprovalPurposeDeletedV2.toBinary(data)
42
+ )
43
+ .with({ type: "NewPurposeVersionActivated" }, ({ data }) =>
44
+ NewPurposeVersionActivatedV2.toBinary(data)
45
+ )
46
+ .with({ type: "PurposeVersionActivated" }, ({ data }) =>
47
+ PurposeVersionActivatedV2.toBinary(data)
48
+ )
49
+ .with({ type: "PurposeVersionUnsuspendedByProducer" }, ({ data }) =>
50
+ PurposeVersionUnsuspendedByProducerV2.toBinary(data)
51
+ )
52
+ .with({ type: "PurposeVersionUnsuspendedByConsumer" }, ({ data }) =>
53
+ PurposeVersionUnsuspendedByConsumerV2.toBinary(data)
54
+ )
55
+ .with({ type: "PurposeVersionSuspendedByProducer" }, ({ data }) =>
56
+ PurposeVersionSuspendedByProducerV2.toBinary(data)
57
+ )
58
+ .with({ type: "PurposeVersionSuspendedByConsumer" }, ({ data }) =>
59
+ PurposeVersionSuspendedByConsumerV2.toBinary(data)
60
+ )
61
+ .with({ type: "NewPurposeVersionWaitingForApproval" }, ({ data }) =>
62
+ NewPurposeVersionWaitingForApprovalV2.toBinary(data)
63
+ )
64
+ .with({ type: "PurposeVersionOverQuotaUnsuspended" }, ({ data }) =>
65
+ PurposeVersionOverQuotaUnsuspendedV2.toBinary(data)
66
+ )
67
+ .with({ type: "PurposeArchived" }, ({ data }) =>
68
+ PurposeArchivedV2.toBinary(data)
69
+ )
70
+ .with({ type: "WaitingForApprovalPurposeVersionDeleted" }, ({ data }) =>
71
+ WaitingForApprovalPurposeVersionDeletedV2.toBinary(data)
72
+ )
73
+ .with({ type: "PurposeVersionRejected" }, ({ data }) =>
74
+ PurposeVersionRejectedV2.toBinary(data)
75
+ )
76
+ .with({ type: "PurposeCloned" }, ({ data }) =>
77
+ PurposeClonedV2.toBinary(data)
78
+ )
79
+ .exhaustive();
80
+ }
81
+
82
+ export const PurposeEventV2 = z.discriminatedUnion("type", [
83
+ z.object({
84
+ event_version: z.literal(2),
85
+ type: z.literal("PurposeAdded"),
86
+ data: protobufDecoder(PurposeAddedV2),
87
+ stream_id: z.string(),
88
+ version: z.number(),
89
+ timestamp: z.coerce.date(),
90
+ }),
91
+ z.object({
92
+ event_version: z.literal(2),
93
+ type: z.literal("DraftPurposeUpdated"),
94
+ data: protobufDecoder(DraftPurposeUpdatedV2),
95
+ stream_id: z.string(),
96
+ version: z.number(),
97
+ timestamp: z.coerce.date(),
98
+ }),
99
+ z.object({
100
+ event_version: z.literal(2),
101
+ type: z.literal("PurposeWaitingForApproval"),
102
+ data: protobufDecoder(PurposeWaitingForApprovalV2),
103
+ stream_id: z.string(),
104
+ version: z.number(),
105
+ timestamp: z.coerce.date(),
106
+ }),
107
+ z.object({
108
+ event_version: z.literal(2),
109
+ type: z.literal("PurposeActivated"),
110
+ data: protobufDecoder(PurposeActivatedV2),
111
+ stream_id: z.string(),
112
+ version: z.number(),
113
+ timestamp: z.coerce.date(),
114
+ }),
115
+ z.object({
116
+ event_version: z.literal(2),
117
+ type: z.literal("DraftPurposeDeleted"),
118
+ data: protobufDecoder(DraftPurposeDeletedV2),
119
+ stream_id: z.string(),
120
+ version: z.number(),
121
+ timestamp: z.coerce.date(),
122
+ }),
123
+ z.object({
124
+ event_version: z.literal(2),
125
+ type: z.literal("WaitingForApprovalPurposeDeleted"),
126
+ data: protobufDecoder(WaitingForApprovalPurposeDeletedV2),
127
+ stream_id: z.string(),
128
+ version: z.number(),
129
+ timestamp: z.coerce.date(),
130
+ }),
131
+ z.object({
132
+ event_version: z.literal(2),
133
+ type: z.literal("NewPurposeVersionActivated"),
134
+ data: protobufDecoder(NewPurposeVersionActivatedV2),
135
+ stream_id: z.string(),
136
+ version: z.number(),
137
+ timestamp: z.coerce.date(),
138
+ }),
139
+ z.object({
140
+ event_version: z.literal(2),
141
+ type: z.literal("PurposeVersionActivated"),
142
+ data: protobufDecoder(PurposeVersionActivatedV2),
143
+ stream_id: z.string(),
144
+ version: z.number(),
145
+ timestamp: z.coerce.date(),
146
+ }),
147
+ z.object({
148
+ event_version: z.literal(2),
149
+ type: z.literal("PurposeVersionUnsuspendedByProducer"),
150
+ data: protobufDecoder(PurposeVersionUnsuspendedByProducerV2),
151
+ stream_id: z.string(),
152
+ version: z.number(),
153
+ timestamp: z.coerce.date(),
154
+ }),
155
+ z.object({
156
+ event_version: z.literal(2),
157
+ type: z.literal("PurposeVersionUnsuspendedByConsumer"),
158
+ data: protobufDecoder(PurposeVersionUnsuspendedByConsumerV2),
159
+ stream_id: z.string(),
160
+ version: z.number(),
161
+ timestamp: z.coerce.date(),
162
+ }),
163
+ z.object({
164
+ event_version: z.literal(2),
165
+ type: z.literal("PurposeVersionSuspendedByProducer"),
166
+ data: protobufDecoder(PurposeVersionSuspendedByProducerV2),
167
+ stream_id: z.string(),
168
+ version: z.number(),
169
+ timestamp: z.coerce.date(),
170
+ }),
171
+ z.object({
172
+ event_version: z.literal(2),
173
+ type: z.literal("PurposeVersionSuspendedByConsumer"),
174
+ data: protobufDecoder(PurposeVersionSuspendedByConsumerV2),
175
+ stream_id: z.string(),
176
+ version: z.number(),
177
+ timestamp: z.coerce.date(),
178
+ }),
179
+ z.object({
180
+ event_version: z.literal(2),
181
+ type: z.literal("NewPurposeVersionWaitingForApproval"),
182
+ data: protobufDecoder(NewPurposeVersionWaitingForApprovalV2),
183
+ stream_id: z.string(),
184
+ version: z.number(),
185
+ timestamp: z.coerce.date(),
186
+ }),
187
+ z.object({
188
+ event_version: z.literal(2),
189
+ type: z.literal("PurposeVersionOverQuotaUnsuspended"),
190
+ data: protobufDecoder(PurposeVersionOverQuotaUnsuspendedV2),
191
+ stream_id: z.string(),
192
+ version: z.number(),
193
+ timestamp: z.coerce.date(),
194
+ }),
195
+ z.object({
196
+ event_version: z.literal(2),
197
+ type: z.literal("PurposeArchived"),
198
+ data: protobufDecoder(PurposeArchivedV2),
199
+ stream_id: z.string(),
200
+ version: z.number(),
201
+ timestamp: z.coerce.date(),
202
+ }),
203
+ z.object({
204
+ event_version: z.literal(2),
205
+ type: z.literal("WaitingForApprovalPurposeVersionDeleted"),
206
+ data: protobufDecoder(WaitingForApprovalPurposeVersionDeletedV2),
207
+ stream_id: z.string(),
208
+ version: z.number(),
209
+ timestamp: z.coerce.date(),
210
+ }),
211
+ z.object({
212
+ event_version: z.literal(2),
213
+ type: z.literal("PurposeVersionRejected"),
214
+ data: protobufDecoder(PurposeVersionRejectedV2),
215
+ stream_id: z.string(),
216
+ version: z.number(),
217
+ timestamp: z.coerce.date(),
218
+ }),
219
+ z.object({
220
+ event_version: z.literal(2),
221
+ type: z.literal("PurposeCloned"),
222
+ data: protobufDecoder(PurposeClonedV2),
223
+ stream_id: z.string(),
224
+ version: z.number(),
225
+ timestamp: z.coerce.date(),
226
+ }),
227
+ ]);
228
+ export type PurposeEventV2 = z.infer<typeof PurposeEventV2>;
@@ -0,0 +1,42 @@
1
+ import { match } from "ts-pattern";
2
+ import { z } from "zod";
3
+ import { VersionedEvent } from "../utils.js";
4
+ import { PurposeEventV1, purposeEventToBinaryDataV1 } from "./eventsV1.js";
5
+ import { PurposeEventV2, purposeEventToBinaryDataV2 } from "./eventsV2.js";
6
+
7
+ function purposeEventToBinaryData(event: PurposeEvent): Uint8Array {
8
+ return match(event)
9
+ .with({ event_version: 1 }, purposeEventToBinaryDataV1)
10
+ .with({ event_version: 2 }, purposeEventToBinaryDataV2)
11
+ .exhaustive();
12
+ }
13
+
14
+ export function encodeOutboundPurposeEvent(event: PurposeEvent): string {
15
+ return JSON.stringify({
16
+ event_version: event.event_version,
17
+ type: event.type,
18
+ data: purposeEventToBinaryData(event),
19
+ stream_id: event.stream_id,
20
+ version: event.version,
21
+ timestamp: event.timestamp,
22
+ });
23
+ }
24
+
25
+ export function decodeOutboundPurposeEvent(encodedEvent: string): PurposeEvent {
26
+ return PurposeEvent.parse(JSON.parse(encodedEvent));
27
+ }
28
+
29
+ export const PurposeEvent = VersionedEvent.transform((obj, ctx) => {
30
+ const res = match(obj)
31
+ .with({ event_version: 1 }, () => PurposeEventV1.safeParse(obj))
32
+ .with({ event_version: 2 }, () => PurposeEventV2.safeParse(obj))
33
+ .exhaustive();
34
+
35
+ if (!res.success) {
36
+ res.error.issues.forEach(ctx.addIssue);
37
+ return z.NEVER;
38
+ }
39
+ return res.data;
40
+ });
41
+ export type PurposeEvent = z.infer<typeof PurposeEvent>;
42
+ export { PurposeEventV1, PurposeEventV2 };
@@ -0,0 +1,51 @@
1
+ import { match } from "ts-pattern";
2
+ import { z } from "zod";
3
+ import {
4
+ TenantCreatedV1,
5
+ TenantUpdatedV1,
6
+ TenantDeletedV1,
7
+ } from "../gen/v1/tenant/events.js";
8
+ import { protobufDecoder } from "../utils.js";
9
+
10
+ export function tenantEventToBinaryDataV1(event: TenantEventV1): Uint8Array {
11
+ return match(event)
12
+ .with({ type: "TenantCreated" }, ({ data }) =>
13
+ TenantCreatedV1.toBinary(data)
14
+ )
15
+ .with({ type: "TenantUpdated" }, ({ data }) =>
16
+ TenantUpdatedV1.toBinary(data)
17
+ )
18
+ .with({ type: "TenantDeleted" }, ({ data }) =>
19
+ TenantDeletedV1.toBinary(data)
20
+ )
21
+ .exhaustive();
22
+ }
23
+
24
+ export const TenantEventV1 = z.discriminatedUnion("type", [
25
+ z.object({
26
+ event_version: z.literal(1),
27
+ type: z.literal("TenantCreated"),
28
+ data: protobufDecoder(TenantCreatedV1),
29
+ stream_id: z.string(),
30
+ version: z.number(),
31
+ timestamp: z.coerce.date(),
32
+ }),
33
+ z.object({
34
+ event_version: z.literal(1),
35
+ type: z.literal("TenantUpdated"),
36
+ data: protobufDecoder(TenantUpdatedV1),
37
+ stream_id: z.string(),
38
+ version: z.number(),
39
+ timestamp: z.coerce.date(),
40
+ }),
41
+ z.object({
42
+ event_version: z.literal(1),
43
+ type: z.literal("TenantDeleted"),
44
+ data: protobufDecoder(TenantDeletedV1),
45
+ stream_id: z.string(),
46
+ version: z.number(),
47
+ timestamp: z.coerce.date(),
48
+ }),
49
+ ]);
50
+
51
+ export type TenantEventV1 = z.infer<typeof TenantEventV1>;
@@ -0,0 +1,159 @@
1
+ import { match } from "ts-pattern";
2
+ import { z } from "zod";
3
+ import {
4
+ TenantOnboardedV2,
5
+ TenantOnboardDetailsUpdatedV2,
6
+ TenantCertifiedAttributeAssignedV2,
7
+ TenantCertifiedAttributeRevokedV2,
8
+ TenantDeclaredAttributeAssignedV2,
9
+ TenantDeclaredAttributeRevokedV2,
10
+ TenantVerifiedAttributeAssignedV2,
11
+ TenantVerifiedAttributeRevokedV2,
12
+ TenantVerifiedAttributeExpirationUpdatedV2,
13
+ MaintenanceTenantDeletedV2,
14
+ TenantVerifiedAttributeExtensionUpdatedV2,
15
+ TenantKindUpdatedV2,
16
+ } from "../gen/v2/tenant/events.js";
17
+ import { protobufDecoder } from "../utils.js";
18
+
19
+ export function tenantEventToBinaryDataV2(event: TenantEventV2): Uint8Array {
20
+ return match(event)
21
+ .with({ type: "TenantOnboarded" }, ({ data }) =>
22
+ TenantOnboardedV2.toBinary(data)
23
+ )
24
+ .with({ type: "TenantOnboardDetailsUpdated" }, ({ data }) =>
25
+ TenantOnboardDetailsUpdatedV2.toBinary(data)
26
+ )
27
+ .with({ type: "TenantCertifiedAttributeAssigned" }, ({ data }) =>
28
+ TenantCertifiedAttributeAssignedV2.toBinary(data)
29
+ )
30
+ .with({ type: "TenantCertifiedAttributeRevoked" }, ({ data }) =>
31
+ TenantCertifiedAttributeRevokedV2.toBinary(data)
32
+ )
33
+ .with({ type: "TenantDeclaredAttributeAssigned" }, ({ data }) =>
34
+ TenantDeclaredAttributeAssignedV2.toBinary(data)
35
+ )
36
+ .with({ type: "TenantDeclaredAttributeRevoked" }, ({ data }) =>
37
+ TenantDeclaredAttributeRevokedV2.toBinary(data)
38
+ )
39
+ .with({ type: "TenantVerifiedAttributeAssigned" }, ({ data }) =>
40
+ TenantVerifiedAttributeAssignedV2.toBinary(data)
41
+ )
42
+ .with({ type: "TenantVerifiedAttributeRevoked" }, ({ data }) =>
43
+ TenantVerifiedAttributeRevokedV2.toBinary(data)
44
+ )
45
+ .with({ type: "TenantVerifiedAttributeExpirationUpdated" }, ({ data }) =>
46
+ TenantVerifiedAttributeExpirationUpdatedV2.toBinary(data)
47
+ )
48
+ .with({ type: "TenantVerifiedAttributeExtensionUpdated" }, ({ data }) =>
49
+ TenantVerifiedAttributeExtensionUpdatedV2.toBinary(data)
50
+ )
51
+ .with({ type: "MaintenanceTenantDeleted" }, ({ data }) =>
52
+ MaintenanceTenantDeletedV2.toBinary(data)
53
+ )
54
+ .with({ type: "TenantKindUpdated" }, ({ data }) =>
55
+ TenantKindUpdatedV2.toBinary(data)
56
+ )
57
+ .exhaustive();
58
+ }
59
+
60
+ export const TenantEventV2 = z.discriminatedUnion("type", [
61
+ z.object({
62
+ event_version: z.literal(2),
63
+ type: z.literal("TenantOnboarded"),
64
+ data: protobufDecoder(TenantOnboardedV2),
65
+ stream_id: z.string(),
66
+ version: z.number(),
67
+ timestamp: z.coerce.date(),
68
+ }),
69
+ z.object({
70
+ event_version: z.literal(2),
71
+ type: z.literal("TenantOnboardDetailsUpdated"),
72
+ data: protobufDecoder(TenantOnboardDetailsUpdatedV2),
73
+ stream_id: z.string(),
74
+ version: z.number(),
75
+ timestamp: z.coerce.date(),
76
+ }),
77
+ z.object({
78
+ event_version: z.literal(2),
79
+ type: z.literal("TenantCertifiedAttributeAssigned"),
80
+ data: protobufDecoder(TenantCertifiedAttributeAssignedV2),
81
+ stream_id: z.string(),
82
+ version: z.number(),
83
+ timestamp: z.coerce.date(),
84
+ }),
85
+ z.object({
86
+ event_version: z.literal(2),
87
+ type: z.literal("TenantCertifiedAttributeRevoked"),
88
+ data: protobufDecoder(TenantCertifiedAttributeRevokedV2),
89
+ stream_id: z.string(),
90
+ version: z.number(),
91
+ timestamp: z.coerce.date(),
92
+ }),
93
+ z.object({
94
+ event_version: z.literal(2),
95
+ type: z.literal("TenantDeclaredAttributeAssigned"),
96
+ data: protobufDecoder(TenantDeclaredAttributeAssignedV2),
97
+ stream_id: z.string(),
98
+ version: z.number(),
99
+ timestamp: z.coerce.date(),
100
+ }),
101
+ z.object({
102
+ event_version: z.literal(2),
103
+ type: z.literal("TenantDeclaredAttributeRevoked"),
104
+ data: protobufDecoder(TenantDeclaredAttributeRevokedV2),
105
+ stream_id: z.string(),
106
+ version: z.number(),
107
+ timestamp: z.coerce.date(),
108
+ }),
109
+ z.object({
110
+ event_version: z.literal(2),
111
+ type: z.literal("TenantVerifiedAttributeAssigned"),
112
+ data: protobufDecoder(TenantVerifiedAttributeAssignedV2),
113
+ stream_id: z.string(),
114
+ version: z.number(),
115
+ timestamp: z.coerce.date(),
116
+ }),
117
+ z.object({
118
+ event_version: z.literal(2),
119
+ type: z.literal("TenantVerifiedAttributeRevoked"),
120
+ data: protobufDecoder(TenantVerifiedAttributeRevokedV2),
121
+ stream_id: z.string(),
122
+ version: z.number(),
123
+ timestamp: z.coerce.date(),
124
+ }),
125
+ z.object({
126
+ event_version: z.literal(2),
127
+ type: z.literal("TenantVerifiedAttributeExpirationUpdated"),
128
+ data: protobufDecoder(TenantVerifiedAttributeExpirationUpdatedV2),
129
+ stream_id: z.string(),
130
+ version: z.number(),
131
+ timestamp: z.coerce.date(),
132
+ }),
133
+ z.object({
134
+ event_version: z.literal(2),
135
+ type: z.literal("TenantVerifiedAttributeExtensionUpdated"),
136
+ data: protobufDecoder(TenantVerifiedAttributeExtensionUpdatedV2),
137
+ stream_id: z.string(),
138
+ version: z.number(),
139
+ timestamp: z.coerce.date(),
140
+ }),
141
+ z.object({
142
+ event_version: z.literal(2),
143
+ type: z.literal("MaintenanceTenantDeleted"),
144
+ data: protobufDecoder(MaintenanceTenantDeletedV2),
145
+ stream_id: z.string(),
146
+ version: z.number(),
147
+ timestamp: z.coerce.date(),
148
+ }),
149
+ z.object({
150
+ event_version: z.literal(2),
151
+ type: z.literal("TenantKindUpdated"),
152
+ data: protobufDecoder(TenantKindUpdatedV2),
153
+ stream_id: z.string(),
154
+ version: z.number(),
155
+ timestamp: z.coerce.date(),
156
+ }),
157
+ ]);
158
+
159
+ export type TenantEventV2 = z.infer<typeof TenantEventV2>;
@@ -0,0 +1,43 @@
1
+ import { match } from "ts-pattern";
2
+ import { z } from "zod";
3
+ import { VersionedEvent } from "../utils.js";
4
+ import { TenantEventV1, tenantEventToBinaryDataV1 } from "./eventsV1.js";
5
+ import { TenantEventV2, tenantEventToBinaryDataV2 } from "./eventsV2.js";
6
+
7
+ function tenantEventToBinaryData(event: TenantEvent): Uint8Array {
8
+ return match(event)
9
+ .with({ event_version: 1 }, tenantEventToBinaryDataV1)
10
+ .with({ event_version: 2 }, tenantEventToBinaryDataV2)
11
+ .exhaustive();
12
+ }
13
+
14
+ export function encodeOutboundTenantEvent(event: TenantEvent): string {
15
+ return JSON.stringify({
16
+ event_version: event.event_version,
17
+ type: event.type,
18
+ data: tenantEventToBinaryData(event),
19
+ stream_id: event.stream_id,
20
+ version: event.version,
21
+ timestamp: event.timestamp,
22
+ });
23
+ }
24
+
25
+ export function decodeOutboundTenantEvent(encodedEvent: string): TenantEvent {
26
+ return TenantEvent.parse(JSON.parse(encodedEvent));
27
+ }
28
+
29
+ export const TenantEvent = VersionedEvent.transform((obj, ctx) => {
30
+ const res = match(obj)
31
+ .with({ event_version: 1 }, () => TenantEventV1.safeParse(obj))
32
+ .with({ event_version: 2 }, () => TenantEventV2.safeParse(obj))
33
+ .exhaustive();
34
+
35
+ if (!res.success) {
36
+ res.error.issues.forEach(ctx.addIssue);
37
+ return z.NEVER;
38
+ }
39
+ return res.data;
40
+ });
41
+
42
+ export type TenantEvent = z.infer<typeof TenantEvent>;
43
+ export { TenantEventV1, TenantEventV2 };
package/src/utils.ts ADDED
@@ -0,0 +1,25 @@
1
+ import { MessageType } from "@protobuf-ts/runtime";
2
+ import { ZodAny, ZodTransformer, z } from "zod";
3
+
4
+ export const VersionedEvent = z.discriminatedUnion("event_version", [
5
+ z
6
+ .object({
7
+ event_version: z.literal(1),
8
+ })
9
+ .passthrough(),
10
+ z
11
+ .object({
12
+ event_version: z.literal(2),
13
+ })
14
+ .passthrough(),
15
+ ]);
16
+
17
+ export function protobufDecoder<I extends object>(
18
+ decoder: MessageType<I>
19
+ ): ZodTransformer<ZodAny, I> {
20
+ return z
21
+ .any()
22
+ .transform((v) =>
23
+ decoder.fromBinary(Buffer.from(Object.values(v) as never, "hex"))
24
+ );
25
+ }
@@ -0,0 +1,28 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import {
3
+ encodeOutboundAgreementEvent,
4
+ decodeOutboundAgreementEvent,
5
+ AgreementEvent,
6
+ } from "../src/index.js";
7
+
8
+ describe("agreement", () => {
9
+ it("should correctly encode and decode AgreementDeleted event", () => {
10
+ const event: AgreementEvent = {
11
+ event_version: 1,
12
+ type: "AgreementDeleted",
13
+ data: {
14
+ agreementId: "123",
15
+ },
16
+ stream_id: "123",
17
+ timestamp: new Date(),
18
+ version: 1,
19
+ };
20
+
21
+ const encoded = encodeOutboundAgreementEvent(event);
22
+ const decoded = decodeOutboundAgreementEvent(encoded);
23
+
24
+ expect(decoded).toEqual(event);
25
+ });
26
+
27
+ // TODO: Add more tests for other event types
28
+ });
@@ -0,0 +1,28 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import {
3
+ encodeOutboundEServiceEvent,
4
+ decodeOutboundEServiceEvent,
5
+ EServiceEvent,
6
+ } from "../src/index.js";
7
+
8
+ describe("eservice", () => {
9
+ it("should correctly encode and decode EServiceDeleted event", () => {
10
+ const event: EServiceEvent = {
11
+ event_version: 1,
12
+ type: "EServiceDeleted",
13
+ data: {
14
+ eserviceId: "123",
15
+ },
16
+ stream_id: "123",
17
+ timestamp: new Date(),
18
+ version: 1,
19
+ };
20
+
21
+ const encoded = encodeOutboundEServiceEvent(event);
22
+ const decoded = decodeOutboundEServiceEvent(encoded);
23
+
24
+ expect(decoded).toEqual(event);
25
+ });
26
+
27
+ // TODO: Add more tests for other event types
28
+ });
@@ -0,0 +1,28 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import {
3
+ encodeOutboundPurposeEvent,
4
+ decodeOutboundPurposeEvent,
5
+ PurposeEvent,
6
+ } from "../src/index.js";
7
+
8
+ describe("purpose", () => {
9
+ it("should correctly encode and decode PurposeDeleted event", () => {
10
+ const event: PurposeEvent = {
11
+ event_version: 1,
12
+ type: "PurposeDeleted",
13
+ data: {
14
+ purposeId: "123",
15
+ },
16
+ stream_id: "123",
17
+ timestamp: new Date(),
18
+ version: 1,
19
+ };
20
+
21
+ const encoded = encodeOutboundPurposeEvent(event);
22
+ const decoded = decodeOutboundPurposeEvent(encoded);
23
+
24
+ expect(decoded).toEqual(event);
25
+ });
26
+
27
+ // TODO: Add more tests for other event types
28
+ });
@@ -0,0 +1,28 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import {
3
+ encodeOutboundTenantEvent,
4
+ decodeOutboundTenantEvent,
5
+ TenantEvent,
6
+ } from "../src/index.js";
7
+
8
+ describe("tenant", () => {
9
+ it("should correctly encode and decode TenantDeleted event", () => {
10
+ const event: TenantEvent = {
11
+ event_version: 1,
12
+ type: "TenantDeleted",
13
+ data: {
14
+ tenantId: "123",
15
+ },
16
+ stream_id: "123",
17
+ timestamp: new Date(),
18
+ version: 1,
19
+ };
20
+
21
+ const encoded = encodeOutboundTenantEvent(event);
22
+ const decoded = decodeOutboundTenantEvent(encoded);
23
+
24
+ expect(decoded).toEqual(event);
25
+ });
26
+
27
+ // TODO: Add more tests for other event types
28
+ });
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "noEmit": true,
5
+ },
6
+ "include": ["src", "tests"]
7
+ }
@@ -0,0 +1,11 @@
1
+ // Root tsconfig for typescript-eslint
2
+ // See: https://typescript-eslint.io/getting-started/typed-linting/monorepos#important-note-regarding-large--10-multi-package-monorepos
3
+ // Choosing the root tsconfig approach because of: https://typescript-eslint.io/getting-started/typed-linting/monorepos#important-note-regarding-large--10-multi-package-monorepos
4
+ {
5
+ "extends": "./tsconfig.json",
6
+ "compilerOptions": {
7
+ // ensure that nobody can accidentally use this config for a build
8
+ "noEmit": true,
9
+ },
10
+ "include": ["src", "tests"]
11
+ }