@livon/schema 0.27.0-rc.1

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 (169) hide show
  1. package/PROMPT.md +21 -0
  2. package/README.md +13 -0
  3. package/SCHEMA.md +13 -0
  4. package/dist/SchemaValidationError.cjs +41 -0
  5. package/dist/SchemaValidationError.d.ts +20 -0
  6. package/dist/SchemaValidationError.js +7 -0
  7. package/dist/SchemaValidationError.spec.cjs +65 -0
  8. package/dist/SchemaValidationError.spec.d.ts +1 -0
  9. package/dist/SchemaValidationError.spec.js +59 -0
  10. package/dist/after.cjs +36 -0
  11. package/dist/after.d.ts +30 -0
  12. package/dist/after.js +2 -0
  13. package/dist/after.spec.cjs +54 -0
  14. package/dist/after.spec.d.ts +1 -0
  15. package/dist/after.spec.js +48 -0
  16. package/dist/and.cjs +36 -0
  17. package/dist/and.d.ts +26 -0
  18. package/dist/and.js +2 -0
  19. package/dist/and.spec.cjs +57 -0
  20. package/dist/and.spec.d.ts +1 -0
  21. package/dist/and.spec.js +51 -0
  22. package/dist/api.cjs +317 -0
  23. package/dist/api.d.ts +107 -0
  24. package/dist/api.js +277 -0
  25. package/dist/api.spec.cjs +512 -0
  26. package/dist/api.spec.d.ts +1 -0
  27. package/dist/api.spec.js +506 -0
  28. package/dist/array.cjs +74 -0
  29. package/dist/array.d.ts +25 -0
  30. package/dist/array.js +40 -0
  31. package/dist/array.spec.cjs +167 -0
  32. package/dist/array.spec.d.ts +1 -0
  33. package/dist/array.spec.js +161 -0
  34. package/dist/before.cjs +36 -0
  35. package/dist/before.d.ts +30 -0
  36. package/dist/before.js +2 -0
  37. package/dist/before.spec.cjs +54 -0
  38. package/dist/before.spec.d.ts +1 -0
  39. package/dist/before.spec.js +48 -0
  40. package/dist/binary.cjs +53 -0
  41. package/dist/binary.d.ts +24 -0
  42. package/dist/binary.js +19 -0
  43. package/dist/binary.spec.cjs +107 -0
  44. package/dist/binary.spec.d.ts +1 -0
  45. package/dist/binary.spec.js +101 -0
  46. package/dist/boolean.cjs +53 -0
  47. package/dist/boolean.d.ts +24 -0
  48. package/dist/boolean.js +19 -0
  49. package/dist/boolean.spec.cjs +96 -0
  50. package/dist/boolean.spec.d.ts +1 -0
  51. package/dist/boolean.spec.js +90 -0
  52. package/dist/context.cjs +125 -0
  53. package/dist/context.d.ts +101 -0
  54. package/dist/context.js +76 -0
  55. package/dist/context.spec.cjs +244 -0
  56. package/dist/context.spec.d.ts +1 -0
  57. package/dist/context.spec.js +238 -0
  58. package/dist/date.cjs +53 -0
  59. package/dist/date.d.ts +24 -0
  60. package/dist/date.js +19 -0
  61. package/dist/date.spec.cjs +97 -0
  62. package/dist/date.spec.d.ts +1 -0
  63. package/dist/date.spec.js +91 -0
  64. package/dist/doc.cjs +54 -0
  65. package/dist/doc.d.ts +25 -0
  66. package/dist/doc.js +17 -0
  67. package/dist/doc.spec.cjs +99 -0
  68. package/dist/doc.spec.d.ts +1 -0
  69. package/dist/doc.spec.js +93 -0
  70. package/dist/enumeration.cjs +74 -0
  71. package/dist/enumeration.d.ts +50 -0
  72. package/dist/enumeration.js +40 -0
  73. package/dist/enumeration.spec.cjs +110 -0
  74. package/dist/enumeration.spec.d.ts +1 -0
  75. package/dist/enumeration.spec.js +104 -0
  76. package/dist/hydrate.cjs +18 -0
  77. package/dist/hydrate.d.ts +1 -0
  78. package/dist/hydrate.js +0 -0
  79. package/dist/index.cjs +145 -0
  80. package/dist/index.d.ts +34 -0
  81. package/dist/index.js +24 -0
  82. package/dist/index.spec.cjs +43 -0
  83. package/dist/index.spec.d.ts +1 -0
  84. package/dist/index.spec.js +37 -0
  85. package/dist/literal.cjs +55 -0
  86. package/dist/literal.d.ts +25 -0
  87. package/dist/literal.js +21 -0
  88. package/dist/literal.spec.cjs +93 -0
  89. package/dist/literal.spec.d.ts +1 -0
  90. package/dist/literal.spec.js +87 -0
  91. package/dist/number.cjs +89 -0
  92. package/dist/number.d.ts +84 -0
  93. package/dist/number.js +55 -0
  94. package/dist/number.spec.cjs +155 -0
  95. package/dist/number.spec.d.ts +1 -0
  96. package/dist/number.spec.js +149 -0
  97. package/dist/object.cjs +66 -0
  98. package/dist/object.d.ts +37 -0
  99. package/dist/object.js +32 -0
  100. package/dist/object.spec.cjs +171 -0
  101. package/dist/object.spec.d.ts +1 -0
  102. package/dist/object.spec.js +165 -0
  103. package/dist/operation.cjs +182 -0
  104. package/dist/operation.d.ts +197 -0
  105. package/dist/operation.js +133 -0
  106. package/dist/operation.spec.cjs +454 -0
  107. package/dist/operation.spec.d.ts +1 -0
  108. package/dist/operation.spec.js +448 -0
  109. package/dist/or.cjs +85 -0
  110. package/dist/or.d.ts +37 -0
  111. package/dist/or.js +51 -0
  112. package/dist/or.spec.cjs +204 -0
  113. package/dist/or.spec.d.ts +1 -0
  114. package/dist/or.spec.js +198 -0
  115. package/dist/schema.cjs +285 -0
  116. package/dist/schema.d.ts +132 -0
  117. package/dist/schema.js +233 -0
  118. package/dist/schema.spec.cjs +587 -0
  119. package/dist/schema.spec.d.ts +1 -0
  120. package/dist/schema.spec.js +581 -0
  121. package/dist/schemaFactory.cjs +125 -0
  122. package/dist/schemaFactory.d.ts +97 -0
  123. package/dist/schemaFactory.js +88 -0
  124. package/dist/schemaFactory.spec.cjs +197 -0
  125. package/dist/schemaFactory.spec.d.ts +1 -0
  126. package/dist/schemaFactory.spec.js +191 -0
  127. package/dist/schemaModule.cjs +280 -0
  128. package/dist/schemaModule.d.ts +97 -0
  129. package/dist/schemaModule.js +243 -0
  130. package/dist/schemaModule.spec.cjs +355 -0
  131. package/dist/schemaModule.spec.d.ts +1 -0
  132. package/dist/schemaModule.spec.js +349 -0
  133. package/dist/string.cjs +93 -0
  134. package/dist/string.d.ts +85 -0
  135. package/dist/string.js +59 -0
  136. package/dist/string.spec.cjs +158 -0
  137. package/dist/string.spec.d.ts +1 -0
  138. package/dist/string.spec.js +152 -0
  139. package/dist/testing/mocks/assertions.mock.cjs +48 -0
  140. package/dist/testing/mocks/assertions.mock.d.ts +5 -0
  141. package/dist/testing/mocks/assertions.mock.js +14 -0
  142. package/dist/testing/mocks/index.cjs +52 -0
  143. package/dist/testing/mocks/index.d.ts +4 -0
  144. package/dist/testing/mocks/index.js +3 -0
  145. package/dist/testing/mocks/schema.mock.cjs +120 -0
  146. package/dist/testing/mocks/schema.mock.d.ts +37 -0
  147. package/dist/testing/mocks/schema.mock.js +74 -0
  148. package/dist/tuple.cjs +58 -0
  149. package/dist/tuple.d.ts +33 -0
  150. package/dist/tuple.js +24 -0
  151. package/dist/tuple.spec.cjs +162 -0
  152. package/dist/tuple.spec.d.ts +1 -0
  153. package/dist/tuple.spec.js +156 -0
  154. package/dist/typeGuards.cjs +60 -0
  155. package/dist/typeGuards.d.ts +93 -0
  156. package/dist/typeGuards.js +8 -0
  157. package/dist/typeGuards.spec.cjs +101 -0
  158. package/dist/typeGuards.spec.d.ts +1 -0
  159. package/dist/typeGuards.spec.js +95 -0
  160. package/dist/types.cjs +18 -0
  161. package/dist/types.d.ts +289 -0
  162. package/dist/types.js +0 -0
  163. package/dist/union.cjs +74 -0
  164. package/dist/union.d.ts +33 -0
  165. package/dist/union.js +40 -0
  166. package/dist/union.spec.cjs +159 -0
  167. package/dist/union.spec.d.ts +1 -0
  168. package/dist/union.spec.js +153 -0
  169. package/package.json +47 -0
