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

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 (351) hide show
  1. package/client.d.mts +4 -4
  2. package/client.d.mts.map +1 -1
  3. package/client.d.ts +4 -4
  4. package/client.d.ts.map +1 -1
  5. package/client.js.map +1 -1
  6. package/client.mjs.map +1 -1
  7. package/core/platform/custom-objects/category.d.mts +125 -0
  8. package/core/platform/custom-objects/category.d.mts.map +1 -0
  9. package/core/platform/custom-objects/category.d.ts +125 -0
  10. package/core/platform/custom-objects/category.d.ts.map +1 -0
  11. package/core/platform/custom-objects/category.js +188 -0
  12. package/core/platform/custom-objects/category.js.map +1 -0
  13. package/core/platform/custom-objects/category.mjs +178 -0
  14. package/core/platform/custom-objects/category.mjs.map +1 -0
  15. package/core/platform/custom-objects/definition.d.mts +147 -0
  16. package/core/platform/custom-objects/definition.d.mts.map +1 -0
  17. package/core/platform/custom-objects/definition.d.ts +147 -0
  18. package/core/platform/custom-objects/definition.d.ts.map +1 -0
  19. package/core/platform/custom-objects/definition.js +200 -0
  20. package/core/platform/custom-objects/definition.js.map +1 -0
  21. package/core/platform/custom-objects/definition.mjs +190 -0
  22. package/core/platform/custom-objects/definition.mjs.map +1 -0
  23. package/core/platform/custom-objects/fields.d.mts +302 -0
  24. package/core/platform/custom-objects/fields.d.mts.map +1 -0
  25. package/core/platform/custom-objects/fields.d.ts +302 -0
  26. package/core/platform/custom-objects/fields.d.ts.map +1 -0
  27. package/core/platform/custom-objects/fields.js +369 -0
  28. package/core/platform/custom-objects/fields.js.map +1 -0
  29. package/core/platform/custom-objects/fields.mjs +347 -0
  30. package/core/platform/custom-objects/fields.mjs.map +1 -0
  31. package/core/platform/custom-objects/function-runtime.d.mts +42 -0
  32. package/core/platform/custom-objects/function-runtime.d.mts.map +1 -0
  33. package/core/platform/custom-objects/function-runtime.d.ts +42 -0
  34. package/core/platform/custom-objects/function-runtime.d.ts.map +1 -0
  35. package/core/platform/custom-objects/function-runtime.js +38 -0
  36. package/core/platform/custom-objects/function-runtime.js.map +1 -0
  37. package/core/platform/custom-objects/function-runtime.mjs +35 -0
  38. package/core/platform/custom-objects/function-runtime.mjs.map +1 -0
  39. package/core/platform/custom-objects/lifecycle.d.mts +83 -0
  40. package/core/platform/custom-objects/lifecycle.d.mts.map +1 -0
  41. package/core/platform/custom-objects/lifecycle.d.ts +83 -0
  42. package/core/platform/custom-objects/lifecycle.d.ts.map +1 -0
  43. package/core/platform/custom-objects/lifecycle.js +372 -0
  44. package/core/platform/custom-objects/lifecycle.js.map +1 -0
  45. package/core/platform/custom-objects/lifecycle.mjs +367 -0
  46. package/core/platform/custom-objects/lifecycle.mjs.map +1 -0
  47. package/core/platform/custom-objects/manager.d.mts +354 -0
  48. package/core/platform/custom-objects/manager.d.mts.map +1 -0
  49. package/core/platform/custom-objects/manager.d.ts +354 -0
  50. package/core/platform/custom-objects/manager.d.ts.map +1 -0
  51. package/core/platform/custom-objects/manager.js +646 -0
  52. package/core/platform/custom-objects/manager.js.map +1 -0
  53. package/core/platform/custom-objects/manager.mjs +637 -0
  54. package/core/platform/custom-objects/manager.mjs.map +1 -0
  55. package/core/platform/custom-objects/provisioning.d.mts +138 -0
  56. package/core/platform/custom-objects/provisioning.d.mts.map +1 -0
  57. package/core/platform/custom-objects/provisioning.d.ts +138 -0
  58. package/core/platform/custom-objects/provisioning.d.ts.map +1 -0
  59. package/core/platform/custom-objects/provisioning.js +455 -0
  60. package/core/platform/custom-objects/provisioning.js.map +1 -0
  61. package/core/platform/custom-objects/provisioning.mjs +447 -0
  62. package/core/platform/custom-objects/provisioning.mjs.map +1 -0
  63. package/core/platform/custom-objects/rql.d.mts +122 -0
  64. package/core/platform/custom-objects/rql.d.mts.map +1 -0
  65. package/core/platform/custom-objects/rql.d.ts +122 -0
  66. package/core/platform/custom-objects/rql.d.ts.map +1 -0
  67. package/core/platform/custom-objects/rql.js +225 -0
  68. package/core/platform/custom-objects/rql.js.map +1 -0
  69. package/core/platform/custom-objects/rql.mjs +222 -0
  70. package/core/platform/custom-objects/rql.mjs.map +1 -0
  71. package/core/platform/custom-objects/schema-manager.d.mts +203 -0
  72. package/core/platform/custom-objects/schema-manager.d.mts.map +1 -0
  73. package/core/platform/custom-objects/schema-manager.d.ts +203 -0
  74. package/core/platform/custom-objects/schema-manager.d.ts.map +1 -0
  75. package/core/platform/custom-objects/schema-manager.js +256 -0
  76. package/core/platform/custom-objects/schema-manager.js.map +1 -0
  77. package/core/platform/custom-objects/schema-manager.mjs +249 -0
  78. package/core/platform/custom-objects/schema-manager.mjs.map +1 -0
  79. package/core/platform/custom-objects/typed-rql.d.mts +157 -0
  80. package/core/platform/custom-objects/typed-rql.d.mts.map +1 -0
  81. package/core/platform/custom-objects/typed-rql.d.ts +157 -0
  82. package/core/platform/custom-objects/typed-rql.d.ts.map +1 -0
  83. package/core/platform/custom-objects/typed-rql.js +583 -0
  84. package/core/platform/custom-objects/typed-rql.js.map +1 -0
  85. package/core/platform/custom-objects/typed-rql.mjs +580 -0
  86. package/core/platform/custom-objects/typed-rql.mjs.map +1 -0
  87. package/core/platform/custom-objects/types.d.mts +549 -0
  88. package/core/platform/custom-objects/types.d.mts.map +1 -0
  89. package/core/platform/custom-objects/types.d.ts +549 -0
  90. package/core/platform/custom-objects/types.d.ts.map +1 -0
  91. package/core/platform/custom-objects/types.js +20 -0
  92. package/core/platform/custom-objects/types.js.map +1 -0
  93. package/core/platform/custom-objects/types.mjs +17 -0
  94. package/core/platform/custom-objects/types.mjs.map +1 -0
  95. package/core/platform/custom-objects/validation.d.mts +97 -0
  96. package/core/platform/custom-objects/validation.d.mts.map +1 -0
  97. package/core/platform/custom-objects/validation.d.ts +97 -0
  98. package/core/platform/custom-objects/validation.d.ts.map +1 -0
  99. package/core/platform/custom-objects/validation.js +477 -0
  100. package/core/platform/custom-objects/validation.js.map +1 -0
  101. package/core/platform/custom-objects/validation.mjs +465 -0
  102. package/core/platform/custom-objects/validation.mjs.map +1 -0
  103. package/core/platform/custom-objects.d.mts +67 -0
  104. package/core/platform/custom-objects.d.mts.map +1 -0
  105. package/core/platform/custom-objects.d.ts +67 -0
  106. package/core/platform/custom-objects.d.ts.map +1 -0
  107. package/core/platform/custom-objects.js +118 -0
  108. package/core/platform/custom-objects.js.map +1 -0
  109. package/core/platform/custom-objects.mjs +45 -0
  110. package/core/platform/custom-objects.mjs.map +1 -0
  111. package/core/platform/manifest/custom-objects/action.d.mts +58 -0
  112. package/core/platform/manifest/custom-objects/action.d.mts.map +1 -0
  113. package/core/platform/manifest/custom-objects/action.d.ts +58 -0
  114. package/core/platform/manifest/custom-objects/action.d.ts.map +1 -0
  115. package/core/platform/manifest/custom-objects/action.js +44 -0
  116. package/core/platform/manifest/custom-objects/action.js.map +1 -0
  117. package/core/platform/manifest/custom-objects/action.mjs +40 -0
  118. package/core/platform/manifest/custom-objects/action.mjs.map +1 -0
  119. package/core/platform/manifest/custom-objects/conditions.d.mts +240 -0
  120. package/core/platform/manifest/custom-objects/conditions.d.mts.map +1 -0
  121. package/core/platform/manifest/custom-objects/conditions.d.ts +240 -0
  122. package/core/platform/manifest/custom-objects/conditions.d.ts.map +1 -0
  123. package/core/platform/manifest/custom-objects/conditions.js +326 -0
  124. package/core/platform/manifest/custom-objects/conditions.js.map +1 -0
  125. package/core/platform/manifest/custom-objects/conditions.mjs +321 -0
  126. package/core/platform/manifest/custom-objects/conditions.mjs.map +1 -0
  127. package/core/platform/manifest/custom-objects/existing.d.mts +87 -0
  128. package/core/platform/manifest/custom-objects/existing.d.mts.map +1 -0
  129. package/core/platform/manifest/custom-objects/existing.d.ts +87 -0
  130. package/core/platform/manifest/custom-objects/existing.d.ts.map +1 -0
  131. package/core/platform/manifest/custom-objects/existing.js +113 -0
  132. package/core/platform/manifest/custom-objects/existing.js.map +1 -0
  133. package/core/platform/manifest/custom-objects/existing.mjs +109 -0
  134. package/core/platform/manifest/custom-objects/existing.mjs.map +1 -0
  135. package/core/platform/manifest/custom-objects/field-resolution.d.mts +48 -0
  136. package/core/platform/manifest/custom-objects/field-resolution.d.mts.map +1 -0
  137. package/core/platform/manifest/custom-objects/field-resolution.d.ts +48 -0
  138. package/core/platform/manifest/custom-objects/field-resolution.d.ts.map +1 -0
  139. package/core/platform/manifest/custom-objects/field-resolution.js +61 -0
  140. package/core/platform/manifest/custom-objects/field-resolution.js.map +1 -0
  141. package/core/platform/manifest/custom-objects/field-resolution.mjs +58 -0
  142. package/core/platform/manifest/custom-objects/field-resolution.mjs.map +1 -0
  143. package/core/platform/manifest/custom-objects/function-file.d.mts +87 -0
  144. package/core/platform/manifest/custom-objects/function-file.d.mts.map +1 -0
  145. package/core/platform/manifest/custom-objects/function-file.d.ts +87 -0
  146. package/core/platform/manifest/custom-objects/function-file.d.ts.map +1 -0
  147. package/core/platform/manifest/custom-objects/function-file.js +76 -0
  148. package/core/platform/manifest/custom-objects/function-file.js.map +1 -0
  149. package/core/platform/manifest/custom-objects/function-file.mjs +69 -0
  150. package/core/platform/manifest/custom-objects/function-file.mjs.map +1 -0
  151. package/core/platform/manifest/custom-objects/list-view.d.mts +65 -0
  152. package/core/platform/manifest/custom-objects/list-view.d.mts.map +1 -0
  153. package/core/platform/manifest/custom-objects/list-view.d.ts +65 -0
  154. package/core/platform/manifest/custom-objects/list-view.d.ts.map +1 -0
  155. package/core/platform/manifest/custom-objects/list-view.js +33 -0
  156. package/core/platform/manifest/custom-objects/list-view.js.map +1 -0
  157. package/core/platform/manifest/custom-objects/list-view.mjs +30 -0
  158. package/core/platform/manifest/custom-objects/list-view.mjs.map +1 -0
  159. package/core/platform/manifest/custom-objects/object-list-page.d.mts +43 -0
  160. package/core/platform/manifest/custom-objects/object-list-page.d.mts.map +1 -0
  161. package/core/platform/manifest/custom-objects/object-list-page.d.ts +43 -0
  162. package/core/platform/manifest/custom-objects/object-list-page.d.ts.map +1 -0
  163. package/core/platform/manifest/custom-objects/object-list-page.js +54 -0
  164. package/core/platform/manifest/custom-objects/object-list-page.js.map +1 -0
  165. package/core/platform/manifest/custom-objects/object-list-page.mjs +50 -0
  166. package/core/platform/manifest/custom-objects/object-list-page.mjs.map +1 -0
  167. package/core/platform/manifest/custom-objects/page-layout.d.mts +142 -0
  168. package/core/platform/manifest/custom-objects/page-layout.d.mts.map +1 -0
  169. package/core/platform/manifest/custom-objects/page-layout.d.ts +142 -0
  170. package/core/platform/manifest/custom-objects/page-layout.d.ts.map +1 -0
  171. package/core/platform/manifest/custom-objects/page-layout.js +184 -0
  172. package/core/platform/manifest/custom-objects/page-layout.js.map +1 -0
  173. package/core/platform/manifest/custom-objects/page-layout.mjs +180 -0
  174. package/core/platform/manifest/custom-objects/page-layout.mjs.map +1 -0
  175. package/core/platform/manifest/custom-objects/register.d.mts +87 -0
  176. package/core/platform/manifest/custom-objects/register.d.mts.map +1 -0
  177. package/core/platform/manifest/custom-objects/register.d.ts +87 -0
  178. package/core/platform/manifest/custom-objects/register.d.ts.map +1 -0
  179. package/core/platform/manifest/custom-objects/register.js +395 -0
  180. package/core/platform/manifest/custom-objects/register.js.map +1 -0
  181. package/core/platform/manifest/custom-objects/register.mjs +391 -0
  182. package/core/platform/manifest/custom-objects/register.mjs.map +1 -0
  183. package/core/platform/manifest/custom-objects/rule.d.mts +113 -0
  184. package/core/platform/manifest/custom-objects/rule.d.mts.map +1 -0
  185. package/core/platform/manifest/custom-objects/rule.d.ts +113 -0
  186. package/core/platform/manifest/custom-objects/rule.d.ts.map +1 -0
  187. package/core/platform/manifest/custom-objects/rule.js +49 -0
  188. package/core/platform/manifest/custom-objects/rule.js.map +1 -0
  189. package/core/platform/manifest/custom-objects/rule.mjs +45 -0
  190. package/core/platform/manifest/custom-objects/rule.mjs.map +1 -0
  191. package/core/platform/manifest/custom-objects/sdui-page.d.mts +214 -0
  192. package/core/platform/manifest/custom-objects/sdui-page.d.mts.map +1 -0
  193. package/core/platform/manifest/custom-objects/sdui-page.d.ts +214 -0
  194. package/core/platform/manifest/custom-objects/sdui-page.d.ts.map +1 -0
  195. package/core/platform/manifest/custom-objects/sdui-page.js +194 -0
  196. package/core/platform/manifest/custom-objects/sdui-page.js.map +1 -0
  197. package/core/platform/manifest/custom-objects/sdui-page.mjs +182 -0
  198. package/core/platform/manifest/custom-objects/sdui-page.mjs.map +1 -0
  199. package/core/platform/manifest/custom-objects/typed-condition.d.mts +28 -0
  200. package/core/platform/manifest/custom-objects/typed-condition.d.mts.map +1 -0
  201. package/core/platform/manifest/custom-objects/typed-condition.d.ts +28 -0
  202. package/core/platform/manifest/custom-objects/typed-condition.d.ts.map +1 -0
  203. package/core/platform/manifest/custom-objects/typed-condition.js +434 -0
  204. package/core/platform/manifest/custom-objects/typed-condition.js.map +1 -0
  205. package/core/platform/manifest/custom-objects/typed-condition.mjs +431 -0
  206. package/core/platform/manifest/custom-objects/typed-condition.mjs.map +1 -0
  207. package/core/platform/manifest/custom-objects/types.d.mts +29 -0
  208. package/core/platform/manifest/custom-objects/types.d.mts.map +1 -0
  209. package/core/platform/manifest/custom-objects/types.d.ts +29 -0
  210. package/core/platform/manifest/custom-objects/types.d.ts.map +1 -0
  211. package/core/platform/manifest/custom-objects/types.js +3 -0
  212. package/core/platform/manifest/custom-objects/types.js.map +1 -0
  213. package/core/platform/manifest/custom-objects/types.mjs +2 -0
  214. package/core/platform/manifest/custom-objects/types.mjs.map +1 -0
  215. package/core/platform/manifest/custom-objects/validation.d.mts +44 -0
  216. package/core/platform/manifest/custom-objects/validation.d.mts.map +1 -0
  217. package/core/platform/manifest/custom-objects/validation.d.ts +44 -0
  218. package/core/platform/manifest/custom-objects/validation.d.ts.map +1 -0
  219. package/core/platform/manifest/custom-objects/validation.js +30 -0
  220. package/core/platform/manifest/custom-objects/validation.js.map +1 -0
  221. package/core/platform/manifest/custom-objects/validation.mjs +27 -0
  222. package/core/platform/manifest/custom-objects/validation.mjs.map +1 -0
  223. package/core/platform/manifest/custom-objects/workflow.d.mts +47 -0
  224. package/core/platform/manifest/custom-objects/workflow.d.mts.map +1 -0
  225. package/core/platform/manifest/custom-objects/workflow.d.ts +47 -0
  226. package/core/platform/manifest/custom-objects/workflow.d.ts.map +1 -0
  227. package/core/platform/manifest/custom-objects/workflow.js +38 -0
  228. package/core/platform/manifest/custom-objects/workflow.js.map +1 -0
  229. package/core/platform/manifest/custom-objects/workflow.mjs +34 -0
  230. package/core/platform/manifest/custom-objects/workflow.mjs.map +1 -0
  231. package/core/platform/manifest/custom-objects.d.mts +85 -0
  232. package/core/platform/manifest/custom-objects.d.mts.map +1 -0
  233. package/core/platform/manifest/custom-objects.d.ts +85 -0
  234. package/core/platform/manifest/custom-objects.d.ts.map +1 -0
  235. package/core/platform/manifest/custom-objects.js +84 -0
  236. package/core/platform/manifest/custom-objects.js.map +1 -0
  237. package/core/platform/manifest/custom-objects.mjs +55 -0
  238. package/core/platform/manifest/custom-objects.mjs.map +1 -0
  239. package/examples/manifest/custom-object-creation-workflow/custom-object-creation-workflow.ts +26 -44
  240. package/examples/manifest/custom-object-creation-workflow/functions/intake-request-created.ts +20 -0
  241. package/examples/manifest/custom-object-creation-workflow/schema.ts +29 -0
  242. package/examples/manifest/dental-practice-management/dental-practice-management.ts +142 -470
  243. package/examples/manifest/dental-practice-management/functions/chair-schedule.ts +13 -23
  244. package/examples/manifest/dental-practice-management/functions/complete-visit.ts +32 -55
  245. package/examples/manifest/dental-practice-management/functions/operatory-list.ts +13 -23
  246. package/examples/manifest/dental-practice-management/functions/patient-list.ts +13 -23
  247. package/examples/manifest/dental-practice-management/functions/treatment-plan-list.ts +13 -23
  248. package/examples/manifest/dental-practice-management/schema.ts +298 -0
  249. package/examples/manifest/existing-manifest-mutations/existing-manifest-mutations.ts +68 -23
  250. package/examples/manifest/field-service-dispatch/field-service-dispatch.ts +102 -375
  251. package/examples/manifest/field-service-dispatch/schema.ts +248 -0
  252. package/examples/manifest/grant-program-management/grant-program-management.ts +125 -419
  253. package/examples/manifest/grant-program-management/schema.ts +269 -0
  254. package/examples/manifest/gym-membership-management/functions/check-in-desk.ts +13 -23
  255. package/examples/manifest/gym-membership-management/functions/member-list.ts +13 -23
  256. package/examples/manifest/gym-membership-management/functions/today-schedule.ts +13 -23
  257. package/examples/manifest/gym-membership-management/functions/trainer-list.ts +13 -23
  258. package/examples/manifest/gym-membership-management/gym-membership-management.ts +92 -442
  259. package/examples/manifest/gym-membership-management/schema.ts +266 -0
  260. package/examples/manifest/procurement-approval-hub/functions/route-purchase-request.ts +20 -0
  261. package/examples/manifest/procurement-approval-hub/procurement-approval-hub.ts +122 -408
  262. package/examples/manifest/procurement-approval-hub/schema.ts +256 -0
  263. package/examples/manifest/simple-todo-app/functions/mark-done.ts +16 -12
  264. package/examples/manifest/simple-todo-app/functions/todo-list.ts +13 -23
  265. package/examples/manifest/simple-todo-app/schema.ts +60 -0
  266. package/examples/manifest/simple-todo-app/simple-todo-app.ts +40 -109
  267. package/examples/manifest/todo-app-without-object-list-view/functions/todo-page.ts +166 -193
  268. package/examples/manifest/todo-app-without-object-list-view/schema.ts +28 -0
  269. package/examples/manifest/todo-app-without-object-list-view/todo-app-without-object-list-view.ts +24 -47
  270. package/package.json +7 -13
  271. package/resources/custom-objects/custom-objects.d.mts +7 -0
  272. package/resources/custom-objects/custom-objects.d.mts.map +1 -1
  273. package/resources/custom-objects/custom-objects.d.ts +7 -0
  274. package/resources/custom-objects/custom-objects.d.ts.map +1 -1
  275. package/resources/custom-objects/custom-objects.js.map +1 -1
  276. package/resources/custom-objects/custom-objects.mjs.map +1 -1
  277. package/resources/custom-objects/fields.d.mts +170 -15
  278. package/resources/custom-objects/fields.d.mts.map +1 -1
  279. package/resources/custom-objects/fields.d.ts +170 -15
  280. package/resources/custom-objects/fields.d.ts.map +1 -1
  281. package/resources/index.d.mts +2 -2
  282. package/resources/index.d.mts.map +1 -1
  283. package/resources/index.d.ts +2 -2
  284. package/resources/index.d.ts.map +1 -1
  285. package/resources/index.js.map +1 -1
  286. package/resources/index.mjs.map +1 -1
  287. package/resources/leave-program-evaluations.d.mts +510 -3
  288. package/resources/leave-program-evaluations.d.mts.map +1 -1
  289. package/resources/leave-program-evaluations.d.ts +510 -3
  290. package/resources/leave-program-evaluations.d.ts.map +1 -1
  291. package/resources/levels.d.mts +64 -2
  292. package/resources/levels.d.mts.map +1 -1
  293. package/resources/levels.d.ts +64 -2
  294. package/resources/levels.d.ts.map +1 -1
  295. package/resources/levels.js +22 -0
  296. package/resources/levels.js.map +1 -1
  297. package/resources/levels.mjs +22 -0
  298. package/resources/levels.mjs.map +1 -1
  299. package/resources/tracks.d.mts +45 -1
  300. package/resources/tracks.d.mts.map +1 -1
  301. package/resources/tracks.d.ts +45 -1
  302. package/resources/tracks.d.ts.map +1 -1
  303. package/resources/tracks.js +22 -0
  304. package/resources/tracks.js.map +1 -1
  305. package/resources/tracks.mjs +22 -0
  306. package/resources/tracks.mjs.map +1 -1
  307. package/src/client.ts +8 -0
  308. package/src/core/platform/README.md +20 -0
  309. package/src/core/platform/custom-objects/category.ts +294 -0
  310. package/src/core/platform/custom-objects/definition.ts +373 -0
  311. package/src/core/platform/custom-objects/fields.ts +653 -0
  312. package/src/core/platform/custom-objects/function-runtime.ts +76 -0
  313. package/src/core/platform/custom-objects/lifecycle.ts +557 -0
  314. package/src/core/platform/custom-objects/manager.ts +959 -0
  315. package/src/core/platform/custom-objects/provisioning.ts +672 -0
  316. package/src/core/platform/custom-objects/rql.ts +375 -0
  317. package/src/core/platform/custom-objects/schema-manager.ts +351 -0
  318. package/src/core/platform/custom-objects/typed-rql.ts +1273 -0
  319. package/src/core/platform/custom-objects/types.ts +753 -0
  320. package/src/core/platform/custom-objects/validation.ts +573 -0
  321. package/src/core/platform/custom-objects.ts +269 -0
  322. package/src/core/platform/manifest/README.md +26 -0
  323. package/src/core/platform/manifest/custom-objects/action.ts +87 -0
  324. package/src/core/platform/manifest/custom-objects/conditions.ts +762 -0
  325. package/src/core/platform/manifest/custom-objects/existing.ts +221 -0
  326. package/src/core/platform/manifest/custom-objects/field-resolution.ts +116 -0
  327. package/src/core/platform/manifest/custom-objects/function-file.ts +149 -0
  328. package/src/core/platform/manifest/custom-objects/list-view.ts +95 -0
  329. package/src/core/platform/manifest/custom-objects/object-list-page.ts +87 -0
  330. package/src/core/platform/manifest/custom-objects/page-layout.ts +380 -0
  331. package/src/core/platform/manifest/custom-objects/register.ts +555 -0
  332. package/src/core/platform/manifest/custom-objects/rule.ts +192 -0
  333. package/src/core/platform/manifest/custom-objects/sdui-page.ts +515 -0
  334. package/src/core/platform/manifest/custom-objects/typed-condition.ts +617 -0
  335. package/src/core/platform/manifest/custom-objects/types.ts +92 -0
  336. package/src/core/platform/manifest/custom-objects/validation.ts +70 -0
  337. package/src/core/platform/manifest/custom-objects/workflow.ts +71 -0
  338. package/src/core/platform/manifest/custom-objects.ts +203 -0
  339. package/src/pebble-sdui-web-custom-apps-shim.d.ts +3 -0
  340. package/src/resources/custom-objects/custom-objects.ts +8 -0
  341. package/src/resources/custom-objects/fields.ts +239 -14
  342. package/src/resources/index.ts +4 -0
  343. package/src/resources/leave-program-evaluations.ts +610 -3
  344. package/src/resources/levels.ts +93 -1
  345. package/src/resources/tracks.ts +70 -0
  346. package/src/tsconfig.json +1 -1
  347. package/src/version.ts +1 -1
  348. package/version.d.mts +1 -1
  349. package/version.d.ts +1 -1
  350. package/version.js +1 -1
  351. package/version.mjs +1 -1
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * In `triggerFunction`, server-bound action params live under `inputs` so
12
12
  * repeated item values like `todo.$('id')` resolve before reaching
