@party-stack/foundry-ontology 0.17.0 → 0.18.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 (253) hide show
  1. package/lib/adapter/convertLoadSubsetOptions.d.ts +2 -0
  2. package/lib/adapter/convertLoadSubsetOptions.d.ts.map +1 -1
  3. package/lib/adapter/convertLoadSubsetOptions.js +158 -191
  4. package/lib/adapter/convertLoadSubsetOptions.js.map +1 -1
  5. package/lib/adapter/createFoundryOntologyBackendAdapter.d.ts +17 -15
  6. package/lib/adapter/createFoundryOntologyBackendAdapter.d.ts.map +1 -1
  7. package/lib/adapter/createFoundryOntologyBackendAdapter.js +288 -400
  8. package/lib/adapter/createFoundryOntologyBackendAdapter.js.map +1 -1
  9. package/lib/adapter/foundryActionValidation.d.ts +17 -15
  10. package/lib/adapter/foundryActionValidation.d.ts.map +1 -1
  11. package/lib/adapter/foundryActionValidation.js +206 -305
  12. package/lib/adapter/foundryActionValidation.js.map +1 -1
  13. package/lib/adapter/foundryCodec.d.ts +10 -9
  14. package/lib/adapter/foundryCodec.d.ts.map +1 -1
  15. package/lib/adapter/foundryCodec.js +180 -287
  16. package/lib/adapter/foundryCodec.js.map +1 -1
  17. package/lib/adapter/foundryMediaId.d.ts +6 -4
  18. package/lib/adapter/foundryMediaId.d.ts.map +1 -1
  19. package/lib/adapter/foundryMediaId.js +31 -32
  20. package/lib/adapter/foundryMediaId.js.map +1 -1
  21. package/lib/adapter/index.d.ts +4 -4
  22. package/lib/adapter/index.js +4 -4
  23. package/lib/adapter/objectCollectionOptions.d.ts +17 -18
  24. package/lib/adapter/objectCollectionOptions.d.ts.map +1 -1
  25. package/lib/adapter/objectCollectionOptions.js +417 -538
  26. package/lib/adapter/objectCollectionOptions.js.map +1 -1
  27. package/lib/config/applyAttachmentConstraintOverrides.d.ts +6 -4
  28. package/lib/config/applyAttachmentConstraintOverrides.d.ts.map +1 -1
  29. package/lib/config/applyAttachmentConstraintOverrides.js +45 -49
  30. package/lib/config/applyAttachmentConstraintOverrides.js.map +1 -1
  31. package/lib/config/index.d.ts +17 -15
  32. package/lib/config/index.d.ts.map +1 -1
  33. package/lib/config/index.js +56 -81
  34. package/lib/config/index.js.map +1 -1
  35. package/lib/connection.d.ts +28 -26
  36. package/lib/connection.d.ts.map +1 -1
  37. package/lib/connection.js +183 -215
  38. package/lib/connection.js.map +1 -1
  39. package/lib/index.d.ts +9 -5
  40. package/lib/index.js +9 -5
  41. package/lib/installation/createFoundryBackendInstallation.d.ts +21 -20
  42. package/lib/installation/createFoundryBackendInstallation.d.ts.map +1 -1
  43. package/lib/installation/createFoundryBackendInstallation.js +52 -62
  44. package/lib/installation/createFoundryBackendInstallation.js.map +1 -1
  45. package/lib/installation/index.d.ts +2 -2
  46. package/lib/installation/index.js +2 -2
  47. package/lib/meta/actionTypeCollectionOptions.d.ts +8 -6
  48. package/lib/meta/actionTypeCollectionOptions.d.ts.map +1 -1
  49. package/lib/meta/actionTypeCollectionOptions.js +49 -49
  50. package/lib/meta/actionTypeCollectionOptions.js.map +1 -1
  51. package/lib/meta/convertActionTypeLoadSubsetOptions.d.ts +3 -1
  52. package/lib/meta/convertActionTypeLoadSubsetOptions.d.ts.map +1 -1
  53. package/lib/meta/convertActionTypeLoadSubsetOptions.js +69 -75
  54. package/lib/meta/convertActionTypeLoadSubsetOptions.js.map +1 -1
  55. package/lib/meta/convertMetaActionType.d.ts +7 -5
  56. package/lib/meta/convertMetaActionType.d.ts.map +1 -1
  57. package/lib/meta/convertMetaActionType.js +458 -581
  58. package/lib/meta/convertMetaActionType.js.map +1 -1
  59. package/lib/meta/convertMetaLinkType.d.ts +4 -2
  60. package/lib/meta/convertMetaLinkType.d.ts.map +1 -1
  61. package/lib/meta/convertMetaLinkType.js +37 -43
  62. package/lib/meta/convertMetaLinkType.js.map +1 -1
  63. package/lib/meta/convertMetaObjectType.d.ts +4 -2
  64. package/lib/meta/convertMetaObjectType.d.ts.map +1 -1
  65. package/lib/meta/convertMetaObjectType.js +34 -35
  66. package/lib/meta/convertMetaObjectType.js.map +1 -1
  67. package/lib/meta/convertMetaQueryFunctionType.d.ts +4 -2
  68. package/lib/meta/convertMetaQueryFunctionType.d.ts.map +1 -1
  69. package/lib/meta/convertMetaQueryFunctionType.js +113 -94
  70. package/lib/meta/convertMetaQueryFunctionType.js.map +1 -1
  71. package/lib/meta/convertMetaTypeDef.d.ts +4 -2
  72. package/lib/meta/convertMetaTypeDef.d.ts.map +1 -1
  73. package/lib/meta/convertMetaTypeDef.js +178 -176
  74. package/lib/meta/convertMetaTypeDef.js.map +1 -1
  75. package/lib/meta/convertMetaValueType.d.ts +4 -2
  76. package/lib/meta/convertMetaValueType.d.ts.map +1 -1
  77. package/lib/meta/convertMetaValueType.js +11 -7
  78. package/lib/meta/convertMetaValueType.js.map +1 -1
  79. package/lib/meta/convertOmsActionParameterMetadata.d.ts +4 -2
  80. package/lib/meta/convertOmsActionParameterMetadata.d.ts.map +1 -1
  81. package/lib/meta/convertOmsActionParameterMetadata.js +107 -163
  82. package/lib/meta/convertOmsActionParameterMetadata.js.map +1 -1
  83. package/lib/meta/createFoundryMetaOntologyBackendAdapter.d.ts +7 -5
  84. package/lib/meta/createFoundryMetaOntologyBackendAdapter.d.ts.map +1 -1
  85. package/lib/meta/createFoundryMetaOntologyBackendAdapter.js +39 -41
  86. package/lib/meta/createFoundryMetaOntologyBackendAdapter.js.map +1 -1
  87. package/lib/meta/entityCollectionOptions.d.ts +12 -11
  88. package/lib/meta/entityCollectionOptions.d.ts.map +1 -1
  89. package/lib/meta/entityCollectionOptions.js +59 -62
  90. package/lib/meta/entityCollectionOptions.js.map +1 -1
  91. package/lib/meta/foundryAttachmentMetadata.d.ts +2 -0
  92. package/lib/meta/foundryAttachmentMetadata.d.ts.map +1 -1
  93. package/lib/meta/foundryAttachmentMetadata.js +13 -14
  94. package/lib/meta/foundryAttachmentMetadata.js.map +1 -1
  95. package/lib/meta/index.d.ts +5 -5
  96. package/lib/meta/index.js +5 -5
  97. package/lib/meta/loadActionTypeOmsMetadata.d.ts +5 -4
  98. package/lib/meta/loadActionTypeOmsMetadata.d.ts.map +1 -1
  99. package/lib/meta/loadActionTypeOmsMetadata.js +102 -139
  100. package/lib/meta/loadActionTypeOmsMetadata.js.map +1 -1
  101. package/lib/meta/queryFunctionTypeCollectionOptions.d.ts +7 -5
  102. package/lib/meta/queryFunctionTypeCollectionOptions.d.ts.map +1 -1
  103. package/lib/meta/queryFunctionTypeCollectionOptions.js +47 -49
  104. package/lib/meta/queryFunctionTypeCollectionOptions.js.map +1 -1
  105. package/lib/stagedWrites.d.ts +26 -24
  106. package/lib/stagedWrites.d.ts.map +1 -1
  107. package/lib/stagedWrites.js +55 -66
  108. package/lib/stagedWrites.js.map +1 -1
  109. package/lib/users/createFoundryAdminOntologyRoute.d.ts +47 -17366
  110. package/lib/users/createFoundryAdminOntologyRoute.d.ts.map +1 -1
  111. package/lib/users/createFoundryAdminOntologyRoute.js +29 -37
  112. package/lib/users/createFoundryAdminOntologyRoute.js.map +1 -1
  113. package/lib/users/createFoundryUsersIntegration.d.ts +6 -4
  114. package/lib/users/createFoundryUsersIntegration.d.ts.map +1 -1
  115. package/lib/users/createFoundryUsersIntegration.js +28 -30
  116. package/lib/users/createFoundryUsersIntegration.js.map +1 -1
  117. package/lib/users/foundryUser.d.ts +4 -2
  118. package/lib/users/foundryUser.d.ts.map +1 -1
  119. package/lib/users/foundryUser.js +69 -74
  120. package/lib/users/foundryUser.js.map +1 -1
  121. package/lib/users/index.d.ts +5 -5
  122. package/lib/users/index.js +5 -5
  123. package/lib/users/userCollectionOptions.d.ts +13 -12
  124. package/lib/users/userCollectionOptions.d.ts.map +1 -1
  125. package/lib/users/userCollectionOptions.js +82 -100
  126. package/lib/users/userCollectionOptions.js.map +1 -1
  127. package/lib/utils/AsyncIterable.d.ts +2 -0
  128. package/lib/utils/AsyncIterable.d.ts.map +1 -1
  129. package/lib/utils/AsyncIterable.js +26 -34
  130. package/lib/utils/AsyncIterable.js.map +1 -1
  131. package/lib/utils/actionTypeName.d.ts +2 -0
  132. package/lib/utils/actionTypeName.d.ts.map +1 -1
  133. package/lib/utils/actionTypeName.js +9 -7
  134. package/lib/utils/actionTypeName.js.map +1 -1
  135. package/lib/utils/chunk.d.ts +2 -0
  136. package/lib/utils/chunk.d.ts.map +1 -1
  137. package/lib/utils/chunk.js +8 -6
  138. package/lib/utils/chunk.js.map +1 -1
  139. package/package.json +21 -27
  140. package/lib/adapter/convertLoadSubsetOptions.test.d.ts +0 -2
  141. package/lib/adapter/convertLoadSubsetOptions.test.d.ts.map +0 -1
  142. package/lib/adapter/convertLoadSubsetOptions.test.js +0 -213
  143. package/lib/adapter/convertLoadSubsetOptions.test.js.map +0 -1
  144. package/lib/adapter/createFoundryOntologyBackendAdapter.test.d.ts +0 -2
  145. package/lib/adapter/createFoundryOntologyBackendAdapter.test.d.ts.map +0 -1
  146. package/lib/adapter/createFoundryOntologyBackendAdapter.test.js +0 -628
  147. package/lib/adapter/createFoundryOntologyBackendAdapter.test.js.map +0 -1
  148. package/lib/adapter/foundryActionValidation.test.d.ts +0 -2
  149. package/lib/adapter/foundryActionValidation.test.d.ts.map +0 -1
  150. package/lib/adapter/foundryActionValidation.test.js +0 -243
  151. package/lib/adapter/foundryActionValidation.test.js.map +0 -1
  152. package/lib/adapter/foundryCodec.test.d.ts +0 -2
  153. package/lib/adapter/foundryCodec.test.d.ts.map +0 -1
  154. package/lib/adapter/foundryCodec.test.js +0 -137
  155. package/lib/adapter/foundryCodec.test.js.map +0 -1
  156. package/lib/adapter/foundryMediaId.test.d.ts +0 -2
  157. package/lib/adapter/foundryMediaId.test.d.ts.map +0 -1
  158. package/lib/adapter/foundryMediaId.test.js +0 -23
  159. package/lib/adapter/foundryMediaId.test.js.map +0 -1
  160. package/lib/adapter/index.d.ts.map +0 -1
  161. package/lib/adapter/index.js.map +0 -1
  162. package/lib/adapter/objectCollectionOptions.test.d.ts +0 -2
  163. package/lib/adapter/objectCollectionOptions.test.d.ts.map +0 -1
  164. package/lib/adapter/objectCollectionOptions.test.js +0 -1289
  165. package/lib/adapter/objectCollectionOptions.test.js.map +0 -1
  166. package/lib/config/connectionPull.test.d.ts +0 -2
  167. package/lib/config/connectionPull.test.d.ts.map +0 -1
  168. package/lib/config/connectionPull.test.js +0 -151
  169. package/lib/config/connectionPull.test.js.map +0 -1
  170. package/lib/config/index.test.d.ts +0 -2
  171. package/lib/config/index.test.d.ts.map +0 -1
  172. package/lib/config/index.test.js +0 -182
  173. package/lib/config/index.test.js.map +0 -1
  174. package/lib/connection.test.d.ts +0 -2
  175. package/lib/connection.test.d.ts.map +0 -1
  176. package/lib/connection.test.js +0 -162
  177. package/lib/connection.test.js.map +0 -1
  178. package/lib/index.d.ts.map +0 -1
  179. package/lib/index.js.map +0 -1
  180. package/lib/installation/createFoundryBackendInstallation.test.d.ts +0 -2
  181. package/lib/installation/createFoundryBackendInstallation.test.d.ts.map +0 -1
  182. package/lib/installation/createFoundryBackendInstallation.test.js +0 -83
  183. package/lib/installation/createFoundryBackendInstallation.test.js.map +0 -1
  184. package/lib/installation/index.d.ts.map +0 -1
  185. package/lib/installation/index.js.map +0 -1
  186. package/lib/meta/actionTypeCollectionOptions.test.d.ts +0 -2
  187. package/lib/meta/actionTypeCollectionOptions.test.d.ts.map +0 -1
  188. package/lib/meta/actionTypeCollectionOptions.test.js +0 -24
  189. package/lib/meta/actionTypeCollectionOptions.test.js.map +0 -1
  190. package/lib/meta/actionTypeIdQuery.test.d.ts +0 -2
  191. package/lib/meta/actionTypeIdQuery.test.d.ts.map +0 -1
  192. package/lib/meta/actionTypeIdQuery.test.js +0 -131
  193. package/lib/meta/actionTypeIdQuery.test.js.map +0 -1
  194. package/lib/meta/convertActionTypeLoadSubsetOptions.test.d.ts +0 -2
  195. package/lib/meta/convertActionTypeLoadSubsetOptions.test.d.ts.map +0 -1
  196. package/lib/meta/convertActionTypeLoadSubsetOptions.test.js +0 -138
  197. package/lib/meta/convertActionTypeLoadSubsetOptions.test.js.map +0 -1
  198. package/lib/meta/convertMetaActionType.test.d.ts +0 -2
  199. package/lib/meta/convertMetaActionType.test.d.ts.map +0 -1
  200. package/lib/meta/convertMetaActionType.test.js +0 -1565
  201. package/lib/meta/convertMetaActionType.test.js.map +0 -1
  202. package/lib/meta/convertMetaLinkType.test.d.ts +0 -2
  203. package/lib/meta/convertMetaLinkType.test.d.ts.map +0 -1
  204. package/lib/meta/convertMetaLinkType.test.js +0 -110
  205. package/lib/meta/convertMetaLinkType.test.js.map +0 -1
  206. package/lib/meta/convertMetaObjectType.test.d.ts +0 -2
  207. package/lib/meta/convertMetaObjectType.test.d.ts.map +0 -1
  208. package/lib/meta/convertMetaObjectType.test.js +0 -250
  209. package/lib/meta/convertMetaObjectType.test.js.map +0 -1
  210. package/lib/meta/convertMetaQueryFunctionType.test.d.ts +0 -2
  211. package/lib/meta/convertMetaQueryFunctionType.test.d.ts.map +0 -1
  212. package/lib/meta/convertMetaQueryFunctionType.test.js +0 -134
  213. package/lib/meta/convertMetaQueryFunctionType.test.js.map +0 -1
  214. package/lib/meta/createFoundryMetaOntologyBackendAdapter.test.d.ts +0 -2
  215. package/lib/meta/createFoundryMetaOntologyBackendAdapter.test.d.ts.map +0 -1
  216. package/lib/meta/createFoundryMetaOntologyBackendAdapter.test.js +0 -49
  217. package/lib/meta/createFoundryMetaOntologyBackendAdapter.test.js.map +0 -1
  218. package/lib/meta/entityCollectionOptions.test.d.ts +0 -2
  219. package/lib/meta/entityCollectionOptions.test.d.ts.map +0 -1
  220. package/lib/meta/entityCollectionOptions.test.js +0 -98
  221. package/lib/meta/entityCollectionOptions.test.js.map +0 -1
  222. package/lib/meta/index.d.ts.map +0 -1
  223. package/lib/meta/index.js.map +0 -1
  224. package/lib/meta/loadActionTypeOmsMetadata.test.d.ts +0 -2
  225. package/lib/meta/loadActionTypeOmsMetadata.test.d.ts.map +0 -1
  226. package/lib/meta/loadActionTypeOmsMetadata.test.js +0 -218
  227. package/lib/meta/loadActionTypeOmsMetadata.test.js.map +0 -1
  228. package/lib/stagedWrites.test.d.ts +0 -2
  229. package/lib/stagedWrites.test.d.ts.map +0 -1
  230. package/lib/stagedWrites.test.js +0 -71
  231. package/lib/stagedWrites.test.js.map +0 -1
  232. package/lib/users/createFoundryUsersIntegration.test.d.ts +0 -2
  233. package/lib/users/createFoundryUsersIntegration.test.d.ts.map +0 -1
  234. package/lib/users/createFoundryUsersIntegration.test.js +0 -32
  235. package/lib/users/createFoundryUsersIntegration.test.js.map +0 -1
  236. package/lib/users/foundryUser.test.d.ts +0 -2
  237. package/lib/users/foundryUser.test.d.ts.map +0 -1
  238. package/lib/users/foundryUser.test.js +0 -45
  239. package/lib/users/foundryUser.test.js.map +0 -1
  240. package/lib/users/index.d.ts.map +0 -1
  241. package/lib/users/index.js.map +0 -1
  242. package/lib/users/userCollectionOptions.test.d.ts +0 -2
  243. package/lib/users/userCollectionOptions.test.d.ts.map +0 -1
  244. package/lib/users/userCollectionOptions.test.js +0 -18
  245. package/lib/users/userCollectionOptions.test.js.map +0 -1
  246. package/lib/utils/AsyncIterable.test.d.ts +0 -2
  247. package/lib/utils/AsyncIterable.test.d.ts.map +0 -1
  248. package/lib/utils/AsyncIterable.test.js +0 -17
  249. package/lib/utils/AsyncIterable.test.js.map +0 -1
  250. package/lib/utils/actionTypeName.test.d.ts +0 -2
  251. package/lib/utils/actionTypeName.test.d.ts.map +0 -1
  252. package/lib/utils/actionTypeName.test.js +0 -30
  253. package/lib/utils/actionTypeName.test.js.map +0 -1
