@rippling/rippling-sdk 0.2.0-alpha.83 → 0.2.0-alpha.85

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 (314) hide show
  1. package/examples/manifest/custom-object-creation-workflow/custom-object-creation-workflow.ts +44 -26
  2. package/examples/manifest/dental-practice-management/dental-practice-management.ts +470 -142
  3. package/examples/manifest/dental-practice-management/functions/chair-schedule.ts +23 -13
  4. package/examples/manifest/dental-practice-management/functions/complete-visit.ts +55 -32
  5. package/examples/manifest/dental-practice-management/functions/operatory-list.ts +23 -13
  6. package/examples/manifest/dental-practice-management/functions/patient-list.ts +23 -13
  7. package/examples/manifest/dental-practice-management/functions/treatment-plan-list.ts +23 -13
  8. package/examples/manifest/existing-manifest-mutations/existing-manifest-mutations.ts +23 -68
  9. package/examples/manifest/field-service-dispatch/field-service-dispatch.ts +375 -102
  10. package/examples/manifest/grant-program-management/grant-program-management.ts +419 -125
  11. package/examples/manifest/gym-membership-management/functions/check-in-desk.ts +23 -13
  12. package/examples/manifest/gym-membership-management/functions/member-list.ts +23 -13
  13. package/examples/manifest/gym-membership-management/functions/today-schedule.ts +23 -13
  14. package/examples/manifest/gym-membership-management/functions/trainer-list.ts +23 -13
  15. package/examples/manifest/gym-membership-management/gym-membership-management.ts +442 -92
  16. package/examples/manifest/procurement-approval-hub/procurement-approval-hub.ts +408 -122
  17. package/examples/manifest/simple-todo-app/functions/mark-done.ts +12 -16
  18. package/examples/manifest/simple-todo-app/functions/todo-list.ts +23 -13
  19. package/examples/manifest/simple-todo-app/simple-todo-app.ts +109 -40
  20. package/examples/manifest/todo-app-without-object-list-view/functions/todo-page.ts +193 -166
  21. package/examples/manifest/todo-app-without-object-list-view/todo-app-without-object-list-view.ts +47 -24
  22. package/package.json +13 -7
  23. package/resources/custom-objects/custom-objects.d.mts +0 -7
  24. package/resources/custom-objects/custom-objects.d.mts.map +1 -1
  25. package/resources/custom-objects/custom-objects.d.ts +0 -7
  26. package/resources/custom-objects/custom-objects.d.ts.map +1 -1
  27. package/resources/custom-objects/custom-objects.js.map +1 -1
  28. package/resources/custom-objects/custom-objects.mjs.map +1 -1
  29. package/resources/custom-objects/fields.d.mts +14 -128
  30. package/resources/custom-objects/fields.d.mts.map +1 -1
  31. package/resources/custom-objects/fields.d.ts +14 -128
  32. package/resources/custom-objects/fields.d.ts.map +1 -1
  33. package/src/resources/custom-objects/custom-objects.ts +0 -8
  34. package/src/resources/custom-objects/fields.ts +13 -191
  35. package/src/tsconfig.json +1 -1
  36. package/src/version.ts +1 -1
  37. package/version.d.mts +1 -1
  38. package/version.d.ts +1 -1
  39. package/version.js +1 -1
  40. package/version.mjs +1 -1
  41. package/core/platform/custom-objects/category.d.mts +0 -125
  42. package/core/platform/custom-objects/category.d.mts.map +0 -1
  43. package/core/platform/custom-objects/category.d.ts +0 -125
  44. package/core/platform/custom-objects/category.d.ts.map +0 -1
  45. package/core/platform/custom-objects/category.js +0 -188
  46. package/core/platform/custom-objects/category.js.map +0 -1
  47. package/core/platform/custom-objects/category.mjs +0 -178
  48. package/core/platform/custom-objects/category.mjs.map +0 -1
  49. package/core/platform/custom-objects/definition.d.mts +0 -147
  50. package/core/platform/custom-objects/definition.d.mts.map +0 -1
  51. package/core/platform/custom-objects/definition.d.ts +0 -147
  52. package/core/platform/custom-objects/definition.d.ts.map +0 -1
  53. package/core/platform/custom-objects/definition.js +0 -200
  54. package/core/platform/custom-objects/definition.js.map +0 -1
  55. package/core/platform/custom-objects/definition.mjs +0 -190
  56. package/core/platform/custom-objects/definition.mjs.map +0 -1
  57. package/core/platform/custom-objects/fields.d.mts +0 -302
  58. package/core/platform/custom-objects/fields.d.mts.map +0 -1
  59. package/core/platform/custom-objects/fields.d.ts +0 -302
  60. package/core/platform/custom-objects/fields.d.ts.map +0 -1
  61. package/core/platform/custom-objects/fields.js +0 -369
  62. package/core/platform/custom-objects/fields.js.map +0 -1
  63. package/core/platform/custom-objects/fields.mjs +0 -347
  64. package/core/platform/custom-objects/fields.mjs.map +0 -1
  65. package/core/platform/custom-objects/function-runtime.d.mts +0 -42
  66. package/core/platform/custom-objects/function-runtime.d.mts.map +0 -1
  67. package/core/platform/custom-objects/function-runtime.d.ts +0 -42
  68. package/core/platform/custom-objects/function-runtime.d.ts.map +0 -1
  69. package/core/platform/custom-objects/function-runtime.js +0 -38
  70. package/core/platform/custom-objects/function-runtime.js.map +0 -1
  71. package/core/platform/custom-objects/function-runtime.mjs +0 -35
  72. package/core/platform/custom-objects/function-runtime.mjs.map +0 -1
  73. package/core/platform/custom-objects/lifecycle.d.mts +0 -83
  74. package/core/platform/custom-objects/lifecycle.d.mts.map +0 -1
  75. package/core/platform/custom-objects/lifecycle.d.ts +0 -83
  76. package/core/platform/custom-objects/lifecycle.d.ts.map +0 -1
  77. package/core/platform/custom-objects/lifecycle.js +0 -372
  78. package/core/platform/custom-objects/lifecycle.js.map +0 -1
  79. package/core/platform/custom-objects/lifecycle.mjs +0 -367
  80. package/core/platform/custom-objects/lifecycle.mjs.map +0 -1
  81. package/core/platform/custom-objects/manager.d.mts +0 -354
  82. package/core/platform/custom-objects/manager.d.mts.map +0 -1
  83. package/core/platform/custom-objects/manager.d.ts +0 -354
  84. package/core/platform/custom-objects/manager.d.ts.map +0 -1
  85. package/core/platform/custom-objects/manager.js +0 -646
  86. package/core/platform/custom-objects/manager.js.map +0 -1
  87. package/core/platform/custom-objects/manager.mjs +0 -637
  88. package/core/platform/custom-objects/manager.mjs.map +0 -1
  89. package/core/platform/custom-objects/provisioning.d.mts +0 -138
  90. package/core/platform/custom-objects/provisioning.d.mts.map +0 -1
  91. package/core/platform/custom-objects/provisioning.d.ts +0 -138
  92. package/core/platform/custom-objects/provisioning.d.ts.map +0 -1
  93. package/core/platform/custom-objects/provisioning.js +0 -455
  94. package/core/platform/custom-objects/provisioning.js.map +0 -1
  95. package/core/platform/custom-objects/provisioning.mjs +0 -447
  96. package/core/platform/custom-objects/provisioning.mjs.map +0 -1
  97. package/core/platform/custom-objects/rql.d.mts +0 -122
  98. package/core/platform/custom-objects/rql.d.mts.map +0 -1
  99. package/core/platform/custom-objects/rql.d.ts +0 -122
  100. package/core/platform/custom-objects/rql.d.ts.map +0 -1
  101. package/core/platform/custom-objects/rql.js +0 -225
  102. package/core/platform/custom-objects/rql.js.map +0 -1
  103. package/core/platform/custom-objects/rql.mjs +0 -222
  104. package/core/platform/custom-objects/rql.mjs.map +0 -1
  105. package/core/platform/custom-objects/schema-manager.d.mts +0 -203
  106. package/core/platform/custom-objects/schema-manager.d.mts.map +0 -1
  107. package/core/platform/custom-objects/schema-manager.d.ts +0 -203
  108. package/core/platform/custom-objects/schema-manager.d.ts.map +0 -1
  109. package/core/platform/custom-objects/schema-manager.js +0 -256
  110. package/core/platform/custom-objects/schema-manager.js.map +0 -1
  111. package/core/platform/custom-objects/schema-manager.mjs +0 -249
  112. package/core/platform/custom-objects/schema-manager.mjs.map +0 -1
  113. package/core/platform/custom-objects/typed-rql.d.mts +0 -157
  114. package/core/platform/custom-objects/typed-rql.d.mts.map +0 -1
  115. package/core/platform/custom-objects/typed-rql.d.ts +0 -157
  116. package/core/platform/custom-objects/typed-rql.d.ts.map +0 -1
  117. package/core/platform/custom-objects/typed-rql.js +0 -583
  118. package/core/platform/custom-objects/typed-rql.js.map +0 -1
  119. package/core/platform/custom-objects/typed-rql.mjs +0 -580
  120. package/core/platform/custom-objects/typed-rql.mjs.map +0 -1
  121. package/core/platform/custom-objects/types.d.mts +0 -549
  122. package/core/platform/custom-objects/types.d.mts.map +0 -1
  123. package/core/platform/custom-objects/types.d.ts +0 -549
  124. package/core/platform/custom-objects/types.d.ts.map +0 -1
  125. package/core/platform/custom-objects/types.js +0 -20
  126. package/core/platform/custom-objects/types.js.map +0 -1
  127. package/core/platform/custom-objects/types.mjs +0 -17
  128. package/core/platform/custom-objects/types.mjs.map +0 -1
  129. package/core/platform/custom-objects/validation.d.mts +0 -97
  130. package/core/platform/custom-objects/validation.d.mts.map +0 -1
  131. package/core/platform/custom-objects/validation.d.ts +0 -97
  132. package/core/platform/custom-objects/validation.d.ts.map +0 -1
  133. package/core/platform/custom-objects/validation.js +0 -477
  134. package/core/platform/custom-objects/validation.js.map +0 -1
  135. package/core/platform/custom-objects/validation.mjs +0 -465
  136. package/core/platform/custom-objects/validation.mjs.map +0 -1
  137. package/core/platform/custom-objects.d.mts +0 -67
  138. package/core/platform/custom-objects.d.mts.map +0 -1
  139. package/core/platform/custom-objects.d.ts +0 -67
  140. package/core/platform/custom-objects.d.ts.map +0 -1
  141. package/core/platform/custom-objects.js +0 -118
  142. package/core/platform/custom-objects.js.map +0 -1
  143. package/core/platform/custom-objects.mjs +0 -45
  144. package/core/platform/custom-objects.mjs.map +0 -1
  145. package/core/platform/manifest/custom-objects/action.d.mts +0 -58
  146. package/core/platform/manifest/custom-objects/action.d.mts.map +0 -1
  147. package/core/platform/manifest/custom-objects/action.d.ts +0 -58
  148. package/core/platform/manifest/custom-objects/action.d.ts.map +0 -1
  149. package/core/platform/manifest/custom-objects/action.js +0 -44
  150. package/core/platform/manifest/custom-objects/action.js.map +0 -1
  151. package/core/platform/manifest/custom-objects/action.mjs +0 -40
  152. package/core/platform/manifest/custom-objects/action.mjs.map +0 -1
  153. package/core/platform/manifest/custom-objects/conditions.d.mts +0 -240
  154. package/core/platform/manifest/custom-objects/conditions.d.mts.map +0 -1
  155. package/core/platform/manifest/custom-objects/conditions.d.ts +0 -240
  156. package/core/platform/manifest/custom-objects/conditions.d.ts.map +0 -1
  157. package/core/platform/manifest/custom-objects/conditions.js +0 -326
  158. package/core/platform/manifest/custom-objects/conditions.js.map +0 -1
  159. package/core/platform/manifest/custom-objects/conditions.mjs +0 -321
  160. package/core/platform/manifest/custom-objects/conditions.mjs.map +0 -1
  161. package/core/platform/manifest/custom-objects/existing.d.mts +0 -87
  162. package/core/platform/manifest/custom-objects/existing.d.mts.map +0 -1
  163. package/core/platform/manifest/custom-objects/existing.d.ts +0 -87
  164. package/core/platform/manifest/custom-objects/existing.d.ts.map +0 -1
  165. package/core/platform/manifest/custom-objects/existing.js +0 -113
  166. package/core/platform/manifest/custom-objects/existing.js.map +0 -1
  167. package/core/platform/manifest/custom-objects/existing.mjs +0 -109
  168. package/core/platform/manifest/custom-objects/existing.mjs.map +0 -1
  169. package/core/platform/manifest/custom-objects/field-resolution.d.mts +0 -48
  170. package/core/platform/manifest/custom-objects/field-resolution.d.mts.map +0 -1
  171. package/core/platform/manifest/custom-objects/field-resolution.d.ts +0 -48
  172. package/core/platform/manifest/custom-objects/field-resolution.d.ts.map +0 -1
  173. package/core/platform/manifest/custom-objects/field-resolution.js +0 -61
  174. package/core/platform/manifest/custom-objects/field-resolution.js.map +0 -1
  175. package/core/platform/manifest/custom-objects/field-resolution.mjs +0 -58
  176. package/core/platform/manifest/custom-objects/field-resolution.mjs.map +0 -1
  177. package/core/platform/manifest/custom-objects/function-file.d.mts +0 -87
  178. package/core/platform/manifest/custom-objects/function-file.d.mts.map +0 -1
  179. package/core/platform/manifest/custom-objects/function-file.d.ts +0 -87
  180. package/core/platform/manifest/custom-objects/function-file.d.ts.map +0 -1
  181. package/core/platform/manifest/custom-objects/function-file.js +0 -76
  182. package/core/platform/manifest/custom-objects/function-file.js.map +0 -1
  183. package/core/platform/manifest/custom-objects/function-file.mjs +0 -69
  184. package/core/platform/manifest/custom-objects/function-file.mjs.map +0 -1
  185. package/core/platform/manifest/custom-objects/list-view.d.mts +0 -65
  186. package/core/platform/manifest/custom-objects/list-view.d.mts.map +0 -1
  187. package/core/platform/manifest/custom-objects/list-view.d.ts +0 -65
  188. package/core/platform/manifest/custom-objects/list-view.d.ts.map +0 -1
  189. package/core/platform/manifest/custom-objects/list-view.js +0 -33
  190. package/core/platform/manifest/custom-objects/list-view.js.map +0 -1
  191. package/core/platform/manifest/custom-objects/list-view.mjs +0 -30
  192. package/core/platform/manifest/custom-objects/list-view.mjs.map +0 -1
  193. package/core/platform/manifest/custom-objects/object-list-page.d.mts +0 -43
  194. package/core/platform/manifest/custom-objects/object-list-page.d.mts.map +0 -1
  195. package/core/platform/manifest/custom-objects/object-list-page.d.ts +0 -43
  196. package/core/platform/manifest/custom-objects/object-list-page.d.ts.map +0 -1
  197. package/core/platform/manifest/custom-objects/object-list-page.js +0 -54
  198. package/core/platform/manifest/custom-objects/object-list-page.js.map +0 -1
  199. package/core/platform/manifest/custom-objects/object-list-page.mjs +0 -50
  200. package/core/platform/manifest/custom-objects/object-list-page.mjs.map +0 -1
  201. package/core/platform/manifest/custom-objects/page-layout.d.mts +0 -142
  202. package/core/platform/manifest/custom-objects/page-layout.d.mts.map +0 -1
  203. package/core/platform/manifest/custom-objects/page-layout.d.ts +0 -142
  204. package/core/platform/manifest/custom-objects/page-layout.d.ts.map +0 -1
  205. package/core/platform/manifest/custom-objects/page-layout.js +0 -184
  206. package/core/platform/manifest/custom-objects/page-layout.js.map +0 -1
  207. package/core/platform/manifest/custom-objects/page-layout.mjs +0 -180
  208. package/core/platform/manifest/custom-objects/page-layout.mjs.map +0 -1
  209. package/core/platform/manifest/custom-objects/register.d.mts +0 -87
  210. package/core/platform/manifest/custom-objects/register.d.mts.map +0 -1
  211. package/core/platform/manifest/custom-objects/register.d.ts +0 -87
  212. package/core/platform/manifest/custom-objects/register.d.ts.map +0 -1
  213. package/core/platform/manifest/custom-objects/register.js +0 -395
  214. package/core/platform/manifest/custom-objects/register.js.map +0 -1
  215. package/core/platform/manifest/custom-objects/register.mjs +0 -391
  216. package/core/platform/manifest/custom-objects/register.mjs.map +0 -1
  217. package/core/platform/manifest/custom-objects/rule.d.mts +0 -113
  218. package/core/platform/manifest/custom-objects/rule.d.mts.map +0 -1
  219. package/core/platform/manifest/custom-objects/rule.d.ts +0 -113
  220. package/core/platform/manifest/custom-objects/rule.d.ts.map +0 -1
  221. package/core/platform/manifest/custom-objects/rule.js +0 -49
  222. package/core/platform/manifest/custom-objects/rule.js.map +0 -1
  223. package/core/platform/manifest/custom-objects/rule.mjs +0 -45
  224. package/core/platform/manifest/custom-objects/rule.mjs.map +0 -1
  225. package/core/platform/manifest/custom-objects/sdui-page.d.mts +0 -214
  226. package/core/platform/manifest/custom-objects/sdui-page.d.mts.map +0 -1
  227. package/core/platform/manifest/custom-objects/sdui-page.d.ts +0 -214
  228. package/core/platform/manifest/custom-objects/sdui-page.d.ts.map +0 -1
  229. package/core/platform/manifest/custom-objects/sdui-page.js +0 -194
  230. package/core/platform/manifest/custom-objects/sdui-page.js.map +0 -1
  231. package/core/platform/manifest/custom-objects/sdui-page.mjs +0 -182
  232. package/core/platform/manifest/custom-objects/sdui-page.mjs.map +0 -1
  233. package/core/platform/manifest/custom-objects/typed-condition.d.mts +0 -28
  234. package/core/platform/manifest/custom-objects/typed-condition.d.mts.map +0 -1
  235. package/core/platform/manifest/custom-objects/typed-condition.d.ts +0 -28
  236. package/core/platform/manifest/custom-objects/typed-condition.d.ts.map +0 -1
  237. package/core/platform/manifest/custom-objects/typed-condition.js +0 -434
  238. package/core/platform/manifest/custom-objects/typed-condition.js.map +0 -1
  239. package/core/platform/manifest/custom-objects/typed-condition.mjs +0 -431
  240. package/core/platform/manifest/custom-objects/typed-condition.mjs.map +0 -1
  241. package/core/platform/manifest/custom-objects/types.d.mts +0 -29
  242. package/core/platform/manifest/custom-objects/types.d.mts.map +0 -1
  243. package/core/platform/manifest/custom-objects/types.d.ts +0 -29
  244. package/core/platform/manifest/custom-objects/types.d.ts.map +0 -1
  245. package/core/platform/manifest/custom-objects/types.js +0 -3
  246. package/core/platform/manifest/custom-objects/types.js.map +0 -1
  247. package/core/platform/manifest/custom-objects/types.mjs +0 -2
  248. package/core/platform/manifest/custom-objects/types.mjs.map +0 -1
  249. package/core/platform/manifest/custom-objects/validation.d.mts +0 -44
  250. package/core/platform/manifest/custom-objects/validation.d.mts.map +0 -1
  251. package/core/platform/manifest/custom-objects/validation.d.ts +0 -44
  252. package/core/platform/manifest/custom-objects/validation.d.ts.map +0 -1
  253. package/core/platform/manifest/custom-objects/validation.js +0 -30
  254. package/core/platform/manifest/custom-objects/validation.js.map +0 -1
  255. package/core/platform/manifest/custom-objects/validation.mjs +0 -27
  256. package/core/platform/manifest/custom-objects/validation.mjs.map +0 -1
  257. package/core/platform/manifest/custom-objects/workflow.d.mts +0 -47
  258. package/core/platform/manifest/custom-objects/workflow.d.mts.map +0 -1
  259. package/core/platform/manifest/custom-objects/workflow.d.ts +0 -47
  260. package/core/platform/manifest/custom-objects/workflow.d.ts.map +0 -1
  261. package/core/platform/manifest/custom-objects/workflow.js +0 -38
  262. package/core/platform/manifest/custom-objects/workflow.js.map +0 -1
  263. package/core/platform/manifest/custom-objects/workflow.mjs +0 -34
  264. package/core/platform/manifest/custom-objects/workflow.mjs.map +0 -1
  265. package/core/platform/manifest/custom-objects.d.mts +0 -85
  266. package/core/platform/manifest/custom-objects.d.mts.map +0 -1
  267. package/core/platform/manifest/custom-objects.d.ts +0 -85
  268. package/core/platform/manifest/custom-objects.d.ts.map +0 -1
  269. package/core/platform/manifest/custom-objects.js +0 -84
  270. package/core/platform/manifest/custom-objects.js.map +0 -1
  271. package/core/platform/manifest/custom-objects.mjs +0 -55
  272. package/core/platform/manifest/custom-objects.mjs.map +0 -1
  273. package/examples/manifest/custom-object-creation-workflow/functions/intake-request-created.ts +0 -20
  274. package/examples/manifest/custom-object-creation-workflow/schema.ts +0 -29
  275. package/examples/manifest/dental-practice-management/schema.ts +0 -298
  276. package/examples/manifest/field-service-dispatch/schema.ts +0 -248
  277. package/examples/manifest/grant-program-management/schema.ts +0 -269
  278. package/examples/manifest/gym-membership-management/schema.ts +0 -266
  279. package/examples/manifest/procurement-approval-hub/functions/route-purchase-request.ts +0 -20
  280. package/examples/manifest/procurement-approval-hub/schema.ts +0 -256
  281. package/examples/manifest/simple-todo-app/schema.ts +0 -60
  282. package/examples/manifest/todo-app-without-object-list-view/schema.ts +0 -28
  283. package/src/core/platform/README.md +0 -20
  284. package/src/core/platform/custom-objects/category.ts +0 -294
  285. package/src/core/platform/custom-objects/definition.ts +0 -373
  286. package/src/core/platform/custom-objects/fields.ts +0 -653
  287. package/src/core/platform/custom-objects/function-runtime.ts +0 -76
  288. package/src/core/platform/custom-objects/lifecycle.ts +0 -557
  289. package/src/core/platform/custom-objects/manager.ts +0 -959
  290. package/src/core/platform/custom-objects/provisioning.ts +0 -672
  291. package/src/core/platform/custom-objects/rql.ts +0 -375
  292. package/src/core/platform/custom-objects/schema-manager.ts +0 -351
  293. package/src/core/platform/custom-objects/typed-rql.ts +0 -1273
  294. package/src/core/platform/custom-objects/types.ts +0 -753
  295. package/src/core/platform/custom-objects/validation.ts +0 -573
  296. package/src/core/platform/custom-objects.ts +0 -269
  297. package/src/core/platform/manifest/README.md +0 -26
  298. package/src/core/platform/manifest/custom-objects/action.ts +0 -87
  299. package/src/core/platform/manifest/custom-objects/conditions.ts +0 -762
  300. package/src/core/platform/manifest/custom-objects/existing.ts +0 -221
  301. package/src/core/platform/manifest/custom-objects/field-resolution.ts +0 -116
  302. package/src/core/platform/manifest/custom-objects/function-file.ts +0 -149
  303. package/src/core/platform/manifest/custom-objects/list-view.ts +0 -95
  304. package/src/core/platform/manifest/custom-objects/object-list-page.ts +0 -87
  305. package/src/core/platform/manifest/custom-objects/page-layout.ts +0 -380
  306. package/src/core/platform/manifest/custom-objects/register.ts +0 -555
  307. package/src/core/platform/manifest/custom-objects/rule.ts +0 -192
  308. package/src/core/platform/manifest/custom-objects/sdui-page.ts +0 -515
  309. package/src/core/platform/manifest/custom-objects/typed-condition.ts +0 -617
  310. package/src/core/platform/manifest/custom-objects/types.ts +0 -92
  311. package/src/core/platform/manifest/custom-objects/validation.ts +0 -70
  312. package/src/core/platform/manifest/custom-objects/workflow.ts +0 -71
  313. package/src/core/platform/manifest/custom-objects.ts +0 -203
  314. package/src/pebble-sdui-web-custom-apps-shim.d.ts +0 -3