13
- * `event['parameters']`. Client-side controls such as `functionApiName`,
13
+ * `event['parameters']`. Client-side controls such as `functionId`,
14
14
  * `responsePath`, `onSuccess`, and `onError` stay top-level.
15
15
  *
16
16
  * `/isMutating` is a shared loading flag: it disables every action while an API
@@ -29,23 +29,31 @@ import {
29
29
  TextInput,
30
30
  VStack,
31
31
  render,
32
- setState,
33
- triggerFunction,
34
32
  } from '@rippling/pebble-sdui-web/catalogs/custom-apps';
35
- import RipplingSDK, {
36
- FunctionContext,
37
- FunctionResponse,
38
- SduiPageFunctionEvent,
39
- } from '@rippling/rippling-sdk';
40
- import type { CustomObjectDataRow } from '@rippling/rippling-sdk/resources/custom-objects/records';
41
-
42
- const OBJECT_API_NAME = 'todo__c';
33
+ import { FunctionContext, FunctionResponse, SduiPageFunctionEvent } from '@rippling/rippling-sdk';
34
+ import {
35
+ createCustomObjectFunctionRuntime,
36
+ createRqlHelpers,
37
+ type RecordShape,
38
+ type TypedCustomObjectRecordManager,
39
+ } from '@rippling/rippling-sdk/core/platform/custom-objects';
40
+ import {
41
+ createTypedSduiMutationTrigger,
42
+ defineTypedSduiPageHandlerFor,
43
+ defineTypedSduiStateAssignments,
44
+ resolveTypedSduiStatePath,
45
+ type TypedSduiPageActionParams,
46
+ type TypedSduiPageOutput,
47
+ } from '@rippling/rippling-sdk/core/platform/manifest/custom-objects';
48
+ import { todoDefinition } from '../schema';
49
+
50
+ const todoRql = createRqlHelpers(todoDefinition);
43
51
  type TodoPageAction = 'init' | 'addTodo' | 'toggleTodo' | 'clearCompleted';
