@servicenow/sdk-build-plugins 4.2.0 → 4.3.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 (330) hide show
  1. package/dist/acl-plugin.js +9 -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-plugin.js +1 -1
  15. package/dist/column-plugin.js.map +1 -1
  16. package/dist/dashboard/dashboard-component-property-defaults.d.ts +152 -0
  17. package/dist/dashboard/dashboard-component-property-defaults.js +264 -0
  18. package/dist/dashboard/dashboard-component-property-defaults.js.map +1 -0
  19. package/dist/dashboard/dashboard-component-resolver.d.ts +13 -0
  20. package/dist/dashboard/dashboard-component-resolver.js +69 -0
  21. package/dist/dashboard/dashboard-component-resolver.js.map +1 -0
  22. package/dist/dashboard/dashboard-plugin.d.ts +12 -0
  23. package/dist/dashboard/dashboard-plugin.js +397 -0
  24. package/dist/dashboard/dashboard-plugin.js.map +1 -0
  25. package/dist/data-plugin.d.ts +3 -0
  26. package/dist/data-plugin.js +61 -113
  27. package/dist/data-plugin.js.map +1 -1
  28. package/dist/email-notification-plugin.d.ts +2 -0
  29. package/dist/email-notification-plugin.js +541 -0
  30. package/dist/email-notification-plugin.js.map +1 -0
  31. package/dist/flow/constants/flow-plugin-constants.d.ts +58 -0
  32. package/dist/flow/constants/flow-plugin-constants.js +70 -0
  33. package/dist/flow/constants/flow-plugin-constants.js.map +1 -0
  34. package/dist/flow/flow-logic/flow-logic-constants.d.ts +38 -0
  35. package/dist/flow/flow-logic/flow-logic-constants.js +118 -0
  36. package/dist/flow/flow-logic/flow-logic-constants.js.map +1 -0
  37. package/dist/flow/flow-logic/flow-logic-diagnostics.d.ts +19 -0
  38. package/dist/flow/flow-logic/flow-logic-diagnostics.js +503 -0
  39. package/dist/flow/flow-logic/flow-logic-diagnostics.js.map +1 -0
  40. package/dist/flow/flow-logic/flow-logic-plugin-helpers.d.ts +62 -0
  41. package/dist/flow/flow-logic/flow-logic-plugin-helpers.js +2092 -0
  42. package/dist/flow/flow-logic/flow-logic-plugin-helpers.js.map +1 -0
  43. package/dist/flow/flow-logic/flow-logic-plugin.d.ts +52 -0
  44. package/dist/flow/flow-logic/flow-logic-plugin.js +283 -0
  45. package/dist/flow/flow-logic/flow-logic-plugin.js.map +1 -0
  46. package/dist/flow/flow-logic/flow-logic-shapes.d.ts +104 -0
  47. package/dist/flow/flow-logic/flow-logic-shapes.js +201 -0
  48. package/dist/flow/flow-logic/flow-logic-shapes.js.map +1 -0
  49. package/dist/flow/plugins/approval-rules-plugin.d.ts +2 -0
  50. package/dist/flow/plugins/approval-rules-plugin.js +49 -0
  51. package/dist/flow/plugins/approval-rules-plugin.js.map +1 -0
  52. package/dist/flow/plugins/flow-action-definition-plugin.d.ts +2 -0
  53. package/dist/flow/plugins/flow-action-definition-plugin.js +286 -0
  54. package/dist/flow/plugins/flow-action-definition-plugin.js.map +1 -0
  55. package/dist/flow/plugins/flow-data-pill-plugin.d.ts +9 -0
  56. package/dist/flow/plugins/flow-data-pill-plugin.js +212 -0
  57. package/dist/flow/plugins/flow-data-pill-plugin.js.map +1 -0
  58. package/dist/flow/plugins/flow-definition-plugin.d.ts +2 -0
  59. package/dist/flow/plugins/flow-definition-plugin.js +1668 -0
  60. package/dist/flow/plugins/flow-definition-plugin.js.map +1 -0
  61. package/dist/flow/plugins/flow-diagnostics-plugin.d.ts +26 -0
  62. package/dist/flow/plugins/flow-diagnostics-plugin.js +217 -0
  63. package/dist/flow/plugins/flow-diagnostics-plugin.js.map +1 -0
  64. package/dist/flow/plugins/flow-instance-plugin.d.ts +12 -0
  65. package/dist/flow/plugins/flow-instance-plugin.js +930 -0
  66. package/dist/flow/plugins/flow-instance-plugin.js.map +1 -0
  67. package/dist/flow/plugins/flow-trigger-instance-plugin.d.ts +2 -0
  68. package/dist/flow/plugins/flow-trigger-instance-plugin.js +324 -0
  69. package/dist/flow/plugins/flow-trigger-instance-plugin.js.map +1 -0
  70. package/dist/flow/plugins/inline-script-plugin.d.ts +39 -0
  71. package/dist/flow/plugins/inline-script-plugin.js +80 -0
  72. package/dist/flow/plugins/inline-script-plugin.js.map +1 -0
  73. package/dist/flow/plugins/step-definition-plugin.d.ts +5 -0
  74. package/dist/flow/plugins/step-definition-plugin.js +71 -0
  75. package/dist/flow/plugins/step-definition-plugin.js.map +1 -0
  76. package/dist/flow/plugins/step-instance-plugin.d.ts +31 -0
  77. package/dist/flow/plugins/step-instance-plugin.js +339 -0
  78. package/dist/flow/plugins/step-instance-plugin.js.map +1 -0
  79. package/dist/flow/plugins/trigger-plugin.d.ts +2 -0
  80. package/dist/flow/plugins/trigger-plugin.js +96 -0
  81. package/dist/flow/plugins/trigger-plugin.js.map +1 -0
  82. package/dist/flow/plugins/wfa-datapill-plugin.d.ts +15 -0
  83. package/dist/flow/plugins/wfa-datapill-plugin.js +178 -0
  84. package/dist/flow/plugins/wfa-datapill-plugin.js.map +1 -0
  85. package/dist/flow/utils/approval-rules-processor.d.ts +13 -0
  86. package/dist/flow/utils/approval-rules-processor.js +267 -0
  87. package/dist/flow/utils/approval-rules-processor.js.map +1 -0
  88. package/dist/flow/utils/built-in-complex-objects.d.ts +19 -0
  89. package/dist/flow/utils/built-in-complex-objects.js +62 -0
  90. package/dist/flow/utils/built-in-complex-objects.js.map +1 -0
  91. package/dist/flow/utils/complex-object-resolver.d.ts +8 -0
  92. package/dist/flow/utils/complex-object-resolver.js +614 -0
  93. package/dist/flow/utils/complex-object-resolver.js.map +1 -0
  94. package/dist/flow/utils/complex-objects.d.ts +36 -0
  95. package/dist/flow/utils/complex-objects.js +481 -0
  96. package/dist/flow/utils/complex-objects.js.map +1 -0
  97. package/dist/flow/utils/data-pill-shapes.d.ts +58 -0
  98. package/dist/flow/utils/data-pill-shapes.js +135 -0
  99. package/dist/flow/utils/data-pill-shapes.js.map +1 -0
  100. package/dist/flow/utils/datapill-transformer.d.ts +110 -0
  101. package/dist/flow/utils/datapill-transformer.js +503 -0
  102. package/dist/flow/utils/datapill-transformer.js.map +1 -0
  103. package/dist/flow/utils/flow-constants.d.ts +65 -0
  104. package/dist/flow/utils/flow-constants.js +223 -0
  105. package/dist/flow/utils/flow-constants.js.map +1 -0
  106. package/dist/flow/utils/flow-io-to-record.d.ts +44 -0
  107. package/dist/flow/utils/flow-io-to-record.js +409 -0
  108. package/dist/flow/utils/flow-io-to-record.js.map +1 -0
  109. package/dist/flow/utils/flow-shapes.d.ts +161 -0
  110. package/dist/flow/utils/flow-shapes.js +255 -0
  111. package/dist/flow/utils/flow-shapes.js.map +1 -0
  112. package/dist/flow/utils/flow-to-xml.d.ts +16 -0
  113. package/dist/flow/utils/flow-to-xml.js +237 -0
  114. package/dist/flow/utils/flow-to-xml.js.map +1 -0
  115. package/dist/flow/utils/flow-variable-processor.d.ts +51 -0
  116. package/dist/flow/utils/flow-variable-processor.js +69 -0
  117. package/dist/flow/utils/flow-variable-processor.js.map +1 -0
  118. package/dist/flow/utils/label-cache-parser.d.ts +7 -0
  119. package/dist/flow/utils/label-cache-parser.js +24 -0
  120. package/dist/flow/utils/label-cache-parser.js.map +1 -0
  121. package/dist/flow/utils/label-cache-processor.d.ts +119 -0
  122. package/dist/flow/utils/label-cache-processor.js +719 -0
  123. package/dist/flow/utils/label-cache-processor.js.map +1 -0
  124. package/dist/flow/utils/pill-string-parser.d.ts +88 -0
  125. package/dist/flow/utils/pill-string-parser.js +306 -0
  126. package/dist/flow/utils/pill-string-parser.js.map +1 -0
  127. package/dist/flow/utils/schema-to-flow-object.d.ts +22 -0
  128. package/dist/flow/utils/schema-to-flow-object.js +318 -0
  129. package/dist/flow/utils/schema-to-flow-object.js.map +1 -0
  130. package/dist/flow/utils/utils.d.ts +117 -0
  131. package/dist/flow/utils/utils.js +345 -0
  132. package/dist/flow/utils/utils.js.map +1 -0
  133. package/dist/index.d.ts +20 -1
  134. package/dist/index.js +21 -1
  135. package/dist/index.js.map +1 -1
  136. package/dist/list-plugin.js +1 -1
  137. package/dist/list-plugin.js.map +1 -1
  138. package/dist/now-attach-plugin.d.ts +1 -0
  139. package/dist/now-attach-plugin.js +3 -0
  140. package/dist/now-attach-plugin.js.map +1 -1
  141. package/dist/record-plugin.d.ts +29 -0
  142. package/dist/record-plugin.js +66 -7
  143. package/dist/record-plugin.js.map +1 -1
  144. package/dist/repack/index.d.ts +2 -0
  145. package/dist/repack/index.js +8 -0
  146. package/dist/repack/index.js.map +1 -1
  147. package/dist/rest-api-plugin.js +54 -44
  148. package/dist/rest-api-plugin.js.map +1 -1
  149. package/dist/server-module-plugin/index.js +38 -4
  150. package/dist/server-module-plugin/index.js.map +1 -1
  151. package/dist/service-catalog/catalog-clientscript-plugin.d.ts +2 -0
  152. package/dist/service-catalog/catalog-clientscript-plugin.js +117 -0
  153. package/dist/service-catalog/catalog-clientscript-plugin.js.map +1 -0
  154. package/dist/service-catalog/catalog-item-plugin.d.ts +2 -0
  155. package/dist/service-catalog/catalog-item-plugin.js +115 -0
  156. package/dist/service-catalog/catalog-item-plugin.js.map +1 -0
  157. package/dist/service-catalog/catalog-ui-policy-plugin.d.ts +2 -0
  158. package/dist/service-catalog/catalog-ui-policy-plugin.js +266 -0
  159. package/dist/service-catalog/catalog-ui-policy-plugin.js.map +1 -0
  160. package/dist/service-catalog/index.d.ts +5 -0
  161. package/dist/service-catalog/index.js +22 -0
  162. package/dist/service-catalog/index.js.map +1 -0
  163. package/dist/service-catalog/record-to-shape.d.ts +6 -0
  164. package/dist/service-catalog/record-to-shape.js +93 -0
  165. package/dist/service-catalog/record-to-shape.js.map +1 -0
  166. package/dist/service-catalog/sc-record-producer-plugin.d.ts +2 -0
  167. package/dist/service-catalog/sc-record-producer-plugin.js +139 -0
  168. package/dist/service-catalog/sc-record-producer-plugin.js.map +1 -0
  169. package/dist/service-catalog/service-catalog-base.d.ts +311 -0
  170. package/dist/service-catalog/service-catalog-base.js +542 -0
  171. package/dist/service-catalog/service-catalog-base.js.map +1 -0
  172. package/dist/service-catalog/service-catalog-diagnostics.d.ts +45 -0
  173. package/dist/service-catalog/service-catalog-diagnostics.js +169 -0
  174. package/dist/service-catalog/service-catalog-diagnostics.js.map +1 -0
  175. package/dist/service-catalog/shape-to-record.d.ts +7 -0
  176. package/dist/service-catalog/shape-to-record.js +232 -0
  177. package/dist/service-catalog/shape-to-record.js.map +1 -0
  178. package/dist/service-catalog/utils.d.ts +313 -0
  179. package/dist/service-catalog/utils.js +1144 -0
  180. package/dist/service-catalog/utils.js.map +1 -0
  181. package/dist/service-catalog/variable-helper.d.ts +43 -0
  182. package/dist/service-catalog/variable-helper.js +92 -0
  183. package/dist/service-catalog/variable-helper.js.map +1 -0
  184. package/dist/service-catalog/variable-set-plugin.d.ts +2 -0
  185. package/dist/service-catalog/variable-set-plugin.js +175 -0
  186. package/dist/service-catalog/variable-set-plugin.js.map +1 -0
  187. package/dist/service-catalog/variables-transform.d.ts +139 -0
  188. package/dist/service-catalog/variables-transform.js +403 -0
  189. package/dist/service-catalog/variables-transform.js.map +1 -0
  190. package/dist/sla/sla-validators.d.ts +61 -0
  191. package/dist/sla/sla-validators.js +224 -0
  192. package/dist/sla/sla-validators.js.map +1 -0
  193. package/dist/sla-plugin.d.ts +5 -0
  194. package/dist/sla-plugin.js +280 -0
  195. package/dist/sla-plugin.js.map +1 -0
  196. package/dist/table-plugin.js +16 -2
  197. package/dist/table-plugin.js.map +1 -1
  198. package/dist/ui-policy-plugin.js +5 -7
  199. package/dist/ui-policy-plugin.js.map +1 -1
  200. package/dist/utils.d.ts +10 -1
  201. package/dist/utils.js +16 -0
  202. package/dist/utils.js.map +1 -1
  203. package/dist/ux-list-menu-config-plugin.d.ts +2 -0
  204. package/dist/ux-list-menu-config-plugin.js +292 -0
  205. package/dist/ux-list-menu-config-plugin.js.map +1 -0
  206. package/dist/workspace-plugin/chrome-tab.d.ts +2 -0
  207. package/dist/workspace-plugin/chrome-tab.js +46 -0
  208. package/dist/workspace-plugin/chrome-tab.js.map +1 -0
  209. package/dist/workspace-plugin/constants.d.ts +52 -0
  210. package/dist/workspace-plugin/constants.js +56 -0
  211. package/dist/workspace-plugin/constants.js.map +1 -0
  212. package/dist/workspace-plugin/fluent-utils.d.ts +9 -0
  213. package/dist/workspace-plugin/fluent-utils.js +60 -0
  214. package/dist/workspace-plugin/fluent-utils.js.map +1 -0
  215. package/dist/workspace-plugin/page.d.ts +8 -0
  216. package/dist/workspace-plugin/page.js +108 -0
  217. package/dist/workspace-plugin/page.js.map +1 -0
  218. package/dist/workspace-plugin/screen.d.ts +1 -0
  219. package/dist/workspace-plugin/screen.js +38 -0
  220. package/dist/workspace-plugin/screen.js.map +1 -0
  221. package/dist/workspace-plugin/templates/index.d.ts +10 -0
  222. package/dist/workspace-plugin/templates/index.js +20 -0
  223. package/dist/workspace-plugin/templates/index.js.map +1 -0
  224. package/dist/workspace-plugin/templates/record-page-composition.d.ts +1 -0
  225. package/dist/workspace-plugin/templates/record-page-composition.js +4043 -0
  226. package/dist/workspace-plugin/templates/record-page-composition.js.map +1 -0
  227. package/dist/workspace-plugin/templates/record-page-data.d.ts +1 -0
  228. package/dist/workspace-plugin/templates/record-page-data.js +527 -0
  229. package/dist/workspace-plugin/templates/record-page-data.js.map +1 -0
  230. package/dist/workspace-plugin/templates/record-page-interalEventMappings.d.ts +1 -0
  231. package/dist/workspace-plugin/templates/record-page-interalEventMappings.js +39 -0
  232. package/dist/workspace-plugin/templates/record-page-interalEventMappings.js.map +1 -0
  233. package/dist/workspace-plugin/templates/record-page-layoutModel.d.ts +1 -0
  234. package/dist/workspace-plugin/templates/record-page-layoutModel.js +55 -0
  235. package/dist/workspace-plugin/templates/record-page-layoutModel.js.map +1 -0
  236. package/dist/workspace-plugin/templates/record-page-properties.d.ts +1 -0
  237. package/dist/workspace-plugin/templates/record-page-properties.js +135 -0
  238. package/dist/workspace-plugin/templates/record-page-properties.js.map +1 -0
  239. package/dist/workspace-plugin/templates/record-page.d.ts +3 -0
  240. package/dist/workspace-plugin/templates/record-page.js +8 -0
  241. package/dist/workspace-plugin/templates/record-page.js.map +1 -0
  242. package/dist/workspace-plugin.d.ts +2 -0
  243. package/dist/workspace-plugin.js +453 -0
  244. package/dist/workspace-plugin.js.map +1 -0
  245. package/package.json +10 -12
  246. package/src/acl-plugin.ts +14 -1
  247. package/src/applicability-plugin.ts +82 -0
  248. package/src/atf/test-plugin.ts +6 -3
  249. package/src/basic-syntax-plugin.ts +10 -1
  250. package/src/business-rule-plugin.ts +2 -1
  251. package/src/call-expression-plugin.ts +2 -130
  252. package/src/column-plugin.ts +1 -1
  253. package/src/dashboard/dashboard-component-property-defaults.ts +277 -0
  254. package/src/dashboard/dashboard-component-resolver.ts +69 -0
  255. package/src/dashboard/dashboard-plugin.ts +450 -0
  256. package/src/data-plugin.ts +67 -139
  257. package/src/email-notification-plugin.ts +850 -0
  258. package/src/flow/constants/flow-plugin-constants.ts +79 -0
  259. package/src/flow/flow-logic/flow-logic-constants.ts +120 -0
  260. package/src/flow/flow-logic/flow-logic-diagnostics.ts +591 -0
  261. package/src/flow/flow-logic/flow-logic-plugin-helpers.ts +2550 -0
  262. package/src/flow/flow-logic/flow-logic-plugin.ts +337 -0
  263. package/src/flow/flow-logic/flow-logic-shapes.ts +215 -0
  264. package/src/flow/plugins/approval-rules-plugin.ts +48 -0
  265. package/src/flow/plugins/flow-action-definition-plugin.ts +295 -0
  266. package/src/flow/plugins/flow-data-pill-plugin.ts +258 -0
  267. package/src/flow/plugins/flow-definition-plugin.ts +2173 -0
  268. package/src/flow/plugins/flow-diagnostics-plugin.ts +280 -0
  269. package/src/flow/plugins/flow-instance-plugin.ts +1148 -0
  270. package/src/flow/plugins/flow-trigger-instance-plugin.ts +426 -0
  271. package/src/flow/plugins/inline-script-plugin.ts +83 -0
  272. package/src/flow/plugins/step-definition-plugin.ts +67 -0
  273. package/src/flow/plugins/step-instance-plugin.ts +431 -0
  274. package/src/flow/plugins/trigger-plugin.ts +95 -0
  275. package/src/flow/plugins/wfa-datapill-plugin.ts +213 -0
  276. package/src/flow/utils/approval-rules-processor.ts +298 -0
  277. package/src/flow/utils/built-in-complex-objects.ts +81 -0
  278. package/src/flow/utils/complex-object-resolver.ts +875 -0
  279. package/src/flow/utils/complex-objects.ts +656 -0
  280. package/src/flow/utils/data-pill-shapes.ts +165 -0
  281. package/src/flow/utils/datapill-transformer.ts +632 -0
  282. package/src/flow/utils/flow-constants.ts +276 -0
  283. package/src/flow/utils/flow-io-to-record.ts +533 -0
  284. package/src/flow/utils/flow-shapes.ts +296 -0
  285. package/src/flow/utils/flow-to-xml.ts +318 -0
  286. package/src/flow/utils/flow-variable-processor.ts +100 -0
  287. package/src/flow/utils/label-cache-parser.ts +37 -0
  288. package/src/flow/utils/label-cache-processor.ts +870 -0
  289. package/src/flow/utils/pill-string-parser.ts +375 -0
  290. package/src/flow/utils/schema-to-flow-object.ts +385 -0
  291. package/src/flow/utils/utils.ts +395 -0
  292. package/src/index.ts +21 -1
  293. package/src/list-plugin.ts +1 -1
  294. package/src/now-attach-plugin.ts +4 -0
  295. package/src/record-plugin.ts +76 -11
  296. package/src/repack/index.ts +14 -0
  297. package/src/rest-api-plugin.ts +62 -50
  298. package/src/server-module-plugin/index.ts +53 -17
  299. package/src/service-catalog/catalog-clientscript-plugin.ts +140 -0
  300. package/src/service-catalog/catalog-item-plugin.ts +162 -0
  301. package/src/service-catalog/catalog-ui-policy-plugin.ts +324 -0
  302. package/src/service-catalog/index.ts +5 -0
  303. package/src/service-catalog/record-to-shape.ts +109 -0
  304. package/src/service-catalog/sc-record-producer-plugin.ts +201 -0
  305. package/src/service-catalog/service-catalog-base.ts +600 -0
  306. package/src/service-catalog/service-catalog-diagnostics.ts +251 -0
  307. package/src/service-catalog/shape-to-record.ts +275 -0
  308. package/src/service-catalog/utils.ts +1362 -0
  309. package/src/service-catalog/variable-helper.ts +135 -0
  310. package/src/service-catalog/variable-set-plugin.ts +197 -0
  311. package/src/service-catalog/variables-transform.ts +438 -0
  312. package/src/sla/sla-validators.ts +331 -0
  313. package/src/sla-plugin.ts +358 -0
  314. package/src/table-plugin.ts +19 -2
  315. package/src/ui-policy-plugin.ts +5 -9
  316. package/src/utils.ts +24 -1
  317. package/src/ux-list-menu-config-plugin.ts +312 -0
  318. package/src/workspace-plugin/chrome-tab.ts +44 -0
  319. package/src/workspace-plugin/constants.ts +53 -0
  320. package/src/workspace-plugin/fluent-utils.ts +60 -0
  321. package/src/workspace-plugin/page.ts +139 -0
  322. package/src/workspace-plugin/screen.ts +34 -0
  323. package/src/workspace-plugin/templates/index.ts +17 -0
  324. package/src/workspace-plugin/templates/record-page-composition.ts +4051 -0
  325. package/src/workspace-plugin/templates/record-page-data.ts +523 -0
  326. package/src/workspace-plugin/templates/record-page-interalEventMappings.ts +35 -0
  327. package/src/workspace-plugin/templates/record-page-layoutModel.ts +51 -0
  328. package/src/workspace-plugin/templates/record-page-properties.ts +131 -0
  329. package/src/workspace-plugin/templates/record-page.ts +6 -0
  330. package/src/workspace-plugin.ts +574 -0