package/dist/api.js ADDED
@@ -0,0 +1,277 @@
1
+ import { normalizeDoc } from "./doc.js";
2
+ import { withFieldOperationName, withOperationName } from "./operation.js";
3
+ const api_subscription = (input)=>({
4
+ type: "subscription",
5
+ payload: input.payload,
6
+ ...input.input ? {
7
+ input: input.input
8
+ } : {},
9
+ ...input.output ? {
10
+ output: input.output
11
+ } : {},
12
+ ...input.filter ? {
13
+ filter: input.filter
14
+ } : {},
15
+ ...input.exec ? {
16
+ exec: input.exec
17
+ } : {},
18
+ ...input.name ? {
19
+ name: input.name
20
+ } : {},
21
+ ...input.doc ? {
22
+ doc: input.doc
23
+ } : {}
24
+ });
25
+ const isOperation = (value)=>'object' == typeof value && null !== value && 'type' in value && 'operation' === value.type;
26
+ const isSchema = (value)=>'object' == typeof value && null !== value && 'parse' in value && 'ast' in value;
27
+ const isRecord = (value)=>'object' == typeof value && null !== value && !Array.isArray(value);
28
+ const mergeOperations = (input, explicit)=>{
29
+ const ops = {
30
+ ...explicit ?? {}
31
+ };
32
+ Object.entries(input).forEach(([key, value])=>{
33
+ if (!ops[key] && isOperation(value)) ops[key] = value;
34
+ });
35
+ return ops;
36
+ };
37
+ const mergeFieldOperations = (input)=>({
38
+ ...input ?? {}
39
+ });
40
+ const subscriptionFromInput = (name, value)=>{
41
+ if (isRecord(value) && 'payload' in value && isSchema(value.payload)) {
42
+ const payload = value.payload;
43
+ const input = isSchema(value.input) ? value.input : void 0;
44
+ const output = isSchema(value.output) ? value.output : void 0;
45
+ const filter = 'function' == typeof value.filter ? value.filter : void 0;
46
+ const exec = 'function' == typeof value.exec ? value.exec : void 0;
47
+ const doc = value.doc;
48
+ const normalized = value.name;
49
+ return {
50
+ type: "subscription",
51
+ payload,
52
+ ...input ? {
53
+ input
54
+ } : {},
55
+ ...output ? {
56
+ output
57
+ } : {},
58
+ ...filter ? {
59
+ filter
60
+ } : {},
61
+ ...exec ? {
62
+ exec
63
+ } : {},
64
+ ...doc ? {
65
+ doc
66
+ } : {},
67
+ ...normalized ? {
68
+ name: normalized
69
+ } : {}
70
+ };
71
+ }
72
+ if (isSchema(value)) return {
73
+ type: "subscription",
74
+ payload: value,
75
+ name
76
+ };
77
+ };
78
+ const mergeSubscriptions = (input)=>{
79
+ const subs = {};
80
+ if (!input) return subs;
81
+ Object.entries(input).forEach(([key, value])=>{
82
+ const subscription = subscriptionFromInput(key, value);
83
+ if (subscription) subs[key] = subscription;
84
+ });
85
+ return subs;
86
+ };
87
+ const api = (input)=>{
88
+ const { type, operations, fieldOperations, subscriptions, ...rest } = input;
89
+ const mergedOperations = mergeOperations(rest, operations);
90
+ const mergedFieldOperations = mergeFieldOperations(fieldOperations);
91
+ const mergedSubscriptions = mergeSubscriptions(subscriptions);
92
+ if (Object.keys(mergedFieldOperations).length > 0 && !type) throw new Error('api.type is required when fieldOperations are provided.');
93
+ const namedOperations = Object.entries(mergedOperations).reduce((acc, [key, op])=>{
94
+ acc[key] = op.name ? op : withOperationName({
95
+ name: key,
96
+ operation: op
97
+ });
98
+ return acc;
99
+ }, {});
100
+ const namedFieldOperations = Object.entries(mergedFieldOperations).reduce((acc, [key, op])=>{
101
+ acc[key] = op.name ? op : withFieldOperationName({
102
+ name: key,
103
+ operation: op
104
+ });
105
+ return acc;
106
+ }, {});
107
+ const namedSubscriptions = Object.entries(mergedSubscriptions).reduce((acc, [key, sub])=>{
108
+ acc[key] = sub.name ? sub : {
109
+ ...sub,
110
+ name: key
111
+ };
112
+ return acc;
113
+ }, {});
114
+ Object.entries(namedOperations).forEach(([operationName, op])=>{
115
+ const topics = Object.keys(op.publish ?? {});
116
+ topics.forEach((topic)=>{
117
+ if (!namedSubscriptions[topic]) throw new Error(`api: operation "${operationName}" publishes "${topic}" but no subscription with that name exists.`);
118
+ });
119
+ });
120
+ const apiDoc = normalizeDoc(input.doc);
121
+ return {
122
+ type: 'api',
123
+ entity: type,
124
+ operations: namedOperations,
125
+ fieldOperations: namedFieldOperations,
126
+ subscriptions: namedSubscriptions,
127
+ ast: ()=>({
128
+ type: 'api',
129
+ name: type?.name,
130
+ doc: apiDoc,
131
+ children: [
132
+ ...Object.entries(namedOperations).map(([name, op])=>{
133
+ const publishTopics = Object.keys(op.publish ?? {});
134
+ const requestType = op.input?.name ?? void 0;
135
+ const responseType = op.output?.name ?? void 0;
136
+ const ackConfig = op.ack;
137
+ const constraints = {
138
+ ...publishTopics.length > 0 ? {
139
+ publish: publishTopics
140
+ } : {},
141
+ ...void 0 !== ackConfig ? {
142
+ ack: ackConfig
143
+ } : {},
144
+ ...requestType ? {
145
+ request: requestType
146
+ } : {},
147
+ ...responseType ? {
148
+ response: responseType
149
+ } : {}
150
+ };
151
+ return {
152
+ type: 'operation',
153
+ name,
154
+ constraints: Object.keys(constraints).length > 0 ? constraints : void 0,
155
+ doc: normalizeDoc(op.doc),
156
+ request: requestType,
157
+ response: responseType,
158
+ children: [
159
+ op.input.ast(),
160
+ ...op.output ? [
161
+ op.output.ast()
162
+ ] : []
163
+ ]
164
+ };
165
+ }),
166
+ ...Object.entries(namedSubscriptions).map(([name, sub])=>{
167
+ const inputType = sub.input?.name ?? void 0;
168
+ const payloadType = sub.payload?.name ?? void 0;
169
+ const outputType = sub.output?.name ?? payloadType;
170
+ const constraints = {
171
+ ...inputType ? {
172
+ input: inputType
173
+ } : {},
174
+ ...payloadType ? {
175
+ payload: payloadType
176
+ } : {},
177
+ ...outputType ? {
178
+ output: outputType
179
+ } : {}
180
+ };
181
+ return {
182
+ type: "subscription",
183
+ name,
184
+ constraints: Object.keys(constraints).length > 0 ? constraints : void 0,
185
+ doc: normalizeDoc(sub.doc),
186
+ request: inputType,
187
+ response: outputType,
188
+ children: [
189
+ sub.payload.ast(),
190
+ ...sub.input ? [
191
+ sub.input.ast()
192
+ ] : [],
193
+ ...sub.output ? [
194
+ sub.output.ast()
195
+ ] : []
196
+ ]
197
+ };
198
+ }),
199
+ ...Object.entries(namedFieldOperations).map(([fieldName, op])=>{
200
+ const requestType = op.input?.name ?? void 0;
201
+ const responseType = op.output?.name ?? void 0;
202
+ const dependsOnType = op.dependsOn?.name ?? void 0;
203
+ const constraints = {
204
+ owner: type?.name,
205
+ field: fieldName,
206
+ ...requestType ? {
207
+ request: requestType
208
+ } : {},
209
+ ...responseType ? {
210
+ response: responseType
211
+ } : {},
212
+ ...dependsOnType ? {
213
+ dependsOn: dependsOnType
214
+ } : {}
215
+ };
216
+ return {
217
+ type: 'field',
218
+ name: type?.name ? `${type.name}.${fieldName}` : fieldName,
219
+ constraints,
220
+ doc: normalizeDoc(op.doc),
221
+ request: requestType,
222
+ response: responseType,
223
+ dependsOn: dependsOnType,
224
+ children: [
225
+ op.dependsOn.ast(),
226
+ ...op.input ? [
227
+ op.input.ast()
228
+ ] : [],
229
+ ...op.output ? [
230
+ op.output.ast()
231
+ ] : []
232
+ ]
233
+ };
234
+ })
235
+ ]
236
+ })
237
+ };
238
+ };
239
+ const composeApi = (apis)=>{
240
+ const operations = {};
241
+ const fieldOperations = {};
242
+ const subscriptions = {};
243
+ Object.values(apis).forEach((apiInstance)=>{
244
+ Object.entries(apiInstance.operations).forEach(([name, op])=>{
245
+ if (operations[name]) throw new Error(`composeApi: duplicate operation name \"${name}\"`);
246
+ operations[name] = op;
247
+ });
248
+ Object.entries(apiInstance.fieldOperations).forEach(([name, op])=>{
249
+ const owner = apiInstance.entity?.name;
250
+ const key = owner ? `${owner}.${name}` : name;
251
+ if (fieldOperations[key]) throw new Error(`composeApi: duplicate field operation name \"${key}\"`);
252
+ fieldOperations[key] = op;
253
+ });
254
+ Object.entries(apiInstance.subscriptions ?? {}).forEach(([name, sub])=>{
255
+ if (subscriptions[name]) throw new Error(`composeApi: duplicate subscription name "${name}"`);
256
+ subscriptions[name] = sub;
257
+ });
258
+ });
259
+ return {
260
+ type: 'api-composed',
261
+ apis,
262
+ operations,
263
+ fieldOperations,
264
+ subscriptions,
265
+ ast: ()=>({
266
+ type: 'api-composed',
267
+ children: Object.entries(apis).map(([name, apiInstance])=>{
268
+ const node = apiInstance.ast();
269
+ return {
270
+ ...node,
271
+ name
272
+ };
273
+ })
274
+ })
275
+ };
276
+ };
277
+ export { api, composeApi, api_subscription as subscription };