44
- type TodoPageFunctionParameters = {
45
- action: TodoPageAction;
46
- text?: string;
47
- todoId?: string;
48
- };
52
+ type TodoPageFunctionParameters =
53
+ | { action: 'init' }
54
+ | { action: 'addTodo'; text?: string }
55
+ | { action: 'toggleTodo'; todoId?: string }
56
+ | { action: 'clearCompleted' };
49
57
 
50
58
  type Todo = {
51
59
  id: string;
@@ -53,6 +61,8 @@ type Todo = {
53
61
  completed: boolean;
54
62
  };
55
63
 
64
+ type TodoRecord = RecordShape<typeof todoDefinition>;
65
+
56
66
  type TodoListState = {
57
67
  todos: Todo[];
58
68
  isEmpty: boolean;
@@ -67,27 +77,43 @@ type TodoAppState = {
67
77
 
68
78
  type TodoSpec = SpecContext<TodoAppState>;
69
79
 
70
- function createClient(context: FunctionContext): RipplingSDK {
71
- return new RipplingSDK({
72
- bearerToken: context.env.rippling_user_bearer_token,
73
- });
80
+ const todoStatePath = resolveTypedSduiStatePath<TodoAppState>();
81
+ const todoStatePaths = {
82
+ newTodoText: todoStatePath('/newTodoText'),
83
+ todoList: todoStatePath('/todoList'),
84
+ todoListTodos: todoStatePath('/todoList/todos'),
85
+ todoListIsEmpty: todoStatePath('/todoList/isEmpty'),
86
+ isMutating: todoStatePath('/isMutating'),
87
+ errorMessage: todoStatePath('/errorMessage'),
88
+ } as const;
89
+
90
+ export type Input = SduiPageFunctionEvent<TodoPageFunctionParameters>;
91
+
92
+ export type Output = TypedSduiPageOutput<TodoListState>;
93
+
94
+ function createTodoManager(context: FunctionContext): TypedCustomObjectRecordManager<typeof todoDefinition> {
95
+ const runtime = createCustomObjectFunctionRuntime(context);
96
+ return runtime.for(todoDefinition);
74
97
  }
75
98
 
76
- function toTodo(record: CustomObjectDataRow): Todo {
99
+ function toTodo(record: TodoRecord): Todo {
77
100
  return {
78
101
  id: record.id,
79
102
  text: record.name,
80
- completed: record['completed__c'] === true,
103
+ completed: record.completed === true,
81
104
  };
82
105
  }
83
106
 
84
- async function listTodos(client: RipplingSDK, roleId: string): Promise<Todo[]> {
85
- const response = await client.customObjects.records.query(OBJECT_API_NAME, {
107
+ async function listTodos(
108
+ manager: TypedCustomObjectRecordManager<typeof todoDefinition>,
109
+ roleId: string,
110
+ ): Promise<Todo[]> {
111
+ const response = await manager.query({
86
112
  limit: 100,
87
- query: `created_by = "${roleId}"`, // RQL query to filter todos by the current role
113
+ query: todoRql.render(todoRql.eq(todoRql.fields.created_by, { id: roleId, apiName: 'Employee' })),
88
114
  });
89
115
 
90
- return (response.results ?? []).map(toTodo);
116
+ return response.results.map(toTodo);
91
117
  }
92
118
 
93
119
  function todoListState(todos: Todo[]): TodoListState {
@@ -106,49 +132,32 @@ function todoState(todos: Todo[]): TodoAppState {
106
132
  };
107
133
  }
108
134
 
109
- function ok(body: Record<string, unknown> | unknown[] = {}): FunctionResponse {
110
- return new FunctionResponse({
111
- body: body as Record<string, unknown>,
112
- statusCode: 200,
113
- headers: {},
114
- message: '',
115
- });
116
- }
117
-
118
- function badRequest(message: string): FunctionResponse {
119
- return new FunctionResponse({
120
- body: { error: message },
121
- statusCode: 400,
122
- headers: {},
123
- message,
124
- });
125
- }
126
-
127
- function serverError(error: unknown): FunctionResponse {
128
- const message = error instanceof Error ? error.message : 'Unknown error';
129
-
130
- return new FunctionResponse({
131
- body: { error: message },
132
- statusCode: 500,
133
- headers: {},
134
- message,
135
- });
135
+ function todoTextParam(params: TypedSduiPageActionParams<TodoPageFunctionParameters, 'addTodo'>): string {
136
+ return typeof params.text === 'string' ? params.text.trim() : '';
136
137
  }
137
138
 
138
- function stringParam(params: TodoPageFunctionParameters, key: 'text' | 'todoId'): string {
139
- const value = params[key];
140
- return typeof value === 'string' ? value.trim() : '';
139
+ function todoIdParam(params: TypedSduiPageActionParams<TodoPageFunctionParameters, 'toggleTodo'>): string {
140
+ return typeof params.todoId === 'string' ? params.todoId.trim() : '';
141
141
  }
142
142
 
143
- // A single mutation flag disables all actions and drives the visible loading text.
144
- function setMutationState(isMutating: boolean) {
145
- return setState({
146
- statePath: '/isMutating',
147
- value: isMutating,
143
+ function mutationActions<TInputs extends { action: Exclude<TodoPageAction, 'init'> }>(
144
+ functionId: string,
145
+ inputs: TInputs,
146
+ errorMessage: string,
147
+ onSuccessState?: ReturnType<typeof defineTypedSduiStateAssignments<TodoAppState>>,
148
+ ) {
149
+ return createTypedSduiMutationTrigger<TodoAppState, TodoListState, typeof inputs>({
150
+ functionId,
151
+ inputs,
152
+ responsePath: todoStatePaths.todoList,
153
+ errorMessage,
154
+ mutationStatePath: todoStatePaths.isMutating,
155
+ errorStatePath: todoStatePaths.errorMessage,
156
+ ...(onSuccessState != null ? { onSuccessState } : {}),
148
157
  });
149
158
  }
150
159
 
151
- function buildAddTodoSection(spec: TodoSpec, functionApiName: string) {
160
+ function buildAddTodoSection(spec: TodoSpec, functionId: string) {
152
161
  return VStack({
153
162
  id: 'addTodoSection',
154
163
  props: {},
@@ -164,8 +173,8 @@ function buildAddTodoSection(spec: TodoSpec, functionApiName: string) {
164
173
  props: {
165
174
  name: 'newTodo',
166
175
  placeholder: 'Enter a new todo item',
167
- value: spec.$bindState('/newTodoText'),
168
- isDisabled: spec.$state('/isMutating'),
176
+ value: spec.$bindState(todoStatePaths.newTodoText),
177
+ isDisabled: spec.$state(todoStatePaths.isMutating),
169
178
  },
170
179
  }),
171
180
  ],
@@ -177,37 +186,34 @@ function buildAddTodoSection(spec: TodoSpec, functionApiName: string) {
177
186
  appearance: 'PRIMARY',
178
187
  isFluid: true,
179
188
  isDisabled: spec.$cond(
180
- or_(equals(spec.$state('/newTodoText'), ''), equals(spec.$state('/isMutating'), true)),
189
+ or_(
190
+ equals(spec.$state(todoStatePaths.newTodoText), ''),
191
+ equals(spec.$state(todoStatePaths.isMutating), true),
192
+ ),
181
193
  true,
182
194
  false,
183
195
  ),
184
196
  },
185
197
  on: {
186
- press: [
187
- setMutationState(true),
188
- triggerFunction(
189
- {
190
- functionApiName,
191
- inputs: {
192
- action: 'addTodo',
193
- text: spec.$state('/newTodoText'),
194
- },
195
- responsePath: '/todoList',
196
- },
197
- {
198
- onSuccess: { set: { '/newTodoText': '', '/errorMessage': '', '/isMutating': false } },
199
- onError: { set: { '/errorMessage': 'Could not add todo. Try again.', '/isMutating': false } },
200
- },
201
- ),
202
- ],
198
+ press: mutationActions(
199
+ functionId,
200
+ {
201
+ action: 'addTodo',
202
+ text: spec.$state(todoStatePaths.newTodoText),
203
+ },
204
+ 'Could not add todo. Try again.',
205
+ defineTypedSduiStateAssignments<TodoAppState>({
206
+ [todoStatePaths.newTodoText]: '',
207
+ }),
208
+ ),
203
209
  },
204
210
  }),
205
211
  ],
206
212
  });
207
213
  }
208
214
 
209
- function buildTodoItems(spec: TodoSpec, functionApiName: string) {
210
- const [todoRepeat, todo] = spec.repeat('/todoList/todos', 'id');
215
+ function buildTodoItems(spec: TodoSpec, functionId: string) {
216
+ const [todoRepeat, todo] = spec.repeat(todoStatePaths.todoListTodos, 'id');
211
217
 
212
218
  return VStack({
213
219
  id: 'todoItems',
@@ -231,31 +237,17 @@ function buildTodoItems(spec: TodoSpec, functionApiName: string) {
231
237
  props: {
232
238
  name: 'completed',
233
239
  value: todo.$bind('completed'),
234
- isDisabled: spec.$state('/isMutating'),
240
+ isDisabled: spec.$state(todoStatePaths.isMutating),
235
241
  },
236
242
  on: {
237
- change: [
238
- setMutationState(true),
239
- triggerFunction(
240
- {
241
- functionApiName,
242
- inputs: {
243
- action: 'toggleTodo',
244
- todoId: todo.$('id'),
245
- },
246
- responsePath: '/todoList',
247
- },
248
- {
249
- onSuccess: { set: { '/errorMessage': '', '/isMutating': false } },
250
- onError: {
251
- set: {
252
- '/errorMessage': 'Could not update todo. Refresh and try again.',
253
- '/isMutating': false,
254
- },
255
- },
256
- },
257
- ),
258
- ],
243
+ change: mutationActions(
244
+ functionId,
245
+ {
246
+ action: 'toggleTodo',
247
+ todoId: todo.$('id'),
248
+ },
249
+ 'Could not update todo. Refresh and try again.',
250
+ ),
259
251
  },
260
252
  }),
261
253
  Text({
@@ -272,7 +264,7 @@ function buildTodoItems(spec: TodoSpec, functionApiName: string) {
272
264
  });
273
265
  }
274
266
 
275
- function buildTodoList(spec: TodoSpec, functionApiName: string) {
267
+ function buildTodoList(spec: TodoSpec, functionId: string) {
276
268
  return VStack({
277
269
  id: 'todoList',
278
270
  props: {
@@ -301,46 +293,35 @@ function buildTodoList(spec: TodoSpec, functionApiName: string) {
301
293
  appearance: 'OUTLINE',
302
294
  size: 'S',
303
295
  isDisabled: spec.$cond(
304
- or_(equals(spec.$state('/isMutating'), true), equals(spec.$state('/todoList/isEmpty'), true)),
296
+ or_(
297
+ equals(spec.$state(todoStatePaths.isMutating), true),
298
+ equals(spec.$state(todoStatePaths.todoListIsEmpty), true),
299
+ ),
305
300
  true,
306
301
  false,
307
302
  ),
308
303
  },
309
304
  on: {
310
- press: [
311
- setMutationState(true),
312
- triggerFunction(
313
- {
314
- functionApiName,
315
- inputs: {
316
- action: 'clearCompleted',
317
- },
318
- responsePath: '/todoList',
319
- },
320
- {
321
- onSuccess: { set: { '/errorMessage': '', '/isMutating': false } },
322
- onError: {
323
- set: {
324
- '/errorMessage': 'Could not clear completed todos. Try again.',
325
- '/isMutating': false,
326
- },
327
- },
328
- },
329
- ),
330
- ],
305
+ press: mutationActions(
306
+ functionId,
307
+ {
308
+ action: 'clearCompleted',
309
+ },
310
+ 'Could not clear completed todos. Try again.',
311
+ ),
331
312
  },
332
313
  }),
333
314
  ],
334
315
  }),
335
316
  Text({
336
317
  id: 'emptyTodos',
337
- visible: equals(spec.$state('/todoList/isEmpty'), true),
318
+ visible: equals(spec.$state(todoStatePaths.todoListIsEmpty), true),
338
319
  props: {
339
320
  text: 'No todos yet.',
340
321
  color: 'colorOnSurfaceVariant',
341
322
  },
342
323
  }),
343
- buildTodoItems(spec, functionApiName),
324
+ buildTodoItems(spec, functionId),
344
325
  ],
345
326
  });
346
327
  }
@@ -348,9 +329,9 @@ function buildTodoList(spec: TodoSpec, functionApiName: string) {
348
329
  function buildError(spec: TodoSpec) {
349
330
  return Text({
350
331
  id: 'todoError',
351
- visible: neq(spec.$state('/errorMessage'), ''),
332
+ visible: neq(spec.$state(todoStatePaths.errorMessage), ''),
352
333
  props: {
353
- text: spec.$state('/errorMessage'),
334
+ text: spec.$state(todoStatePaths.errorMessage),
354
335
  color: 'colorError',
355
336
  },
356
337
  });
@@ -360,7 +341,7 @@ function buildLoading(spec: TodoSpec) {
360
341
  return Text({
361
342
  id: 'todoLoading',
362
343
  // Keep disabled controls explainable while a triggerFunction call is in flight.
363
- visible: equals(spec.$state('/isMutating'), true),
344
+ visible: equals(spec.$state(todoStatePaths.isMutating), true),
364
345
  props: {
365
346
  text: 'Updating todos...',
366
347
  color: 'colorOnSurfaceVariant',
@@ -368,7 +349,7 @@ function buildLoading(spec: TodoSpec) {
368
349
  });
369
350
  }
370
351
 
371
- function buildTodoCard(spec: TodoSpec, functionApiName: string) {
352
+ function buildTodoCard(spec: TodoSpec, functionId: string) {
372
353
  return Card({
373
354
  id: 'todoCard',
374
355
  props: {},
@@ -380,17 +361,17 @@ function buildTodoCard(spec: TodoSpec, functionApiName: string) {
380
361
  padding: 'space400',
381
362
  },
382
363
  children: [
383
- buildAddTodoSection(spec, functionApiName),
364
+ buildAddTodoSection(spec, functionId),
384
365
  buildError(spec),
385
366
  buildLoading(spec),
386
- buildTodoList(spec, functionApiName),
367
+ buildTodoList(spec, functionId),
387
368
  ],
388
369
  }),
389
370
  ],
390
371
  });
391
372
  }
392
373
 
393
- function renderSpec(state: TodoAppState, functionApiName: string) {
374
+ function renderSpec(state: TodoAppState, functionId: string) {
394
375
  const spec = createSpec<TodoAppState>({ state });
395
376
  const root = PageContent({
396
377
  id: 'todoApp',
@@ -398,100 +379,92 @@ function renderSpec(state: TodoAppState, functionApiName: string) {
398
379
  size: '776',
399
380
  alignment: 'CENTER',
400
381
  },
401
- children: [buildTodoCard(spec, functionApiName)],
382
+ children: [buildTodoCard(spec, functionId)],
402
383
  });
403
384
 
404
385
  return render({ root, state });
405
386
  }
406
387
 
407
388
  async function addTodo(
408
- client: RipplingSDK,
409
- params: TodoPageFunctionParameters,
389
+ manager: TypedCustomObjectRecordManager<typeof todoDefinition>,
390
+ params: TypedSduiPageActionParams<TodoPageFunctionParameters, 'addTodo'>,
410
391
  roleId: string,
411
392
  ): Promise<TodoListState> {
412
- const text = stringParam(params, 'text');
393
+ const text = todoTextParam(params);
413
394
 
414
395
  if (!text) {
415
396
  throw new Error('Todo text is required');
416
397
  }
417
398
 
418
- await client.customObjects.records.create(OBJECT_API_NAME, {
399
+ await manager.create({
419
400
  name: text,
420
- completed__c: false,
401
+ completed: false,
421
402
  });
422
403
 
423
- return todoListState(await listTodos(client, roleId));
404
+ return todoListState(await listTodos(manager, roleId));
424
405
  }
425
406
 
426
407
  async function toggleTodo(
427
- client: RipplingSDK,
428
- params: TodoPageFunctionParameters,
408
+ manager: TypedCustomObjectRecordManager<typeof todoDefinition>,
409
+ params: TypedSduiPageActionParams<TodoPageFunctionParameters, 'toggleTodo'>,
429
410
  roleId: string,
430
411
  ): Promise<TodoListState> {
431
- const todoId = stringParam(params, 'todoId');
412
+ const todoId = todoIdParam(params);
432
413
 
433
414
  if (!todoId) {
434
415
  throw new Error('todoId must be a todo record ID');
435
416
  }
436
417
 
437
- const todo = toTodo(await client.customObjects.records.retrieve(OBJECT_API_NAME, todoId));
438
- await client.customObjects.records.update(OBJECT_API_NAME, todoId, {
439
- completed__c: !todo.completed,
418
+ const todo = toTodo(await manager.get(todoId));
419
+ await manager.update(todoId, {
420
+ completed: !todo.completed,
440
421
  });
441
422
 
442
- return todoListState(await listTodos(client, roleId));
423
+ return todoListState(await listTodos(manager, roleId));
443
424
  }
444
425
 
445
- async function clearCompleted(client: RipplingSDK, roleId: string): Promise<TodoListState> {
446
- const todos = await listTodos(client, roleId);
426
+ async function clearCompleted(
427
+ manager: TypedCustomObjectRecordManager<typeof todoDefinition>,
428
+ roleId: string,
429
+ ): Promise<TodoListState> {
430
+ const todos = await listTodos(manager, roleId);
447
431
  const completedTodoIds = todos.filter((todo) => todo.completed).map((todo) => todo.id);
448
432
 
449
433
  if (completedTodoIds.length === 0) {
450
434
  return todoListState(todos);
451
435
  }
452
436
 
453
- await client.customObjects.records.bulkDelete(OBJECT_API_NAME, {
454
- all_or_nothing: false,
455
- rows_to_delete: completedTodoIds,
437
+ await manager.deleteMany(completedTodoIds, {
438
+ allOrNothing: false,
456
439
  });
457
440
 
458
- return todoListState(await listTodos(client, roleId));
441
+ return todoListState(await listTodos(manager, roleId));
459
442
  }
460
443
 
444
+ const defineTodoPageHandler = defineTypedSduiPageHandlerFor<TodoPageFunctionParameters, TodoListState>();
445
+
446
+ const todoPageHandler = defineTodoPageHandler({
447
+ requireRoleId: true,
448
+ createRuntime(context) {
449
+ return {
450
+ manager: createTodoManager(context),
451
+ functionId: context.function.function_id,
452
+ };
453
+ },
454
+ async init({ runtime, roleId }) {
455
+ const todos = await listTodos(runtime.manager, roleId);
456
+ return renderSpec(todoState(todos), runtime.functionId);
457
+ },
458
+ actions: {
459
+ addTodo: async ({ runtime, params, roleId }) => addTodo(runtime.manager, params, roleId),
460
+ toggleTodo: async ({ runtime, params, roleId }) => toggleTodo(runtime.manager, params, roleId),
461
+ clearCompleted: async ({ runtime, roleId }) => clearCompleted(runtime.manager, roleId),
462
+ },
463
+ });
464
+
461
465
  export async function onRipplingEvent(
462
- event: SduiPageFunctionEvent<TodoPageFunctionParameters>,
466
+ event: Input,
463
467
  context: FunctionContext,
464
- ): Promise<FunctionResponse> {
465
- const params = event.parameters;
466
- const action = params.action;
467
- const roleId = context.function.role_id;
468
- if (!roleId) {
469
- return badRequest('Role ID is required');
470
- }
471
-
472
- try {
473
- const client = createClient(context);
474
-
475
- if (action === 'init') {
476
- const functionApiName = context.function.function_api_name;
477
- const todos = await listTodos(client, roleId);
478
- return ok({ spec: JSON.stringify(renderSpec(todoState(todos), functionApiName)) });
479
- }
480
-
481
- if (action === 'addTodo') {
482
- return ok(await addTodo(client, params, roleId));
483
- }
484
-
485
- if (action === 'toggleTodo') {
486
- return ok(await toggleTodo(client, params, roleId));
487
- }
488
-
489
- if (action === 'clearCompleted') {
490
- return ok(await clearCompleted(client, roleId));
491
- }
492
-
493
- return badRequest(`Unknown action: ${action}`);
494
- } catch (error) {
495
- return serverError(error);
496
- }
468
+ ): Promise<FunctionResponse<Output>> {
469
+ return todoPageHandler(event, context);
497
470
  }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Typed custom-object schema for the custom SDUI todo example.
3
+ */
4
+
5
+ import { boolean, defineCustomObject, section } from '@rippling/rippling-sdk/core/platform/custom-objects';
6
+
7
+ /** Logical category shared by the custom SDUI todo example. */
8
+ export const CUSTOM_TODO_CATEGORY = 'custom_todo_app';
9
+
10
+ /** Typed schema used by the custom SDUI todo manifest and function code. */
11
+ export const todoDefinition = defineCustomObject({
12
+ name: 'todo',
13
+ displayName: 'Todo',
14
+ pluralLabel: 'Todos',
15
+ category: CUSTOM_TODO_CATEGORY,
16
+ description: 'A todo item rendered by a custom SDUI page.',
17
+ icon: { emoji: '✅' },
18
+ sections: {
19
+ details: section('Details', { sectionId: 'sec_custom_todo_details' }),
20
+ },
21
+ fields: {
22
+ completed: boolean({
23
+ displayName: 'Completed',
24
+ description: 'Whether the todo item is complete',
25
+ section: 'details',
26
+ }),
27
+ },
28
+ });