@rippling/rippling-sdk 0.2.0-alpha.108 → 0.2.0-alpha.110

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 (366) hide show
  1. package/client.d.mts +14 -0
  2. package/client.d.mts.map +1 -1
  3. package/client.d.ts +14 -0
  4. package/client.d.ts.map +1 -1
  5. package/client.js +18 -0
  6. package/client.js.map +1 -1
  7. package/client.mjs +18 -0
  8. package/client.mjs.map +1 -1
  9. package/index.d.mts +5 -0
  10. package/index.d.mts.map +1 -1
  11. package/index.d.ts +5 -0
  12. package/index.d.ts.map +1 -1
  13. package/index.js +11 -1
  14. package/index.js.map +1 -1
  15. package/index.mjs +5 -0
  16. package/index.mjs.map +1 -1
  17. package/lib/charts/builders.d.mts +18 -19
  18. package/lib/charts/builders.d.mts.map +1 -1
  19. package/lib/charts/builders.d.ts +18 -19
  20. package/lib/charts/builders.d.ts.map +1 -1
  21. package/lib/charts/builders.js +35 -28
  22. package/lib/charts/builders.js.map +1 -1
  23. package/lib/charts/builders.mjs +35 -28
  24. package/lib/charts/builders.mjs.map +1 -1
  25. package/lib/charts/describe.d.mts +6 -7
  26. package/lib/charts/describe.d.mts.map +1 -1
  27. package/lib/charts/describe.d.ts +6 -7
  28. package/lib/charts/describe.d.ts.map +1 -1
  29. package/lib/charts/describe.js +26 -27
  30. package/lib/charts/describe.js.map +1 -1
  31. package/lib/charts/describe.mjs +27 -28
  32. package/lib/charts/describe.mjs.map +1 -1
  33. package/lib/charts/errors.d.mts +2 -6
  34. package/lib/charts/errors.d.mts.map +1 -1
  35. package/lib/charts/errors.d.ts +2 -6
  36. package/lib/charts/errors.d.ts.map +1 -1
  37. package/lib/charts/errors.js +2 -6
  38. package/lib/charts/errors.js.map +1 -1
  39. package/lib/charts/errors.mjs +2 -6
  40. package/lib/charts/errors.mjs.map +1 -1
  41. package/lib/charts/evaluate.d.mts +5 -7
  42. package/lib/charts/evaluate.d.mts.map +1 -1
  43. package/lib/charts/evaluate.d.ts +5 -7
  44. package/lib/charts/evaluate.d.ts.map +1 -1
  45. package/lib/charts/evaluate.js +21 -35
  46. package/lib/charts/evaluate.js.map +1 -1
  47. package/lib/charts/evaluate.mjs +22 -36
  48. package/lib/charts/evaluate.mjs.map +1 -1
  49. package/lib/charts/schema.d.mts +8 -97
  50. package/lib/charts/schema.d.mts.map +1 -1
  51. package/lib/charts/schema.d.ts +8 -97
  52. package/lib/charts/schema.d.ts.map +1 -1
  53. package/lib/charts/schema.js +186 -65
  54. package/lib/charts/schema.js.map +1 -1
  55. package/lib/charts/schema.mjs +185 -65
  56. package/lib/charts/schema.mjs.map +1 -1
  57. package/lib/charts/types.d.mts +40 -25
  58. package/lib/charts/types.d.mts.map +1 -1
  59. package/lib/charts/types.d.ts +40 -25
  60. package/lib/charts/types.d.ts.map +1 -1
  61. package/lib/charts/types.js +8 -10
  62. package/lib/charts/types.js.map +1 -1
  63. package/lib/charts/types.mjs +8 -10
  64. package/lib/charts/types.mjs.map +1 -1
  65. package/lib/charts/visualization-grammar.d.mts +66 -0
  66. package/lib/charts/visualization-grammar.d.mts.map +1 -0
  67. package/lib/charts/visualization-grammar.d.ts +66 -0
  68. package/lib/charts/visualization-grammar.d.ts.map +1 -0
  69. package/lib/charts/visualization-grammar.js +70 -0
  70. package/lib/charts/visualization-grammar.js.map +1 -0
  71. package/lib/charts/visualization-grammar.mjs +67 -0
  72. package/lib/charts/visualization-grammar.mjs.map +1 -0
  73. package/lib/charts/vocabulary.d.mts +7 -0
  74. package/lib/charts/vocabulary.d.mts.map +1 -0
  75. package/lib/charts/vocabulary.d.ts +7 -0
  76. package/lib/charts/vocabulary.d.ts.map +1 -0
  77. package/lib/charts/vocabulary.js +10 -0
  78. package/lib/charts/vocabulary.js.map +1 -0
  79. package/lib/charts/vocabulary.mjs +7 -0
  80. package/lib/charts/vocabulary.mjs.map +1 -0
  81. package/lib/charts.d.mts +3 -3
  82. package/lib/charts.d.mts.map +1 -1
  83. package/lib/charts.d.ts +3 -3
  84. package/lib/charts.d.ts.map +1 -1
  85. package/lib/charts.js +2 -1
  86. package/lib/charts.js.map +1 -1
  87. package/lib/charts.mjs +1 -1
  88. package/lib/charts.mjs.map +1 -1
  89. package/lib/manifest/composition.d.mts +21 -0
  90. package/lib/manifest/composition.d.mts.map +1 -0
  91. package/lib/manifest/composition.d.ts +21 -0
  92. package/lib/manifest/composition.d.ts.map +1 -0
  93. package/lib/manifest/composition.js +103 -0
  94. package/lib/manifest/composition.js.map +1 -0
  95. package/lib/manifest/composition.mjs +99 -0
  96. package/lib/manifest/composition.mjs.map +1 -0
  97. package/lib/manifest/definitions/_object-records.d.mts +23 -0
  98. package/lib/manifest/definitions/_object-records.d.mts.map +1 -0
  99. package/lib/manifest/definitions/_object-records.d.ts +23 -0
  100. package/lib/manifest/definitions/_object-records.d.ts.map +1 -0
  101. package/lib/manifest/definitions/_object-records.js +151 -0
  102. package/lib/manifest/definitions/_object-records.js.map +1 -0
  103. package/lib/manifest/definitions/_object-records.mjs +147 -0
  104. package/lib/manifest/definitions/_object-records.mjs.map +1 -0
  105. package/lib/manifest/definitions/action.d.mts +7 -0
  106. package/lib/manifest/definitions/action.d.mts.map +1 -0
  107. package/lib/manifest/definitions/action.d.ts +7 -0
  108. package/lib/manifest/definitions/action.d.ts.map +1 -0
  109. package/lib/manifest/definitions/action.js +25 -0
  110. package/lib/manifest/definitions/action.js.map +1 -0
  111. package/lib/manifest/definitions/action.mjs +22 -0
  112. package/lib/manifest/definitions/action.mjs.map +1 -0
  113. package/lib/manifest/definitions/agent.d.mts +51 -0
  114. package/lib/manifest/definitions/agent.d.mts.map +1 -0
  115. package/lib/manifest/definitions/agent.d.ts +51 -0
  116. package/lib/manifest/definitions/agent.d.ts.map +1 -0
  117. package/lib/manifest/definitions/agent.js +65 -0
  118. package/lib/manifest/definitions/agent.js.map +1 -0
  119. package/lib/manifest/definitions/agent.mjs +59 -0
  120. package/lib/manifest/definitions/agent.mjs.map +1 -0
  121. package/lib/manifest/definitions/app.d.mts +3 -0
  122. package/lib/manifest/definitions/app.d.mts.map +1 -0
  123. package/lib/manifest/definitions/app.d.ts +3 -0
  124. package/lib/manifest/definitions/app.d.ts.map +1 -0
  125. package/lib/manifest/definitions/app.js +14 -0
  126. package/lib/manifest/definitions/app.js.map +1 -0
  127. package/lib/manifest/definitions/app.mjs +11 -0
  128. package/lib/manifest/definitions/app.mjs.map +1 -0
  129. package/lib/manifest/definitions/category.d.mts +9 -0
  130. package/lib/manifest/definitions/category.d.mts.map +1 -0
  131. package/lib/manifest/definitions/category.d.ts +9 -0
  132. package/lib/manifest/definitions/category.d.ts.map +1 -0
  133. package/lib/manifest/definitions/category.js +27 -0
  134. package/lib/manifest/definitions/category.js.map +1 -0
  135. package/lib/manifest/definitions/category.mjs +23 -0
  136. package/lib/manifest/definitions/category.mjs.map +1 -0
  137. package/lib/manifest/definitions/component.d.mts +101 -0
  138. package/lib/manifest/definitions/component.d.mts.map +1 -0
  139. package/lib/manifest/definitions/component.d.ts +101 -0
  140. package/lib/manifest/definitions/component.d.ts.map +1 -0
  141. package/lib/manifest/definitions/component.js +106 -0
  142. package/lib/manifest/definitions/component.js.map +1 -0
  143. package/lib/manifest/definitions/component.mjs +97 -0
  144. package/lib/manifest/definitions/component.mjs.map +1 -0
  145. package/lib/manifest/definitions/custom-field-section.d.mts +13 -0
  146. package/lib/manifest/definitions/custom-field-section.d.mts.map +1 -0
  147. package/lib/manifest/definitions/custom-field-section.d.ts +13 -0
  148. package/lib/manifest/definitions/custom-field-section.d.ts.map +1 -0
  149. package/lib/manifest/definitions/custom-field-section.js +15 -0
  150. package/lib/manifest/definitions/custom-field-section.js.map +1 -0
  151. package/lib/manifest/definitions/custom-field-section.mjs +12 -0
  152. package/lib/manifest/definitions/custom-field-section.mjs.map +1 -0
  153. package/lib/manifest/definitions/custom-field.d.mts +10 -0
  154. package/lib/manifest/definitions/custom-field.d.mts.map +1 -0
  155. package/lib/manifest/definitions/custom-field.d.ts +10 -0
  156. package/lib/manifest/definitions/custom-field.d.ts.map +1 -0
  157. package/lib/manifest/definitions/custom-field.js +18 -0
  158. package/lib/manifest/definitions/custom-field.js.map +1 -0
  159. package/lib/manifest/definitions/custom-field.mjs +15 -0
  160. package/lib/manifest/definitions/custom-field.mjs.map +1 -0
  161. package/lib/manifest/definitions/custom-object.d.mts +162 -0
  162. package/lib/manifest/definitions/custom-object.d.mts.map +1 -0
  163. package/lib/manifest/definitions/custom-object.d.ts +162 -0
  164. package/lib/manifest/definitions/custom-object.d.ts.map +1 -0
  165. package/lib/manifest/definitions/custom-object.js +412 -0
  166. package/lib/manifest/definitions/custom-object.js.map +1 -0
  167. package/lib/manifest/definitions/custom-object.mjs +386 -0
  168. package/lib/manifest/definitions/custom-object.mjs.map +1 -0
  169. package/lib/manifest/definitions/custom-skill.d.mts +8 -0
  170. package/lib/manifest/definitions/custom-skill.d.mts.map +1 -0
  171. package/lib/manifest/definitions/custom-skill.d.ts +8 -0
  172. package/lib/manifest/definitions/custom-skill.d.ts.map +1 -0
  173. package/lib/manifest/definitions/custom-skill.js +15 -0
  174. package/lib/manifest/definitions/custom-skill.js.map +1 -0
  175. package/lib/manifest/definitions/custom-skill.mjs +12 -0
  176. package/lib/manifest/definitions/custom-skill.mjs.map +1 -0
  177. package/lib/manifest/definitions/field-section.d.mts +7 -0
  178. package/lib/manifest/definitions/field-section.d.mts.map +1 -0
  179. package/lib/manifest/definitions/field-section.d.ts +7 -0
  180. package/lib/manifest/definitions/field-section.d.ts.map +1 -0
  181. package/lib/manifest/definitions/field-section.js +16 -0
  182. package/lib/manifest/definitions/field-section.js.map +1 -0
  183. package/lib/manifest/definitions/field-section.mjs +13 -0
  184. package/lib/manifest/definitions/field-section.mjs.map +1 -0
  185. package/lib/manifest/definitions/field.d.mts +38 -0
  186. package/lib/manifest/definitions/field.d.mts.map +1 -0
  187. package/lib/manifest/definitions/field.d.ts +38 -0
  188. package/lib/manifest/definitions/field.d.ts.map +1 -0
  189. package/lib/manifest/definitions/field.js +50 -0
  190. package/lib/manifest/definitions/field.js.map +1 -0
  191. package/lib/manifest/definitions/field.mjs +45 -0
  192. package/lib/manifest/definitions/field.mjs.map +1 -0
  193. package/lib/manifest/definitions/function.d.mts +61 -0
  194. package/lib/manifest/definitions/function.d.mts.map +1 -0
  195. package/lib/manifest/definitions/function.d.ts +61 -0
  196. package/lib/manifest/definitions/function.d.ts.map +1 -0
  197. package/lib/manifest/definitions/function.js +79 -0
  198. package/lib/manifest/definitions/function.js.map +1 -0
  199. package/lib/manifest/definitions/function.mjs +73 -0
  200. package/lib/manifest/definitions/function.mjs.map +1 -0
  201. package/lib/manifest/definitions/index.d.mts +22 -0
  202. package/lib/manifest/definitions/index.d.mts.map +1 -0
  203. package/lib/manifest/definitions/index.d.ts +22 -0
  204. package/lib/manifest/definitions/index.d.ts.map +1 -0
  205. package/lib/manifest/definitions/index.js +64 -0
  206. package/lib/manifest/definitions/index.js.map +1 -0
  207. package/lib/manifest/definitions/index.mjs +22 -0
  208. package/lib/manifest/definitions/index.mjs.map +1 -0
  209. package/lib/manifest/definitions/list-view.d.mts +9 -0
  210. package/lib/manifest/definitions/list-view.d.mts.map +1 -0
  211. package/lib/manifest/definitions/list-view.d.ts +9 -0
  212. package/lib/manifest/definitions/list-view.d.ts.map +1 -0
  213. package/lib/manifest/definitions/list-view.js +25 -0
  214. package/lib/manifest/definitions/list-view.js.map +1 -0
  215. package/lib/manifest/definitions/list-view.mjs +22 -0
  216. package/lib/manifest/definitions/list-view.mjs.map +1 -0
  217. package/lib/manifest/definitions/object-search-config.d.mts +13 -0
  218. package/lib/manifest/definitions/object-search-config.d.mts.map +1 -0
  219. package/lib/manifest/definitions/object-search-config.d.ts +13 -0
  220. package/lib/manifest/definitions/object-search-config.d.ts.map +1 -0
  221. package/lib/manifest/definitions/object-search-config.js +25 -0
  222. package/lib/manifest/definitions/object-search-config.js.map +1 -0
  223. package/lib/manifest/definitions/object-search-config.mjs +22 -0
  224. package/lib/manifest/definitions/object-search-config.mjs.map +1 -0
  225. package/lib/manifest/definitions/object-settings.d.mts +24 -0
  226. package/lib/manifest/definitions/object-settings.d.mts.map +1 -0
  227. package/lib/manifest/definitions/object-settings.d.ts +24 -0
  228. package/lib/manifest/definitions/object-settings.d.ts.map +1 -0
  229. package/lib/manifest/definitions/object-settings.js +32 -0
  230. package/lib/manifest/definitions/object-settings.js.map +1 -0
  231. package/lib/manifest/definitions/object-settings.mjs +29 -0
  232. package/lib/manifest/definitions/object-settings.mjs.map +1 -0
  233. package/lib/manifest/definitions/page-layout.d.mts +21 -0
  234. package/lib/manifest/definitions/page-layout.d.mts.map +1 -0
  235. package/lib/manifest/definitions/page-layout.d.ts +21 -0
  236. package/lib/manifest/definitions/page-layout.d.ts.map +1 -0
  237. package/lib/manifest/definitions/page-layout.js +155 -0
  238. package/lib/manifest/definitions/page-layout.js.map +1 -0
  239. package/lib/manifest/definitions/page-layout.mjs +152 -0
  240. package/lib/manifest/definitions/page-layout.mjs.map +1 -0
  241. package/lib/manifest/definitions/page.d.mts +8 -0
  242. package/lib/manifest/definitions/page.d.mts.map +1 -0
  243. package/lib/manifest/definitions/page.d.ts +8 -0
  244. package/lib/manifest/definitions/page.d.ts.map +1 -0
  245. package/lib/manifest/definitions/page.js +15 -0
  246. package/lib/manifest/definitions/page.js.map +1 -0
  247. package/lib/manifest/definitions/page.mjs +12 -0
  248. package/lib/manifest/definitions/page.mjs.map +1 -0
  249. package/lib/manifest/definitions/record-triggered-flow.d.mts +24 -0
  250. package/lib/manifest/definitions/record-triggered-flow.d.mts.map +1 -0
  251. package/lib/manifest/definitions/record-triggered-flow.d.ts +24 -0
  252. package/lib/manifest/definitions/record-triggered-flow.d.ts.map +1 -0
  253. package/lib/manifest/definitions/record-triggered-flow.js +28 -0
  254. package/lib/manifest/definitions/record-triggered-flow.js.map +1 -0
  255. package/lib/manifest/definitions/record-triggered-flow.mjs +25 -0
  256. package/lib/manifest/definitions/record-triggered-flow.mjs.map +1 -0
  257. package/lib/manifest/definitions/validation.d.mts +8 -0
  258. package/lib/manifest/definitions/validation.d.mts.map +1 -0
  259. package/lib/manifest/definitions/validation.d.ts +8 -0
  260. package/lib/manifest/definitions/validation.d.ts.map +1 -0
  261. package/lib/manifest/definitions/validation.js +24 -0
  262. package/lib/manifest/definitions/validation.js.map +1 -0
  263. package/lib/manifest/definitions/validation.mjs +21 -0
  264. package/lib/manifest/definitions/validation.mjs.map +1 -0
  265. package/lib/manifest/definitions/workflow.d.mts +10 -0
  266. package/lib/manifest/definitions/workflow.d.mts.map +1 -0
  267. package/lib/manifest/definitions/workflow.d.ts +10 -0
  268. package/lib/manifest/definitions/workflow.d.ts.map +1 -0
  269. package/lib/manifest/definitions/workflow.js +33 -0
  270. package/lib/manifest/definitions/workflow.js.map +1 -0
  271. package/lib/manifest/definitions/workflow.mjs +29 -0
  272. package/lib/manifest/definitions/workflow.mjs.map +1 -0
  273. package/lib/manifest/index.d.mts +3 -0
  274. package/lib/manifest/index.d.mts.map +1 -1
  275. package/lib/manifest/index.d.ts +3 -0
  276. package/lib/manifest/index.d.ts.map +1 -1
  277. package/lib/manifest/index.js +4 -0
  278. package/lib/manifest/index.js.map +1 -1
  279. package/lib/manifest/index.mjs +3 -0
  280. package/lib/manifest/index.mjs.map +1 -1
  281. package/lib/manifest/package-manifest.d.mts +17 -0
  282. package/lib/manifest/package-manifest.d.mts.map +1 -0
  283. package/lib/manifest/package-manifest.d.ts +17 -0
  284. package/lib/manifest/package-manifest.d.ts.map +1 -0
  285. package/lib/manifest/package-manifest.js +26 -0
  286. package/lib/manifest/package-manifest.js.map +1 -0
  287. package/lib/manifest/package-manifest.mjs +23 -0
  288. package/lib/manifest/package-manifest.mjs.map +1 -0
  289. package/package.json +4 -2
  290. package/resources/index.d.mts +1 -0
  291. package/resources/index.d.mts.map +1 -1
  292. package/resources/index.d.ts +1 -0
  293. package/resources/index.d.ts.map +1 -1
  294. package/resources/index.js +4 -2
  295. package/resources/index.js.map +1 -1
  296. package/resources/index.mjs +1 -0
  297. package/resources/index.mjs.map +1 -1
  298. package/resources/reimbursements.d.mts +1 -1
  299. package/resources/reimbursements.d.ts +1 -1
  300. package/resources/reimbursements.js +1 -1
  301. package/resources/reimbursements.mjs +1 -1
  302. package/resources/spend-categories.d.mts +140 -0
  303. package/resources/spend-categories.d.mts.map +1 -0
  304. package/resources/spend-categories.d.ts +140 -0
  305. package/resources/spend-categories.d.ts.map +1 -0
  306. package/resources/spend-categories.js +83 -0
  307. package/resources/spend-categories.js.map +1 -0
  308. package/resources/spend-categories.mjs +79 -0
  309. package/resources/spend-categories.mjs.map +1 -0
  310. package/src/client.ts +41 -0
  311. package/src/index.ts +17 -0
  312. package/src/lib/charts/README.md +35 -28
  313. package/src/lib/charts/agent-reference.md +73 -0
  314. package/src/lib/charts/builders.ts +51 -35
  315. package/src/lib/charts/capabilities.json +96 -0
  316. package/src/lib/charts/describe.ts +31 -29
  317. package/src/lib/charts/errors.ts +2 -6
  318. package/src/lib/charts/evaluate.ts +25 -38
  319. package/src/lib/charts/schema.ts +232 -66
  320. package/src/lib/charts/types.ts +42 -31
  321. package/src/lib/charts/visualization-grammar.ts +67 -0
  322. package/src/lib/charts/vocabulary.ts +7 -0
  323. package/src/lib/charts.ts +8 -1
  324. package/src/lib/manifest/composition.ts +133 -0
  325. package/src/lib/manifest/definitions/README.md +89 -0
  326. package/src/lib/manifest/definitions/_object-records.ts +218 -0
  327. package/src/lib/manifest/definitions/action.ts +31 -0
  328. package/src/lib/manifest/definitions/agent.ts +149 -0
  329. package/src/lib/manifest/definitions/app.ts +12 -0
  330. package/src/lib/manifest/definitions/category.ts +35 -0
  331. package/src/lib/manifest/definitions/component.ts +241 -0
  332. package/src/lib/manifest/definitions/custom-field-section.ts +39 -0
  333. package/src/lib/manifest/definitions/custom-field.ts +32 -0
  334. package/src/lib/manifest/definitions/custom-object.ts +786 -0
  335. package/src/lib/manifest/definitions/custom-skill.ts +28 -0
  336. package/src/lib/manifest/definitions/field-section.ts +31 -0
  337. package/src/lib/manifest/definitions/field.ts +119 -0
  338. package/src/lib/manifest/definitions/function.ts +198 -0
  339. package/src/lib/manifest/definitions/index.ts +91 -0
  340. package/src/lib/manifest/definitions/list-view.ts +48 -0
  341. package/src/lib/manifest/definitions/object-search-config.ts +44 -0
  342. package/src/lib/manifest/definitions/object-settings.ts +61 -0
  343. package/src/lib/manifest/definitions/page-layout.ts +218 -0
  344. package/src/lib/manifest/definitions/page.ts +28 -0
  345. package/src/lib/manifest/definitions/record-triggered-flow.ts +71 -0
  346. package/src/lib/manifest/definitions/validation.ts +46 -0
  347. package/src/lib/manifest/definitions/workflow.ts +62 -0
  348. package/src/lib/manifest/index.ts +4 -0
  349. package/src/lib/manifest/package-manifest.ts +40 -0
  350. package/src/resources/index.ts +7 -0
  351. package/src/resources/reimbursements.ts +1 -1
  352. package/src/resources/spend-categories.ts +175 -0
  353. package/src/version.ts +1 -1
  354. package/version.d.mts +1 -1
  355. package/version.d.ts +1 -1
  356. package/version.js +1 -1
  357. package/version.mjs +1 -1
  358. package/lib/charts/guards.d.mts +0 -15
  359. package/lib/charts/guards.d.mts.map +0 -1
  360. package/lib/charts/guards.d.ts +0 -15
  361. package/lib/charts/guards.d.ts.map +0 -1
  362. package/lib/charts/guards.js +0 -38
  363. package/lib/charts/guards.js.map +0 -1
  364. package/lib/charts/guards.mjs +0 -34
  365. package/lib/charts/guards.mjs.map +0 -1
  366. package/src/lib/charts/guards.ts +0 -42