@@ -578,7 +578,9 @@ export const TablePlugin = Plugin.create({
578
578
  autoNumber[0]
579
579
  ?.transform(({ $ }) => ({
580
580
  number: $.toNumber().def(1000),
581
- numberOfDigits: $.from('maximum_digits').toNumber().def(7),
581
+ numberOfDigits: $.from('maximum_digits')
582
+ .map((v) => v.ifString()?.ifNotEmpty()?.toNumber())
583
+ .def(7),
582
584
  prefix: $.def('PRE'),
583
585
  }))
584
586
  .withAliasedKeys(autoNumberAliases)
@@ -1007,6 +1009,7 @@ export const TablePlugin = Plugin.create({
1007
1009
 
1008
1010
  // sys_dictionary
1009
1011
  const schema = table.get('schema').asObject()
1012
+ const columnIdsMap = new Map<string, string>()
1010
1013
  for (const [name, column] of schema.entries()) {
1011
1014
  if (!name.match(columnNameRegex)) {
1012
1015
  diagnostics.error(
@@ -1044,6 +1047,7 @@ export const TablePlugin = Plugin.create({
1044
1047
  return { success: false }
1045
1048
  }
1046
1049
  relatedRecords.push(result.value)
1050
+ columnIdsMap.set(name, result.value.getId().getValue())
1047
1051
  }
1048
1052
 
1049
1053
  // sys_index
@@ -1062,7 +1066,20 @@ export const TablePlugin = Plugin.create({
1062
1066
  index_name: indexObject['name'],
1063
1067
  col_name_string: colNames,
1064
1068
  unique_index: indexObject['unique'] === true,
1065
- logical_table_name: table.get('name').asString().getValue(),
1069
+ logical_table_name: tableName.getValue(),
1070
+ index_col_name: colNames
1071
+ .split(',')
1072
+ .map((colName) => {
1073
+ if (!columnIdsMap.has(colName)) {
1074
+ diagnostics.error(
1075
+ index,
1076
+ `Column '${colName}' not found in table '${tableName.getValue()}'`
1077
+ )
1078
+ return ''
1079
+ }
1080
+ return columnIdsMap.get(colName)
1081
+ })
1082
+ .join(','),
1066
1083
  },
1067
1084
  })
1068
1085
  )
@@ -9,6 +9,7 @@ import {
9
9
  type Shape,
10
10
  } from '@servicenow/sdk-build-core'
11
11
  import { validateClientSideScript } from './utils'
12
+ import { NowIdShape } from './now-id-plugin'
12
13
 
13
14
  // Define table names as constants since they're not exported from the core tables
14
15
  const SYS_UI_POLICY = 'sys_ui_policy'
@@ -201,10 +202,7 @@ export const UiPolicyPlugin = Plugin.create({
201
202
  const rlActionObj: {
202
203
  list?: string
203
204
  visible?: boolean | 'ignore'
204
- $id: string
205
- } = {
206
- $id: rlAction.getId().getValue(),
207
- }
205
+ } = {}
208
206
 
209
207
  const listValue = rlAction.get('list')?.ifString()?.getValue()
210
208
  if (listValue) {
@@ -224,7 +222,7 @@ export const UiPolicyPlugin = Plugin.create({
224
222
  }
225
223
 
226
224
  // Skip if no meaningful properties (only $id exists)
227
- if (Object.keys(rlActionObj).length === 1 && rlActionObj.$id) {
225
+ if (Object.keys(rlActionObj).length === 0) {
228
226
  return null
229
227
  }
230
228
 
@@ -247,7 +245,7 @@ export const UiPolicyPlugin = Plugin.create({
247
245
  const includeScriptFalse = runScriptsValue || isValidScript(scriptFalseValue)
248
246
 
249
247
  return {
250
- $id: $.val(record.getId()),
248
+ $id: $.val(NowIdShape.from(record)),
251
249
  table: $.from('table').def(''),
252
250
  shortDescription: $.from('short_description'),
253
251
  active: $.toBoolean().def(true),
@@ -317,8 +315,6 @@ export const UiPolicyPlugin = Plugin.create({
317
315
  return { success: false }
318
316
  }
319
317
 
320
- const $id = arg.get('$id')
321
-
322
318
  // Validate table scope prefix for scoped apps
323
319
  const tableValue = arg.get('table')
324
320
  if (tableValue?.isString() && config?.scope) {
@@ -357,7 +353,7 @@ export const UiPolicyPlugin = Plugin.create({
357
353
  const policyRecord = await factory.createRecord({
358
354
  source: callExpression,
359
355
  table: SYS_UI_POLICY,
360
- explicitId: $id,
356
+ explicitId: arg.get('$id'),
361
357
  properties: arg.transform(({ $ }) => ({
362
358
  table: $.from('table').def(''),
363
359
  short_description: $.from('shortDescription'),
package/src/utils.ts CHANGED
@@ -1,4 +1,11 @@
1
- import { ts, type Shape, type ObjectShape, type Diagnostics, type Compiler } from '@servicenow/sdk-build-core'
1
+ import {
2
+ ts,
3
+ type Shape,
4
+ type ObjectShape,
5
+ type Diagnostics,
6
+ type Compiler,
7
+ type PluginApiDoc,
8
+ } from '@servicenow/sdk-build-core'
2
9
 
3
10
  export function toReference(shape: Shape) {
4
11
  return shape.ifRecord()?.getId() ?? shape.ifString()?.getValue() ?? ''
@@ -93,3 +100,19 @@ export function validateClientSideScript(script: string, compiler: Compiler): bo
93
100
 
94
101
  return isValid
95
102
  }
103
+
104
+ /**
105
+ * Creates a documentation entry for first-party SDK plugins.
106
+ * Using this helper ensures apiName and docPath are always in sync.
107
+ *
108
+ * @param apiName - The API name (e.g., 'BusinessRule', 'Acl')
109
+ * @param tags - Keywords for categorization (typically includes the ServiceNow table name)
110
+ * @returns A complete PluginApiDoc entry
111
+ */
112
+ export function createSdkDocEntry(apiName: string, tags: string[]): PluginApiDoc {
113
+ return {
114
+ apiName,
115
+ docPath: `@servicenow/sdk/docs/${apiName}/${apiName}.md`,
116
+ tags,
117
+ }
118
+ }
@@ -0,0 +1,312 @@
1
+ import { Plugin, CallExpressionShape, type Record } from '@servicenow/sdk-build-core'
2
+
3
+ import { NowIdShape } from './now-id-plugin'
4
+
5
+ export const UxListMenuConfigPlugin = Plugin.create({
6
+ name: 'UxListMenuConfigPlugin',
7
+ records: {
8
+ sys_ux_list_menu_config: {
9
+ relationships: {
10
+ sys_ux_list_category: {
11
+ via: 'configuration',
12
+ descendant: true,
13
+ },
14
+ sys_ux_list: {
15
+ via: 'configuration',
16
+ descendant: true,
17
+ },
18
+ },
19
+ toShape(record, { descendants }) {
20
+ const categories = descendants.query('sys_ux_list_category').map((category) => {
21
+ const lists = descendants
22
+ .query('sys_ux_list')
23
+ .filter((list) => {
24
+ const categoryGuid = list.get('category').isString()
25
+ ? list.get('category').getValue()
26
+ : list.get('category').asRecord().getId().getValue()
27
+
28
+ return categoryGuid === category.getId().getValue()
29
+ })
30
+ .map((list) => {
31
+ const applicabilities = descendants.query('sys_ux_applicability_m2m_list').filter((app) => {
32
+ const listGuid = app.get('list').isString()
33
+ ? app.get('list').getValue()
34
+ : app.get('list').asRecord().getId().getValue()
35
+
36
+ return listGuid === list.getId().getValue()
37
+ })
38
+
39
+ const applicabilityShapes = applicabilities.map((app) => {
40
+ return app.transform(({ $ }) => ({
41
+ $id: $.val(NowIdShape.from(app)),
42
+ active: $.from('active').def(true).toBoolean(),
43
+ applicability: $.from('applicability'),
44
+ order: $.from('order').def(0).toNumber(),
45
+ }))
46
+ })
47
+
48
+ return list.transform(({ $ }) => {
49
+ return {
50
+ $id: $.val(NowIdShape.from(list)),
51
+ active: $.from('active').def(true).toBoolean(),
52
+ applicabilities: $.val(applicabilityShapes),
53
+ columns: $.from('columns'),
54
+ condition: $.from('condition'),
55
+ enableInfiniteScroll: $.from('enable_infinite_scroll').def(false).toBoolean(),
56
+ fixedQuery: $.from('fixed_query').def(''),
57
+ groupByColumn: $.from('group_by_column').def(''),
58
+ groups: $.from('groups').def(''),
59
+ hideCellFilter: $.from('hide_cell_filter').def(false).toBoolean(),
60
+ hideCheckboxHover: $.from('hide_checkbox_hover').def(false).toBoolean(),
61
+ hideColumnFiltering: $.from('hide_column_filtering').def(false).toBoolean(),
62
+ hideColumnGrouping: $.from('hide_column_grouping').def(false).toBoolean(),
63
+ hideColumnResizing: $.from('hide_column_resizing').def(false).toBoolean(),
64
+ hideColumnSorting: $.from('hide_column_sorting').def(false).toBoolean(),
65
+ hideDragAndDrop: $.from('hide_drag_and_drop').def(false).toBoolean(),
66
+ hideEmptyStateImage: $.from('hide_empty_state_image').def(false).toBoolean(),
67
+ hideFirstPage: $.from('hide_first_page').def(false).toBoolean(),
68
+ hideHeader: $.from('hide_header').def(false).toBoolean(),
69
+ hideHighlightContent: $.from('hide_highlight_content').def(false).toBoolean(),
70
+ hideHighlightedValues: $.from('hide_highlighted_values').def(false).toBoolean(),
71
+ hideInlineEditing: $.from('hide_inline_editing').def(false).toBoolean(),
72
+ hideLastPage: $.from('hide_last_page').def(false).toBoolean(),
73
+ hideLastRefreshedText: $.from('hide_last_refreshed_text').def(false).toBoolean(),
74
+ hideLinks: $.from('hide_links').def(false).toBoolean(),
75
+ hideListActions: $.from('hide_list_actions').def(false).toBoolean(),
76
+ hideMenuButton: $.from('hide_menu_button').def(false).toBoolean(),
77
+ hideNextPage: $.from('hide_next_page').def(false).toBoolean(),
78
+ hideOptionToSaveAs: $.from('hide_option_to_save_as').def(false).toBoolean(),
79
+ hidePages: $.from('hide_pages').def(false).toBoolean(),
80
+ hidePagination: $.from('hide_pagination').def(false).toBoolean(),
81
+ hidePanelAdvanced: $.from('hide_panel_advanced').def(false).toBoolean(),
82
+ hidePanelButton: $.from('hide_panel_button').def(false).toBoolean(),
83
+ hidePanelConditionDelete: $.from('hide_panel_condition_delete')
84
+ .def(false)
85
+ .toBoolean(),
86
+ hidePanelFooter: $.from('hide_panel_footer').def(false).toBoolean(),
87
+ hidePanelRestore: $.from('hide_panel_restore').def(false).toBoolean(),
88
+ hidePersonalization: $.from('hide_personalization').def(false).toBoolean(),
89
+ hidePreviousPage: $.from('hide_previous_page').def(false).toBoolean(),
90
+ hideQuickEdit: $.from('hide_quick_edit').def(false).toBoolean(),
91
+ hideRange: $.from('hide_range').def(false).toBoolean(),
92
+ hideRecordCountBadge: $.from('hide_record_count_badge').def(false).toBoolean(),
93
+ hideReferenceLinks: $.from('hide_reference_links').def(false).toBoolean(),
94
+ hideRefreshButton: $.from('hide_refresh_button').def(false).toBoolean(),
95
+ hideRowCount: $.from('hide_row_count').def(false).toBoolean(),
96
+ hideRowSelector: $.from('hide_row_selector').def(false).toBoolean(),
97
+ hideRowsPerPageSelector: $.from('hide_rows_per_page_selector')
98
+ .def(false)
99
+ .toBoolean(),
100
+ hideSelectAll: $.from('hide_select_all').def(false).toBoolean(),
101
+ hideSharingButton: $.from('hide_sharing_button').def(false).toBoolean(),
102
+ hideTitle: $.from('hide_title').def(false).toBoolean(),
103
+ highlightContentColor: $.from('highlight_content_color').def(''),
104
+ highlightContentPattern: $.from('highlight_content_pattern').def(''),
105
+ listAttributes: $.from('list_attributes').def(''),
106
+ liveUpdates: $.from('live_updates').def('off'),
107
+ maxCharacters: $.from('max_characters').def(4000).toNumber(),
108
+ order: $.from('order').def(100).toNumber(),
109
+ override_word_wrap_user_pref: $.from('override_word_wrap_user_pref')
110
+ .def(false)
111
+ .toBoolean(),
112
+ roles: $.from('roles').def(''),
113
+ table: $.from('table').def(''),
114
+ title: $.from('title').def(''),
115
+ view: $.from('view').def(''),
116
+ wordWrap: $.from('word_wrap').def(false).toBoolean(),
117
+ }
118
+ })
119
+ })
120
+
121
+ return category.transform(({ $ }) => {
122
+ return {
123
+ $id: $.val(NowIdShape.from(category)),
124
+ title: $.from('title').def(''),
125
+ order: $.from('order').toNumber().def(100),
126
+ description: $.from('description').def(''),
127
+ lists: $.val(lists),
128
+ }
129
+ })
130
+ })
131
+
132
+ return {
133
+ success: true,
134
+ value: new CallExpressionShape({
135
+ source: record,
136
+ callee: 'UxListMenuConfig',
137
+ args: [
138
+ record.transform(({ $ }) => {
139
+ return {
140
+ $id: $.val(NowIdShape.from(record)),
141
+ name: $.from('name').def(''),
142
+ active: $.from('active').def(true).toBoolean(),
143
+ description: $.from('description').def(''),
144
+ categories: $.val(categories),
145
+ }
146
+ }),
147
+ ],
148
+ }),
149
+ }
150
+ },
151
+ },
152
+ sys_ux_list_category: {},
153
+ sys_ux_list: {
154
+ relationships: {
155
+ sys_ux_applicability_m2m_list: {
156
+ via: 'list',
157
+ descendant: true,
158
+ },
159
+ },
160
+ },
161
+ sys_ux_applicability_m2m_list: {},
162
+ },
163
+ shapes: [
164
+ {
165
+ shape: CallExpressionShape,
166
+ fileTypes: ['fluent'],
167
+ async toRecord(callExpression, { factory }) {
168
+ if (callExpression.getCallee() !== 'UxListMenuConfig') {
169
+ return { success: false }
170
+ }
171
+
172
+ const arg = callExpression.getArgument(0).asObject()
173
+
174
+ const UxListMenuConfigRecord = await factory.createRecord({
175
+ source: callExpression,
176
+ table: 'sys_ux_list_menu_config',
177
+ explicitId: arg.get('$id'),
178
+ properties: arg.transform(({ $ }) => ({
179
+ name: $.from('name').def(''),
180
+ description: $.from('description').def(''),
181
+ active: $.from('active').def(true),
182
+ })),
183
+ })
184
+
185
+ const categories = arg.get('categories').ifArray()?.getElements() ?? []
186
+
187
+ const childRecords: Record[] = []
188
+
189
+ for (const category of categories) {
190
+ const categoryObject = category.asObject()
191
+
192
+ const categoryRecord = await factory.createRecord({
193
+ source: callExpression,
194
+ table: 'sys_ux_list_category',
195
+ explicitId: categoryObject.get('$id'),
196
+ properties: categoryObject.transform(({ $ }) => ({
197
+ active: $.from('active').def(true),
198
+ configuration: $.val(UxListMenuConfigRecord),
199
+ description: $.from('description').def(''),
200
+ title: $.from('title').def(''),
201
+ order: $.from('order').def(100),
202
+ })),
203
+ })
204
+
205
+ childRecords.push(categoryRecord)
206
+
207
+ const lists = categoryObject.get('lists').ifArray()?.getElements() ?? []
208
+
209
+ for (const list of lists) {
210
+ const listObject = list.asObject()
211
+
212
+ const listRecord = await factory.createRecord({
213
+ source: callExpression,
214
+ table: 'sys_ux_list',
215
+ explicitId: listObject.get('$id'),
216
+ properties: listObject.transform(({ $ }) => ({
217
+ active: $.from('active').def(true),
218
+ category: $.val(categoryRecord),
219
+ columns: $.from('columns'),
220
+ condition: $.from('condition'),
221
+ configuration: $.val(UxListMenuConfigRecord),
222
+ enable_infinite_scroll: $.from('enableInfiniteScroll').def(false),
223
+ fixed_query: $.from('fixedQuery'),
224
+ group_by_column: $.from('groupByColumn'),
225
+ groups: $.from('groups'),
226
+ hide_cell_filter: $.from('hideCellFilter').def(false),
227
+ hide_checkbox_hover: $.from('hideCheckboxHover').def(false),
228
+ hide_column_filtering: $.from('hideColumnFiltering').def(false),
229
+ hide_column_grouping: $.from('hideColumnGrouping').def(false),
230
+ hide_column_resizing: $.from('hideColumnResizing').def(false),
231
+ hide_column_sorting: $.from('hideColumnSorting').def(false),
232
+ hide_drag_and_drop: $.from('hideDragAndDrop').def(false),
233
+ hide_empty_state_image: $.from('hideEmptyStateImage').def(false),
234
+ hide_first_page: $.from('hideFirstPage').def(false),
235
+ hide_header: $.from('hideHeader').def(false),
236
+ hide_highlight_content: $.from('hideHighlightContent').def(false),
237
+ hide_highlighted_values: $.from('hideHighlightedValues').def(false),
238
+ hide_inline_editing: $.from('hideInlineEditing').def(false),
239
+ hide_last_page: $.from('hideLastPage').def(false),
240
+ hide_last_refreshed_text: $.from('hideLastRefreshedText').def(false),
241
+ hide_links: $.from('hideLinks').def(false),
242
+ hide_list_actions: $.from('hideListActions').def(false),
243
+ hide_menu_button: $.from('hideMenuButton').def(false),
244
+ hide_next_page: $.from('hideNextPage').def(false),
245
+ hide_option_to_save_as: $.from('hideOptionToSaveAs').def(false),
246
+ hide_pages: $.from('hidePages').def(false),
247
+ hide_pagination: $.from('hidePagination').def(false),
248
+ hide_panel_advanced: $.from('hidePanelAdvanced').def(false),
249
+ hide_panel_button: $.from('hidePanelButton').def(false),
250
+ hide_panel_condition_delete: $.from('hidePanelConditionDelete').def(false),
251
+ hide_panel_footer: $.from('hidePanelFooter').def(false),
252
+ hide_panel_restore: $.from('hidePanelRestore').def(false),
253
+ hide_personalization: $.from('hidePersonalization').def(false),
254
+ hide_previous_page: $.from('hidePreviousPage').def(false),
255
+ hide_quick_edit: $.from('hideQuickEdit').def(false),
256
+ hide_range: $.from('hideRange').def(false),
257
+ hide_record_count_badge: $.from('hideRecordCountBadge').def(false),
258
+ hide_reference_links: $.from('hideReferenceLinks').def(false),
259
+ hide_refresh_button: $.from('hideRefreshButton').def(false),
260
+ hide_row_count: $.from('hideRowCount').def(false),
261
+ hide_row_selector: $.from('hideRowSelector').def(false),
262
+ hide_rows_per_page_selector: $.from('hideRowsPerPageSelector').def(false),
263
+ hide_select_all: $.from('hideSelectAll').def(false),
264
+ hide_sharing_button: $.from('hideSharingButton').def(false),
265
+ hide_title: $.from('hideTitle').def(false),
266
+ highlight_content_color: $.from('highlightContentColor'),
267
+ highlight_content_pattern: $.from('highlightContentPattern'),
268
+ list_attributes: $.from('listAttributes'),
269
+ live_updates: $.from('liveUpdates').def('off'),
270
+ max_characters: $.from('maxCharacters').def(4000).toNumber(),
271
+ order: $.from('order').def(100).toNumber(),
272
+ override_word_wrap_user_pref: $.from('overrideWordWrapUserPref').def(false),
273
+ roles: $.from('roles'),
274
+ table: $.from('table'),
275
+ title: $.from('title'),
276
+ view: $.from('view'),
277
+ word_wrap: $.from('wordWrap').def(false),
278
+ })),
279
+ })
280
+
281
+ childRecords.push(listRecord)
282
+
283
+ // Create sys_ux_applicability_m2m_list records
284
+ const applicabilities = listObject.get('applicabilities').ifArray()?.getElements() ?? []
285
+ for (const applicability of applicabilities) {
286
+ const applicabilityObject = applicability.asObject()
287
+
288
+ childRecords.push(
289
+ await factory.createRecord({
290
+ source: callExpression,
291
+ table: 'sys_ux_applicability_m2m_list',
292
+ explicitId: applicabilityObject.get('$id'),
293
+ properties: applicabilityObject.transform(({ $ }) => ({
294
+ active: $.from('active').def(true),
295
+ applicability: $.from('applicability'),
296
+ list: $.val(listRecord),
297
+ order: $.from('order').def(0),
298
+ })),
299
+ })
300
+ )
301
+ }
302
+ }
303
+ }
304
+
305
+ return {
306
+ success: true,
307
+ value: UxListMenuConfigRecord.with(...childRecords),
308
+ }
309
+ },
310
+ },
311
+ ],
312
+ })
@@ -0,0 +1,44 @@
1
+ function newTabMenuTemplate(table: string) {
2
+ return {
3
+ label: {
4
+ translatable: true,
5
+ message: `New ${table}`,
6
+ },
7
+ routeInfo: {
8
+ route: 'record',
9
+ fields: {
10
+ table: table,
11
+ sysId: '-1',
12
+ },
13
+ multiInstField: 'sysId',
14
+ },
15
+ condition: {
16
+ tableDescription: {
17
+ table: table,
18
+ canCreate: true,
19
+ },
20
+ },
21
+ }
22
+ }
23
+
24
+ export function createChromeTabJsonStringForPageProp(tables: string[]) {
25
+ return JSON.stringify({
26
+ contextual: ['record'],
27
+ newTabMenu: tables.map((table) => newTabMenuTemplate(table)),
28
+ maxMainTabLimit: 10,
29
+ maxTotalSubTabLimit: 30,
30
+ })
31
+ }
32
+
33
+ // This next function reverse engineers createChromeTab to take that output as input (stringified JSON) and returns the tables
34
+ export function parsePagePropChromeTabJson(chromeTab: string): string[] {
35
+ try {
36
+ const chromeTabJson = JSON.parse(chromeTab)
37
+ return chromeTabJson.newTabMenu.map(
38
+ (item: { routeInfo: { fields: { table: string } } }) => item.routeInfo.fields.table
39
+ )
40
+ } catch (e) {
41
+ console.log(`Failed to parse chrome tab json for Workspace plugin | ${e}`)
42
+ return []
43
+ }
44
+ }
@@ -0,0 +1,53 @@
1
+ export const DEFAULTS = {
2
+ record: {
3
+ MACROPONENT: 'e3c63f089db4729086517760a31f5558',
4
+ PARENT_MACROPONENT: 'c276387cc331101080d6d3658940ddd2',
5
+ NAME: 'Record Default',
6
+ DESCRIPTION: '',
7
+ SCREEN_CONDITION: '',
8
+ ORDER: 0,
9
+ FIELDS: 'table,sysId',
10
+ ROUTE_TYPE: 'record',
11
+ OPTIONAL_PARAMETERS: 'query,extraParams,views,selectedTab',
12
+ },
13
+ list: {
14
+ MACROPONENT: '2c08111d0fc21010036a83fa68767ef6',
15
+ PARENT_MACROPONENT: 'c276387cc331101080d6d3658940ddd2',
16
+ NAME: 'List Page',
17
+ DESCRIPTION: '',
18
+ SCREEN_CONDITION: '',
19
+ ORDER: 0,
20
+ FIELDS: '',
21
+ OPTIONAL_PARAMETERS: 'listId',
22
+ ROUTE_TYPE: 'list',
23
+ },
24
+ home: {
25
+ MACROPONENT: '163a913b532c0110aab9ddeeff7b1241',
26
+ PARENT_MACROPONENT: 'c276387cc331101080d6d3658940ddd2',
27
+ NAME: 'Dashboards Default',
28
+ DESCRIPTION: '',
29
+ SCREEN_CONDITION: '',
30
+ ORDER: 0,
31
+ FIELDS: '',
32
+ OPTIONAL_PARAMETERS: 'sysId,edit,tabSysId,filter,element',
33
+ ROUTE_TYPE: 'home',
34
+ },
35
+ 'simple-list': {
36
+ MACROPONENT: '8515f3e853031010ffa5ddeeff7b1297',
37
+ PARENT_MACROPONENT: 'c276387cc331101080d6d3658940ddd2',
38
+ NAME: 'Simple List',
39
+ DESCRIPTION: '',
40
+ SCREEN_CONDITION: '',
41
+ ORDER: 0,
42
+ FIELDS: 'table',
43
+ OPTIONAL_PARAMETERS: 'listTitle,query,disableInlineEditing',
44
+ ROUTE_TYPE: 'simplelist',
45
+ },
46
+ }
47
+
48
+ export const TABLES = {
49
+ SCREEN_COLLECTION: 'sys_ux_screen_type',
50
+ SCREEN: 'sys_ux_screen',
51
+ ROUTE: 'sys_ux_app_route',
52
+ MACROPONENT: 'sys_ux_macroponent',
53
+ }
@@ -0,0 +1,60 @@
1
+ import type { Source, Record, Shape } from '@servicenow/sdk-build-core'
2
+ import { NowIdShape } from '../now-id-plugin'
3
+
4
+ export const getExplicitIdGenerator = (source: Source, appConfigId: string) => (table: string, uniqueString: string) =>
5
+ new NowIdShape({ source, id: `${appConfigId}_${table}_${uniqueString}` })
6
+
7
+ export const buildRecordKey = (record: Record) => `${record.getTable()}_${record.getId().getValue()}`
8
+
9
+ /*
10
+ This is just an equality check similar to the existing "strictEqual", except it's a little more relaxed.
11
+ We want to make sure that our defaulted records aren't "tampered" with. If they are, this will detect it.
12
+
13
+ Record.strictEqual() tests that the number of properties match, which is too agressive for our needs, because
14
+ the number of properties on an actual record is almost always higher than on a generated record (due to sys_ columns, mostly).
15
+ */
16
+ export const doesActualRecordMatchGeneratedRecord = (actualRecord: Record, generatedRecord: Record): boolean => {
17
+ for (const [gFieldName, gFieldValue] of generatedRecord.entries()) {
18
+ const generatedRecordValueAsString = convertFieldValueToString(gFieldValue)
19
+ const actualRecordValueAsString = convertFieldValueToString(actualRecord.get(gFieldName))
20
+ if (generatedRecordValueAsString !== actualRecordValueAsString) {
21
+ return false
22
+ }
23
+ }
24
+ return true
25
+ }
26
+
27
+ export const convertFieldValueToString = (fieldValue: Shape<unknown>): string => {
28
+ if (fieldValue.isRecord()) {
29
+ return fieldValue.asRecord().getId().getValue()
30
+ } else if (fieldValue.isBoolean()) {
31
+ return fieldValue.asBoolean().getValue().toString()
32
+ } else if (fieldValue.isNumber()) {
33
+ return fieldValue.asNumber().getValue().toString()
34
+ }
35
+ return fieldValue.asString().getValue()
36
+ }
37
+
38
+ export const serializeActualRecordAsOverrideToTheDefault = (
39
+ actualRecord: Record,
40
+ generatedRecord: Record
41
+ ): { [fieldName: string]: string } => {
42
+ // Looping through the generated record keys gives us a more controllable and precise list to track/record.
43
+ const serializedRecordValue: { [fieldName: string]: string } = {}
44
+ for (const field of generatedRecord.keys()) {
45
+ const fieldValue = actualRecord.get(field)
46
+ if (fieldValue.isRecord()) {
47
+ serializedRecordValue[field] = fieldValue.asRecord().getId().getValue()
48
+ } else {
49
+ try {
50
+ serializedRecordValue[field] = JSON.stringify(JSON.parse(fieldValue.asString().getValue())).replace(
51
+ /\\/g,
52
+ '\\\\'
53
+ )
54
+ } catch (e) {
55
+ serializedRecordValue[field] = fieldValue.asString().getValue()
56
+ }
57
+ }
58
+ }
59
+ return serializedRecordValue
60
+ }