@servicenow/sdk-build-plugins 4.2.0 → 4.4.0

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 (349) hide show
  1. package/dist/acl-plugin.js +11 -0
  2. package/dist/acl-plugin.js.map +1 -1
  3. package/dist/applicability-plugin.d.ts +2 -0
  4. package/dist/applicability-plugin.js +72 -0
  5. package/dist/applicability-plugin.js.map +1 -0
  6. package/dist/atf/test-plugin.js +5 -2
  7. package/dist/atf/test-plugin.js.map +1 -1
  8. package/dist/basic-syntax-plugin.js +7 -1
  9. package/dist/basic-syntax-plugin.js.map +1 -1
  10. package/dist/business-rule-plugin.js +1 -0
  11. package/dist/business-rule-plugin.js.map +1 -1
  12. package/dist/call-expression-plugin.js +1 -107
  13. package/dist/call-expression-plugin.js.map +1 -1
  14. package/dist/column/column-to-record.d.ts +10 -3
  15. package/dist/column/column-to-record.js +44 -7
  16. package/dist/column/column-to-record.js.map +1 -1
  17. package/dist/column-plugin.d.ts +3 -1
  18. package/dist/column-plugin.js +12 -12
  19. package/dist/column-plugin.js.map +1 -1
  20. package/dist/dashboard/dashboard-component-property-defaults.d.ts +152 -0
  21. package/dist/dashboard/dashboard-component-property-defaults.js +264 -0
  22. package/dist/dashboard/dashboard-component-property-defaults.js.map +1 -0
  23. package/dist/dashboard/dashboard-component-resolver.d.ts +13 -0
  24. package/dist/dashboard/dashboard-component-resolver.js +69 -0
  25. package/dist/dashboard/dashboard-component-resolver.js.map +1 -0
  26. package/dist/dashboard/dashboard-plugin.d.ts +12 -0
  27. package/dist/dashboard/dashboard-plugin.js +397 -0
  28. package/dist/dashboard/dashboard-plugin.js.map +1 -0
  29. package/dist/data-plugin.d.ts +3 -0
  30. package/dist/data-plugin.js +61 -113
  31. package/dist/data-plugin.js.map +1 -1
  32. package/dist/email-notification-plugin.d.ts +2 -0
  33. package/dist/email-notification-plugin.js +541 -0
  34. package/dist/email-notification-plugin.js.map +1 -0
  35. package/dist/flow/constants/flow-plugin-constants.d.ts +58 -0
  36. package/dist/flow/constants/flow-plugin-constants.js +70 -0
  37. package/dist/flow/constants/flow-plugin-constants.js.map +1 -0
  38. package/dist/flow/flow-logic/flow-logic-constants.d.ts +38 -0
  39. package/dist/flow/flow-logic/flow-logic-constants.js +118 -0
  40. package/dist/flow/flow-logic/flow-logic-constants.js.map +1 -0
  41. package/dist/flow/flow-logic/flow-logic-diagnostics.d.ts +19 -0
  42. package/dist/flow/flow-logic/flow-logic-diagnostics.js +503 -0
  43. package/dist/flow/flow-logic/flow-logic-diagnostics.js.map +1 -0
  44. package/dist/flow/flow-logic/flow-logic-plugin-helpers.d.ts +62 -0
  45. package/dist/flow/flow-logic/flow-logic-plugin-helpers.js +2092 -0
  46. package/dist/flow/flow-logic/flow-logic-plugin-helpers.js.map +1 -0
  47. package/dist/flow/flow-logic/flow-logic-plugin.d.ts +52 -0
  48. package/dist/flow/flow-logic/flow-logic-plugin.js +283 -0
  49. package/dist/flow/flow-logic/flow-logic-plugin.js.map +1 -0
  50. package/dist/flow/flow-logic/flow-logic-shapes.d.ts +104 -0
  51. package/dist/flow/flow-logic/flow-logic-shapes.js +201 -0
  52. package/dist/flow/flow-logic/flow-logic-shapes.js.map +1 -0
  53. package/dist/flow/plugins/approval-rules-plugin.d.ts +2 -0
  54. package/dist/flow/plugins/approval-rules-plugin.js +49 -0
  55. package/dist/flow/plugins/approval-rules-plugin.js.map +1 -0
  56. package/dist/flow/plugins/flow-action-definition-plugin.d.ts +2 -0
  57. package/dist/flow/plugins/flow-action-definition-plugin.js +286 -0
  58. package/dist/flow/plugins/flow-action-definition-plugin.js.map +1 -0
  59. package/dist/flow/plugins/flow-data-pill-plugin.d.ts +9 -0
  60. package/dist/flow/plugins/flow-data-pill-plugin.js +212 -0
  61. package/dist/flow/plugins/flow-data-pill-plugin.js.map +1 -0
  62. package/dist/flow/plugins/flow-definition-plugin.d.ts +2 -0
  63. package/dist/flow/plugins/flow-definition-plugin.js +1668 -0
  64. package/dist/flow/plugins/flow-definition-plugin.js.map +1 -0
  65. package/dist/flow/plugins/flow-diagnostics-plugin.d.ts +26 -0
  66. package/dist/flow/plugins/flow-diagnostics-plugin.js +217 -0
  67. package/dist/flow/plugins/flow-diagnostics-plugin.js.map +1 -0
  68. package/dist/flow/plugins/flow-instance-plugin.d.ts +12 -0
  69. package/dist/flow/plugins/flow-instance-plugin.js +1205 -0
  70. package/dist/flow/plugins/flow-instance-plugin.js.map +1 -0
  71. package/dist/flow/plugins/flow-trigger-instance-plugin.d.ts +2 -0
  72. package/dist/flow/plugins/flow-trigger-instance-plugin.js +338 -0
  73. package/dist/flow/plugins/flow-trigger-instance-plugin.js.map +1 -0
  74. package/dist/flow/plugins/inline-script-plugin.d.ts +39 -0
  75. package/dist/flow/plugins/inline-script-plugin.js +80 -0
  76. package/dist/flow/plugins/inline-script-plugin.js.map +1 -0
  77. package/dist/flow/plugins/step-definition-plugin.d.ts +5 -0
  78. package/dist/flow/plugins/step-definition-plugin.js +71 -0
  79. package/dist/flow/plugins/step-definition-plugin.js.map +1 -0
  80. package/dist/flow/plugins/step-instance-plugin.d.ts +31 -0
  81. package/dist/flow/plugins/step-instance-plugin.js +339 -0
  82. package/dist/flow/plugins/step-instance-plugin.js.map +1 -0
  83. package/dist/flow/plugins/trigger-plugin.d.ts +2 -0
  84. package/dist/flow/plugins/trigger-plugin.js +96 -0
  85. package/dist/flow/plugins/trigger-plugin.js.map +1 -0
  86. package/dist/flow/plugins/wfa-datapill-plugin.d.ts +15 -0
  87. package/dist/flow/plugins/wfa-datapill-plugin.js +178 -0
  88. package/dist/flow/plugins/wfa-datapill-plugin.js.map +1 -0
  89. package/dist/flow/utils/approval-rules-processor.d.ts +13 -0
  90. package/dist/flow/utils/approval-rules-processor.js +267 -0
  91. package/dist/flow/utils/approval-rules-processor.js.map +1 -0
  92. package/dist/flow/utils/built-in-complex-objects.d.ts +19 -0
  93. package/dist/flow/utils/built-in-complex-objects.js +62 -0
  94. package/dist/flow/utils/built-in-complex-objects.js.map +1 -0
  95. package/dist/flow/utils/complex-object-resolver.d.ts +8 -0
  96. package/dist/flow/utils/complex-object-resolver.js +614 -0
  97. package/dist/flow/utils/complex-object-resolver.js.map +1 -0
  98. package/dist/flow/utils/complex-objects.d.ts +36 -0
  99. package/dist/flow/utils/complex-objects.js +481 -0
  100. package/dist/flow/utils/complex-objects.js.map +1 -0
  101. package/dist/flow/utils/data-pill-shapes.d.ts +58 -0
  102. package/dist/flow/utils/data-pill-shapes.js +135 -0
  103. package/dist/flow/utils/data-pill-shapes.js.map +1 -0
  104. package/dist/flow/utils/datapill-transformer.d.ts +110 -0
  105. package/dist/flow/utils/datapill-transformer.js +503 -0
  106. package/dist/flow/utils/datapill-transformer.js.map +1 -0
  107. package/dist/flow/utils/flow-constants.d.ts +72 -0
  108. package/dist/flow/utils/flow-constants.js +230 -0
  109. package/dist/flow/utils/flow-constants.js.map +1 -0
  110. package/dist/flow/utils/flow-io-to-record.d.ts +44 -0
  111. package/dist/flow/utils/flow-io-to-record.js +409 -0
  112. package/dist/flow/utils/flow-io-to-record.js.map +1 -0
  113. package/dist/flow/utils/flow-shapes.d.ts +161 -0
  114. package/dist/flow/utils/flow-shapes.js +255 -0
  115. package/dist/flow/utils/flow-shapes.js.map +1 -0
  116. package/dist/flow/utils/flow-to-xml.d.ts +16 -0
  117. package/dist/flow/utils/flow-to-xml.js +237 -0
  118. package/dist/flow/utils/flow-to-xml.js.map +1 -0
  119. package/dist/flow/utils/flow-variable-processor.d.ts +51 -0
  120. package/dist/flow/utils/flow-variable-processor.js +69 -0
  121. package/dist/flow/utils/flow-variable-processor.js.map +1 -0
  122. package/dist/flow/utils/label-cache-parser.d.ts +7 -0
  123. package/dist/flow/utils/label-cache-parser.js +24 -0
  124. package/dist/flow/utils/label-cache-parser.js.map +1 -0
  125. package/dist/flow/utils/label-cache-processor.d.ts +119 -0
  126. package/dist/flow/utils/label-cache-processor.js +719 -0
  127. package/dist/flow/utils/label-cache-processor.js.map +1 -0
  128. package/dist/flow/utils/pill-string-parser.d.ts +88 -0
  129. package/dist/flow/utils/pill-string-parser.js +306 -0
  130. package/dist/flow/utils/pill-string-parser.js.map +1 -0
  131. package/dist/flow/utils/schema-to-flow-object.d.ts +22 -0
  132. package/dist/flow/utils/schema-to-flow-object.js +318 -0
  133. package/dist/flow/utils/schema-to-flow-object.js.map +1 -0
  134. package/dist/flow/utils/service-catalog.d.ts +47 -0
  135. package/dist/flow/utils/service-catalog.js +137 -0
  136. package/dist/flow/utils/service-catalog.js.map +1 -0
  137. package/dist/flow/utils/utils.d.ts +117 -0
  138. package/dist/flow/utils/utils.js +345 -0
  139. package/dist/flow/utils/utils.js.map +1 -0
  140. package/dist/index.d.ts +20 -1
  141. package/dist/index.js +21 -1
  142. package/dist/index.js.map +1 -1
  143. package/dist/list-plugin.js +1 -1
  144. package/dist/list-plugin.js.map +1 -1
  145. package/dist/now-attach-plugin.d.ts +1 -0
  146. package/dist/now-attach-plugin.js +10 -10
  147. package/dist/now-attach-plugin.js.map +1 -1
  148. package/dist/now-ref-plugin.js +1 -1
  149. package/dist/now-ref-plugin.js.map +1 -1
  150. package/dist/record-plugin.d.ts +29 -0
  151. package/dist/record-plugin.js +66 -7
  152. package/dist/record-plugin.js.map +1 -1
  153. package/dist/repack/index.d.ts +2 -0
  154. package/dist/repack/index.js +8 -0
  155. package/dist/repack/index.js.map +1 -1
  156. package/dist/rest-api-plugin.js +54 -44
  157. package/dist/rest-api-plugin.js.map +1 -1
  158. package/dist/server-module-plugin/index.d.ts +10 -0
  159. package/dist/server-module-plugin/index.js +83 -59
  160. package/dist/server-module-plugin/index.js.map +1 -1
  161. package/dist/service-catalog/catalog-clientscript-plugin.d.ts +2 -0
  162. package/dist/service-catalog/catalog-clientscript-plugin.js +117 -0
  163. package/dist/service-catalog/catalog-clientscript-plugin.js.map +1 -0
  164. package/dist/service-catalog/catalog-item-plugin.d.ts +2 -0
  165. package/dist/service-catalog/catalog-item-plugin.js +115 -0
  166. package/dist/service-catalog/catalog-item-plugin.js.map +1 -0
  167. package/dist/service-catalog/catalog-ui-policy-plugin.d.ts +2 -0
  168. package/dist/service-catalog/catalog-ui-policy-plugin.js +266 -0
  169. package/dist/service-catalog/catalog-ui-policy-plugin.js.map +1 -0
  170. package/dist/service-catalog/index.d.ts +5 -0
  171. package/dist/service-catalog/index.js +22 -0
  172. package/dist/service-catalog/index.js.map +1 -0
  173. package/dist/service-catalog/record-to-shape.d.ts +6 -0
  174. package/dist/service-catalog/record-to-shape.js +93 -0
  175. package/dist/service-catalog/record-to-shape.js.map +1 -0
  176. package/dist/service-catalog/sc-record-producer-plugin.d.ts +2 -0
  177. package/dist/service-catalog/sc-record-producer-plugin.js +140 -0
  178. package/dist/service-catalog/sc-record-producer-plugin.js.map +1 -0
  179. package/dist/service-catalog/service-catalog-base.d.ts +311 -0
  180. package/dist/service-catalog/service-catalog-base.js +542 -0
  181. package/dist/service-catalog/service-catalog-base.js.map +1 -0
  182. package/dist/service-catalog/service-catalog-diagnostics.d.ts +45 -0
  183. package/dist/service-catalog/service-catalog-diagnostics.js +172 -0
  184. package/dist/service-catalog/service-catalog-diagnostics.js.map +1 -0
  185. package/dist/service-catalog/shape-to-record.d.ts +8 -0
  186. package/dist/service-catalog/shape-to-record.js +235 -0
  187. package/dist/service-catalog/shape-to-record.js.map +1 -0
  188. package/dist/service-catalog/utils.d.ts +323 -0
  189. package/dist/service-catalog/utils.js +1216 -0
  190. package/dist/service-catalog/utils.js.map +1 -0
  191. package/dist/service-catalog/variable-helper.d.ts +43 -0
  192. package/dist/service-catalog/variable-helper.js +92 -0
  193. package/dist/service-catalog/variable-helper.js.map +1 -0
  194. package/dist/service-catalog/variable-set-plugin.d.ts +2 -0
  195. package/dist/service-catalog/variable-set-plugin.js +175 -0
  196. package/dist/service-catalog/variable-set-plugin.js.map +1 -0
  197. package/dist/service-catalog/variables-transform.d.ts +139 -0
  198. package/dist/service-catalog/variables-transform.js +403 -0
  199. package/dist/service-catalog/variables-transform.js.map +1 -0
  200. package/dist/sla/sla-validators.d.ts +61 -0
  201. package/dist/sla/sla-validators.js +224 -0
  202. package/dist/sla/sla-validators.js.map +1 -0
  203. package/dist/sla-plugin.d.ts +5 -0
  204. package/dist/sla-plugin.js +280 -0
  205. package/dist/sla-plugin.js.map +1 -0
  206. package/dist/static-content-plugin.js +25 -2
  207. package/dist/static-content-plugin.js.map +1 -1
  208. package/dist/table-plugin.js +32 -15
  209. package/dist/table-plugin.js.map +1 -1
  210. package/dist/ui-page-plugin.js +832 -19
  211. package/dist/ui-page-plugin.js.map +1 -1
  212. package/dist/ui-policy-plugin.js +5 -7
  213. package/dist/ui-policy-plugin.js.map +1 -1
  214. package/dist/utils.d.ts +10 -1
  215. package/dist/utils.js +16 -0
  216. package/dist/utils.js.map +1 -1
  217. package/dist/ux-list-menu-config-plugin.d.ts +2 -0
  218. package/dist/ux-list-menu-config-plugin.js +292 -0
  219. package/dist/ux-list-menu-config-plugin.js.map +1 -0
  220. package/dist/workspace-plugin/chrome-tab.d.ts +2 -0
  221. package/dist/workspace-plugin/chrome-tab.js +46 -0
  222. package/dist/workspace-plugin/chrome-tab.js.map +1 -0
  223. package/dist/workspace-plugin/constants.d.ts +52 -0
  224. package/dist/workspace-plugin/constants.js +56 -0
  225. package/dist/workspace-plugin/constants.js.map +1 -0
  226. package/dist/workspace-plugin/fluent-utils.d.ts +9 -0
  227. package/dist/workspace-plugin/fluent-utils.js +60 -0
  228. package/dist/workspace-plugin/fluent-utils.js.map +1 -0
  229. package/dist/workspace-plugin/page.d.ts +8 -0
  230. package/dist/workspace-plugin/page.js +108 -0
  231. package/dist/workspace-plugin/page.js.map +1 -0
  232. package/dist/workspace-plugin/screen.d.ts +1 -0
  233. package/dist/workspace-plugin/screen.js +38 -0
  234. package/dist/workspace-plugin/screen.js.map +1 -0
  235. package/dist/workspace-plugin/templates/index.d.ts +10 -0
  236. package/dist/workspace-plugin/templates/index.js +20 -0
  237. package/dist/workspace-plugin/templates/index.js.map +1 -0
  238. package/dist/workspace-plugin/templates/record-page-composition.d.ts +1 -0
  239. package/dist/workspace-plugin/templates/record-page-composition.js +4043 -0
  240. package/dist/workspace-plugin/templates/record-page-composition.js.map +1 -0
  241. package/dist/workspace-plugin/templates/record-page-data.d.ts +1 -0
  242. package/dist/workspace-plugin/templates/record-page-data.js +527 -0
  243. package/dist/workspace-plugin/templates/record-page-data.js.map +1 -0
  244. package/dist/workspace-plugin/templates/record-page-interalEventMappings.d.ts +1 -0
  245. package/dist/workspace-plugin/templates/record-page-interalEventMappings.js +39 -0
  246. package/dist/workspace-plugin/templates/record-page-interalEventMappings.js.map +1 -0
  247. package/dist/workspace-plugin/templates/record-page-layoutModel.d.ts +1 -0
  248. package/dist/workspace-plugin/templates/record-page-layoutModel.js +55 -0
  249. package/dist/workspace-plugin/templates/record-page-layoutModel.js.map +1 -0
  250. package/dist/workspace-plugin/templates/record-page-properties.d.ts +1 -0
  251. package/dist/workspace-plugin/templates/record-page-properties.js +135 -0
  252. package/dist/workspace-plugin/templates/record-page-properties.js.map +1 -0
  253. package/dist/workspace-plugin/templates/record-page.d.ts +3 -0
  254. package/dist/workspace-plugin/templates/record-page.js +8 -0
  255. package/dist/workspace-plugin/templates/record-page.js.map +1 -0
  256. package/dist/workspace-plugin.d.ts +2 -0
  257. package/dist/workspace-plugin.js +453 -0
  258. package/dist/workspace-plugin.js.map +1 -0
  259. package/package.json +10 -12
  260. package/src/acl-plugin.ts +16 -1
  261. package/src/applicability-plugin.ts +82 -0
  262. package/src/atf/test-plugin.ts +6 -3
  263. package/src/basic-syntax-plugin.ts +10 -1
  264. package/src/business-rule-plugin.ts +2 -1
  265. package/src/call-expression-plugin.ts +2 -130
  266. package/src/column/column-to-record.ts +54 -8
  267. package/src/column-plugin.ts +29 -13
  268. package/src/dashboard/dashboard-component-property-defaults.ts +277 -0
  269. package/src/dashboard/dashboard-component-resolver.ts +69 -0
  270. package/src/dashboard/dashboard-plugin.ts +450 -0
  271. package/src/data-plugin.ts +67 -139
  272. package/src/email-notification-plugin.ts +850 -0
  273. package/src/flow/constants/flow-plugin-constants.ts +79 -0
  274. package/src/flow/flow-logic/flow-logic-constants.ts +120 -0
  275. package/src/flow/flow-logic/flow-logic-diagnostics.ts +591 -0
  276. package/src/flow/flow-logic/flow-logic-plugin-helpers.ts +2550 -0
  277. package/src/flow/flow-logic/flow-logic-plugin.ts +337 -0
  278. package/src/flow/flow-logic/flow-logic-shapes.ts +215 -0
  279. package/src/flow/plugins/approval-rules-plugin.ts +48 -0
  280. package/src/flow/plugins/flow-action-definition-plugin.ts +295 -0
  281. package/src/flow/plugins/flow-data-pill-plugin.ts +258 -0
  282. package/src/flow/plugins/flow-definition-plugin.ts +2173 -0
  283. package/src/flow/plugins/flow-diagnostics-plugin.ts +280 -0
  284. package/src/flow/plugins/flow-instance-plugin.ts +1499 -0
  285. package/src/flow/plugins/flow-trigger-instance-plugin.ts +444 -0
  286. package/src/flow/plugins/inline-script-plugin.ts +83 -0
  287. package/src/flow/plugins/step-definition-plugin.ts +67 -0
  288. package/src/flow/plugins/step-instance-plugin.ts +431 -0
  289. package/src/flow/plugins/trigger-plugin.ts +95 -0
  290. package/src/flow/plugins/wfa-datapill-plugin.ts +213 -0
  291. package/src/flow/utils/approval-rules-processor.ts +298 -0
  292. package/src/flow/utils/built-in-complex-objects.ts +81 -0
  293. package/src/flow/utils/complex-object-resolver.ts +875 -0
  294. package/src/flow/utils/complex-objects.ts +656 -0
  295. package/src/flow/utils/data-pill-shapes.ts +165 -0
  296. package/src/flow/utils/datapill-transformer.ts +632 -0
  297. package/src/flow/utils/flow-constants.ts +285 -0
  298. package/src/flow/utils/flow-io-to-record.ts +533 -0
  299. package/src/flow/utils/flow-shapes.ts +296 -0
  300. package/src/flow/utils/flow-to-xml.ts +318 -0
  301. package/src/flow/utils/flow-variable-processor.ts +100 -0
  302. package/src/flow/utils/label-cache-parser.ts +37 -0
  303. package/src/flow/utils/label-cache-processor.ts +870 -0
  304. package/src/flow/utils/pill-string-parser.ts +375 -0
  305. package/src/flow/utils/schema-to-flow-object.ts +385 -0
  306. package/src/flow/utils/service-catalog.ts +174 -0
  307. package/src/flow/utils/utils.ts +395 -0
  308. package/src/index.ts +20 -1
  309. package/src/list-plugin.ts +1 -1
  310. package/src/now-attach-plugin.ts +14 -11
  311. package/src/now-ref-plugin.ts +1 -1
  312. package/src/record-plugin.ts +76 -11
  313. package/src/repack/index.ts +14 -0
  314. package/src/rest-api-plugin.ts +62 -50
  315. package/src/server-module-plugin/index.ts +112 -86
  316. package/src/service-catalog/catalog-clientscript-plugin.ts +140 -0
  317. package/src/service-catalog/catalog-item-plugin.ts +162 -0
  318. package/src/service-catalog/catalog-ui-policy-plugin.ts +324 -0
  319. package/src/service-catalog/index.ts +5 -0
  320. package/src/service-catalog/record-to-shape.ts +109 -0
  321. package/src/service-catalog/sc-record-producer-plugin.ts +201 -0
  322. package/src/service-catalog/service-catalog-base.ts +600 -0
  323. package/src/service-catalog/service-catalog-diagnostics.ts +254 -0
  324. package/src/service-catalog/shape-to-record.ts +279 -0
  325. package/src/service-catalog/utils.ts +1455 -0
  326. package/src/service-catalog/variable-helper.ts +135 -0
  327. package/src/service-catalog/variable-set-plugin.ts +197 -0
  328. package/src/service-catalog/variables-transform.ts +438 -0
  329. package/src/sla/sla-validators.ts +331 -0
  330. package/src/sla-plugin.ts +358 -0
  331. package/src/static-content-plugin.ts +25 -2
  332. package/src/table-plugin.ts +49 -16
  333. package/src/ui-page-plugin.ts +1063 -20
  334. package/src/ui-policy-plugin.ts +5 -9
  335. package/src/utils.ts +24 -1
  336. package/src/ux-list-menu-config-plugin.ts +312 -0
  337. package/src/workspace-plugin/chrome-tab.ts +44 -0
  338. package/src/workspace-plugin/constants.ts +53 -0
  339. package/src/workspace-plugin/fluent-utils.ts +60 -0
  340. package/src/workspace-plugin/page.ts +139 -0
  341. package/src/workspace-plugin/screen.ts +34 -0
  342. package/src/workspace-plugin/templates/index.ts +17 -0
  343. package/src/workspace-plugin/templates/record-page-composition.ts +4051 -0
  344. package/src/workspace-plugin/templates/record-page-data.ts +523 -0
  345. package/src/workspace-plugin/templates/record-page-interalEventMappings.ts +35 -0
  346. package/src/workspace-plugin/templates/record-page-layoutModel.ts +51 -0
  347. package/src/workspace-plugin/templates/record-page-properties.ts +131 -0
  348. package/src/workspace-plugin/templates/record-page.ts +6 -0
  349. package/src/workspace-plugin.ts +574 -0