@@ -14,25 +14,34 @@
14
14
  * (With npx, use `2>/dev/null` before `>` if npm prints warnings into the file.)
15
15
  */
16
16
 
17
+ import * as fs from 'node:fs';
17
18
  import * as path from 'node:path';
18
- import { toCustomCategoryApiName } from '@rippling/rippling-sdk/core/platform/custom-objects';
19
19
  import {
20
- createTypedRuleHelpers,
21
- defineSduiPageFromFunctionFile,
22
- defineTypedListView,
23
- defineTypedPageLayout,
24
- defineTypedValidation,
25
- defineTypedRule,
26
- registerManifestCustomObjects,
27
- } from '@rippling/rippling-sdk/core/platform/manifest/custom-objects';
28
- import { App, Category, ManifestBuilder, SduiPage, SummaryField } from '@rippling/rippling-sdk/lib/manifest';
29
- import {
30
- enrollmentDefinition,
31
- GYM_CATEGORY,
32
- memberDefinition,
33
- sessionDefinition,
34
- trainerDefinition,
35
- } from './schema';
20
+ App,
21
+ Category,
22
+ CustomObject,
23
+ CustomObjectFieldSection,
24
+ CustomObjectPageLayout,
25
+ DatetimeField,
26
+ DateField,
27
+ EmailField,
28
+ FormulaField,
29
+ ListViewDef,
30
+ LongTextField,
31
+ LookupField,
32
+ ManifestBuilder,
33
+ ManifestFunction,
34
+ NumberField,
35
+ ParentChildField,
36
+ PhoneField,
37
+ RadioField,
38
+ Rule,
39
+ SelectField,
40
+ SduiPage,
41
+ SummaryField,
42
+ TextField,
43
+ Validation,
44
+ } from '@rippling/rippling-sdk/lib/manifest';
36
45
 