@@ -0,0 +1,786 @@
1
+ import {
2
+ buildProvisionableFieldParams,
3
+ buildCustomObjectNameFieldDetails,
4
+ } from '../../../core/platform/custom-objects/provisioning';
5
+ import { Category } from '../category';
6
+ import {
7
+ CustomObject,
8
+ type CustomObjectFieldInput,
9
+ type CustomObjectStandardFieldIdentifier,
10
+ } from '../custom-object';
11
+ import { Field } from '../field';
12
+ import { CustomObjectFieldSection } from '../custom-object-field-section';
13
+ import { CustomObjectPageLayout } from '../custom-object-page-layout';
14
+ import type { ManifestComponent } from '../manifest-builder';
15
+ import type { RipplingSDK } from '../../../client';
16
+ import {
17
+ defineCustomObject as createObject,
18
+ extendCustomObject as extendObject,
19
+ } from '../../../core/platform/custom-objects/definition';
20
+ import type { CustomObjectCategoryDefinition } from '../../../core/platform/custom-objects/category';
21
+ import type {
22
+ CustomObjectRecordsClient,
23
+ TypedBatchWriteOptions,
24
+ TypedRecordPageOptions,
25
+ TypedRecordQueryOptions,
26
+ TypedRecordPage,
27
+ } from '../../../core/platform/custom-objects/manager';
28
+ import {
29
+ createRqlHelpers,
30
+ type RqlFieldToken,
31
+ type RqlComparableValue,
32
+ type RqlFragment,
33
+ } from '../../../core/platform/custom-objects/rql';
34
+ import type {
35
+ AnyCustomObjectDefinition,
36
+ AnyFieldDefinition,
37
+ CustomObjectDefinition,
38
+ FieldDefinitions,
39
+ SectionDefinitions,
40
+ NameFieldDefinition,
41
+ RecordShape,
42
+ LogicalCustomObjectName,
43
+ LogicalCategoryName,
44
+ } from '../../../core/platform/custom-objects/types';
45
+ import type { RequestOptions } from '../../../internal/request-options';
46
+ import type {
47
+ FieldListParams,
48
+ CustomObjectField,
49
+ CustomObjectFieldsPageCursorURL,
50
+ } from '../../../resources/custom-objects/fields';
51
+ import type { CustomObject as DeployedCustomObject } from '../../../resources/custom-objects/custom-objects';
52
+ import type { APIPromise } from '../../../core/api-promise';
53
+ import type { PagePromise } from '../../../core/pagination';
54
+ import { categoryComponent, defineCategory } from './category';
55
+ import {
56
+ defineComponent,
57
+ detachedManifestScope,
58
+ withApiName,
59
+ validateCustomApiName,
60
+ type MetadataConfig,
61
+ registeredComponent,
62
+ type CompileContext,
63
+ type ComponentDefinition,
64
+ } from './component';
65
+ import type { ValueParser } from './function';
66
+ import {
67
+ assertObjectInput,
68
+ createObjectRecords,
69
+ type ObjectCreateInput,
70
+ type ObjectUpdateInput,
71
+ type ObjectBulkUpdateInput,
72
+ } from './_object-records';
73
+
74
+ export type { ObjectCreateInput, ObjectUpdateInput, ObjectBulkUpdateInput } from './_object-records';
75
+
76
+ export type DefineCustomObjectProps<
77
+ A extends `${string}__c`,
78
+ F extends FieldDefinitions,
79
+ C extends string = `${Unsuffixed<A>}_category`,
80
+ S extends SectionDefinitions = {},
81
+ N extends NameFieldDefinition = { kind: 'text' },
82
+ > = Omit<ObjectOptions<S, F, N>, 'pluralLabel'> & {
83
+ apiName: A;
84
+ name: string;
85
+ pluralName?: string;
86
+ category?: CategoryInput<C>;
87
+ };
88
+
89
+ export type DefinedCustomObject<D extends { fields: object; apiName: string }> = Omit<
90
+ D,
91
+ 'fields' | 'inputs' | 'records' | 'schema'
92
+ > & {
93
+ readonly fields: {
94
+ readonly [K in keyof D['fields']]: Omit<D['fields'][K], 'apiName'> & {
95
+ readonly apiName: `${Unsuffixed<Extract<K, string>>}__c`;
96
+ readonly objectApiName: D['apiName'];
97
+ };
98
+ };
99
+ readonly records: D extends AnyCustomObjectDefinition ? Readonly<ObjectRecords<D>> : never;
100
+ readonly schema: D extends AnyCustomObjectDefinition ? Readonly<ObjectSchema> : never;
101
+ readonly inputs: D extends AnyCustomObjectDefinition ?
102
+ {
103
+ readonly create: ValueParser<ObjectCreateInput<D>>;
104
+ readonly update: ValueParser<ObjectUpdateInput<D>>;
105
+ }
106
+ : never;
107
+ };
108
+
109
+ /** Authenticated records transport supplied at the operation's call site. */
110
+ export interface ObjectRecordsContext {
111
+ readonly customObjects: { readonly records: CustomObjectRecordsClient };
112
+ }
113
+
114
+ /** Schema resources supplied at the operation's call site. */
115
+ export interface ObjectSchemaContext {
116
+ readonly customObjects: Pick<RipplingSDK['customObjects'], 'retrieve' | 'fields'>;
117
+ }
118
+
119
+ export type ObjectRecordListOptions<D extends AnyCustomObjectDefinition> = TypedRecordPageOptions & {
120
+ where?: ObjectFilter<D['apiName']>;
121
+ };
122
+
123
+ /** Typed record operations; supply an authenticated client at each call. */
124
+ export interface ObjectRecords<D extends AnyCustomObjectDefinition> {
125
+ create(ctx: ObjectRecordsContext, input: ObjectCreateInput<D>): Promise<RecordShape<D>>;
126
+ createMany(
127
+ ctx: ObjectRecordsContext,
128
+ rows: readonly ObjectCreateInput<D>[],
129
+ options?: TypedBatchWriteOptions,
130
+ ): Promise<readonly RecordShape<D>[]>;
131
+ get(ctx: ObjectRecordsContext, recordID: string): Promise<RecordShape<D>>;
132
+ getByExternalID(ctx: ObjectRecordsContext, externalID: string): Promise<RecordShape<D>>;
133
+ update(ctx: ObjectRecordsContext, recordID: string, patch: ObjectUpdateInput<D>): Promise<RecordShape<D>>;
134
+ updateMany(
135
+ ctx: ObjectRecordsContext,
136
+ rows: readonly ObjectBulkUpdateInput<D>[],
137
+ options?: TypedBatchWriteOptions,
138
+ ): Promise<readonly RecordShape<D>[]>;
139
+ delete(ctx: ObjectRecordsContext, recordID: string): Promise<void>;
140
+ deleteMany(
141
+ ctx: ObjectRecordsContext,
142
+ recordIDs: readonly string[],
143
+ options?: TypedBatchWriteOptions,
144
+ ): Promise<void>;
145
+ /** List records with optional typed filters and cursor pagination. */
146
+ list(ctx: ObjectRecordsContext, options?: ObjectRecordListOptions<D>): Promise<TypedRecordPage<D>>;
147
+ /** Run a raw RQL filter with cursor pagination. */
148
+ query(ctx: ObjectRecordsContext, options?: TypedRecordQueryOptions): Promise<TypedRecordPage<D>>;
149
+ }
150
+
151
+ /** Deployed object metadata, separate from the local field definitions. */
152
+ export interface ObjectSchema {
153
+ retrieve(ctx: ObjectSchemaContext, options?: RequestOptions): APIPromise<DeployedCustomObject>;
154
+ readonly fields: Readonly<ObjectSchemaFields>;
155
+ }
156
+
157
+ export interface ObjectSchemaFields {
158
+ list(
159
+ ctx: ObjectSchemaContext,
160
+ params?: FieldListParams,
161
+ options?: RequestOptions,
162
+ ): PagePromise<CustomObjectFieldsPageCursorURL, CustomObjectField>;
163
+ }
164
+
165
+ export interface CustomObjectOperations<D extends AnyCustomObjectDefinition> {
166
+ readonly records: Readonly<ObjectRecords<D>>;
167
+ readonly schema: Readonly<ObjectSchema>;
168
+ }
169
+
170
+ /** The same operations with the authenticated client supplied by client.objects(definition). */
171
+ export interface ObjectClient<D extends AnyCustomObjectDefinition> {
172
+ create(input: ObjectCreateInput<D>): Promise<RecordShape<D>>;
173
+ createMany(
174
+ rows: readonly ObjectCreateInput<D>[],
175
+ options?: TypedBatchWriteOptions,
176
+ ): Promise<readonly RecordShape<D>[]>;
177
+ get(recordID: string): Promise<RecordShape<D>>;
178
+ getByExternalID(externalID: string): Promise<RecordShape<D>>;
179
+ update(recordID: string, patch: ObjectUpdateInput<D>): Promise<RecordShape<D>>;
180
+ updateMany(
181
+ rows: readonly ObjectBulkUpdateInput<D>[],
182
+ options?: TypedBatchWriteOptions,
183
+ ): Promise<readonly RecordShape<D>[]>;
184
+ delete(recordID: string): Promise<void>;
185
+ deleteMany(recordIDs: readonly string[], options?: TypedBatchWriteOptions): Promise<void>;
186
+ list(options?: ObjectRecordListOptions<D>): Promise<TypedRecordPage<D>>;
187
+ query(options?: TypedRecordQueryOptions): Promise<TypedRecordPage<D>>;
188
+ schema: { retrieve(options?: RequestOptions): APIPromise<DeployedCustomObject> };
189
+ fields: {
190
+ list(
191
+ params?: FieldListParams,
192
+ options?: RequestOptions,
193
+ ): PagePromise<CustomObjectFieldsPageCursorURL, CustomObjectField>;
194
+ };
195
+ }
196
+
197
+ export type ObjectFilter<A extends string> = RqlFragment & { readonly [filterOwner]: A };
198
+
199
+ export function defineCustomObject<
200
+ const A extends `${string}__c`,
201
+ const F extends FieldDefinitions,
202
+ C extends string = `${Unsuffixed<A>}_category`,
203
+ S extends SectionDefinitions = {},
204
+ N extends NameFieldDefinition = { kind: 'text' },
205
+ >(
206
+ props: DefineCustomObjectProps<A, F, C, S, N>,
207
+ ): DefinedCustomObject<
208
+ CustomObjectDefinition<LogicalCustomObjectName<Unsuffixed<A>>, LogicalCategoryName<C>, S, F, N>
209
+ >;
210
+ export function defineCustomObject(props: Record<string, any>): object {
211
+ const apiName = props['apiName'] as string;
212
+ validateCustomApiName(apiName);
213
+ const name = apiName.slice(0, -3);
214
+ const sourceFields = props['fields'] as FieldDefinitions;
215
+ const fields = normalizeFieldNames(sourceFields);
216
+ validateSections(props['sections']);
217
+ const category =
218
+ props['category'] ??
219
+ defineCategory({
220
+ apiName: `${name}_category__c`,
221
+ name: props['name'],
222
+ description: props['description'],
223
+ });
224
+ validateCustomApiName(typeof category === 'string' ? category : category.apiName);
225
+ const definition = createObject({
226
+ ...props,
227
+ name,
228
+ displayName: props['name'],
229
+ ...(props['pluralName'] === undefined ? {} : { pluralLabel: props['pluralName'] }),
230
+ category: typeof category === 'string' ? category.slice(0, -3) : category,
231
+ fields,
232
+ } as Parameters<typeof createObject>[0]);
233
+ return customObjectComponent.register(withInputs(definition, Object.keys(sourceFields)), props);
234
+ }
235
+
236
+ /** Existing extension semantics, with the same additive field tokens and parsers. */
237
+ export function extendCustomObject<
238
+ B extends AnyCustomObjectDefinition,
239
+ S extends SectionDefinitions = {},
240
+ F extends FieldDefinitions = {},
241
+ >(
242
+ base: B,
243
+ extension: Omit<Parameters<typeof extendObject<B, S, F>>[1], 'fields'> & {
244
+ fields?: Extract<keyof B['fields'], keyof F> extends never ? F & ApiNamedMap<F> : never;
245
+ sections?: ApiNamedMap<S>;
246
+ },
247
+ ): DefinedCustomObject<ReturnType<typeof extendObject<B, S, F>>> {
248
+ const fields = normalizeFieldNames(base.fields);
249
+ const addedFields = normalizeFieldNames<AnyFieldDefinition>(extension.fields ?? {});
250
+ validateSections(extension.sections);
251
+ for (const key of Object.keys(extension.fields ?? {})) {
252
+ if (Object.prototype.hasOwnProperty.call(fields, key.replace(/__c$/, '')))
253
+ throw new Error(`Cannot replace existing custom field ${key} on ${base.apiName}.`);
254
+ }
255
+ const definition = extendObject(
256
+ { ...base, fields } as B,
257
+ { ...extension, fields: addedFields } as unknown as Parameters<typeof extendObject<B, S, F>>[1],
258
+ ) as unknown as AnyCustomObjectDefinition;
259
+ const keys = [...Object.keys(base.fields), ...Object.keys(extension.fields ?? {})];
260
+ return extendedObjectComponent.register(
261
+ withInputs(definition, keys),
262
+ base,
263
+ extension,
264
+ ) as unknown as DefinedCustomObject<ReturnType<typeof extendObject<B, S, F>>>;
265
+ }
266
+
267
+ export const eq = <T, const A extends string>(
268
+ field: FieldToken<T, A>,
269
+ value: RqlComparableValue<NoInfer<T>> | null,
270
+ ) => query.eq(field as unknown as RqlFieldToken<T>, value) as ObjectFilter<A>;
271
+
272
+ export const ne = <T, const A extends string>(
273
+ field: FieldToken<T, A>,
274
+ value: RqlComparableValue<NoInfer<T>> | null,
275
+ ) => query.ne(field as unknown as RqlFieldToken<T>, value) as ObjectFilter<A>;
276
+
277
+ export const lt = <T extends string | number, const A extends string>(
278
+ field: FieldToken<T | null, A>,
279
+ value: NoInfer<T>,
280
+ ) => query.lt(field as unknown as RqlFieldToken<T>, value) as ObjectFilter<A>;
281
+
282
+ export const lte = <T extends string | number, const A extends string>(
283
+ field: FieldToken<T | null, A>,
284
+ value: NoInfer<T>,
285
+ ) => query.lte(field as unknown as RqlFieldToken<T>, value) as ObjectFilter<A>;
286
+
287
+ export const gt = <T extends string | number, const A extends string>(
288
+ field: FieldToken<T | null, A>,
289
+ value: NoInfer<T>,
290
+ ) => query.gt(field as unknown as RqlFieldToken<T>, value) as ObjectFilter<A>;
291
+
292
+ export const gte = <T extends string | number, const A extends string>(
293
+ field: FieldToken<T | null, A>,
294
+ value: NoInfer<T>,
295
+ ) => query.gte(field as unknown as RqlFieldToken<T>, value) as ObjectFilter<A>;
296
+
297
+ export const inArray = <T, const A extends string>(
298
+ field: FieldToken<T, A>,
299
+ values: readonly RqlComparableValue<NoInfer<T>>[],
300
+ ) => query.in(field as unknown as RqlFieldToken<T>, values) as ObjectFilter<A>;
301
+
302
+ export const notInArray = <T, const A extends string>(
303
+ field: FieldToken<T, A>,
304
+ values: readonly RqlComparableValue<NoInfer<T>>[],
305
+ ) => query.notIn(field as unknown as RqlFieldToken<T>, values) as ObjectFilter<A>;
306
+
307
+ export const isNull = <T, const A extends string>(field: FieldToken<T, A>) =>
308
+ query.isNull(field as unknown as RqlFieldToken<T>) as ObjectFilter<A>;
309
+
310
+ export const isNotNull = <T, const A extends string>(field: FieldToken<T, A>) =>
311
+ query.isNotNull(field as unknown as RqlFieldToken<T>) as ObjectFilter<A>;
312
+
313
+ export const and = <const A extends string>(first: ObjectFilter<A>, ...rest: ObjectFilter<NoInfer<A>>[]) =>
314
+ query.and(first, ...rest) as ObjectFilter<A>;
315
+
316
+ export const or = <const A extends string>(first: ObjectFilter<A>, ...rest: ObjectFilter<NoInfer<A>>[]) =>
317
+ query.or(first, ...rest) as ObjectFilter<A>;
318
+
319
+ export const not = <const A extends string>(filter: ObjectFilter<A>) => query.not(filter) as ObjectFilter<A>;
320
+
321
+ type Unsuffixed<N extends string> = N extends `${infer Name}__c` ? Name : N;
322
+
323
+ /** Enrich the existing immutable schema; normalization and validation stay in the existing factory. */
324
+ function withInputs<D extends AnyCustomObjectDefinition>(
325
+ definition: D,
326
+ keys = Object.keys(definition.fields),
327
+ ): DefinedCustomObject<D> {
328
+ const fields = Object.freeze(
329
+ Object.fromEntries(
330
+ keys.map((key) => [
331
+ key,
332
+ Object.freeze({
333
+ ...definition.fields[key.replace(/__c$/, '')]!,
334
+ logicalName: key,
335
+ objectApiName: definition.apiName,
336
+ }),
337
+ ]),
338
+ ),
339
+ );
340
+ const enriched = { ...definition, fields } as D;
341
+ const parser = <T>(operation: 'create' | 'update'): ValueParser<T> => ({
342
+ parse(value) {
343
+ if (value == null || typeof value !== 'object' || Array.isArray(value))
344
+ throw new TypeError('Expected a record object.');
345
+ assertObjectInput(enriched, value as Record<string, unknown>, operation);
346
+ return value as T;
347
+ },
348
+ });
349
+ return Object.freeze({
350
+ ...enriched,
351
+ ...createObjectOperations(enriched),
352
+ fields,
353
+ inputs: Object.freeze({
354
+ create: parser<ObjectCreateInput<D>>('create'),
355
+ update: parser<ObjectUpdateInput<D>>('update'),
356
+ }),
357
+ }) as DefinedCustomObject<D>;
358
+ }
359
+
360
+ function normalizeFieldNames<T>(fields: Readonly<Record<string, T>>) {
361
+ return Object.fromEntries(
362
+ Object.entries(fields).map(([apiName, field]) => {
363
+ validateCustomApiName(apiName);
364
+ return [apiName.slice(0, -3), field];
365
+ }),
366
+ );
367
+ }
368
+
369
+ function validateSections(sections: SectionDefinitions = {}): void {
370
+ for (const [apiName, section] of Object.entries(sections)) {
371
+ validateCustomApiName(apiName);
372
+ if (section.sectionId !== undefined) validateCustomApiName(section.sectionId);
373
+ }
374
+ }
375
+
376
+ type ApiNamedMap<T> = {
377
+ [K in keyof T]: string extends K ? T[K]
378
+ : K extends `${string}__c` ? T[K]
379
+ : never;
380
+ };
381
+
382
+ type CategoryInput<N extends string> = `${N}__c` | CustomObjectCategoryDefinition<LogicalCategoryName<N>>;
383
+
384
+ type ObjectOptions<
385
+ S extends SectionDefinitions,
386
+ F extends FieldDefinitions,
387
+ N extends NameFieldDefinition,
388
+ > = Pick<
389
+ AnyCustomObjectDefinition,
390
+ 'description' | 'pluralLabel' | 'icon' | 'ownerRole' | 'enableHistory'
391
+ > & {
392
+ sections?: S & ApiNamedMap<S>;
393
+ fields: F &
394
+ ApiNamedMap<F> & {
395
+ [K in keyof F]: string extends Exclude<F[K]['section'], undefined> ? F[K]
396
+ : Exclude<F[K]['section'], undefined> extends keyof NoInfer<S> ? F[K]
397
+ : never;
398
+ };
399
+ nameField?: N;
400
+ };
401
+
402
+ /** Operations capture only the definition; each call supplies its own authenticated transport. */
403
+ function createObjectOperations<D extends AnyCustomObjectDefinition>(
404
+ definition: D,
405
+ ): CustomObjectOperations<D> {
406
+ return {
407
+ records: createObjectRecords(definition),
408
+ schema: Object.freeze<ObjectSchema>({
409
+ retrieve: (ctx, options) => ctx.customObjects.retrieve(definition.apiName, options),
410
+ fields: Object.freeze<ObjectSchemaFields>({
411
+ list: (ctx, params, options) => ctx.customObjects.fields.list(definition.apiName, params, options),
412
+ }),
413
+ }),
414
+ };
415
+ }
416
+
417
+ /** @internal Forward client helpers to the definition operations. */
418
+ export function createObjectClient<D extends AnyCustomObjectDefinition>(
419
+ ctx: ObjectRecordsContext & ObjectSchemaContext,
420
+ definition: D,
421
+ ): ObjectClient<D> {
422
+ const { records, schema } = createObjectOperations(definition);
423
+ return {
424
+ create: (input) => records.create(ctx, input),
425
+ createMany: (rows, options) => records.createMany(ctx, rows, options),
426
+ get: (recordID) => records.get(ctx, recordID),
427
+ getByExternalID: (externalID) => records.getByExternalID(ctx, externalID),
428
+ update: (recordID, patch) => records.update(ctx, recordID, patch),
429
+ updateMany: (rows, options) => records.updateMany(ctx, rows, options),
430
+ delete: (recordID) => records.delete(ctx, recordID),
431
+ deleteMany: (recordIDs, options) => records.deleteMany(ctx, recordIDs, options),
432
+ list: (options) => records.list(ctx, options),
433
+ query: (options) => records.query(ctx, options),
434
+ schema: { retrieve: (options) => schema.retrieve(ctx, options) },
435
+ fields: {
436
+ list: (params, options) => schema.fields.list(ctx, params, options),
437
+ },
438
+ };
439
+ }
440
+
441
+ // Reuse the existing operators, carrying the schema's object identity through typed filters.
442
+ const query = createRqlHelpers({ fields: {} } as AnyCustomObjectDefinition);
443
+
444
+ declare const filterOwner: unique symbol;
445
+
446
+ type FieldToken<T, A extends string> = Pick<RqlFieldToken<T>, 'apiName' | '__valueType__'> & {
447
+ readonly objectApiName: A;
448
+ };
449
+
450
+ declare const objectScope: unique symbol;
451
+
452
+ /** Carry parent identity through helpers while still accepting existing constructor instances. */
453
+ export type ObjectScoped<TObject extends ObjectReference, TDefinition> = TDefinition & {
454
+ readonly [objectScope]: TObject['apiName'];
455
+ };
456
+
457
+ export function scopedDefinition<TObject extends ObjectReference, TDefinition extends object>(
458
+ _object: TObject,
459
+ definition: TDefinition,
460
+ ): ObjectScoped<TObject, TDefinition> {
461
+ return definition as ObjectScoped<TObject, TDefinition>;
462
+ }
463
+
464
+ /** A complete schema is a local dependency; an identity-only target names an existing resource. */
465
+ function isObjectDefinition(value: object): value is AnyCustomObjectDefinition {
466
+ return 'fields' in value && 'nameField' in value && 'categoryApiName' in value;
467
+ }
468
+
469
+ export function fieldReferences<TObject extends ObjectReference>(
470
+ owner: TObject,
471
+ field: DefinitionFieldReference<TObject>,
472
+ ): object[] {
473
+ return [typeof field === 'object' && 'getApiName' in field ? field : owner];
474
+ }
475
+
476
+ const currentFieldSections = new WeakMap<Field, CustomObjectFieldSection | undefined>();
477
+
478
+ /** Keep dependency collection in sync with layout-driven field moves. */
479
+ export function trackFieldSection<T extends Field>(field: T, section: CustomObjectFieldSection): T {
480
+ currentFieldSections.set(field, section);
481
+ const assignSection = field._assignSection.bind(field);
482
+ field._assignSection = (section) => {
483
+ assignSection(section);
484
+ currentFieldSections.set(field, typeof section === 'string' ? undefined : section);
485
+ };
486
+ return field;
487
+ }
488
+
489
+ export function fieldSectionReferences(field: Field): object[] {
490
+ const section = currentFieldSections.get(field);
491
+ // Schema-owned sections are emitted by the object compiler; authored sections are dependencies.
492
+ return section != null && registeredComponent(section) != null ? [section] : [];
493
+ }
494
+
495
+ /** Shared by section serialization and authored/default conflict detection. */
496
+ function fieldSectionApiName(definition: AnyCustomObjectDefinition, key: string): string {
497
+ const apiName = definition.sections[key]?.sectionId ?? key;
498
+ validateCustomApiName(apiName);
499
+ return apiName;
500
+ }
501
+
502
+ /** Reuse the typed SDK's field compiler and the metadata SDK's serializers. */
503
+ function objectMetadata(definition: AnyCustomObjectDefinition): ObjectMetadata {
504
+ const existing = registrations.get(definition);
505
+ if (existing != null) return existing;
506
+ if (
507
+ definition.ownerRole != null ||
508
+ definition.enableHistory != null ||
509
+ Object.values(definition.fields).some(
510
+ (field) => field.enableHistory != null || field.restSection != null || field.rqlDefinition != null,
511
+ )
512
+ )
513
+ throw new Error('REST-only object options cannot be compiled to metadata.');
514
+ const category = new Category(detachedManifestScope, {
515
+ apiName: definition.categoryApiName,
516
+ name: definition.categoryDefinition?.displayName ?? definition.category,
517
+ description: definition.categoryDefinition?.description ?? '',
518
+ });
519
+ const components: ManifestComponent[] = [];
520
+ const object = new CustomObject(
521
+ {
522
+ _register(component) {
523
+ components.push(component);
524
+ },
525
+ },
526
+ {
527
+ apiName: definition.apiName,
528
+ name: definition.displayName,
529
+ category,
530
+ description: definition.description,
531
+ ...(definition.pluralLabel == null ? {} : { pluralLabel: definition.pluralLabel }),
532
+ ...(definition.icon == null ? {} : { icon: definition.icon }),
533
+ nameFieldDetails: buildCustomObjectNameFieldDetails(definition) ?? null,
534
+ },
535
+ );
536
+ const sections = Object.fromEntries(
537
+ Object.entries(definition.sections).map(([key, section]) => {
538
+ const apiName = fieldSectionApiName(definition, key);
539
+ return [
540
+ key,
541
+ withApiName(
542
+ new CustomObjectFieldSection(object, { name: section.name, sectionId: apiName }),
543
+ apiName,
544
+ ),
545
+ ];
546
+ }),
547
+ );
548
+ const needsFallback =
549
+ Object.keys(sections).length === 0 ||
550
+ Object.values(definition.fields).some((field) => field.section == null);
551
+ const generalKey = `${definition.name}_general__c`;
552
+ const defaultSectionApiName = fieldSectionApiName(definition, generalKey);
553
+ const defaultSection =
554
+ needsFallback ?
555
+ sections[generalKey] ??
556
+ withApiName(
557
+ new CustomObjectFieldSection(object, { name: 'General', sectionId: defaultSectionApiName }),
558
+ defaultSectionApiName,
559
+ )
560
+ : undefined;
561
+ const firstSection = defaultSection ?? Object.values(sections)[0]!;
562
+ withApiName(object, definition.apiName, { default_field_section_api_name: firstSection.getSectionId() });
563
+ // Provisioning needs section handles; here they are deterministic API names instead of destination IDs.
564
+ const provisionable = {
565
+ ...definition,
566
+ sections: Object.fromEntries(
567
+ Object.entries(sections).map(([key, section]) => [
568
+ key,
569
+ { name: section.getName(), sectionId: section.getSectionId() },
570
+ ]),
571
+ ),
572
+ };
573
+ const fields = Object.fromEntries(
574
+ Object.entries(definition.fields).map(([key, field]) => {
575
+ const section = field.section == null ? defaultSection : sections[field.section];
576
+ if (section == null) throw new Error(`Unknown section ${field.section} on ${definition.apiName}.`);
577
+ const { create } = buildProvisionableFieldParams(provisionable, key);
578
+ return [
579
+ key,
580
+ trackFieldSection(
581
+ new Field(object, {
582
+ apiName: field.apiName,
583
+ displayName: field.displayName,
584
+ description: field.description,
585
+ section,
586
+ dataType: create.data_type,
587
+ required: field.writable ? field.required : null,
588
+ unique: create.is_unique ?? null,
589
+ derivedFieldFormula: create.derived_field_formula ?? null,
590
+ ...(field.formulaAttributeMetas == null ? {} : { formulaAttrMetas: field.formulaAttributeMetas }),
591
+ ...(field.derivedAggregatedField == null ?
592
+ {}
593
+ : { derivedAggregatedField: field.derivedAggregatedField }),
594
+ }),
595
+ section,
596
+ ),
597
+ ];
598
+ }),
599
+ );
600
+ const layoutSections = [
601
+ ...new Set([...Object.values(sections), ...(defaultSection == null ? [] : [defaultSection])]),
602
+ ];
603
+ const layout = withApiName(
604
+ new CustomObjectPageLayout(object, {
605
+ apiName: 'default',
606
+ layoutId: 'default',
607
+ name: `${definition.displayName} Layout`,
608
+ tabEdits: {
609
+ newTabs: [
610
+ {
611
+ key: 'details',
612
+ name: 'Details',
613
+ type: 'tab_with_sections',
614
+ sections: layoutSections.map((section, index) => ({
615
+ name: section.getName(),
616
+ type: 'fields_section',
617
+ section,
618
+ fields: [
619
+ ...(index === 0 ? [object.standardFields.name] : []),
620
+ ...Object.values(fields).filter((field) => field.getSectionId() === section.getSectionId()),
621
+ ],
622
+ })),
623
+ },
624
+ ],
625
+ systemTabEdits: {},
626
+ tabsOrder: ['details'],
627
+ },
628
+ }),
629
+ 'default',
630
+ );
631
+ const metadata = {
632
+ object,
633
+ sections,
634
+ defaultSection,
635
+ fields,
636
+ layout,
637
+ components: [...components],
638
+ defaultFieldSectionApiName: firstSection.getSectionId(),
639
+ };
640
+ registrations.set(definition, metadata);
641
+ return metadata;
642
+ }
643
+
644
+ export type ObjectReference = AnyCustomObjectDefinition;
645
+
646
+ export type DefinitionFieldReference<TObject extends ObjectReference> =
647
+ | TObject['fields'][keyof TObject['fields']]
648
+ | ObjectScoped<TObject, Field>
649
+ | CustomObjectStandardFieldIdentifier;
650
+
651
+ interface ObjectMetadata {
652
+ object: CustomObject;
653
+ sections: Record<string, CustomObjectFieldSection>;
654
+ defaultSection: CustomObjectFieldSection | undefined;
655
+ fields: Record<string, Field>;
656
+ layout: CustomObjectPageLayout;
657
+ components: ManifestComponent[];
658
+ defaultFieldSectionApiName: string;
659
+ }
660
+
661
+ const registrations = new WeakMap<AnyCustomObjectDefinition, ObjectMetadata>();
662
+
663
+ export type SectionReference<TObject extends ObjectReference> =
664
+ | ObjectScoped<TObject, CustomObjectFieldSection>
665
+ | Extract<keyof TObject['sections'], string>
666
+ | 'general';
667
+
668
+ export function manifestSection<TObject extends ObjectReference>(
669
+ object: TObject,
670
+ reference: SectionReference<TObject>,
671
+ ): CustomObjectFieldSection {
672
+ if (typeof reference !== 'string') {
673
+ if (reference.getModelApiName() !== manifestObject(object).getApiName())
674
+ throw new Error('Section reference belongs to another object.');
675
+ return reference;
676
+ }
677
+ const registration = objectMetadata(object);
678
+ const section =
679
+ registration.sections[reference] ?? (reference === 'general' ? registration.defaultSection : undefined);
680
+ if (section == null) throw new Error(`Unknown section ${reference} on ${object.apiName}.`);
681
+ return section;
682
+ }
683
+
684
+ /** References and compilation reuse one materialized schema; authored children remain explicit roots. */
685
+ export function manifestObject(reference: ObjectReference): CustomObject {
686
+ return objectMetadata(reference).object;
687
+ }
688
+
689
+ /** Adapts a typed schema field to the existing layout, view, and rule component APIs. */
690
+ export function manifestField<TObject extends ObjectReference>(
691
+ object: TObject,
692
+ field: NoInfer<DefinitionFieldReference<TObject>>,
693
+ ): Field {
694
+ const metadata = objectMetadata(object);
695
+ const resolved = metadata.object;
696
+ const candidate = field as CustomObjectFieldInput | AnyCustomObjectDefinition['fields'][string];
697
+ if (typeof candidate === 'string') return resolved.standardField(candidate);
698
+ if ('getApiName' in candidate) {
699
+ if (candidate.getCustomObjectApiName() !== resolved.getApiName())
700
+ throw new Error('Field reference belongs to another object.');
701
+ return candidate;
702
+ }
703
+ if ('objectApiName' in candidate && candidate.objectApiName !== object.apiName)
704
+ throw new Error('Field reference belongs to another object.');
705
+ const registered = metadata.fields[candidate.logicalName];
706
+ if (registered == null) throw new Error(`Unknown field ${candidate.logicalName} on ${object.apiName}.`);
707
+ return registered;
708
+ }
709
+
710
+ const behavior = {
711
+ type: 'CUSTOM_OBJECT' as const,
712
+ references(definition: AnyCustomObjectDefinition): () => object[] {
713
+ const category = definition.categoryDefinition;
714
+ if (category != null && registeredComponent(category) == null)
715
+ categoryComponent.register(category, category);
716
+ return () => [
717
+ ...(category == null ? [] : [category]),
718
+ ...Object.values(registrations.get(definition)?.fields ?? {}).flatMap(fieldSectionReferences),
719
+ ...(Object.values(definition.fields) as AnyFieldDefinition[]).flatMap((field) =>
720
+ field.kind === 'lookup' || field.kind === 'parent-child' ?
721
+ isObjectDefinition(field.target) ? [field.target]
722
+ : []
723
+ : [],
724
+ ),
725
+ ];
726
+ },
727
+ compileBatch(definitions: readonly AnyCustomObjectDefinition[], context: CompileContext) {
728
+ const categories = new Set(
729
+ context.definitions
730
+ .filter((definition) => registeredComponent(definition)?.type === 'CUSTOM_CATEGORY')
731
+ .flatMap((definition) => ('apiName' in definition ? [definition.apiName] : [])),
732
+ );
733
+ // Generate defaults from the complete schema, including base definitions reached through children.
734
+ const schemas = new Map<string, AnyCustomObjectDefinition>();
735
+ for (const definition of definitions) {
736
+ const previous = schemas.get(definition.apiName);
737
+ if (previous == null) {
738
+ schemas.set(definition.apiName, definition);
739
+ continue;
740
+ }
741
+ schemas.set(definition.apiName, {
742
+ ...previous,
743
+ sections: { ...previous.sections, ...definition.sections },
744
+ fields: Object.fromEntries(
745
+ [...Object.values(previous.fields), ...Object.values(definition.fields)].map((field) => [
746
+ field.apiName,
747
+ field,
748
+ ]),
749
+ ),
750
+ });
751
+ }
752
+ const defaults = new Map([...schemas].map(([apiName, schema]) => [apiName, objectMetadata(schema)]));
753
+ return definitions.flatMap((definition) => {
754
+ if (!categories.has(definition.categoryApiName))
755
+ throw new Error(
756
+ `Include a category definition for ${definition.categoryApiName}, or use a typed category in ${definition.apiName}.`,
757
+ );
758
+ const generated = defaults.get(definition.apiName)!;
759
+ const authoredSections = new Set(
760
+ Object.keys(definition.sections).map((key) => fieldSectionApiName(definition, key)),
761
+ );
762
+ const metadata = objectMetadata(definition);
763
+ return metadata.components.map((component) => {
764
+ const config = (component === metadata.layout ? generated.layout : component).toDict();
765
+ if (component === metadata.object)
766
+ config['default_field_section_api_name'] = generated.defaultFieldSectionApiName;
767
+ return {
768
+ config: config as MetadataConfig,
769
+ fallback:
770
+ component === metadata.layout ||
771
+ (component === metadata.defaultSection && !authoredSections.has(config['api_name'])),
772
+ };
773
+ });
774
+ });
775
+ },
776
+ };
777
+
778
+ const customObjectComponent: ComponentDefinition<typeof defineCustomObject> = defineComponent({
779
+ ...behavior,
780
+ define: defineCustomObject,
781
+ });
782
+
783
+ const extendedObjectComponent = defineComponent({
784
+ ...behavior,
785
+ define: extendCustomObject,
786
+ });