@@ -0,0 +1,385 @@
1
+ // biome-ignore-all lint/suspicious/noExplicitAny: This file processes dynamic JSON schemas
2
+ import {
3
+ CallExpressionShape,
4
+ ObjectShape,
5
+ UndefinedShape,
6
+ type Record as FluentRecord,
7
+ } from '@servicenow/sdk-build-core'
8
+ import {
9
+ StringColumn,
10
+ IntegerColumn,
11
+ DecimalColumn,
12
+ BooleanColumn,
13
+ DateTimeColumn,
14
+ ChoiceColumn,
15
+ choiceDropdown,
16
+ ReferenceColumn,
17
+ } from '@servicenow/sdk-core/runtime/db'
18
+ import { ChoiceDropdown } from './flow-constants'
19
+
20
+ /**
21
+ * Reverse of `generateSchemaFromObject`.
22
+ * Takes the `serialized_content` field from a `sys_complex_object` record and
23
+ * rebuilds a `FlowObject(...)` call-expression shape that can be placed back in
24
+ * the Fluent source.
25
+ */
26
+
27
+ // ------------------------------------------------------------
28
+ // Schema <-> Column API mappings (inverse of COLUMN_TYPE_TO_SCHEMA_TYPE)
29
+ // ------------------------------------------------------------
30
+ const SCHEMA_TYPE_TO_COLUMN_API: Record<string, string> = {
31
+ string: StringColumn.name,
32
+ integer: IntegerColumn.name,
33
+ number: DecimalColumn.name,
34
+ boolean: BooleanColumn.name,
35
+ date: DateTimeColumn.name,
36
+ glide_date_time: DateTimeColumn.name,
37
+ choice: ChoiceColumn.name,
38
+ reference: ReferenceColumn.name,
39
+ }
40
+
41
+ /**
42
+ * Build a `CallExpressionShape` for a simple (non-object) field given its
43
+ * schema primitive type and associated facets.
44
+ */
45
+ function buildPrimitiveFieldCallExpr(fieldFacet: ObjectShape, source: FluentRecord): CallExpressionShape {
46
+ const childType = fieldFacet.get('childType').ifDefined()?.asString()?.getValue()
47
+ const schemaType = childType ?? fieldFacet.get('type')?.asString()?.getValue()
48
+ const callee = SCHEMA_TYPE_TO_COLUMN_API[schemaType] ?? StringColumn.name
49
+
50
+ const additionalProps: globalThis.Record<string, unknown> = {}
51
+
52
+ // Extract referenceTable for ReferenceColumn type
53
+ const referenceTable = fieldFacet.get('reference')?.ifString()?.getValue()
54
+ if (referenceTable && schemaType === 'reference') {
55
+ additionalProps['referenceTable'] = referenceTable
56
+ }
57
+
58
+ const isChoiceColumn = callee === ChoiceColumn.name
59
+ const isStringColumn = callee === StringColumn.name
60
+
61
+ return new CallExpressionShape({
62
+ source,
63
+ callee,
64
+ args: [
65
+ fieldFacet
66
+ .transform(({ $ }) => ({
67
+ label: $.from('label', 'childLabel').map((label, child) => (child.isDefined() ? child : label)),
68
+ mandatory: $.toBoolean().def(false),
69
+ ...(isStringColumn && {
70
+ maxLength: $.from('maxLength', 'childMaxLength')
71
+ .map((maxLength, child) => {
72
+ const value = child.isDefined() ? child : maxLength
73
+ if (value.isString() && value.getValue() !== '') {
74
+ return value.toNumber().getValue()
75
+ }
76
+ return 0
77
+ })
78
+ .def(0),
79
+ }),
80
+ default: $.from('defaultValue', 'childDefaultValue')
81
+ .map((defaultValue, childDefault) => (childDefault.isDefined() ? childDefault : defaultValue))
82
+ .def(''),
83
+ hint: $.from('hint', 'childHint')
84
+ .map((hint, childHint) => (childHint.isDefined() ? childHint : hint))
85
+ .def(''),
86
+ ...(isChoiceColumn && {
87
+ choices: $.def({}),
88
+ dropdown: $.from('choiceOption')
89
+ .map((value) => {
90
+ const val = value.getValue()
91
+ if (
92
+ value.if(UndefinedShape) ||
93
+ val === '' ||
94
+ value.toNumber().getValue() === ChoiceDropdown.DROPDOWN_WITH_NONE
95
+ ) {
96
+ return undefined
97
+ }
98
+ return choiceDropdown[ChoiceDropdown.DROPDOWN_WITHOUT_NONE]
99
+ })
100
+ .def(choiceDropdown[ChoiceDropdown.DROPDOWN_WITH_NONE]),
101
+ }),
102
+ }))
103
+ .merge(additionalProps),
104
+ ],
105
+ })
106
+ }
107
+
108
+ /**
109
+ * Recursively converts the schema representation for a FlowArray into an
110
+ * `ObjectShape` that will be supplied as the first argument to a
111
+ * `FlowArray(...)` call-expression.
112
+ */
113
+ function buildFlowArrayFromSchema(
114
+ schemaContent: Record<string, any>,
115
+ source: FluentRecord,
116
+ parentTypeFacet: ObjectShape,
117
+ complexObjectSysId?: string,
118
+ co_type_name?: string
119
+ ): CallExpressionShape {
120
+ const rootContent = schemaContent['$COCollectionField']
121
+ if (!rootContent) {
122
+ throw new Error('Invalid complex object schema: $COCollectionField not found')
123
+ }
124
+ let rootTypeFacet = parseTypeFacet(source, schemaContent, '$COCollectionField')
125
+ if (!rootTypeFacet) {
126
+ rootTypeFacet = parentTypeFacet
127
+ }
128
+ const type = rootTypeFacet.get('type')?.asString()?.getValue()
129
+ let elementType: CallExpressionShape
130
+ if (type === 'array.object') {
131
+ const childKey = parentTypeFacet.get('childName')?.asString()?.getValue()
132
+ elementType = buildFlowObjectFromSchema(rootContent[0][childKey], source, rootTypeFacet)
133
+ } else {
134
+ elementType = buildPrimitiveFieldCallExpr(parentTypeFacet, source)
135
+ }
136
+
137
+ return new CallExpressionShape({
138
+ source,
139
+ callee: 'FlowArray',
140
+ args: [
141
+ parentTypeFacet.transform(({ $ }) => ({
142
+ ...(complexObjectSysId ? { $id: $.val(complexObjectSysId) } : {}),
143
+ ...(co_type_name ? { co_type_name: $.val(co_type_name) } : {}),
144
+ elementType: $.val(elementType),
145
+ label: $.def(''),
146
+ mandatory: $.toBoolean().def(false),
147
+ hint: $.def(''),
148
+ maxRows: $.from('maxRows', 'max_rows')
149
+ .map((maxRows, max_rows) => {
150
+ const value = max_rows.isDefined() ? max_rows : maxRows
151
+ if (value.isString() && value.getValue() !== '') {
152
+ return value.toNumber().getValue()
153
+ }
154
+ return undefined
155
+ })
156
+ .def(undefined),
157
+ childName: $,
158
+ })),
159
+ ],
160
+ })
161
+ }
162
+
163
+ function buildNestedFlowArrayFromSchema(
164
+ schemaContent: Record<string, any>,
165
+ source: FluentRecord,
166
+ parentTypeFacet: ObjectShape
167
+ ): CallExpressionShape {
168
+ const type = parentTypeFacet.get('type')?.asString()?.getValue()
169
+ let elementType: CallExpressionShape
170
+ if (type === 'array.object') {
171
+ // Unwrap the wrapper if present (used for nested array.object)
172
+ // ServiceNow stores nested array.object elements in two ways:
173
+ // 1. With $<num>_<fieldName> wrapper (e.g., $0_task)
174
+ // 2. With the field name itself as wrapper (e.g., tasks inside tasks array)
175
+ const keys = Object.keys(schemaContent)
176
+ const wrapperKey = keys.find((k) => /^\$\d+_/.test(k)) ?? keys.find((k) => !k.endsWith('.$field_facets'))
177
+ const innerContent = wrapperKey ? schemaContent[wrapperKey] : schemaContent
178
+ elementType = buildFlowObjectFromSchema(innerContent, source, parentTypeFacet)
179
+ } else {
180
+ elementType = buildPrimitiveFieldCallExpr(parentTypeFacet, source)
181
+ }
182
+
183
+ return new CallExpressionShape({
184
+ source,
185
+ callee: 'FlowArray',
186
+ args: [
187
+ parentTypeFacet.transform(({ $ }) => ({
188
+ elementType: $.val(elementType),
189
+ label: $.def(''),
190
+ mandatory: $.toBoolean().def(false),
191
+ hint: $.def(''),
192
+ maxRows: $.from('maxRows', 'max_rows')
193
+ .map((maxRows, max_rows) => {
194
+ const value = max_rows.isDefined() ? max_rows : maxRows
195
+ if (value.isString() && value.getValue() !== '') {
196
+ return value.toNumber().getValue()
197
+ }
198
+ return undefined
199
+ })
200
+ .def(undefined),
201
+ childName: $,
202
+ })),
203
+ ],
204
+ })
205
+ }
206
+
207
+ /**
208
+ * Recursively converts the schema representation for a FlowObject into an
209
+ * `ObjectShape` that will be supplied as the first argument to a
210
+ * `FlowObject(...)` call-expression.
211
+ */
212
+ function buildFlowObjectFromSchema(
213
+ schemaContent: Record<string, any>,
214
+ source: FluentRecord,
215
+ parentTypeFacet: ObjectShape,
216
+ complexObjectSysId?: string,
217
+ co_type_name?: string
218
+ ): CallExpressionShape {
219
+ const properties: Record<string, unknown> = {}
220
+
221
+ if (typeof schemaContent === 'object') {
222
+ for (const [key, value] of Object.entries(schemaContent)) {
223
+ // Skip facet keys – they belong to the previous field name.
224
+ if (key.endsWith('.$field_facets')) {
225
+ continue
226
+ }
227
+
228
+ const fieldFacet = parseFieldFacet(source, schemaContent, key)
229
+ if (!fieldFacet) {
230
+ throw new Error(`Invalid complex object schema: ${key} facet not found`)
231
+ }
232
+ if (typeof value === 'string') {
233
+ // Primitive field
234
+ properties[key] = buildPrimitiveFieldCallExpr(fieldFacet, source)
235
+ } else if (typeof value === 'object' && value !== null) {
236
+ if (Array.isArray(value)) {
237
+ // Nested FlowArray
238
+ properties[key] = buildNestedFlowArrayFromSchema(value[0], source, fieldFacet)
239
+ } else {
240
+ // Nested FlowObject
241
+ properties[key] = buildFlowObjectFromSchema(value, source, fieldFacet)
242
+ }
243
+ }
244
+ }
245
+ }
246
+
247
+ return new CallExpressionShape({
248
+ source,
249
+ callee: 'FlowObject',
250
+ args: [
251
+ parentTypeFacet.transform(({ $ }) => ({
252
+ ...(complexObjectSysId ? { $id: $.val(complexObjectSysId) } : {}),
253
+ ...(co_type_name ? { co_type_name: $.val(co_type_name) } : {}),
254
+ fields: $.val(properties),
255
+ label: $.from('label', 'childLabel')
256
+ .map((label, child) => (child.isDefined() ? child : label))
257
+ .def(''),
258
+ mandatory: $.toBoolean().def(false),
259
+ })),
260
+ ],
261
+ })
262
+ }
263
+
264
+ /**
265
+ * Main entry ‑ convert `serialized_content` JSON → FlowObject or FlowArray call expression.
266
+ *
267
+ * @param schema Parsed `serialized_content`.
268
+ * @param source Optional source node to attach to created shapes.
269
+ * @param complexObjectSysId The sys_id of the sys_complex_object record (if available)
270
+ * @param co_type_name The name field from sys_complex_object
271
+ */
272
+ export function buildComplexObjectFromSchema(
273
+ source: FluentRecord,
274
+ schema: Record<string, any>,
275
+ attributes: COAttributes,
276
+ complexObjectSysId?: string,
277
+ co_type_name?: string
278
+ ): CallExpressionShape {
279
+ const { co_type_name: attrCoTypeName, uiType, ...rest } = attributes
280
+ const rootKey = `FlowDesigner:${attrCoTypeName}`
281
+ if (!rootKey) {
282
+ throw new Error(`Invalid complex object schema: ${attrCoTypeName} not found`)
283
+ }
284
+ const rootContent = schema[rootKey]
285
+ let rootTypeFacet = parseTypeFacet(source, schema, rootKey)
286
+
287
+ if (!rootTypeFacet) {
288
+ throw new Error('Invalid complex object schema: root type facet not found')
289
+ }
290
+
291
+ rootTypeFacet = rootTypeFacet.merge({
292
+ type: uiType,
293
+ ...rest,
294
+ })
295
+ // Pass the explicit co_type_name parameter (undefined for deterministic, value for non-deterministic)
296
+ if (uiType.startsWith('array.')) {
297
+ return buildFlowArrayFromSchema(rootContent, source, rootTypeFacet, complexObjectSysId, co_type_name)
298
+ }
299
+ return buildFlowObjectFromSchema(rootContent, source, rootTypeFacet, complexObjectSysId, co_type_name)
300
+ }
301
+
302
+ function parseTypeFacet(source: FluentRecord, schema: Record<string, any>, key: string): ObjectShape | undefined {
303
+ const facetKey = `${key}.$type_facets`
304
+ return parseFacet(source, schema, facetKey)
305
+ }
306
+
307
+ function parseFieldFacet(source: FluentRecord, schema: Record<string, any>, key: string): ObjectShape | undefined {
308
+ const facetKey = `${key}.$field_facets`
309
+ return parseFacet(source, schema, facetKey)
310
+ }
311
+
312
+ function parseFacet(source: FluentRecord, schema: Record<string, any>, facetKey: string) {
313
+ const facet = schema[facetKey]?.SimpleMapFacet
314
+
315
+ if (!facet) {
316
+ return undefined
317
+ }
318
+
319
+ const choices = schema[facetKey]?.SimpleChoiceFacet
320
+
321
+ try {
322
+ const parsed = JSON.parse(facet)
323
+ const parsedChoices = choices ? JSON.parse(choices)['choice_map_key$'] : {}
324
+ return new ObjectShape({
325
+ source,
326
+ properties: {
327
+ type: parsed['uiType'],
328
+ label: parsed['label'],
329
+ mandatory: parsed['mandatory'],
330
+ reference: parsed['reference'],
331
+ childName: parsed['child_name'],
332
+ childMaxLength: parsed['child_maxsize'],
333
+ childHint: parsed['child_hint'],
334
+ maxLength: parsed['max_length'],
335
+ maxRows: parsed['max_rows'],
336
+ childType: parsed['child_type'],
337
+ childLabel: parsed['child_label'],
338
+ choiceOption: parsed['choiceOption'],
339
+ defaultValue: parsed['default_value'],
340
+ childDefaultValue: parsed['child_defaultValue'],
341
+ hint: parsed['hint'],
342
+ choices: Object.keys(parsedChoices).reduce(
343
+ (acc, key) => {
344
+ const { label, value, order } = JSON.parse(parsedChoices[key])
345
+ acc[value] = { label, sequence: order }
346
+ return acc
347
+ },
348
+ {} as globalThis.Record<string, { label: string; sequence: number }>
349
+ ),
350
+ },
351
+ })
352
+ } catch {
353
+ // Failed to parse facet - returning undefined
354
+ }
355
+
356
+ return undefined
357
+ }
358
+
359
+ export function getAttributeValue(attributesStr: string, key: string): string | undefined {
360
+ const attributes = parseAttributesToObject(attributesStr)
361
+ return attributes[key]
362
+ }
363
+
364
+ type COAttributes = {
365
+ dynamic: string
366
+ co_type_name: string
367
+ uiType: string
368
+ child_label?: string
369
+ child_name?: string
370
+ child_type?: string
371
+ [key: string]: string | undefined
372
+ }
373
+
374
+ export function parseAttributesToObject(attributesStr: string): COAttributes {
375
+ return attributesStr
376
+ .split(',')
377
+ .map((p) => p.trim())
378
+ .reduce((acc, pair) => {
379
+ const [key, value] = pair.split('=')
380
+ if (key && value !== undefined) {
381
+ acc[key as keyof COAttributes] = value
382
+ }
383
+ return acc
384
+ }, {} as COAttributes)
385
+ }
@@ -0,0 +1,174 @@
1
+ import type { Database, Record, Shape, Source } from '@servicenow/sdk-build-core'
2
+ import {
3
+ ArrayShape,
4
+ IdentifierShape,
5
+ PropertyAccessShape,
6
+ TemplateExpressionShape,
7
+ TemplateSpanShape,
8
+ isGUID,
9
+ } from '@servicenow/sdk-build-core'
10
+ import { getIdentifierFromRecord } from './utils'
11
+ import {
12
+ CATALOG_VARIABLE_ACTIONS,
13
+ CORE_ACTIONS_SYS_ID_NAME_MAP,
14
+ CATALOG_ITEM_TABLE,
15
+ CATALOG_VARIABLE_TABLE,
16
+ } from './flow-constants'
17
+
18
+ /**
19
+ * Service Catalog Utility Functions
20
+ *
21
+ * This module contains utilities for transforming catalog item and catalog variable
22
+ * data between XML and Fluent formats, including:
23
+ * - Checking if an action is catalog-related
24
+ * - Finding catalog items by sys_id
25
+ * - Creating template expressions for catalog item references
26
+ * - Converting slushbucket format to catalog variable arrays
27
+ */
28
+
29
+ /**
30
+ * Check if an action definition is a catalog-related action (getCatalogVariables or createCatalogTask).
31
+ * @param actionDefinition - The action definition shape
32
+ * @returns true if the action is getCatalogVariables or createCatalogTask, false otherwise
33
+ */
34
+ export function isCatalogAction(actionDefinition: Shape | undefined): boolean {
35
+ const actionName = CORE_ACTIONS_SYS_ID_NAME_MAP[actionDefinition?.getValue() as string]
36
+ return actionName ? CATALOG_VARIABLE_ACTIONS.includes(actionName) : false
37
+ }
38
+
39
+ /**
40
+ * Helper function to find catalog item record by sys_id from database.
41
+ * @param sysId - The sys_id of the catalog item (must be 32 characters)
42
+ * @param database - Database instance to query
43
+ * @returns Catalog item record or undefined if not found
44
+ */
45
+ export function findCatalogItemBySysId(sysId: string | undefined, database: Database | undefined): Record | undefined {
46
+ if (!database || !sysId || !isGUID(sysId)) {
47
+ return undefined
48
+ }
49
+ return database.get(CATALOG_ITEM_TABLE, sysId)
50
+ }
51
+
52
+ /**
53
+ * Helper function to create a template expression from an identifier.
54
+ * Creates: `${identifierName}`
55
+ */
56
+ export function createTemplateExpressionFromIdentifier(
57
+ identifierName: string,
58
+ source: Source
59
+ ): TemplateExpressionShape {
60
+ return new TemplateExpressionShape({
61
+ source,
62
+ literalText: '',
63
+ spans: [
64
+ new TemplateSpanShape({
65
+ source,
66
+ expression: new IdentifierShape({ source, name: identifierName }),
67
+ literalText: '',
68
+ }),
69
+ ],
70
+ })
71
+ }
72
+
73
+ /**
74
+ * Helper function to create a PropertyAccessShape for a catalog variable reference.
75
+ * Creates: catalogItemIdentifierName.variables.varName
76
+ */
77
+ export function createCatalogVariablePropertyAccess(
78
+ catalogItemRecord: Record,
79
+ catalogItemIdentifierName: string,
80
+ varName: string,
81
+ source: Source
82
+ ): PropertyAccessShape {
83
+ const catalogItemIdentifier = new IdentifierShape({
84
+ source: catalogItemRecord.getOriginalNode() || source,
85
+ name: catalogItemIdentifierName,
86
+ value: catalogItemRecord,
87
+ })
88
+ const variablesIdentifier = new IdentifierShape({
89
+ source,
90
+ name: 'variables',
91
+ })
92
+ const varNameIdentifier = new IdentifierShape({
93
+ source,
94
+ name: varName,
95
+ })
96
+
97
+ return new PropertyAccessShape({
98
+ source,
99
+ elements: [catalogItemIdentifier, variablesIdentifier, varNameIdentifier],
100
+ })
101
+ }
102
+
103
+ /**
104
+ * Convert slushbucket format (comma-separated sys_id:name pairs) to an array of catalog variable references.
105
+ * Example: "abc123:email,def456:html" → [catalogItem.variables.email, catalogItem.variables.html]
106
+ *
107
+ * @param slushBucketValue - Slushbucket string from XML
108
+ * @param catalogItemRecord - Catalog item record to look up variables
109
+ * @param source - Source for creating shapes
110
+ * @param actionInstanceUUID - UUID of the action instance (for label_cache lookup)
111
+ * @param flowRecord - Flow record containing label_cache
112
+ * @returns ArrayShape of PropertyAccessShape elements or undefined if conversion fails
113
+ */
114
+ export function convertSlushBucketToCatalogVariableArray(
115
+ slushBucketValue: string,
116
+ catalogItemRecord: Record | undefined,
117
+ source: Source
118
+ ): ArrayShape | undefined {
119
+ if (!catalogItemRecord) {
120
+ return undefined
121
+ }
122
+
123
+ const variableShapes: PropertyAccessShape[] = []
124
+ const catalogItemIdentifierName = getIdentifierFromRecord(catalogItemRecord) || 'catalogItem'
125
+
126
+ //use slushbucket sys_ids to look up variable names
127
+ if (!slushBucketValue || !slushBucketValue.trim()) {
128
+ return undefined
129
+ }
130
+
131
+ const entries = slushBucketValue
132
+ .split(',')
133
+ .map((entry) => entry.trim())
134
+ .filter(Boolean)
135
+
136
+ // Build a map of sysId → record by iterating allRecords once
137
+ const variableRecordBySysId = new Map<string, Record>()
138
+ for (const rec of catalogItemRecord.flat()) {
139
+ if (rec.getTable() === CATALOG_VARIABLE_TABLE) {
140
+ variableRecordBySysId.set(rec.getId().getValue(), rec)
141
+ }
142
+ }
143
+
144
+ for (const entry of entries) {
145
+ const [sysId] = entry.split(':')
146
+ if (!sysId || !sysId.trim()) {
147
+ continue
148
+ }
149
+ const variableRecord = variableRecordBySysId.get(sysId)
150
+
151
+ if (variableRecord) {
152
+ const varName = variableRecord.get('name')?.asString()?.getValue()
153
+ if (varName) {
154
+ // Create PropertyAccessShape: catalogItemIdentifierName.variables.varName
155
+ const propertyAccess = createCatalogVariablePropertyAccess(
156
+ catalogItemRecord,
157
+ catalogItemIdentifierName,
158
+ varName,
159
+ source
160
+ )
161
+ variableShapes.push(propertyAccess)
162
+ }
163
+ }
164
+ }
165
+
166
+ if (variableShapes.length === 0) {
167
+ return undefined
168
+ }
169
+
170
+ return new ArrayShape({
171
+ source,
172
+ elements: variableShapes,
173
+ })
174
+ }