37
46
  const manifest = new ManifestBuilder({
38
47
  key: 'gym_membership_management',
@@ -42,138 +51,455 @@ const manifest = new ManifestBuilder({
42
51
  });
43
52
 
44
53
  const gymCategory = new Category(manifest, {
45
- apiName: toCustomCategoryApiName(GYM_CATEGORY),
54
+ apiName: 'gym__c',
46
55
  name: 'Gym',
47
56
  description: 'Memberships, staff, schedules, and attendance',
48
57
  });
49
58
 
50
- const [member, trainer, session, enrollment] = registerManifestCustomObjects(manifest, {
59
+ // ── Member ────────────────────────────────────────────────────────────────────
60
+ const memberObj = new CustomObject(manifest, {
61
+ apiName: 'gym_member__c',
62
+ name: 'Member',
63
+ pluralLabel: 'Members',
51
64
  category: gymCategory,
52
- definitions: [memberDefinition, trainerDefinition, sessionDefinition, enrollmentDefinition] as const,
65
+ description: 'Gym member profile, contact, and membership status',
66
+ icon: { emoji: '🏋️' },
67
+ });
68
+
69
+ const memberProfileSection = new CustomObjectFieldSection(memberObj, {
70
+ name: 'Profile',
71
+ sectionId: 'sec_gm_profile',
72
+ });
73
+
74
+ const memberMembershipSection = new CustomObjectFieldSection(memberObj, {
75
+ name: 'Membership',
76
+ sectionId: 'sec_gm_membership',
77
+ });
78
+
79
+ const memberFirstName = new TextField(memberObj, {
80
+ apiName: 'first_name__c',
81
+ displayName: 'First name',
82
+ description: 'First name field',
83
+ required: true,
84
+ maxLength: 80,
85
+ section: memberProfileSection,
86
+ });
87
+
88
+ const memberLastName = new TextField(memberObj, {
89
+ apiName: 'last_name__c',
90
+ displayName: 'Last name',
91
+ description: 'Last name field',
92
+ required: true,
93
+ maxLength: 80,
94
+ section: memberProfileSection,
95
+ });
96
+
97
+ const memberEmail = new EmailField(memberObj, {
98
+ apiName: 'email__c',
99
+ displayName: 'Email',
100
+ description: 'Email field',
101
+ unique: true,
102
+ section: memberProfileSection,
103
+ });
104
+
105
+ const memberPhone = new PhoneField(memberObj, {
106
+ apiName: 'phone__c',
107
+ displayName: 'Phone',
108
+ description: 'Phone field',
109
+ section: memberProfileSection,
110
+ });
111
+
112
+ const memberStatusField = new RadioField(memberObj, {
113
+ apiName: 'membership_status__c',
114
+ displayName: 'Membership status',
115
+ description: 'Membership status field',
116
+ options: ['Active', 'Frozen', 'Cancelled', 'Trial'],
117
+ required: true,
118
+ section: memberMembershipSection,
119
+ });
120
+
121
+ const memberJoinDate = new DateField(memberObj, {
122
+ apiName: 'join_date__c',
123
+ displayName: 'Join date',
124
+ description: 'Join date field',
125
+ section: memberMembershipSection,
126
+ });
127
+
128
+ const memberEmergencyField = new LongTextField(memberObj, {
129
+ apiName: 'emergency_contact__c',
130
+ displayName: 'Emergency contact',
131
+ maxLength: 2000,
132
+ description: 'Name and phone for emergencies',
133
+ section: memberMembershipSection,
134
+ });
135
+
136
+ const memberPreferredClassTypesField = new SelectField(memberObj, {
137
+ apiName: 'preferred_class_types__c',
138
+ displayName: 'Preferred class types',
139
+ description: 'One or more class types the member enjoys',
140
+ options: ['Yoga', 'Spin', 'HIIT', 'Strength', 'Pilates', 'Dance', 'Aquatics'],
141
+ section: memberMembershipSection,
142
+ });
143
+
144
+ // ── Trainer ─────────────────────────────────────────────────────────────────
145
+ const trainerObj = new CustomObject(manifest, {
146
+ apiName: 'gym_trainer__c',
147
+ name: 'Trainer',
148
+ pluralLabel: 'Trainers',
149
+ category: gymCategory,
150
+ description: 'Instructors and coaches who lead scheduled classes',
151
+ icon: { emoji: '🎯' },
152
+ });
153
+
154
+ const trainerSection = new CustomObjectFieldSection(trainerObj, {
155
+ name: 'Trainer',
156
+ sectionId: 'sec_tr_profile',
157
+ });
158
+
159
+ const trainerEmailField = new EmailField(trainerObj, {
160
+ apiName: 'email__c',
161
+ displayName: 'Email',
162
+ description: 'Email field',
163
+ section: trainerSection,
164
+ });
165
+
166
+ const trainerSpecialtyField = new RadioField(trainerObj, {
167
+ apiName: 'specialty__c',
168
+ displayName: 'Primary specialty',
169
+ description: 'Primary specialty field',
170
+ options: ['Yoga', 'Spin', 'HIIT', 'Strength', 'Pilates', 'Dance', 'Aquatics', 'General'],
171
+ section: trainerSection,
172
+ });
173
+
174
+ const trainerBioField = new LongTextField(trainerObj, {
175
+ apiName: 'bio__c',
176
+ displayName: 'Bio & certifications',
177
+ description: 'Bio & certifications field',
178
+ maxLength: 4000,
179
+ section: trainerSection,
180
+ });
181
+
182
+ const trainerLabelField = new FormulaField(trainerObj, {
183
+ apiName: 'trainer_label__c',
184
+ displayName: 'List label',
185
+ description: 'List label field',
186
+ fieldType: 'TEXT',
187
+ maxLength: 220,
188
+ formula: "CONCATENATE(name, ' · ', specialty__c)",
189
+ section: trainerSection,
190
+ });
191
+
192
+ // ── Class session ───────────────────────────────────────────────────────────
193
+ const sessionObj = new CustomObject(manifest, {
194
+ apiName: 'gym_class_session__c',
195
+ name: 'Class session',
196
+ pluralLabel: 'Class sessions',
197
+ category: gymCategory,
198
+ description: 'A scheduled class with assigned trainer, time, and capacity',
199
+ icon: { emoji: '📅' },
200
+ });
201
+
202
+ const sessionScheduleSection = new CustomObjectFieldSection(sessionObj, {
203
+ name: 'Schedule',
204
+ sectionId: 'sec_cs_schedule',
205
+ });
206
+
207
+ const sessionTrainerSection = new CustomObjectFieldSection(sessionObj, {
208
+ name: 'Class & room',
209
+ sectionId: 'sec_cs_class',
210
+ });
211
+
212
+ const sessionTrainerRef = new LookupField(sessionObj, {
213
+ apiName: 'trainer_ref__c',
214
+ displayName: 'Trainer',
215
+ target: trainerObj,
216
+ relatedDataLabel: 'Class sessions',
217
+ required: true,
218
+ description: 'Instructor leading this session',
219
+ section: sessionScheduleSection,
220
+ });
221
+
222
+ const sessionStartField = new DatetimeField(sessionObj, {
223
+ apiName: 'start_time__c',
224
+ displayName: 'Start',
225
+ required: true,
226
+ description: 'Session start (local)',
227
+ section: sessionScheduleSection,
228
+ });
229
+
230
+ const sessionEndField = new DatetimeField(sessionObj, {
231
+ apiName: 'end_time__c',
232
+ displayName: 'End',
233
+ required: true,
234
+ description: 'Session end (local)',
235
+ section: sessionScheduleSection,
236
+ });
237
+
238
+ const sessionClassTypeField = new RadioField(sessionObj, {
239
+ apiName: 'class_type__c',
240
+ displayName: 'Class type',
241
+ description: 'Class type field',
242
+ options: [
243
+ 'Yoga',
244
+ 'Spin',
245
+ 'HIIT',
246
+ 'Strength',
247
+ 'Pilates',
248
+ 'Dance',
249
+ 'Aquatics',
250
+ 'Recovery / stretch',
251
+ 'Other',
252
+ ],
253
+ required: true,
254
+ section: sessionTrainerSection,
255
+ });
256
+
257
+ const sessionRoomField = new TextField(sessionObj, {
258
+ apiName: 'room_name__c',
259
+ displayName: 'Studio / room',
260
+ maxLength: 80,
261
+ description: 'E.g. Studio A, Pool lane 2',
262
+ section: sessionTrainerSection,
263
+ });
264
+
265
+ const sessionCapacityField = new NumberField(sessionObj, {
266
+ apiName: 'capacity__c',
267
+ displayName: 'Capacity',
268
+ decimalPlaces: 0,
269
+ description: 'Maximum attendees for this session',
270
+ section: sessionTrainerSection,
271
+ });
272
+
273
+ const sessionNotesField = new LongTextField(sessionObj, {
274
+ apiName: 'session_notes__c',
275
+ displayName: 'Notes',
276
+ description: 'Notes field',
277
+ maxLength: 4000,
278
+ section: sessionTrainerSection,
279
+ });
280
+
281
+ const sessionDayField = new FormulaField(sessionObj, {
282
+ apiName: 'session_date__c',
283
+ displayName: 'Session date',
284
+ fieldType: 'DATE',
285
+ formula: "DATETRUNC('DAY', start_time__c)",
286
+ description: 'Calendar day for filtering “today” views',
287
+ section: sessionScheduleSection,
288
+ });
289
+
290
+ const sessionBoardLabel = new FormulaField(sessionObj, {
291
+ apiName: 'session_board_label__c',
292
+ displayName: 'Board label',
293
+ description: 'Board label field',
294
+ fieldType: 'TEXT',
295
+ maxLength: 260,
296
+ formula: "CONCATENATE(class_type__c, ' · ', room_name__c)",
297
+ section: sessionScheduleSection,
298
+ });
299
+
300
+ // ── Enrollment (child of session) ───────────────────────────────────────────
301
+ const enrollmentObj = new CustomObject(manifest, {
302
+ apiName: 'gym_class_enrollment__c',
303
+ name: 'Class enrollment',
304
+ pluralLabel: 'Class enrollments',
305
+ category: gymCategory,
306
+ description: 'Member registration for a session with attendance and check-in',
307
+ icon: { emoji: '✅' },
308
+ });
309
+
310
+ const enrollmentSessionSection = new CustomObjectFieldSection(enrollmentObj, {
311
+ name: 'Session & member',
312
+ sectionId: 'sec_ce_link',
313
+ });
314
+
315
+ const enrollmentAttendanceSection = new CustomObjectFieldSection(enrollmentObj, {
316
+ name: 'Attendance',
317
+ sectionId: 'sec_ce_att',
318
+ });
319
+
320
+ const enrollmentSessionRef = new ParentChildField(enrollmentObj, {
321
+ apiName: 'class_session_ref__c',
322
+ displayName: 'Class session',
323
+ target: sessionObj,
324
+ relatedDataLabel: 'Enrollments',
325
+ parentChildType: 'PRIMARY',
326
+ enableParentOwnerInheritance: false,
327
+ description: 'Which scheduled class this row belongs to',
328
+ section: enrollmentSessionSection,
329
+ });
330
+
331
+ const enrollmentMemberRef = new LookupField(enrollmentObj, {
332
+ apiName: 'member_ref__c',
333
+ displayName: 'Member',
334
+ description: 'Member field',
335
+ target: memberObj,
336
+ relatedDataLabel: 'Class enrollments',
337
+ required: true,
338
+ section: enrollmentSessionSection,
339
+ });
340
+
341
+ const enrollmentAttendanceField = new RadioField(enrollmentObj, {
342
+ apiName: 'attendance_status__c',
343
+ displayName: 'Attendance',
344
+ options: ['Registered', 'Checked in', 'Late', 'No-show', 'Cancelled'],
345
+ required: true,
346
+ description: 'Front desk: set to Checked in when the member arrives',
347
+ section: enrollmentAttendanceSection,
348
+ });
349
+
350
+ const enrollmentCheckedInAt = new DatetimeField(enrollmentObj, {
351
+ apiName: 'checked_in_at__c',
352
+ displayName: 'Checked in at',
353
+ description: 'Timestamp when staff recorded arrival (optional)',
354
+ section: enrollmentAttendanceSection,
355
+ });
356
+
357
+ const enrollmentNotesField = new LongTextField(enrollmentObj, {
358
+ apiName: 'enrollment_notes__c',
359
+ displayName: 'Notes',
360
+ description: 'Notes field',
361
+ maxLength: 2000,
362
+ section: enrollmentAttendanceSection,
363
+ });
364
+
365
+ const enrollmentRosterTitle = new FormulaField(enrollmentObj, {
366
+ apiName: 'roster_row_label__c',
367
+ displayName: 'Roster row label',
368
+ description: 'Roster row label field',
369
+ fieldType: 'TEXT',
370
+ maxLength: 160,
371
+ formula: "CONCATENATE(attendance_status__c, ' · Enrollment')",
372
+ section: enrollmentAttendanceSection,
53
373
  });
54
374
 
55
375
  // ── Rollups ─────────────────────────────────────────────────────────────────
56
- const enrollmentCountOnSession = new SummaryField(session.object, {
376
+ const enrollmentCountOnSession = new SummaryField(sessionObj, {
57
377
  apiName: 'enrollment_count__c',
58
378
  displayName: 'Enrolled (count)',
59
- aggregates: enrollment.fields.member_ref,
379
+ aggregates: enrollmentMemberRef,
60
380
  using: 'COUNT',
61
- lookup: enrollment.fields.class_session_ref,
381
+ lookup: enrollmentSessionRef,
62
382
  description: 'Rows on this session’s roster',
63
- section: session.sections.schedule,
383
+ section: sessionScheduleSection,
64
384
  });
65
385
 
66
386
  // Note: Rollups from session → trainer would require a parent–child edge from
67
387
  // session to trainer; trainer is linked via LookupField instead, so session
68
388
  // counts per trainer are surfaced via session list views and SDUI, not a rollup.
69
389
 
70
- // ── Validations & defaults ──────────────────────────────────────────────────
71
- defineTypedValidation(session, {
390
+ // ── Validations & defaults ────────────────────────────────────────────────────
391
+ new Validation(sessionObj, {
72
392
  ruleId: 'gym_session_end_after_start',
73
393
  displayName: 'End time must be after start',
74
- whenInvalid: (c) => c.lte(c.fields.end_time, c.fields.start_time),
394
+ rqlFormula: '(end_time__c <= start_time__c)',
75
395
  errorMessage: 'End time must be after the start time.',
76
396
  ruleDescription: 'Prevents zero-length or inverted intervals',
77
397
  state: 'ACTIVE',
78
398
  level: 'FIELD',
79
- field: 'end_time',
399
+ fieldRef: sessionEndField,
80
400
  });
81
401
 
82
- const enrollmentRules = createTypedRuleHelpers(enrollment);
83
- defineTypedRule(enrollment, {
402
+ new Rule(enrollmentObj, {
84
403
  flowId: 'gym_default_enrollment_status',
85
404
  flowName: 'Default attendance to Registered',
86
405
  triggerType: 'CREATE',
87
406
  description: 'New roster rows start as Registered unless changed',
88
- actions: [enrollmentRules.setField('attendance_status').toValue('Registered')],
407
+ actions: [{ targetField: enrollmentAttendanceField, fixedValue: 'Registered' }],
89
408
  });
90
409
 
91
- // ── List views ──────────────────────────────────────────────────────────────
92
- defineTypedListView(member, {
410
+ // ── List views ───────────────────────────────────────────────────────────────
411
+ new ListViewDef(memberObj, {
93
412
  viewId: 'view_gym_all_members',
94
413
  name: 'All members',
95
414
  description: 'Directory with membership status',
96
- fields: ['name', 'email', 'phone', 'membership_status', 'preferred_class_types', 'join_date'],
415
+ fields: [
416
+ 'name',
417
+ memberEmail,
418
+ memberPhone,
419
+ memberStatusField,
420
+ memberPreferredClassTypesField,
421
+ memberJoinDate,
422
+ ],
97
423
  orderBy: 'name',
98
424
  sortOrder: 'ASC',
99
425
  isPublic: true,
100
426
  objectScope: 'all',
101
427
  });
102
428
 
103
- defineTypedListView(trainer, {
429
+ new ListViewDef(trainerObj, {
104
430
  viewId: 'view_gym_all_trainers',
105
431
  name: 'All trainers',
106
432
  description: 'Staff roster with session counts',
107
- fields: ['name', 'email', 'specialty', 'trainer_label'],
433
+ fields: ['name', trainerEmailField, trainerSpecialtyField, trainerLabelField],
108
434
  orderBy: 'name',
109
435
  sortOrder: 'ASC',
110
436
  isPublic: true,
111
437
  objectScope: 'all',
112
438
  });
113
439
 
114
- defineTypedListView(session, {
440
+ new ListViewDef(sessionObj, {
115
441
  viewId: 'view_gym_all_sessions',
116
442
  name: 'All class sessions',
117
443
  description: 'Chronological schedule with trainer and enrollments',
118
444
  fields: [
119
445
  'name',
120
- 'trainer_ref',
121
- 'start_time',
122
- 'end_time',
123
- 'class_type',
124
- 'room_name',
125
- 'capacity',
446
+ sessionTrainerRef,
447
+ sessionStartField,
448
+ sessionEndField,
449
+ sessionClassTypeField,
450
+ sessionRoomField,
451
+ sessionCapacityField,
126
452
  enrollmentCountOnSession,
127
- 'session_board_label',
453
+ sessionBoardLabel,
128
454
  ],
129
- orderBy: 'start_time',
455
+ orderBy: sessionStartField,
130
456
  sortOrder: 'ASC',
131
457
  isPublic: true,
132
458
  objectScope: 'all',
133
459
  });
134
460
 
135
- defineTypedListView(session, {
461
+ new ListViewDef(sessionObj, {
136
462
  viewId: 'view_gym_today_sessions',
137
463
  name: 'Today’s class sessions',
138
464
  description: 'Sessions whose calendar day is today — use with Today’s schedule SDUI tab',
139
465
  fields: [
140
466
  'name',
141
- 'trainer_ref',
142
- 'start_time',
143
- 'end_time',
144
- 'class_type',
145
- 'room_name',
467
+ sessionTrainerRef,
468
+ sessionStartField,
469
+ sessionEndField,
470
+ sessionClassTypeField,
471
+ sessionRoomField,
146
472
  enrollmentCountOnSession,
147
- 'session_board_label',
148
- 'session_date',
473
+ sessionBoardLabel,
474
+ sessionDayField,
149
475
  ],
150
- orderBy: 'start_time',
476
+ orderBy: sessionStartField,
151
477
  sortOrder: 'ASC',
152
478
  isPublic: true,
153
479
  objectScope: 'all',
154
- filter: (c) => c.eq(c.fields.session_date, c.today()),
480
+ rqlFilter: '(session_date__c == TODAY())',
155
481
  });
156
482
 
157
- defineTypedListView(enrollment, {
483
+ new ListViewDef(enrollmentObj, {
158
484
  viewId: 'view_gym_all_enrollments',
159
485
  name: 'All enrollments',
160
486
  description: 'Full roster grid',
161
487
  fields: [
162
488
  'name',
163
- 'class_session_ref',
164
- 'member_ref',
165
- 'attendance_status',
166
- 'checked_in_at',
167
- 'roster_row_label',
489
+ enrollmentSessionRef,
490
+ enrollmentMemberRef,
491
+ enrollmentAttendanceField,
492
+ enrollmentCheckedInAt,
493
+ enrollmentRosterTitle,
168
494
  ],
169
- orderBy: 'member_ref',
495
+ orderBy: enrollmentMemberRef,
170
496
  sortOrder: 'ASC',
171
497
  isPublic: true,
172
498
  objectScope: 'all',
173
499
  });
174
500
 
175
- // ── Page layouts ────────────────────────────────────────────────────────────
176
- defineTypedPageLayout(member, {
501
+ // ── Page layouts ─────────────────────────────────────────────────────────────
502
+ new CustomObjectPageLayout(memberObj, {
177
503
  apiName: 'default',
178
504
  name: 'Member',
179
505
  layoutId: 'layout_gym_member',
@@ -187,14 +513,20 @@ defineTypedPageLayout(member, {
187
513
  {
188
514
  name: 'Profile',
189
515
  type: 'fields_section',
190
- section: member.sections.profile,
191
- fields: [{ field: 'name', editable: true }, 'first_name', 'last_name', 'email', 'phone'],
516
+ section: memberProfileSection,
517
+ fields: [
518
+ { field: 'name', editable: true },
519
+ memberFirstName,
520
+ memberLastName,
521
+ memberEmail,
522
+ memberPhone,
523
+ ],
192
524
  },
193
525
  {
194
526
  name: 'Membership',
195
527
  type: 'fields_section',
196
- section: member.sections.membership,
197
- fields: ['membership_status', 'preferred_class_types', 'join_date', 'emergency_contact'],
528
+ section: memberMembershipSection,
529
+ fields: [memberStatusField, memberPreferredClassTypesField, memberJoinDate, memberEmergencyField],
198
530
  },
199
531
  ],
200
532
  },
@@ -205,7 +537,7 @@ defineTypedPageLayout(member, {
205
537
  visibilityConditions: {},
206
538
  });
207
539
 
208
- defineTypedPageLayout(trainer, {
540
+ new CustomObjectPageLayout(trainerObj, {
209
541
  apiName: 'default',
210
542
  name: 'Trainer',
211
543
  layoutId: 'layout_gym_trainer',
@@ -219,8 +551,14 @@ defineTypedPageLayout(trainer, {
219
551
  {
220
552
  name: 'Details',
221
553
  type: 'fields_section',
222
- section: trainer.sections.trainer,
223
- fields: [{ field: 'name', editable: true }, 'email', 'specialty', 'trainer_label', 'bio'],
554
+ section: trainerSection,
555
+ fields: [
556
+ { field: 'name', editable: true },
557
+ trainerEmailField,
558
+ trainerSpecialtyField,
559
+ trainerLabelField,
560
+ trainerBioField,
561
+ ],
224
562
  },
225
563
  ],
226
564
  },
@@ -231,7 +569,7 @@ defineTypedPageLayout(trainer, {
231
569
  visibilityConditions: {},
232
570
  });
233
571
 
234
- defineTypedPageLayout(session, {
572
+ new CustomObjectPageLayout(sessionObj, {
235
573
  apiName: 'default',
236
574
  name: 'Class session',
237
575
  layoutId: 'layout_gym_class_session',
@@ -245,22 +583,22 @@ defineTypedPageLayout(session, {
245
583
  {
246
584
  name: 'Schedule',
247
585
  type: 'fields_section',
248
- section: session.sections.schedule,
586
+ section: sessionScheduleSection,
249
587
  fields: [
250
588
  { field: 'name', editable: true },
251
- 'trainer_ref',
252
- 'start_time',
253
- 'end_time',
254
- 'session_date',
255
- 'session_board_label',
589
+ sessionTrainerRef,
590
+ sessionStartField,
591
+ sessionEndField,
592
+ sessionDayField,
593
+ sessionBoardLabel,
256
594
  enrollmentCountOnSession,
257
595
  ],
258
596
  },
259
597
  {
260
598
  name: 'Class & room',
261
599
  type: 'fields_section',
262
- section: session.sections.class_and_room,
263
- fields: ['class_type', 'room_name', 'capacity', 'session_notes'],
600
+ section: sessionTrainerSection,
601
+ fields: [sessionClassTypeField, sessionRoomField, sessionCapacityField, sessionNotesField],
264
602
  },
265
603
  ],
266
604
  },
@@ -271,7 +609,7 @@ defineTypedPageLayout(session, {
271
609
  visibilityConditions: {},
272
610
  });
273
611
 
274
- defineTypedPageLayout(enrollment, {
612
+ new CustomObjectPageLayout(enrollmentObj, {
275
613
  apiName: 'default',
276
614
  name: 'Enrollment',
277
615
  layoutId: 'layout_gym_enrollment',
@@ -285,14 +623,19 @@ defineTypedPageLayout(enrollment, {
285
623
  {
286
624
  name: 'Session & member',
287
625
  type: 'fields_section',
288
- section: enrollment.sections.session_and_member,
289
- fields: [{ field: 'name', editable: true }, 'class_session_ref', 'member_ref'],
626
+ section: enrollmentSessionSection,
627
+ fields: [{ field: 'name', editable: true }, enrollmentSessionRef, enrollmentMemberRef],
290
628
  },
291
629
  {
292
630
  name: 'Attendance & check-in',
293
631
  type: 'fields_section',
294
- section: enrollment.sections.attendance,
295
- fields: ['attendance_status', 'checked_in_at', 'roster_row_label', 'enrollment_notes'],
632
+ section: enrollmentAttendanceSection,
633
+ fields: [
634
+ enrollmentAttendanceField,
635
+ enrollmentCheckedInAt,
636
+ enrollmentRosterTitle,
637
+ enrollmentNotesField,
638
+ ],
296
639
  },
297
640
  ],
298
641
  },
@@ -303,12 +646,16 @@ defineTypedPageLayout(enrollment, {
303
646
  visibilityConditions: {},
304
647
  });
305
648
 
306
- // ── SDUI object-list tabs ──────────────────────────────────────────────────
649
+ // ── SDUI object-list tabs ───────────────────────────────────────────────────
307
650
  const sduiObjectListDependencies = {
308
651
  '@rippling/rippling-sdk': '^0.2.0-alpha.65',
309
652
  '@rippling/pebble-sdui-web': '^0.9.2',
310
653
  };
311
654
 
655
+ function loadFunctionCode(filename: string): string {
656
+ return fs.readFileSync(path.join(__dirname, 'functions', filename), 'utf-8');
657
+ }
658
+
312
659
  function createObjectListPage(props: {
313
660
  codeFilename: string;
314
661
  functionApiName: string;
@@ -317,17 +664,20 @@ function createObjectListPage(props: {
317
664
  pageId: string;
318
665
  pageName: string;
319
666
  }): SduiPage {
320
- return defineSduiPageFromFunctionFile(manifest, {
667
+ const listFn = new ManifestFunction(manifest, {
321
668
  apiName: props.functionApiName,
322
669
  name: props.functionName,
323
670
  description: props.functionDescription,
324
- codeDirectory: path.join(__dirname, 'functions'),
325
- codeFilename: props.codeFilename,
671
+ code: loadFunctionCode(props.codeFilename),
326
672
  dependencies: sduiObjectListDependencies,
327
673
  isAsync: false,
328
- pageId: props.pageId,
329
- pageName: props.pageName,
330
- }).page;
674
+ });
675
+
676
+ return new SduiPage(manifest, {
677
+ sduiPageId: props.pageId,
678
+ name: props.pageName,
679
+ function: listFn,
680
+ });
331
681
  }
332
682
 
333
683
  const memberListPage = createObjectListPage({