@picked/client 0.0.1-dev.1773807602703 → 0.0.1-dev.1774224866171

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/dist/api-WKe5XBeR.cjs +1 -0
  2. package/dist/api-ZK-H-MlI.js +37 -0
  3. package/dist/cjs/form/index.js +1 -0
  4. package/dist/cjs/index.js +2 -2
  5. package/dist/cjs/plugins/create-experience/index.js +1 -1
  6. package/dist/cjs/plugins/dynamic-experiences/index.js +1 -1
  7. package/dist/cjs/plugins/experience-browser-storage/index.js +1 -1
  8. package/dist/cjs/plugins/history-browser-storage/index.js +1 -1
  9. package/dist/cjs/plugins/responses-browser-storage/index.js +1 -1
  10. package/dist/cjs/plugins/responses-indexeddb/index.js +1 -1
  11. package/dist/cjs/plugins/single-page-app/index.js +1 -1
  12. package/dist/cjs/plugins/web-components/index.js +1 -1
  13. package/dist/cjs/plugins/window-object/index.js +1 -1
  14. package/dist/cjs/server/index.js +1 -1
  15. package/dist/esm/form/index.js +428 -0
  16. package/dist/esm/index.js +1138 -1291
  17. package/dist/esm/plugins/create-experience/index.js +424 -509
  18. package/dist/esm/plugins/dynamic-experiences/index.js +120 -204
  19. package/dist/esm/plugins/experience-browser-storage/index.js +32 -37
  20. package/dist/esm/plugins/history-browser-storage/index.js +23 -25
  21. package/dist/esm/plugins/responses-browser-storage/index.js +36 -39
  22. package/dist/esm/plugins/responses-indexeddb/index.js +77 -80
  23. package/dist/esm/plugins/single-page-app/index.js +31 -35
  24. package/dist/esm/plugins/web-components/index.js +18 -20
  25. package/dist/esm/plugins/window-object/index.js +9 -9
  26. package/dist/esm/server/index.js +95 -89
  27. package/dist/experience-instance-DZiAwXph.js +481 -0
  28. package/dist/experience-instance-Ddk4Jktn.cjs +1 -0
  29. package/dist/id-Bv44ilEo.cjs +1 -0
  30. package/dist/id-CRqy981z.js +4 -0
  31. package/dist/logger-6z_gb4rA.js +4 -0
  32. package/dist/logger-fbvQC40v.cjs +1 -0
  33. package/dist/object-C82v79xc.js +25 -0
  34. package/dist/object-CUJOjanb.cjs +1 -0
  35. package/dist/rules-logic-B7vJrWyO.js +231 -0
  36. package/dist/rules-logic-CXr4wXcG.cjs +1 -0
  37. package/dist/storage-6Xk0uAxB.js +103 -0
  38. package/dist/storage-B6lQtc4-.cjs +1 -0
  39. package/dist/supports-0XIfd4-R.js +85 -0
  40. package/dist/supports-Dsjg-82e.cjs +1 -0
  41. package/dist/types/entities/action/action.d.ts.map +1 -1
  42. package/dist/types/entities/experience/experience.d.ts +31 -48
  43. package/dist/types/entities/experience/experience.d.ts.map +1 -1
  44. package/dist/types/entities/experience-instance/experience-instance.d.ts +2 -2
  45. package/dist/types/entities/experience-instance/experience-instance.d.ts.map +1 -1
  46. package/dist/types/entities/feature/feature.d.ts.map +1 -1
  47. package/dist/types/entities/field/field.d.ts +12 -17
  48. package/dist/types/entities/field/field.d.ts.map +1 -1
  49. package/dist/types/entities/history/history.d.ts.map +1 -1
  50. package/dist/types/entities/response/response.d.ts +7 -9
  51. package/dist/types/entities/response/response.d.ts.map +1 -1
  52. package/dist/types/form/build-responses.d.ts +14 -0
  53. package/dist/types/form/build-responses.d.ts.map +1 -0
  54. package/dist/types/form/create-field-evaluator.d.ts +19 -0
  55. package/dist/types/form/create-field-evaluator.d.ts.map +1 -0
  56. package/dist/types/form/create-field-validation.d.ts +44 -0
  57. package/dist/types/form/create-field-validation.d.ts.map +1 -0
  58. package/dist/types/form/create-form.d.ts +66 -0
  59. package/dist/types/form/create-form.d.ts.map +1 -0
  60. package/dist/types/form/create-submit-pipeline.d.ts +58 -0
  61. package/dist/types/form/create-submit-pipeline.d.ts.map +1 -0
  62. package/dist/types/form/get-step-fields.d.ts +5 -0
  63. package/dist/types/form/get-step-fields.d.ts.map +1 -0
  64. package/dist/types/form/index.d.ts +10 -0
  65. package/dist/types/form/index.d.ts.map +1 -0
  66. package/dist/types/index.d.ts +1 -3
  67. package/dist/types/index.d.ts.map +1 -1
  68. package/dist/types/logic-engine.d.ts +2 -8
  69. package/dist/types/logic-engine.d.ts.map +1 -1
  70. package/dist/types/picked.d.ts +23 -42
  71. package/dist/types/picked.d.ts.map +1 -1
  72. package/dist/types/plugins/create-experience/create-experience.d.ts +37 -70
  73. package/dist/types/plugins/create-experience/create-experience.d.ts.map +1 -1
  74. package/dist/types/plugins/create-experience/index.d.ts +1 -1
  75. package/dist/types/plugins/create-experience/index.d.ts.map +1 -1
  76. package/dist/types/plugins/create-experience/plugin.d.ts.map +1 -1
  77. package/dist/types/plugins/dynamic-experiences/plugin.d.ts +5 -20
  78. package/dist/types/plugins/dynamic-experiences/plugin.d.ts.map +1 -1
  79. package/dist/types/plugins/dynamic-experiences/types.d.ts +0 -46
  80. package/dist/types/plugins/dynamic-experiences/types.d.ts.map +1 -1
  81. package/dist/types/plugins/experience-browser-storage/plugin.d.ts +2 -1
  82. package/dist/types/plugins/experience-browser-storage/plugin.d.ts.map +1 -1
  83. package/dist/types/plugins/history-browser-storage/plugin.d.ts +1 -0
  84. package/dist/types/plugins/history-browser-storage/plugin.d.ts.map +1 -1
  85. package/dist/types/plugins/responses-browser-storage/plugin.d.ts +2 -1
  86. package/dist/types/plugins/responses-browser-storage/plugin.d.ts.map +1 -1
  87. package/dist/types/plugins/responses-indexeddb/plugin.d.ts.map +1 -1
  88. package/dist/types/plugins/single-page-app/plugin.d.ts +1 -1
  89. package/dist/types/plugins/single-page-app/plugin.d.ts.map +1 -1
  90. package/dist/types/utils/dom.d.ts +0 -3
  91. package/dist/types/utils/dom.d.ts.map +1 -1
  92. package/dist/types/utils/events.d.ts +2 -2
  93. package/dist/types/utils/events.d.ts.map +1 -1
  94. package/dist/types/utils/global-obj.d.ts +0 -1
  95. package/dist/types/utils/global-obj.d.ts.map +1 -1
  96. package/dist/types/utils/indexed-db.d.ts +2 -1
  97. package/dist/types/utils/indexed-db.d.ts.map +1 -1
  98. package/dist/types/utils/logger.d.ts.map +1 -1
  99. package/dist/types/utils/node-tree/min-max-steps-to-leaf.d.ts.map +1 -1
  100. package/dist/types/utils/node-tree/min-max-steps-to-origin.d.ts.map +1 -1
  101. package/dist/types/utils/node-tree/next-reachable-step-nodes.d.ts +3 -3
  102. package/dist/types/utils/node-tree/next-reachable-step-nodes.d.ts.map +1 -1
  103. package/dist/types/utils/nodes.d.ts +2 -7
  104. package/dist/types/utils/nodes.d.ts.map +1 -1
  105. package/dist/types/utils/object.d.ts +0 -8
  106. package/dist/types/utils/object.d.ts.map +1 -1
  107. package/dist/types/utils/picked-config.d.ts +1 -1
  108. package/dist/types/utils/picked-config.d.ts.map +1 -1
  109. package/dist/types/utils/search-params.d.ts.map +1 -1
  110. package/dist/types/utils/storage.d.ts.map +1 -1
  111. package/package.json +18 -8
  112. package/dist/api-GlH9T8_1.js +0 -32
  113. package/dist/api-GvmToTw0.cjs +0 -1
  114. package/dist/experience-instance-CxiOyYPf.cjs +0 -1
  115. package/dist/experience-instance-DCknHRkX.js +0 -804
  116. package/dist/id-BKIWbSTy.cjs +0 -1
  117. package/dist/id-BW-g3y32.js +0 -6
  118. package/dist/logger-BsmHUUw1.cjs +0 -1
  119. package/dist/logger-C9a75KZn.js +0 -5
  120. package/dist/nodes-DQt4TfuO.js +0 -26
  121. package/dist/nodes-DsL8kMSX.cjs +0 -1
  122. package/dist/object-BbFTsGh3.cjs +0 -1
  123. package/dist/object-JwZ58NOH.js +0 -28
  124. package/dist/storage-Be5xWNPC.cjs +0 -1
  125. package/dist/storage-Co_LbKr_.js +0 -239
  126. package/dist/supports-8YT4QKI7.js +0 -95
  127. package/dist/supports-YvpQZxbh.cjs +0 -1
  128. package/dist/types/entities/condition/condition.d.ts +0 -17
  129. package/dist/types/entities/condition/condition.d.ts.map +0 -1
  130. package/dist/types/entities/project/project.d.ts +0 -9
  131. package/dist/types/entities/project/project.d.ts.map +0 -1
  132. package/dist/types/entities/step/step.d.ts +0 -20
  133. package/dist/types/entities/step/step.d.ts.map +0 -1
  134. package/dist/types/utils/key.d.ts +0 -12
  135. package/dist/types/utils/key.d.ts.map +0 -1