@@ -1,1565 +0,0 @@
1
- import { validate } from "@party-stack/ontology";
2
- import { Temporal } from "temporal-polyfill";
3
- import { describe, expect, it } from "vitest";
4
- import { convertFoundryMetaActionType } from "./convertMetaActionType.js";
5
- function actionType(parameters) {
6
- return {
7
- actionType: {
8
- apiName: "validated-action",
9
- displayName: "Validated action",
10
- status: "EXPERIMENTAL",
11
- parameters,
12
- rid: "ri.actions.main.action-type.example",
13
- operations: [],
14
- },
15
- fullLogicRules: [],
16
- };
17
- }
18
- function omsIconMetadata(locator, color) {
19
- return {
20
- actionType: {
21
- actionTypeLogic: {
22
- validation: {
23
- parameterValidations: {},
24
- },
25
- },
26
- metadata: {
27
- displayMetadata: {
28
- icon: {
29
- type: "blueprint",
30
- blueprint: { locator, color },
31
- },
32
- },
33
- },
34
- },
35
- propertyApiNamesByParameter: new Map(),
36
- };
37
- }
38
- function objectParameter(objectType, required) {
39
- return {
40
- displayName: objectType,
41
- dataType: {
42
- type: "object",
43
- objectTypeApiName: objectType,
44
- objectApiName: objectType,
45
- },
46
- required,
47
- typeClasses: [],
48
- };
49
- }
50
- function structListParameter() {
51
- return {
52
- displayName: "Entries",
53
- dataType: {
54
- type: "array",
55
- subType: {
56
- type: "struct",
57
- fields: [
58
- {
59
- name: "code",
60
- fieldType: { type: "string" },
61
- required: true,
62
- },
63
- {
64
- name: "enabled",
65
- fieldType: { type: "boolean" },
66
- required: true,
67
- },
68
- ],
69
- },
70
- },
71
- required: false,
72
- typeClasses: [],
73
- };
74
- }
75
- function structListField(parameterId, field) {
76
- return {
77
- type: "structListParameterFieldValue",
78
- parameterId,
79
- structParameterFieldApiName: field,
80
- };
81
- }
82
- function structField(parameterId, field) {
83
- return {
84
- type: "structParameterFieldValue",
85
- parameterId,
86
- structParameterFieldApiName: field,
87
- };
88
- }
89
- function omsActionMetadata(parameterName, allowedValues, prefill, resolvedProperty) {
90
- return {
91
- actionType: {
92
- actionTypeLogic: {
93
- validation: {
94
- parameterValidations: {
95
- [parameterName]: {
96
- defaultValidation: {
97
- display: {
98
- prefill,
99
- },
100
- validation: {
101
- allowedValues,
102
- },
103
- },
104
- },
105
- },
106
- },
107
- },
108
- },
109
- propertyApiNamesByParameter: resolvedProperty
110
- ? new Map([
111
- [
112
- resolvedProperty.parameterId,
113
- new Map([[resolvedProperty.propertyTypeId, resolvedProperty.propertyApiName]]),
114
- ],
115
- ])
116
- : new Map(),
117
- };
118
- }
119
- function omsOneOf(values, allowed = false) {
120
- return {
121
- type: "oneOf",
122
- oneOf: {
123
- type: "oneOf",
124
- oneOf: {
125
- labelledValues: values.map(({ label, value }) => ({
126
- label,
127
- value: {
128
- type: "string",
129
- string: value,
130
- },
131
- })),
132
- otherValueAllowed: { allowed },
133
- },
134
- },
135
- };
136
- }
137
- function omsTextRegex(regex) {
138
- return {
139
- type: "text",
140
- text: {
141
- type: "text",
142
- text: {
143
- regex: {
144
- regex,
145
- failureMessage: "Invalid value.",
146
- },
147
- },
148
- },
149
- };
150
- }
151
- describe("convertFoundryMetaActionType parameter validation", () => {
152
- it("maps the Foundry action type RID to the runtime metadata ID", () => {
153
- expect(convertFoundryMetaActionType(actionType({}))).toMatchObject({
154
- id: "ri.actions.main.action-type.example",
155
- name: "validatedAction",
156
- });
157
- });
158
- it("maps Blueprint icons and colors from OMS action metadata", () => {
159
- expect(convertFoundryMetaActionType(actionType({}), omsIconMetadata("person", "#2d72d2"))).toMatchObject({
160
- icon: {
161
- name: "person",
162
- meta: {
163
- blueprint: { name: "person" },
164
- },
165
- },
166
- color: "#2d72d2",
167
- });
168
- });
169
- it("preserves decimal parameters as strings", () => {
170
- const result = convertFoundryMetaActionType(actionType({
171
- amount: {
172
- displayName: "Amount",
173
- dataType: {
174
- type: "decimal",
175
- precision: 38,
176
- scale: 18,
177
- },
178
- required: true,
179
- typeClasses: [],
180
- },
181
- }));
182
- expect(result.parameters[0]?.type).toEqual({
183
- kind: "string",
184
- value: {},
185
- });
186
- });
187
- it("preserves object references nested inside array structs", () => {
188
- const result = convertFoundryMetaActionType(actionType({
189
- entries: {
190
- displayName: "Entries",
191
- dataType: {
192
- type: "array",
193
- subType: {
194
- type: "struct",
195
- fields: [
196
- {
197
- name: "part",
198
- fieldType: {
199
- type: "object",
200
- objectTypeApiName: "Part",
201
- objectApiName: "part",
202
- },
203
- required: true,
204
- },
205
- ],
206
- },
207
- },
208
- required: true,
209
- typeClasses: [],
210
- },
211
- }));
212
- expect(result.parameters[0]?.type).toEqual({
213
- kind: "list",
214
- value: {
215
- elementType: {
216
- kind: "struct",
217
- value: {
218
- fields: [
219
- {
220
- name: "part",
221
- displayName: "part",
222
- type: {
223
- kind: "objectReference",
224
- value: { objectType: "Part" },
225
- },
226
- },
227
- ],
228
- },
229
- },
230
- },
231
- });
232
- });
233
- it("converts closed one-of string validation to an enum constraint", () => {
234
- const result = convertFoundryMetaActionType(actionType({
235
- status: {
236
- displayName: "Status",
237
- dataType: { type: "string" },
238
- required: true,
239
- typeClasses: [],
240
- validation: {
241
- defaultValidation: {
242
- allowedValues: {
243
- type: "oneOf",
244
- options: [
245
- { displayName: "Open", value: "open" },
246
- { displayName: "Closed", value: "closed" },
247
- ],
248
- otherValuesAllowed: false,
249
- },
250
- },
251
- },
252
- },
253
- }));
254
- expect(result.parameters[0]?.type).toEqual({
255
- kind: "string",
256
- value: {
257
- constraint: {
258
- kind: "enum",
259
- value: {
260
- options: [
261
- { value: "open", label: "Open" },
262
- { value: "closed", label: "Closed" },
263
- ],
264
- },
265
- },
266
- },
267
- });
268
- });
269
- it("preserves one-of suggestions that permit other values", () => {
270
- const result = convertFoundryMetaActionType(actionType({
271
- status: {
272
- displayName: "Status",
273
- dataType: { type: "string" },
274
- required: true,
275
- typeClasses: [],
276
- validation: {
277
- defaultValidation: {
278
- allowedValues: {
279
- type: "oneOf",
280
- options: [{ displayName: "Open", value: "open" }],
281
- otherValuesAllowed: true,
282
- },
283
- },
284
- },
285
- },
286
- }));
287
- expect(result.parameters[0]?.type).toEqual({
288
- kind: "string",
289
- value: {
290
- suggestions: [
291
- {
292
- value: "open",
293
- label: "Open",
294
- },
295
- ],
296
- },
297
- });
298
- });
299
- it("converts text regex validation to a regex constraint", () => {
300
- const result = convertFoundryMetaActionType(actionType({
301
- postalCode: {
302
- displayName: "Postal code",
303
- dataType: { type: "string" },
304
- required: false,
305
- typeClasses: [],
306
- validation: {
307
- defaultValidation: {
308
- allowedValues: {
309
- type: "text",
310
- regex: "^\\d{5}$",
311
- },
312
- },
313
- },
314
- },
315
- }));
316
- expect(result.parameters[0]?.type).toEqual({
317
- kind: "optional",
318
- value: {
319
- type: {
320
- kind: "string",
321
- value: {
322
- constraint: {
323
- kind: "regex",
324
- value: { regex: "^\\d{5}$" },
325
- },
326
- },
327
- },
328
- },
329
- });
330
- });
331
- it("references value types so their existing constraints are reused", () => {
332
- const result = convertFoundryMetaActionType(actionType({
333
- postalCode: {
334
- displayName: "Postal code",
335
- dataType: { type: "string" },
336
- required: true,
337
- typeClasses: [],
338
- validation: {
339
- defaultValidation: {
340
- allowedValues: {
341
- type: "valueType",
342
- apiName: "PostalCode",
343
- rid: "ri.ontology.main.value-type.example",
344
- versionId: "1",
345
- },
346
- },
347
- },
348
- },
349
- }));
350
- expect(result.parameters[0]?.type).toEqual({
351
- kind: "ref",
352
- value: { name: "PostalCode" },
353
- });
354
- });
355
- it("maps Foundry current user arguments to the canonical user context", () => {
356
- const metadata = actionType({});
357
- metadata.fullLogicRules = [
358
- {
359
- type: "createObject",
360
- objectTypeApiName: "Task",
361
- propertyArguments: {
362
- createdBy: {
363
- type: "currentUser",
364
- },
365
- },
366
- structPropertyArguments: {},
367
- },
368
- ];
369
- expect(convertFoundryMetaActionType(metadata).logic).toEqual([
370
- {
371
- kind: "createObject",
372
- value: {
373
- objectType: "Task",
374
- values: [
375
- {
376
- property: ["createdBy"],
377
- value: {
378
- kind: "contextReference",
379
- value: {
380
- name: "user",
381
- },
382
- },
383
- },
384
- ],
385
- },
386
- },
387
- ]);
388
- });
389
- });
390
- describe("convertFoundryMetaActionType mutation targets", () => {
391
- it("requires an optional object-reference update target", () => {
392
- const metadata = actionType({
393
- survey: objectParameter("HospitalSurveyDev", false),
394
- });
395
- metadata.fullLogicRules = [
396
- {
397
- type: "modifyObject",
398
- objectToModify: "survey",
399
- propertyArguments: {},
400
- structPropertyArguments: {},
401
- },
402
- ];
403
- const result = convertFoundryMetaActionType(metadata);
404
- expect(result.parameters[0]?.type).toEqual({
405
- kind: "objectReference",
406
- value: { objectType: "HospitalSurveyDev" },
407
- });
408
- expect(result.logic[0]).toMatchObject({
409
- kind: "updateObject",
410
- value: { object: { name: "survey" } },
411
- });
412
- });
413
- it("requires an optional object-reference delete target", () => {
414
- const metadata = actionType({
415
- survey: objectParameter("HospitalSurveyDev", false),
416
- });
417
- metadata.fullLogicRules = [
418
- {
419
- type: "deleteObject",
420
- objectToDelete: "survey",
421
- },
422
- ];
423
- expect(convertFoundryMetaActionType(metadata).parameters[0]?.type).toEqual({
424
- kind: "objectReference",
425
- value: { objectType: "HospitalSurveyDev" },
426
- });
427
- });
428
- it("leaves an already-required mutation target unchanged", () => {
429
- const metadata = actionType({
430
- survey: objectParameter("HospitalSurveyDev", true),
431
- });
432
- metadata.fullLogicRules = [
433
- {
434
- type: "modifyObject",
435
- objectToModify: "survey",
436
- propertyArguments: {},
437
- structPropertyArguments: {},
438
- },
439
- ];
440
- expect(convertFoundryMetaActionType(metadata).parameters[0]?.type).toEqual({
441
- kind: "objectReference",
442
- value: { objectType: "HospitalSurveyDev" },
443
- });
444
- });
445
- it("preserves optional object references that are not mutation targets", () => {
446
- const metadata = actionType({
447
- survey: objectParameter("HospitalSurveyDev", true),
448
- relatedSurvey: objectParameter("HospitalSurveyDev", false),
449
- });
450
- metadata.fullLogicRules = [
451
- {
452
- type: "modifyObject",
453
- objectToModify: "survey",
454
- propertyArguments: {
455
- relatedSurvey: {
456
- type: "parameterId",
457
- parameterId: "relatedSurvey",
458
- },
459
- },
460
- structPropertyArguments: {},
461
- },
462
- ];
463
- expect(convertFoundryMetaActionType(metadata).parameters[1]?.type).toEqual({
464
- kind: "optional",
465
- value: {
466
- type: {
467
- kind: "objectReference",
468
- value: { objectType: "HospitalSurveyDev" },
469
- },
470
- },
471
- });
472
- });
473
- it("preserves optional scalar property parameters", () => {
474
- const metadata = actionType({
475
- survey: objectParameter("HospitalSurveyDev", true),
476
- status: {
477
- displayName: "Status",
478
- dataType: { type: "string" },
479
- required: false,
480
- typeClasses: [],
481
- },
482
- });
483
- metadata.fullLogicRules = [
484
- {
485
- type: "modifyObject",
486
- objectToModify: "survey",
487
- propertyArguments: {
488
- status: {
489
- type: "parameterId",
490
- parameterId: "status",
491
- },
492
- },
493
- structPropertyArguments: {},
494
- },
495
- ];
496
- expect(convertFoundryMetaActionType(metadata).parameters[1]?.type).toEqual({
497
- kind: "optional",
498
- value: {
499
- type: {
500
- kind: "string",
501
- value: {},
502
- },
503
- },
504
- });
505
- });
506
- it("normalizes only update and delete targets across multiple rules", () => {
507
- const metadata = actionType({
508
- surveyToUpdate: objectParameter("HospitalSurveyDev", false),
509
- surveyToDelete: objectParameter("HospitalSurveyDev", false),
510
- surveyToRead: objectParameter("HospitalSurveyDev", false),
511
- });
512
- metadata.fullLogicRules = [
513
- {
514
- type: "modifyObject",
515
- objectToModify: "surveyToUpdate",
516
- propertyArguments: {
517
- copiedStatus: {
518
- type: "objectParameterPropertyValue",
519
- parameterId: "surveyToRead",
520
- propertyTypeApiName: "status",
521
- },
522
- },
523
- structPropertyArguments: {},
524
- },
525
- {
526
- type: "deleteObject",
527
- objectToDelete: "surveyToDelete",
528
- },
529
- ];
530
- const result = convertFoundryMetaActionType(metadata);
531
- expect(result.parameters.map(({ name, type }) => [name, type.kind])).toEqual([
532
- ["surveyToUpdate", "objectReference"],
533
- ["surveyToDelete", "objectReference"],
534
- ["surveyToRead", "optional"],
535
- ]);
536
- });
537
- });
538
- describe("convertFoundryMetaActionType struct assignments", () => {
539
- it.each([
540
- {
541
- name: "create-object",
542
- rule: {
543
- type: "createObject",
544
- objectTypeApiName: "Record",
545
- propertyArguments: {},
546
- structPropertyArguments: {
547
- entries: {
548
- code: structListField("entries", "code"),
549
- enabled: structListField("entries", "enabled"),
550
- },
551
- },
552
- },
553
- expectedKind: "createObject",
554
- },
555
- {
556
- name: "update-object",
557
- rule: {
558
- type: "modifyObject",
559
- objectToModify: "record",
560
- propertyArguments: {},
561
- structPropertyArguments: {
562
- entries: {
563
- code: structListField("entries", "code"),
564
- enabled: structListField("entries", "enabled"),
565
- },
566
- },
567
- },
568
- expectedKind: "updateObject",
569
- },
570
- ])("converts a complete $name list mapping to a map expression", ({ rule, expectedKind }) => {
571
- const metadata = actionType({
572
- entries: structListParameter(),
573
- record: {
574
- displayName: "Record",
575
- dataType: {
576
- type: "object",
577
- objectTypeApiName: "Record",
578
- objectApiName: "record",
579
- },
580
- required: true,
581
- typeClasses: [],
582
- },
583
- });
584
- metadata.fullLogicRules = [rule];
585
- expect(convertFoundryMetaActionType(metadata).logic).toMatchObject([
586
- {
587
- kind: expectedKind,
588
- value: {
589
- values: [
590
- {
591
- property: ["entries"],
592
- value: {
593
- kind: "map",
594
- value: {
595
- source: {
596
- kind: "inputReference",
597
- value: {
598
- name: "entries",
599
- },
600
- },
601
- binding: "item",
602
- body: {
603
- kind: "struct",
604
- value: {
605
- fields: [
606
- {
607
- name: "code",
608
- value: {
609
- kind: "getAt",
610
- value: {
611
- source: {
612
- kind: "localReference",
613
- value: {
614
- name: "item",
615
- },
616
- },
617
- path: ["code"],
618
- },
619
- },
620
- },
621
- {
622
- name: "enabled",
623
- value: {
624
- kind: "getAt",
625
- value: {
626
- source: {
627
- kind: "localReference",
628
- value: {
629
- name: "item",
630
- },
631
- },
632
- path: ["enabled"],
633
- },
634
- },
635
- },
636
- ],
637
- },
638
- },
639
- },
640
- },
641
- },
642
- ],
643
- },
644
- },
645
- ]);
646
- });
647
- it("preserves nested assignments for an ordinary struct", () => {
648
- const metadata = actionType({
649
- details: {
650
- displayName: "Details",
651
- dataType: {
652
- type: "struct",
653
- fields: [
654
- {
655
- name: "code",
656
- fieldType: { type: "string" },
657
- required: true,
658
- },
659
- ],
660
- },
661
- required: true,
662
- typeClasses: [],
663
- },
664
- });
665
- metadata.fullLogicRules = [
666
- {
667
- type: "createObject",
668
- objectTypeApiName: "Record",
669
- propertyArguments: {},
670
- structPropertyArguments: {
671
- details: {
672
- code: structField("details", "code"),
673
- },
674
- },
675
- },
676
- ];
677
- expect(convertFoundryMetaActionType(metadata).logic).toMatchObject([
678
- {
679
- value: {
680
- values: [
681
- {
682
- property: ["details", "code"],
683
- value: {
684
- kind: "getAt",
685
- value: {
686
- source: {
687
- kind: "inputReference",
688
- value: { name: "details" },
689
- },
690
- path: ["code"],
691
- },
692
- },
693
- },
694
- ],
695
- },
696
- },
697
- ]);
698
- });
699
- it.each([
700
- {
701
- name: "partial",
702
- fields: {
703
- code: structListField("entries", "code"),
704
- },
705
- expectedFields: [
706
- {
707
- name: "code",
708
- value: {
709
- kind: "getAt",
710
- value: {
711
- source: {
712
- kind: "localReference",
713
- value: { name: "item" },
714
- },
715
- path: ["code"],
716
- },
717
- },
718
- },
719
- ],
720
- },
721
- {
722
- name: "renamed",
723
- fields: {
724
- renamedCode: structListField("entries", "code"),
725
- enabled: structListField("entries", "enabled"),
726
- },
727
- expectedFields: [
728
- {
729
- name: "renamedCode",
730
- value: {
731
- kind: "getAt",
732
- value: {
733
- source: {
734
- kind: "localReference",
735
- value: { name: "item" },
736
- },
737
- path: ["code"],
738
- },
739
- },
740
- },
741
- {
742
- name: "enabled",
743
- value: {
744
- kind: "getAt",
745
- value: {
746
- source: {
747
- kind: "localReference",
748
- value: { name: "item" },
749
- },
750
- path: ["enabled"],
751
- },
752
- },
753
- },
754
- ],
755
- },
756
- ])("converts a $name list mapping to a map expression", ({ fields, expectedFields }) => {
757
- const metadata = actionType({
758
- entries: structListParameter(),
759
- });
760
- metadata.fullLogicRules = [
761
- {
762
- type: "createObject",
763
- objectTypeApiName: "Record",
764
- propertyArguments: {},
765
- structPropertyArguments: { entries: fields },
766
- },
767
- ];
768
- expect(convertFoundryMetaActionType(metadata).logic).toMatchObject([
769
- {
770
- value: {
771
- values: [
772
- {
773
- property: ["entries"],
774
- value: {
775
- kind: "map",
776
- value: {
777
- source: {
778
- kind: "inputReference",
779
- value: {
780
- name: "entries",
781
- },
782
- },
783
- binding: "item",
784
- body: {
785
- kind: "struct",
786
- value: {
787
- fields: expectedFields,
788
- },
789
- },
790
- },
791
- },
792
- },
793
- ],
794
- },
795
- },
796
- ]);
797
- });
798
- it("rejects mappings driven by multiple list parameters", () => {
799
- const metadata = actionType({
800
- entries: structListParameter(),
801
- otherEntries: structListParameter(),
802
- });
803
- metadata.fullLogicRules = [
804
- {
805
- type: "createObject",
806
- objectTypeApiName: "Record",
807
- propertyArguments: {},
808
- structPropertyArguments: {
809
- entries: {
810
- code: structListField("entries", "code"),
811
- enabled: structListField("otherEntries", "enabled"),
812
- },
813
- },
814
- },
815
- ];
816
- expect(() => convertFoundryMetaActionType(metadata)).toThrow('Unsupported Foundry list-of-struct assignment for property "entries": fields are mapped from multiple list parameters');
817
- });
818
- it("rejects mappings that mix list and non-list struct fields", () => {
819
- const metadata = actionType({
820
- entries: structListParameter(),
821
- details: {
822
- displayName: "Details",
823
- dataType: {
824
- type: "struct",
825
- fields: [
826
- {
827
- name: "enabled",
828
- fieldType: { type: "boolean" },
829
- required: true,
830
- },
831
- ],
832
- },
833
- required: true,
834
- typeClasses: [],
835
- },
836
- });
837
- metadata.fullLogicRules = [
838
- {
839
- type: "createObject",
840
- objectTypeApiName: "Record",
841
- propertyArguments: {},
842
- structPropertyArguments: {
843
- entries: {
844
- code: structListField("entries", "code"),
845
- enabled: structField("details", "enabled"),
846
- },
847
- },
848
- },
849
- ];
850
- expect(() => convertFoundryMetaActionType(metadata)).toThrow('Unsupported Foundry list-of-struct assignment for property "entries": list fields are mixed with non-list struct field arguments');
851
- });
852
- it("produces action IR that passes ontology validation", () => {
853
- const metadata = actionType({
854
- entries: structListParameter(),
855
- record: {
856
- displayName: "Record",
857
- dataType: {
858
- type: "object",
859
- objectTypeApiName: "Record",
860
- objectApiName: "record",
861
- },
862
- required: true,
863
- typeClasses: [],
864
- },
865
- });
866
- metadata.fullLogicRules = [
867
- {
868
- type: "createObject",
869
- objectTypeApiName: "Record",
870
- propertyArguments: {},
871
- structPropertyArguments: {
872
- entries: {
873
- code: structListField("entries", "code"),
874
- enabled: structListField("entries", "enabled"),
875
- },
876
- summaries: {
877
- identifier: structListField("entries", "code"),
878
- },
879
- },
880
- },
881
- {
882
- type: "modifyObject",
883
- objectToModify: "record",
884
- propertyArguments: {},
885
- structPropertyArguments: {
886
- entries: {
887
- code: structListField("entries", "code"),
888
- enabled: structListField("entries", "enabled"),
889
- },
890
- },
891
- },
892
- ];
893
- const converted = convertFoundryMetaActionType(metadata);
894
- const ontology = {
895
- types: [],
896
- objectTypes: [
897
- {
898
- name: "Record",
899
- displayName: "Record",
900
- pluralDisplayName: "Records",
901
- primaryKey: "id",
902
- properties: [
903
- {
904
- name: "id",
905
- displayName: "ID",
906
- type: { kind: "string", value: {} },
907
- },
908
- {
909
- name: "entries",
910
- displayName: "Entries",
911
- type: converted.parameters[0].type,
912
- },
913
- {
914
- name: "summaries",
915
- displayName: "Summaries",
916
- type: {
917
- kind: "optional",
918
- value: {
919
- type: {
920
- kind: "list",
921
- value: {
922
- elementType: {
923
- kind: "struct",
924
- value: {
925
- fields: [
926
- {
927
- name: "identifier",
928
- displayName: "Identifier",
929
- type: {
930
- kind: "string",
931
- value: {},
932
- },
933
- },
934
- ],
935
- },
936
- },
937
- },
938
- },
939
- },
940
- },
941
- },
942
- ],
943
- },
944
- ],
945
- linkTypes: [],
946
- actionTypes: [converted],
947
- queryFunctionTypes: [],
948
- };
949
- expect(validate(ontology)).toEqual({ kind: "ok" });
950
- });
951
- });
952
- describe("convertFoundryMetaActionType OMS string constraints", () => {
953
- it("uses a closed OMS one-of and preserves its prefill", () => {
954
- const result = convertFoundryMetaActionType(actionType({
955
- country: {
956
- displayName: "Country",
957
- dataType: { type: "string" },
958
- required: true,
959
- typeClasses: [],
960
- },
961
- }), omsActionMetadata("country", omsOneOf([
962
- { label: "United States", value: "US" },
963
- { label: "Canada", value: "CA" },
964
- ]), {
965
- type: "staticValue",
966
- staticValue: {
967
- type: "string",
968
- string: "US",
969
- },
970
- }));
971
- expect(result.parameters[0]?.type).toEqual({
972
- kind: "string",
973
- value: {
974
- constraint: {
975
- kind: "enum",
976
- value: {
977
- options: [
978
- { value: "US", label: "United States" },
979
- { value: "CA", label: "Canada" },
980
- ],
981
- },
982
- },
983
- },
984
- });
985
- expect(result.parameters[0]?.defaultValue).toEqual({
986
- kind: "literal",
987
- value: { value: "US" },
988
- });
989
- });
990
- it("preserves open OMS one-of values as optional string suggestions", () => {
991
- const metadata = actionType({
992
- country: {
993
- displayName: "Country",
994
- dataType: { type: "string" },
995
- required: false,
996
- typeClasses: [],
997
- },
998
- claim: {
999
- displayName: "Claim",
1000
- dataType: {
1001
- type: "object",
1002
- objectTypeApiName: "Claim",
1003
- objectApiName: "claim",
1004
- },
1005
- required: true,
1006
- typeClasses: [],
1007
- },
1008
- });
1009
- metadata.fullLogicRules = [
1010
- {
1011
- type: "modifyObject",
1012
- objectToModify: "claim",
1013
- propertyArguments: {
1014
- country: {
1015
- type: "parameterId",
1016
- parameterId: "country",
1017
- },
1018
- },
1019
- structPropertyArguments: {},
1020
- },
1021
- ];
1022
- const result = convertFoundryMetaActionType(metadata, omsActionMetadata("country", omsOneOf([
1023
- { label: "United States", value: "US" },
1024
- { label: "Mexico", value: "MX" },
1025
- { label: "Canada", value: "CA" },
1026
- ], true), {
1027
- type: "objectParameterPropertyValue",
1028
- objectParameterPropertyValue: {
1029
- parameterId: "claim",
1030
- propertyTypeId: "country",
1031
- },
1032
- }, {
1033
- propertyTypeId: "country",
1034
- parameterId: "claim",
1035
- propertyApiName: "country",
1036
- }));
1037
- expect(result.parameters[0]?.type).toEqual({
1038
- kind: "optional",
1039
- value: {
1040
- type: {
1041
- kind: "string",
1042
- value: {
1043
- suggestions: [
1044
- {
1045
- value: "US",
1046
- label: "United States",
1047
- },
1048
- {
1049
- value: "MX",
1050
- label: "Mexico",
1051
- },
1052
- {
1053
- value: "CA",
1054
- label: "Canada",
1055
- },
1056
- ],
1057
- },
1058
- },
1059
- },
1060
- });
1061
- expect(result.parameters[0]?.defaultValue).toEqual({
1062
- kind: "getAt",
1063
- value: {
1064
- source: {
1065
- kind: "objectLookup",
1066
- value: {
1067
- reference: {
1068
- kind: "inputReference",
1069
- value: { name: "claim" },
1070
- },
1071
- },
1072
- },
1073
- path: ["country"],
1074
- },
1075
- });
1076
- });
1077
- it("applies an OMS enum inside optional strings", () => {
1078
- const result = convertFoundryMetaActionType(actionType({
1079
- country: {
1080
- displayName: "Country",
1081
- dataType: { type: "string" },
1082
- required: false,
1083
- typeClasses: [],
1084
- },
1085
- }), omsActionMetadata("country", omsOneOf([{ label: "United States", value: "US" }])));
1086
- expect(result.parameters[0]?.type).toEqual({
1087
- kind: "optional",
1088
- value: {
1089
- type: {
1090
- kind: "string",
1091
- value: {
1092
- constraint: {
1093
- kind: "enum",
1094
- value: {
1095
- options: [
1096
- {
1097
- value: "US",
1098
- label: "United States",
1099
- },
1100
- ],
1101
- },
1102
- },
1103
- },
1104
- },
1105
- },
1106
- });
1107
- });
1108
- it("applies OMS constraints to string list element types", () => {
1109
- const result = convertFoundryMetaActionType(actionType({
1110
- countries: {
1111
- displayName: "Countries",
1112
- dataType: {
1113
- type: "array",
1114
- subType: { type: "string" },
1115
- },
1116
- required: true,
1117
- typeClasses: [],
1118
- },
1119
- }), omsActionMetadata("countries", omsOneOf([{ label: "United States", value: "US" }])));
1120
- expect(result.parameters[0]?.type).toMatchObject({
1121
- kind: "list",
1122
- value: {
1123
- elementType: {
1124
- kind: "string",
1125
- value: {
1126
- constraint: {
1127
- kind: "enum",
1128
- },
1129
- },
1130
- },
1131
- },
1132
- });
1133
- });
1134
- it("uses an OMS text regex when public metadata has none", () => {
1135
- const result = convertFoundryMetaActionType(actionType({
1136
- postalCode: {
1137
- displayName: "Postal code",
1138
- dataType: { type: "string" },
1139
- required: true,
1140
- typeClasses: [],
1141
- },
1142
- }), omsActionMetadata("postalCode", omsTextRegex("^\\d{5}$")));
1143
- expect(result.parameters[0]?.type).toEqual({
1144
- kind: "string",
1145
- value: {
1146
- constraint: {
1147
- kind: "regex",
1148
- value: { regex: "^\\d{5}$" },
1149
- },
1150
- },
1151
- });
1152
- });
1153
- it("keeps public string constraints when OMS also supplies one", () => {
1154
- const result = convertFoundryMetaActionType(actionType({
1155
- country: {
1156
- displayName: "Country",
1157
- dataType: { type: "string" },
1158
- required: true,
1159
- typeClasses: [],
1160
- validation: {
1161
- defaultValidation: {
1162
- allowedValues: {
1163
- type: "oneOf",
1164
- options: [
1165
- {
1166
- displayName: "Public option",
1167
- value: "public",
1168
- },
1169
- ],
1170
- otherValuesAllowed: false,
1171
- },
1172
- },
1173
- },
1174
- },
1175
- }), omsActionMetadata("country", omsOneOf([{ label: "OMS option", value: "oms" }])));
1176
- expect(result.parameters[0]?.type).toMatchObject({
1177
- kind: "string",
1178
- value: {
1179
- constraint: {
1180
- kind: "enum",
1181
- value: {
1182
- options: [
1183
- {
1184
- value: "public",
1185
- label: "Public option",
1186
- },
1187
- ],
1188
- },
1189
- },
1190
- },
1191
- });
1192
- });
1193
- });
1194
- describe("convertFoundryMetaActionType OMS struct field validations", () => {
1195
- const options = [{ value: "high", label: "High severity" }];
1196
- const fields = [
1197
- { name: "severity", fieldType: { type: "string" }, required: false },
1198
- { name: "category", fieldType: { type: "string" }, required: false },
1199
- {
1200
- name: "tags",
1201
- fieldType: { type: "array", itemType: { type: "string" } },
1202
- required: false,
1203
- },
1204
- { name: "code", fieldType: { type: "string" }, required: true },
1205
- ];
1206
- it.each([false, true])("converts field validation through optional list wrappers: %s", (list) => {
1207
- const struct = { type: "struct", fields };
1208
- const metadata = actionType({
1209
- issues: {
1210
- displayName: "Issues",
1211
- dataType: list ? { type: "array", subType: struct } : struct,
1212
- required: !list,
1213
- typeClasses: [],
1214
- },
1215
- });
1216
- const oms = {
1217
- actionType: {
1218
- actionTypeLogic: {
1219
- validation: {
1220
- parameterValidations: {
1221
- issues: {
1222
- defaultValidation: { display: {} },
1223
- structFieldValidations: Object.fromEntries(Object.entries({
1224
- severity: omsOneOf(options),
1225
- category: omsOneOf(options, true),
1226
- tags: omsOneOf(options, true),
1227
- code: omsTextRegex("^[A-Z]+$"),
1228
- }).map(([name, allowedValues]) => [
1229
- name,
1230
- { defaultValidation: { validation: { allowedValues } } },
1231
- ])),
1232
- },
1233
- },
1234
- },
1235
- },
1236
- },
1237
- propertyApiNamesByParameter: new Map(),
1238
- };
1239
- const result = convertFoundryMetaActionType(metadata, oms);
1240
- let type = result.parameters[0].type;
1241
- if (list) {
1242
- expect(type.kind).toBe("optional");
1243
- if (type.kind !== "optional")
1244
- throw new Error("Expected optional list");
1245
- expect(type.value.type.kind).toBe("list");
1246
- if (type.value.type.kind !== "list")
1247
- throw new Error("Expected list");
1248
- type = type.value.type.value.elementType;
1249
- }
1250
- expect(type.kind).toBe("struct");
1251
- if (type.kind !== "struct")
1252
- throw new Error("Expected struct");
1253
- expect(type.value.fields).toEqual([
1254
- {
1255
- name: "severity", displayName: "severity",
1256
- type: { kind: "optional", value: { type: {
1257
- kind: "string", value: { constraint: { kind: "enum", value: { options } } },
1258
- } } },
1259
- },
1260
- {
1261
- name: "category", displayName: "category",
1262
- type: { kind: "optional", value: { type: {
1263
- kind: "string", value: { suggestions: options },
1264
- } } },
1265
- },
1266
- {
1267
- name: "tags", displayName: "tags",
1268
- type: { kind: "optional", value: { type: {
1269
- kind: "list", value: { elementType: {
1270
- kind: "string", value: { suggestions: options },
1271
- } },
1272
- } } },
1273
- },
1274
- {
1275
- name: "code", displayName: "code",
1276
- type: { kind: "string", value: {
1277
- constraint: { kind: "regex", value: { regex: "^[A-Z]+$" } },
1278
- } },
1279
- },
1280
- ]);
1281
- expect(convertFoundryMetaActionType(metadata).parameters[0]?.type).toEqual(convertFoundryMetaActionType(metadata, { ...oms, actionType: {
1282
- ...oms.actionType,
1283
- actionTypeLogic: { ...oms.actionType.actionTypeLogic, validation: {
1284
- ...oms.actionType.actionTypeLogic.validation, parameterValidations: {},
1285
- } },
1286
- } }).parameters[0]?.type);
1287
- });
1288
- it.each([false, true])("retains top-level open string suggestions, list: %s", (list) => {
1289
- const result = convertFoundryMetaActionType(actionType({
1290
- tags: {
1291
- displayName: "Tags",
1292
- dataType: list ? { type: "array", subType: { type: "string" } } : { type: "string" },
1293
- required: false,
1294
- typeClasses: [],
1295
- },
1296
- }), omsActionMetadata("tags", omsOneOf(options, true)));
1297
- let type = result.parameters[0].type;
1298
- if (type.kind !== "optional")
1299
- throw new Error("Expected optional type");
1300
- type = type.value.type;
1301
- if (type.kind === "list")
1302
- type = type.value.elementType;
1303
- expect(type).toEqual({ kind: "string", value: { suggestions: options } });
1304
- });
1305
- });
1306
- describe("convertFoundryMetaActionType OMS defaults", () => {
1307
- it("converts static and object-property prefills to parameter defaults", () => {
1308
- const metadata = actionType({
1309
- assignee: {
1310
- displayName: "Assignee",
1311
- dataType: {
1312
- type: "object",
1313
- objectTypeApiName: "User",
1314
- objectApiName: "User",
1315
- },
1316
- required: true,
1317
- typeClasses: [],
1318
- },
1319
- assigneeName: {
1320
- displayName: "Assignee name",
1321
- dataType: { type: "string" },
1322
- required: false,
1323
- typeClasses: [],
1324
- },
1325
- notes: {
1326
- displayName: "Notes",
1327
- dataType: { type: "string" },
1328
- required: false,
1329
- typeClasses: [],
1330
- },
1331
- });
1332
- const result = convertFoundryMetaActionType(metadata, {
1333
- actionType: {
1334
- actionTypeLogic: {
1335
- validation: {
1336
- parameterValidations: {
1337
- assigneeName: {
1338
- defaultValidation: {
1339
- display: {
1340
- prefill: {
1341
- type: "objectParameterPropertyValue",
1342
- objectParameterPropertyValue: {
1343
- parameterId: "assignee",
1344
- propertyTypeId: "legacy-display-name-id",
1345
- },
1346
- },
1347
- },
1348
- },
1349
- },
1350
- notes: {
1351
- defaultValidation: {
1352
- display: {
1353
- prefill: {
1354
- type: "staticValue",
1355
- staticValue: {
1356
- type: "string",
1357
- string: "from-foundry",
1358
- },
1359
- },
1360
- },
1361
- },
1362
- },
1363
- },
1364
- },
1365
- },
1366
- },
1367
- propertyApiNamesByParameter: new Map([
1368
- ["assignee", new Map([["legacy-display-name-id", "displayName"]])],
1369
- ]),
1370
- });
1371
- expect(result.parameters).toMatchObject([
1372
- {
1373
- name: "assignee",
1374
- },
1375
- {
1376
- name: "assigneeName",
1377
- defaultValue: {
1378
- kind: "getAt",
1379
- value: {
1380
- source: {
1381
- kind: "objectLookup",
1382
- value: {
1383
- reference: {
1384
- kind: "inputReference",
1385
- value: { name: "assignee" },
1386
- },
1387
- },
1388
- },
1389
- path: ["displayName"],
1390
- },
1391
- },
1392
- },
1393
- {
1394
- name: "notes",
1395
- defaultValue: {
1396
- kind: "literal",
1397
- value: {
1398
- value: "from-foundry",
1399
- },
1400
- },
1401
- },
1402
- ]);
1403
- });
1404
- it("omits object-query prefills", () => {
1405
- const objectSet = {
1406
- objectSet: {
1407
- startingObjectSet: {
1408
- type: "base",
1409
- base: { objectTypeId: "jfubb6is.user" },
1410
- },
1411
- transforms: [
1412
- {
1413
- type: "propertyFilter",
1414
- propertyFilter: {
1415
- type: "exactMatch",
1416
- exactMatch: {
1417
- propertyId: "email",
1418
- terms: [
1419
- {
1420
- type: "string",
1421
- string: "owner@example.com",
1422
- },
1423
- ],
1424
- },
1425
- },
1426
- },
1427
- {
1428
- type: "propertyFilter",
1429
- propertyFilter: {
1430
- type: "parameterizedExactMatch",
1431
- parameterizedExactMatch: {
1432
- propertyId: "department",
1433
- terms: [
1434
- {
1435
- type: "unresolved",
1436
- unresolved: {
1437
- parameterId: "departments",
1438
- },
1439
- },
1440
- ],
1441
- },
1442
- },
1443
- },
1444
- ],
1445
- },
1446
- conditionValues: {
1447
- departments: {
1448
- type: "staticValue",
1449
- staticValue: {
1450
- type: "stringList",
1451
- stringList: {
1452
- strings: ["Engineering", "Operations"],
1453
- },
1454
- },
1455
- },
1456
- },
1457
- };
1458
- const result = convertFoundryMetaActionType(actionType({
1459
- assignee: {
1460
- displayName: "Assignee",
1461
- dataType: {
1462
- type: "object",
1463
- objectTypeApiName: "User",
1464
- objectApiName: "jfubb6is.user",
1465
- },
1466
- required: false,
1467
- typeClasses: [],
1468
- },
1469
- }), {
1470
- actionType: {
1471
- actionTypeLogic: {
1472
- validation: {
1473
- parameterValidations: {
1474
- assignee: {
1475
- defaultValidation: {
1476
- display: {
1477
- prefill: {
1478
- type: "objectQueryPrefill",
1479
- objectQueryPrefill: {
1480
- objectSet,
1481
- },
1482
- },
1483
- },
1484
- },
1485
- },
1486
- },
1487
- },
1488
- },
1489
- },
1490
- propertyApiNamesByParameter: new Map(),
1491
- });
1492
- expect(result.parameters[0]?.defaultValue).toBeUndefined();
1493
- });
1494
- it("normalizes typed OMS date and list values", () => {
1495
- const result = convertFoundryMetaActionType(actionType({
1496
- dueDate: {
1497
- displayName: "Due date",
1498
- dataType: { type: "date" },
1499
- required: false,
1500
- typeClasses: [],
1501
- },
1502
- tags: {
1503
- displayName: "Tags",
1504
- dataType: {
1505
- type: "array",
1506
- subType: { type: "string" },
1507
- },
1508
- required: false,
1509
- typeClasses: [],
1510
- },
1511
- }), {
1512
- actionType: {
1513
- actionTypeLogic: {
1514
- validation: {
1515
- parameterValidations: {
1516
- dueDate: {
1517
- defaultValidation: {
1518
- display: {
1519
- prefill: {
1520
- type: "staticValue",
1521
- staticValue: {
1522
- type: "date",
1523
- date: {
1524
- dateValue: "2026-08-31",
1525
- },
1526
- },
1527
- },
1528
- },
1529
- },
1530
- },
1531
- tags: {
1532
- defaultValidation: {
1533
- display: {
1534
- prefill: {
1535
- type: "staticValue",
1536
- staticValue: {
1537
- type: "stringList",
1538
- stringList: {
1539
- strings: ["priority", "customer"],
1540
- },
1541
- },
1542
- },
1543
- },
1544
- },
1545
- },
1546
- },
1547
- },
1548
- },
1549
- },
1550
- propertyApiNamesByParameter: new Map(),
1551
- });
1552
- const dueDateDefault = result.parameters[0]?.defaultValue;
1553
- const tagsDefault = result.parameters[1]?.defaultValue;
1554
- expect(dueDateDefault?.kind).toBe("literal");
1555
- expect(tagsDefault?.kind).toBe("literal");
1556
- if (dueDateDefault?.kind !== "literal" || tagsDefault?.kind !== "literal") {
1557
- throw new Error("Expected literal defaults.");
1558
- }
1559
- const date = dueDateDefault.value.value;
1560
- expect(date).toBeInstanceOf(Temporal.PlainDate);
1561
- expect(date.toString()).toBe("2026-08-31");
1562
- expect(tagsDefault.value.value).toEqual(["priority", "customer"]);
1563
- });
1564
- });
1565
- //# sourceMappingURL=convertMetaActionType.test.js.map