@@ -0,0 +1,428 @@
1
+ import { t as e } from "../../rules-logic-B7vJrWyO.js";
2
+ import { attach as t, combine as n, createEffect as r, createEvent as i, createStore as a, sample as o, split as s } from "effector";
3
+ //#region src/form/build-responses.ts
4
+ function c(e, t, n) {
5
+ let r = e[t];
6
+ if (r === void 0) {
7
+ e[t] = n;
8
+ return;
9
+ }
10
+ if (Array.isArray(r) && Array.isArray(n) && n.length > 0) {
11
+ typeof r[0] == "string" ? e[t] = [...r, ...n].map(String) : typeof r[0] == "number" ? e[t] = [...r, ...n].map(Number) : typeof r[0] == "boolean" ? e[t] = [...r, ...n].map((e) => !!e) : e[t] = n;
12
+ return;
13
+ }
14
+ e[t] = n;
15
+ }
16
+ function l(e, t) {
17
+ let n = Array.from(t.entries()), r = {};
18
+ return e.forEach((e) => {
19
+ let t = n.filter(([t]) => t === e.id);
20
+ t.length === 0 && (t = [[e.id, ""]]), t.forEach(([, t]) => {
21
+ if (t === "") {
22
+ c(r, e.id, null);
23
+ return;
24
+ }
25
+ switch (e.type) {
26
+ case "text":
27
+ case "object":
28
+ c(r, e.id, e.multiple ? [String(t)] : String(t));
29
+ break;
30
+ case "number":
31
+ c(r, e.id, e.multiple ? [Number(t)] : Number(t));
32
+ break;
33
+ case "boolean":
34
+ c(r, e.id, e.multiple ? [t === "true"] : t === "true");
35
+ break;
36
+ }
37
+ });
38
+ }), r;
39
+ }
40
+ //#endregion
41
+ //#region src/form/get-step-fields.ts
42
+ function u(e) {
43
+ return Array.isArray(e.options) && e.options.some((e) => "condition" in e);
44
+ }
45
+ function d(e) {
46
+ return e.some((e) => e.condition || u(e));
47
+ }
48
+ async function f(t, n, r) {
49
+ return n.length === 0 || !d(n) ? n : (await Promise.all(n.map(async (n) => {
50
+ if (!(!n.condition || await e(t, n.condition, r))) return null;
51
+ if (!Array.isArray(n.options) || !u(n)) return n;
52
+ let i = (await Promise.all(n.options.map(async (n) => n.condition ? await e(t, n.condition, r) ? n : null : n))).filter((e) => e !== null);
53
+ return i.length === n.options.length ? n : i.length === 0 ? null : {
54
+ ...n,
55
+ options: i
56
+ };
57
+ }))).filter((e) => e !== null);
58
+ }
59
+ //#endregion
60
+ //#region src/form/create-field-evaluator.ts
61
+ function p(e, n, i) {
62
+ let s = a([]), c = t({
63
+ source: {
64
+ allFields: e.fields.listStore,
65
+ fieldIds: n,
66
+ staged: i,
67
+ committed: e.responses.getAllStore
68
+ },
69
+ effect: r(async ({ allFields: t, fieldIds: n, staged: r, committed: i }) => await f(e, t.filter((e) => n.includes(e.id)), { responses: {
70
+ ...i,
71
+ ...r
72
+ } }))
73
+ });
74
+ return o({
75
+ clock: c.doneData,
76
+ target: s
77
+ }), c(), o({
78
+ clock: [
79
+ e.responses.listStore,
80
+ n,
81
+ e.fields.listStore,
82
+ i
83
+ ],
84
+ target: c
85
+ }), { fieldsStore: s };
86
+ }
87
+ //#endregion
88
+ //#region src/form/create-field-validation.ts
89
+ function m(e) {
90
+ return e === null || e === "" || Array.isArray(e) && e.length === 0;
91
+ }
92
+ function h(n, r, s) {
93
+ let c = i(), l = i(), u = a({});
94
+ o({
95
+ clock: l,
96
+ source: u,
97
+ fn: (e, { fieldId: t }) => ({
98
+ ...e,
99
+ [t]: !0
100
+ }),
101
+ target: u
102
+ });
103
+ let d = a({}), f = d.map((e) => Object.values(e).filter((e) => e !== void 0)), p = t({
104
+ source: {
105
+ fields: r,
106
+ staged: s,
107
+ committed: n.responses.getAllStore
108
+ },
109
+ effect: async ({ fields: t, staged: r, committed: i }, { fieldId: a, value: o, checkRequired: s }) => {
110
+ let c = t.find((e) => e.id === a);
111
+ if (!c) return {
112
+ fieldId: a,
113
+ error: null
114
+ };
115
+ if (c.validation && Object.keys(c.validation).length > 0) {
116
+ let t = {
117
+ ...i,
118
+ ...r
119
+ }, s = await e(n, c.validation, {
120
+ responses: t,
121
+ $input: o
122
+ });
123
+ if (typeof s == "string") return {
124
+ fieldId: a,
125
+ error: {
126
+ fieldId: a,
127
+ userMessage: s,
128
+ systemMessage: s,
129
+ value: o
130
+ }
131
+ };
132
+ if (s === !1) return {
133
+ fieldId: a,
134
+ error: {
135
+ fieldId: a,
136
+ userMessage: "This field is invalid",
137
+ systemMessage: "Field validation rule returned false.",
138
+ value: o
139
+ }
140
+ };
141
+ }
142
+ return s && c.required && m(o) ? {
143
+ fieldId: a,
144
+ error: {
145
+ fieldId: a,
146
+ userMessage: "This field is required",
147
+ systemMessage: "Field is required.",
148
+ value: o
149
+ }
150
+ } : {
151
+ fieldId: a,
152
+ error: null
153
+ };
154
+ }
155
+ });
156
+ return o({
157
+ clock: c,
158
+ source: u,
159
+ filter: (e, { fieldId: t }) => e[t] === !0,
160
+ fn: (e, { fieldId: t, value: n }) => ({
161
+ fieldId: t,
162
+ value: n,
163
+ checkRequired: !1
164
+ }),
165
+ target: p
166
+ }), o({
167
+ clock: l,
168
+ fn: ({ fieldId: e, value: t }) => ({
169
+ fieldId: e,
170
+ value: t,
171
+ checkRequired: !0
172
+ }),
173
+ target: p
174
+ }), s.on(c, (e, { fieldId: t, value: n }) => ({
175
+ ...e,
176
+ [t]: n
177
+ })), s.on(l, (e, { fieldId: t, value: n }) => ({
178
+ ...e,
179
+ [t]: n
180
+ })), d.on(p.doneData, (e, { fieldId: t, error: n }) => {
181
+ if (n === null) {
182
+ let n = { ...e };
183
+ return delete n[t], n;
184
+ }
185
+ return {
186
+ ...e,
187
+ [t]: n
188
+ };
189
+ }), {
190
+ fieldChangeEvent: c,
191
+ fieldBlurEvent: l,
192
+ touchedStore: u,
193
+ fieldErrorsStore: d,
194
+ formErrorsStore: f,
195
+ stagedValuesStore: s
196
+ };
197
+ }
198
+ //#endregion
199
+ //#region src/form/create-submit-pipeline.ts
200
+ function g(e) {
201
+ let t = [];
202
+ return {
203
+ executeFx: r(async (...n) => await e(t, ...n)),
204
+ register: (e) => (t.push(e), () => {
205
+ t = t.filter((t) => t !== e);
206
+ })
207
+ };
208
+ }
209
+ function _({ client: e, experienceInstance: n, formId: c, title: u, stepStore: d, fieldsStore: f, goToNextStep: p }) {
210
+ let m = i(), h = i(), _ = i(), v = i(), y = i(), b = a(!1), x = a(!1);
211
+ x.on(v, () => !0).on(m, () => !1);
212
+ let S = m.map(() => void 0), C = g(async (e, t) => {
213
+ await Promise.all(e.map((e) => Promise.resolve(e(t))));
214
+ }), w = g(async (e, t) => {
215
+ await Promise.all(e.map((e) => Promise.resolve(e(t))));
216
+ }), T = g(async (e, t) => {
217
+ let n = t;
218
+ for (let t of e) {
219
+ let e = await Promise.resolve(t(n));
220
+ e !== void 0 && (n = e);
221
+ }
222
+ return n;
223
+ }), E = r(async (t) => ({
224
+ data: t,
225
+ errors: (await e.responses.commit(t)).errors
226
+ })), D = t({
227
+ source: {
228
+ step: d,
229
+ title: u
230
+ },
231
+ mapParams: (e, t) => ({
232
+ step: t.step,
233
+ title: t.title,
234
+ data: e.data
235
+ }),
236
+ effect: r(async ({ step: t, title: r, data: i }) => (e.eventBus({
237
+ type: "form_submit_success",
238
+ form: {
239
+ id: c,
240
+ title: r
241
+ },
242
+ experience: n,
243
+ step: t ?? void 0
244
+ }), i))
245
+ }), O = t({
246
+ source: {
247
+ step: d,
248
+ title: u
249
+ },
250
+ mapParams: (e, t) => ({
251
+ step: t.step,
252
+ title: t.title,
253
+ errors: e.errors
254
+ }),
255
+ effect: r(async ({ step: t, title: r, errors: i }) => (e.eventBus({
256
+ type: "form_submit_error",
257
+ form: {
258
+ id: c,
259
+ title: r
260
+ },
261
+ exception: { reason: i },
262
+ experience: n,
263
+ step: t ?? void 0
264
+ }), i.forEach((r) => {
265
+ e.eventBus({
266
+ type: "field_validation_error",
267
+ exception: { reason: [r] },
268
+ experience: n,
269
+ step: t ?? void 0
270
+ });
271
+ }), i))
272
+ });
273
+ return o({
274
+ clock: m,
275
+ fn: () => !0,
276
+ target: b
277
+ }), o({
278
+ clock: m,
279
+ source: {
280
+ step: d,
281
+ title: u
282
+ },
283
+ fn: ({ step: e, title: t }) => ({
284
+ formId: c,
285
+ title: t,
286
+ step: e
287
+ }),
288
+ target: r(({ formId: t, title: r, step: i }) => {
289
+ e.eventBus({
290
+ type: "form_submit",
291
+ form: {
292
+ id: t,
293
+ title: r
294
+ },
295
+ experience: n,
296
+ step: i ?? void 0
297
+ });
298
+ })
299
+ }), o({
300
+ clock: m,
301
+ source: { stepFields: f },
302
+ fn: ({ stepFields: e }, t) => (t.preventDefault(), l(e, new FormData(t.currentTarget))),
303
+ target: T.executeFx
304
+ }), o({
305
+ clock: T.executeFx.doneData,
306
+ target: E
307
+ }), s({
308
+ source: E.doneData,
309
+ match: { hasErrors: ({ errors: e }) => e.length > 0 },
310
+ cases: {
311
+ hasErrors: O,
312
+ __: D
313
+ }
314
+ }), o({
315
+ clock: D.doneData,
316
+ target: h
317
+ }), o({
318
+ clock: h,
319
+ fn: (e) => ({
320
+ data: e,
321
+ stopNavigation: v
322
+ }),
323
+ target: C.executeFx
324
+ }), o({
325
+ clock: C.executeFx.done,
326
+ target: y
327
+ }), o({
328
+ clock: y,
329
+ source: x,
330
+ filter: (e) => !e,
331
+ target: p
332
+ }), o({
333
+ clock: O.doneData,
334
+ target: _
335
+ }), o({
336
+ clock: _,
337
+ target: w.executeFx
338
+ }), o({
339
+ clock: [y, w.executeFx.done],
340
+ fn: () => !1,
341
+ target: b
342
+ }), {
343
+ submitEvent: m,
344
+ isFormSubmitting: b,
345
+ onSubmit: T.register,
346
+ onSuccess: C.register,
347
+ onError: w.register,
348
+ submitStarted: S,
349
+ validationErrorsReceived: _
350
+ };
351
+ }
352
+ //#endregion
353
+ //#region src/form/create-form.ts
354
+ function v(e) {
355
+ let t = e.currentTarget;
356
+ if (t instanceof HTMLInputElement) return t.type === "checkbox" ? t.checked : t.value;
357
+ if (t instanceof HTMLSelectElement || t instanceof HTMLTextAreaElement) return t.value;
358
+ }
359
+ function y(e, t, r, i) {
360
+ let { client: s, experienceInstance: c } = e, { currentStepStore: l, goToNextStep: u } = c, d = a({}), { fieldsStore: f } = p(s, i, d), { fieldChangeEvent: m, fieldBlurEvent: g, touchedStore: y, fieldErrorsStore: b, formErrorsStore: x } = h(s, f, d), S = n({
361
+ fields: f,
362
+ responses: s.responses.listStore,
363
+ staged: d,
364
+ fieldErrors: b,
365
+ touched: y
366
+ }, ({ fields: e, responses: t, staged: n, fieldErrors: r, touched: i }) => e.map((e) => {
367
+ let a = (t) => {
368
+ let n = v(t);
369
+ n !== void 0 && m({
370
+ fieldId: e.id,
371
+ value: n
372
+ });
373
+ }, o = (t) => {
374
+ let n = v(t);
375
+ n !== void 0 && g({
376
+ fieldId: e.id,
377
+ value: n
378
+ });
379
+ };
380
+ return {
381
+ ...e,
382
+ value: n[e.id] ?? t.find((t) => t.fieldId === e.id)?.value,
383
+ error: r[e.id],
384
+ touched: i[e.id] ?? !1,
385
+ onChange: a,
386
+ onBlur: o,
387
+ props: {
388
+ name: e.id,
389
+ id: e.id,
390
+ oninput: a,
391
+ onblur: o
392
+ }
393
+ };
394
+ })), { submitEvent: C, isFormSubmitting: w, onSubmit: T, onSuccess: E, onError: D, submitStarted: O, validationErrorsReceived: k } = _({
395
+ client: s,
396
+ experienceInstance: c,
397
+ formId: t,
398
+ title: r,
399
+ stepStore: l,
400
+ fieldsStore: f,
401
+ goToNextStep: u
402
+ });
403
+ return o({
404
+ clock: O,
405
+ fn: () => ({}),
406
+ target: y
407
+ }), o({
408
+ clock: O,
409
+ fn: () => ({}),
410
+ target: b
411
+ }), o({
412
+ clock: k,
413
+ fn: (e) => Object.fromEntries(e.map((e) => [e.fieldId, e])),
414
+ target: b
415
+ }), {
416
+ form: {
417
+ props: { onsubmit: C },
418
+ errors: x,
419
+ submitting: w,
420
+ onSubmit: T,
421
+ onSuccess: E,
422
+ onError: D
423
+ },
424
+ fields: S
425
+ };
426
+ }
427
+ //#endregion
428
+ export { l as buildResponsesFromFormData, p as createFieldEvaluator, h as createFieldValidation, y as createForm, _ as createSubmitPipeline, v as getEventValue, f as getStepFields };