@servicenow/sdk-build-plugins 4.4.1 → 4.6.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 (337) hide show
  1. package/dist/acl-plugin.js +54 -4
  2. package/dist/acl-plugin.js.map +1 -1
  3. package/dist/applicability-plugin.js +2 -0
  4. package/dist/applicability-plugin.js.map +1 -1
  5. package/dist/application-menu-plugin.js +2 -0
  6. package/dist/application-menu-plugin.js.map +1 -1
  7. package/dist/arrow-function-plugin.d.ts +6 -1
  8. package/dist/arrow-function-plugin.js +105 -12
  9. package/dist/arrow-function-plugin.js.map +1 -1
  10. package/dist/atf/test-plugin.js +2 -0
  11. package/dist/atf/test-plugin.js.map +1 -1
  12. package/dist/basic-syntax-plugin.js +20 -0
  13. package/dist/basic-syntax-plugin.js.map +1 -1
  14. package/dist/call-expression-plugin.js +1 -0
  15. package/dist/call-expression-plugin.js.map +1 -1
  16. package/dist/claims-plugin.js +1 -0
  17. package/dist/claims-plugin.js.map +1 -1
  18. package/dist/client-script-plugin.js +1 -0
  19. package/dist/client-script-plugin.js.map +1 -1
  20. package/dist/column-plugin.js +4 -7
  21. package/dist/column-plugin.js.map +1 -1
  22. package/dist/cross-scope-privilege-plugin.js +1 -0
  23. package/dist/cross-scope-privilege-plugin.js.map +1 -1
  24. package/dist/dashboard/dashboard-plugin.js +2 -0
  25. package/dist/dashboard/dashboard-plugin.js.map +1 -1
  26. package/dist/data-plugin.js +1 -0
  27. package/dist/data-plugin.js.map +1 -1
  28. package/dist/email-notification-plugin.js +9 -13
  29. package/dist/email-notification-plugin.js.map +1 -1
  30. package/dist/flow/constants/flow-plugin-constants.d.ts +1 -1
  31. package/dist/flow/constants/flow-plugin-constants.js +1 -1
  32. package/dist/flow/constants/flow-plugin-constants.js.map +1 -1
  33. package/dist/flow/flow-logic/flow-logic-diagnostics.js +5 -5
  34. package/dist/flow/flow-logic/flow-logic-diagnostics.js.map +1 -1
  35. package/dist/flow/flow-logic/flow-logic-plugin-helpers.d.ts +82 -2
  36. package/dist/flow/flow-logic/flow-logic-plugin-helpers.js +48 -40
  37. package/dist/flow/flow-logic/flow-logic-plugin-helpers.js.map +1 -1
  38. package/dist/flow/flow-logic/flow-logic-plugin.js +1 -0
  39. package/dist/flow/flow-logic/flow-logic-plugin.js.map +1 -1
  40. package/dist/flow/plugins/approval-rules-plugin.js +1 -0
  41. package/dist/flow/plugins/approval-rules-plugin.js.map +1 -1
  42. package/dist/flow/plugins/flow-action-definition-plugin.js +1232 -55
  43. package/dist/flow/plugins/flow-action-definition-plugin.js.map +1 -1
  44. package/dist/flow/plugins/flow-data-pill-plugin.js +6 -2
  45. package/dist/flow/plugins/flow-data-pill-plugin.js.map +1 -1
  46. package/dist/flow/plugins/flow-definition-plugin.js +23 -44
  47. package/dist/flow/plugins/flow-definition-plugin.js.map +1 -1
  48. package/dist/flow/plugins/flow-diagnostics-plugin.d.ts +2 -2
  49. package/dist/flow/plugins/flow-diagnostics-plugin.js +3 -2
  50. package/dist/flow/plugins/flow-diagnostics-plugin.js.map +1 -1
  51. package/dist/flow/plugins/flow-instance-plugin.js +136 -34
  52. package/dist/flow/plugins/flow-instance-plugin.js.map +1 -1
  53. package/dist/flow/plugins/flow-trigger-instance-plugin.js +1 -0
  54. package/dist/flow/plugins/flow-trigger-instance-plugin.js.map +1 -1
  55. package/dist/flow/plugins/inline-script-plugin.js +1 -0
  56. package/dist/flow/plugins/inline-script-plugin.js.map +1 -1
  57. package/dist/flow/plugins/step-definition-plugin.js +4 -2
  58. package/dist/flow/plugins/step-definition-plugin.js.map +1 -1
  59. package/dist/flow/plugins/step-instance-plugin.d.ts +9 -1
  60. package/dist/flow/plugins/step-instance-plugin.js +649 -135
  61. package/dist/flow/plugins/step-instance-plugin.js.map +1 -1
  62. package/dist/flow/plugins/trigger-plugin.js +2 -0
  63. package/dist/flow/plugins/trigger-plugin.js.map +1 -1
  64. package/dist/flow/plugins/wfa-datapill-plugin.js +21 -5
  65. package/dist/flow/plugins/wfa-datapill-plugin.js.map +1 -1
  66. package/dist/flow/post-install.d.ts +2 -0
  67. package/dist/flow/post-install.js +59 -0
  68. package/dist/flow/post-install.js.map +1 -0
  69. package/dist/flow/utils/complex-object-resolver.js +4 -1
  70. package/dist/flow/utils/complex-object-resolver.js.map +1 -1
  71. package/dist/flow/utils/complex-objects.js +5 -3
  72. package/dist/flow/utils/complex-objects.js.map +1 -1
  73. package/dist/flow/utils/flow-constants.d.ts +90 -2
  74. package/dist/flow/utils/flow-constants.js +430 -7
  75. package/dist/flow/utils/flow-constants.js.map +1 -1
  76. package/dist/flow/utils/flow-io-to-record.d.ts +1 -1
  77. package/dist/flow/utils/flow-io-to-record.js +37 -16
  78. package/dist/flow/utils/flow-io-to-record.js.map +1 -1
  79. package/dist/flow/utils/flow-shapes.js +4 -0
  80. package/dist/flow/utils/flow-shapes.js.map +1 -1
  81. package/dist/flow/utils/flow-to-xml.d.ts +3 -2
  82. package/dist/flow/utils/flow-to-xml.js +3 -4
  83. package/dist/flow/utils/flow-to-xml.js.map +1 -1
  84. package/dist/flow/utils/label-cache-parser.d.ts +9 -2
  85. package/dist/flow/utils/label-cache-parser.js +32 -4
  86. package/dist/flow/utils/label-cache-parser.js.map +1 -1
  87. package/dist/flow/utils/label-cache-processor.d.ts +5 -0
  88. package/dist/flow/utils/label-cache-processor.js +14 -2
  89. package/dist/flow/utils/label-cache-processor.js.map +1 -1
  90. package/dist/flow/utils/pill-shape-helpers.d.ts +15 -0
  91. package/dist/flow/utils/pill-shape-helpers.js +35 -0
  92. package/dist/flow/utils/pill-shape-helpers.js.map +1 -0
  93. package/dist/flow/utils/pill-string-parser.js +1 -0
  94. package/dist/flow/utils/pill-string-parser.js.map +1 -1
  95. package/dist/flow/utils/schema-to-flow-object.d.ts +6 -1
  96. package/dist/flow/utils/schema-to-flow-object.js +131 -15
  97. package/dist/flow/utils/schema-to-flow-object.js.map +1 -1
  98. package/dist/flow/utils/service-catalog.js +5 -1
  99. package/dist/flow/utils/service-catalog.js.map +1 -1
  100. package/dist/flow/utils/utils.d.ts +1 -0
  101. package/dist/flow/utils/utils.js +6 -1
  102. package/dist/flow/utils/utils.js.map +1 -1
  103. package/dist/form-plugin.d.ts +2 -0
  104. package/dist/form-plugin.js +1132 -0
  105. package/dist/form-plugin.js.map +1 -0
  106. package/dist/html-import-plugin.js +1 -0
  107. package/dist/html-import-plugin.js.map +1 -1
  108. package/dist/import-sets-plugin.js +2 -0
  109. package/dist/import-sets-plugin.js.map +1 -1
  110. package/dist/inbound-email-action-plugin.d.ts +10 -0
  111. package/dist/inbound-email-action-plugin.js +128 -0
  112. package/dist/inbound-email-action-plugin.js.map +1 -0
  113. package/dist/index.d.ts +13 -0
  114. package/dist/index.js +17 -1
  115. package/dist/index.js.map +1 -1
  116. package/dist/instance-scan-plugin.d.ts +2 -0
  117. package/dist/instance-scan-plugin.js +293 -0
  118. package/dist/instance-scan-plugin.js.map +1 -0
  119. package/dist/json-plugin.js +1 -0
  120. package/dist/json-plugin.js.map +1 -1
  121. package/dist/list-plugin.js +1 -0
  122. package/dist/list-plugin.js.map +1 -1
  123. package/dist/now-attach-plugin.js +1 -0
  124. package/dist/now-attach-plugin.js.map +1 -1
  125. package/dist/now-config-plugin.js +659 -51
  126. package/dist/now-config-plugin.js.map +1 -1
  127. package/dist/now-id-plugin.js +1 -0
  128. package/dist/now-id-plugin.js.map +1 -1
  129. package/dist/now-include-plugin.js +1 -0
  130. package/dist/now-include-plugin.js.map +1 -1
  131. package/dist/now-ref-plugin.js +1 -0
  132. package/dist/now-ref-plugin.js.map +1 -1
  133. package/dist/now-unresolved-plugin.js +1 -0
  134. package/dist/now-unresolved-plugin.js.map +1 -1
  135. package/dist/package-json-plugin.js +1 -0
  136. package/dist/package-json-plugin.js.map +1 -1
  137. package/dist/property-plugin.js +3 -1
  138. package/dist/property-plugin.js.map +1 -1
  139. package/dist/record-plugin.d.ts +37 -0
  140. package/dist/record-plugin.js +47 -3
  141. package/dist/record-plugin.js.map +1 -1
  142. package/dist/repack/lint/Rules.d.ts +11 -2
  143. package/dist/repack/lint/Rules.js +160 -16
  144. package/dist/repack/lint/Rules.js.map +1 -1
  145. package/dist/repack/lint/index.d.ts +10 -5
  146. package/dist/repack/lint/index.js +76 -50
  147. package/dist/repack/lint/index.js.map +1 -1
  148. package/dist/rest-api-plugin.js +22 -1
  149. package/dist/rest-api-plugin.js.map +1 -1
  150. package/dist/role-plugin.js +1 -0
  151. package/dist/role-plugin.js.map +1 -1
  152. package/dist/schedule-script/index.d.ts +1 -0
  153. package/dist/schedule-script/index.js +18 -0
  154. package/dist/schedule-script/index.js.map +1 -0
  155. package/dist/schedule-script/scheduled-script-plugin.d.ts +2 -0
  156. package/dist/schedule-script/scheduled-script-plugin.js +556 -0
  157. package/dist/schedule-script/scheduled-script-plugin.js.map +1 -0
  158. package/dist/schedule-script/timeZoneConverter.d.ts +61 -0
  159. package/dist/schedule-script/timeZoneConverter.js +170 -0
  160. package/dist/schedule-script/timeZoneConverter.js.map +1 -0
  161. package/dist/script-action-plugin.js +2 -0
  162. package/dist/script-action-plugin.js.map +1 -1
  163. package/dist/script-include-plugin.js +2 -0
  164. package/dist/script-include-plugin.js.map +1 -1
  165. package/dist/server-module-plugin/index.js +13 -2
  166. package/dist/server-module-plugin/index.js.map +1 -1
  167. package/dist/service-catalog/catalog-clientscript-plugin.js +2 -0
  168. package/dist/service-catalog/catalog-clientscript-plugin.js.map +1 -1
  169. package/dist/service-catalog/catalog-item-plugin.js +2 -0
  170. package/dist/service-catalog/catalog-item-plugin.js.map +1 -1
  171. package/dist/service-catalog/catalog-ui-policy-plugin.js +2 -0
  172. package/dist/service-catalog/catalog-ui-policy-plugin.js.map +1 -1
  173. package/dist/service-catalog/sc-record-producer-plugin.js +2 -0
  174. package/dist/service-catalog/sc-record-producer-plugin.js.map +1 -1
  175. package/dist/service-catalog/service-catalog-base.d.ts +18 -18
  176. package/dist/service-catalog/service-catalog-base.js +22 -22
  177. package/dist/service-catalog/service-catalog-base.js.map +1 -1
  178. package/dist/service-catalog/service-catalog-diagnostics.d.ts +6 -0
  179. package/dist/service-catalog/service-catalog-diagnostics.js +20 -0
  180. package/dist/service-catalog/service-catalog-diagnostics.js.map +1 -1
  181. package/dist/service-catalog/shape-to-record.js +7 -2
  182. package/dist/service-catalog/shape-to-record.js.map +1 -1
  183. package/dist/service-catalog/variable-set-plugin.js +2 -0
  184. package/dist/service-catalog/variable-set-plugin.js.map +1 -1
  185. package/dist/service-portal/angular-provider-plugin.js +2 -0
  186. package/dist/service-portal/angular-provider-plugin.js.map +1 -1
  187. package/dist/service-portal/dependency-plugin.js +5 -31
  188. package/dist/service-portal/dependency-plugin.js.map +1 -1
  189. package/dist/service-portal/header-footer-plugin.d.ts +2 -0
  190. package/dist/service-portal/header-footer-plugin.js +50 -0
  191. package/dist/service-portal/header-footer-plugin.js.map +1 -0
  192. package/dist/service-portal/menu-plugin.d.ts +2 -0
  193. package/dist/service-portal/menu-plugin.js +334 -0
  194. package/dist/service-portal/menu-plugin.js.map +1 -0
  195. package/dist/service-portal/page-plugin.d.ts +2 -0
  196. package/dist/service-portal/page-plugin.js +681 -0
  197. package/dist/service-portal/page-plugin.js.map +1 -0
  198. package/dist/service-portal/page-route-map-plugin.d.ts +2 -0
  199. package/dist/service-portal/page-route-map-plugin.js +114 -0
  200. package/dist/service-portal/page-route-map-plugin.js.map +1 -0
  201. package/dist/service-portal/portal-plugin.d.ts +2 -0
  202. package/dist/service-portal/portal-plugin.js +309 -0
  203. package/dist/service-portal/portal-plugin.js.map +1 -0
  204. package/dist/service-portal/theme-plugin.d.ts +2 -0
  205. package/dist/service-portal/theme-plugin.js +112 -0
  206. package/dist/service-portal/theme-plugin.js.map +1 -0
  207. package/dist/service-portal/utils.d.ts +46 -0
  208. package/dist/service-portal/utils.js +331 -0
  209. package/dist/service-portal/utils.js.map +1 -0
  210. package/dist/service-portal/widget-plugin.js +10 -182
  211. package/dist/service-portal/widget-plugin.js.map +1 -1
  212. package/dist/sla-plugin.js +2 -0
  213. package/dist/sla-plugin.js.map +1 -1
  214. package/dist/static-content-plugin.js +5 -0
  215. package/dist/static-content-plugin.js.map +1 -1
  216. package/dist/table-plugin.js +191 -26
  217. package/dist/table-plugin.js.map +1 -1
  218. package/dist/ui-action-plugin.js +3 -4
  219. package/dist/ui-action-plugin.js.map +1 -1
  220. package/dist/ui-page-plugin.js +101 -21
  221. package/dist/ui-page-plugin.js.map +1 -1
  222. package/dist/ui-policy-plugin.js +1 -0
  223. package/dist/ui-policy-plugin.js.map +1 -1
  224. package/dist/user-preference-plugin.js +2 -0
  225. package/dist/user-preference-plugin.js.map +1 -1
  226. package/dist/utils.d.ts +20 -2
  227. package/dist/utils.js +34 -3
  228. package/dist/utils.js.map +1 -1
  229. package/dist/ux-list-menu-config-plugin.js +2 -0
  230. package/dist/ux-list-menu-config-plugin.js.map +1 -1
  231. package/dist/view-plugin.js +9 -3
  232. package/dist/view-plugin.js.map +1 -1
  233. package/dist/workspace-plugin.js +41 -36
  234. package/dist/workspace-plugin.js.map +1 -1
  235. package/package.json +11 -11
  236. package/src/_types/eslint-community-eslint-utils.d.ts +15 -0
  237. package/src/acl-plugin.ts +97 -8
  238. package/src/applicability-plugin.ts +2 -0
  239. package/src/application-menu-plugin.ts +2 -0
  240. package/src/arrow-function-plugin.ts +128 -13
  241. package/src/atf/test-plugin.ts +2 -0
  242. package/src/basic-syntax-plugin.ts +21 -0
  243. package/src/call-expression-plugin.ts +1 -0
  244. package/src/claims-plugin.ts +1 -0
  245. package/src/client-script-plugin.ts +2 -1
  246. package/src/column-plugin.ts +4 -8
  247. package/src/cross-scope-privilege-plugin.ts +2 -1
  248. package/src/dashboard/dashboard-plugin.ts +2 -0
  249. package/src/data-plugin.ts +1 -0
  250. package/src/email-notification-plugin.ts +3 -23
  251. package/src/flow/constants/flow-plugin-constants.ts +1 -1
  252. package/src/flow/flow-logic/flow-logic-diagnostics.ts +5 -6
  253. package/src/flow/flow-logic/flow-logic-plugin-helpers.ts +47 -45
  254. package/src/flow/flow-logic/flow-logic-plugin.ts +1 -0
  255. package/src/flow/plugins/approval-rules-plugin.ts +1 -0
  256. package/src/flow/plugins/flow-action-definition-plugin.ts +1584 -62
  257. package/src/flow/plugins/flow-data-pill-plugin.ts +6 -2
  258. package/src/flow/plugins/flow-definition-plugin.ts +22 -51
  259. package/src/flow/plugins/flow-diagnostics-plugin.ts +3 -2
  260. package/src/flow/plugins/flow-instance-plugin.ts +201 -36
  261. package/src/flow/plugins/flow-trigger-instance-plugin.ts +1 -0
  262. package/src/flow/plugins/inline-script-plugin.ts +1 -0
  263. package/src/flow/plugins/step-definition-plugin.ts +4 -2
  264. package/src/flow/plugins/step-instance-plugin.ts +772 -155
  265. package/src/flow/plugins/trigger-plugin.ts +2 -0
  266. package/src/flow/plugins/wfa-datapill-plugin.ts +26 -5
  267. package/src/flow/post-install.ts +93 -0
  268. package/src/flow/utils/complex-object-resolver.ts +4 -1
  269. package/src/flow/utils/complex-objects.ts +11 -3
  270. package/src/flow/utils/flow-constants.ts +451 -6
  271. package/src/flow/utils/flow-io-to-record.ts +43 -17
  272. package/src/flow/utils/flow-shapes.ts +4 -0
  273. package/src/flow/utils/flow-to-xml.ts +4 -4
  274. package/src/flow/utils/label-cache-parser.ts +33 -4
  275. package/src/flow/utils/label-cache-processor.ts +14 -2
  276. package/src/flow/utils/pill-shape-helpers.ts +42 -0
  277. package/src/flow/utils/pill-string-parser.ts +1 -0
  278. package/src/flow/utils/schema-to-flow-object.ts +183 -15
  279. package/src/flow/utils/service-catalog.ts +5 -2
  280. package/src/flow/utils/utils.ts +12 -1
  281. package/src/form-plugin.ts +1409 -0
  282. package/src/html-import-plugin.ts +1 -0
  283. package/src/import-sets-plugin.ts +2 -0
  284. package/src/inbound-email-action-plugin.ts +145 -0
  285. package/src/index.ts +13 -0
  286. package/src/instance-scan-plugin.ts +313 -0
  287. package/src/json-plugin.ts +1 -0
  288. package/src/list-plugin.ts +2 -1
  289. package/src/now-attach-plugin.ts +1 -0
  290. package/src/now-config-plugin.ts +833 -53
  291. package/src/now-id-plugin.ts +1 -0
  292. package/src/now-include-plugin.ts +1 -0
  293. package/src/now-ref-plugin.ts +1 -0
  294. package/src/now-unresolved-plugin.ts +1 -0
  295. package/src/package-json-plugin.ts +1 -0
  296. package/src/property-plugin.ts +6 -1
  297. package/src/record-plugin.ts +56 -6
  298. package/src/repack/lint/Rules.ts +171 -22
  299. package/src/repack/lint/index.ts +80 -56
  300. package/src/rest-api-plugin.ts +28 -2
  301. package/src/role-plugin.ts +2 -1
  302. package/src/schedule-script/index.ts +1 -0
  303. package/src/schedule-script/scheduled-script-plugin.ts +690 -0
  304. package/src/schedule-script/timeZoneConverter.ts +188 -0
  305. package/src/script-action-plugin.ts +2 -0
  306. package/src/script-include-plugin.ts +2 -0
  307. package/src/server-module-plugin/index.ts +14 -2
  308. package/src/service-catalog/catalog-clientscript-plugin.ts +2 -0
  309. package/src/service-catalog/catalog-item-plugin.ts +2 -0
  310. package/src/service-catalog/catalog-ui-policy-plugin.ts +2 -0
  311. package/src/service-catalog/sc-record-producer-plugin.ts +2 -0
  312. package/src/service-catalog/service-catalog-base.ts +22 -22
  313. package/src/service-catalog/service-catalog-diagnostics.ts +30 -0
  314. package/src/service-catalog/shape-to-record.ts +8 -2
  315. package/src/service-catalog/variable-set-plugin.ts +2 -0
  316. package/src/service-portal/angular-provider-plugin.ts +2 -0
  317. package/src/service-portal/dependency-plugin.ts +6 -53
  318. package/src/service-portal/header-footer-plugin.ts +57 -0
  319. package/src/service-portal/menu-plugin.ts +413 -0
  320. package/src/service-portal/page-plugin.ts +805 -0
  321. package/src/service-portal/page-route-map-plugin.ts +124 -0
  322. package/src/service-portal/portal-plugin.ts +342 -0
  323. package/src/service-portal/theme-plugin.ts +135 -0
  324. package/src/service-portal/utils.ts +470 -0
  325. package/src/service-portal/widget-plugin.ts +18 -224
  326. package/src/sla-plugin.ts +2 -0
  327. package/src/static-content-plugin.ts +4 -0
  328. package/src/table-plugin.ts +228 -37
  329. package/src/ui-action-plugin.ts +3 -8
  330. package/src/ui-page-plugin.ts +110 -21
  331. package/src/ui-policy-plugin.ts +2 -1
  332. package/src/user-preference-plugin.ts +2 -0
  333. package/src/utils.ts +42 -2
  334. package/src/ux-list-menu-config-plugin.ts +2 -0
  335. package/src/view-plugin.ts +11 -4
  336. package/src/workspace-plugin.ts +45 -43
  337. package/src/_types/eslint-plugin-es-x.d.ts +0 -17
@@ -0,0 +1,413 @@
1
+ import {
2
+ CallExpressionShape,
3
+ Plugin,
4
+ type Diagnostics,
5
+ type Factory,
6
+ type Record,
7
+ type Shape,
8
+ type Transform,
9
+ } from '@servicenow/sdk-build-core'
10
+ import { NowIdShape } from '../now-id-plugin'
11
+ import { NowIncludeShape } from '../now-include-plugin'
12
+ import { toReference, getFieldAsNumber, noThrow, createSdkDocEntry } from '../utils'
13
+ import { getRolesString } from './utils'
14
+
15
+ const default_placeholder_dimensions = `{
16
+ "mobile": {
17
+ "height": "250px",
18
+ "width": "100%"
19
+ },
20
+ "desktop": {
21
+ "height": "250px",
22
+ "width": "100%"
23
+ },
24
+ "tablet": {
25
+ "height": "250px",
26
+ "width": "100%"
27
+ }
28
+ }`
29
+
30
+ const default_placeholder_template = `<!--
31
+ AngularJS template with configurable options.
32
+ Use the "options" object to control dynamic behavior.
33
+ Example: Display an element when max row count is 10:
34
+ <div ng-if="options.maxRowCount === 10"></div>
35
+ The "skeleton-container" class is used for loading placeholders.
36
+ -->
37
+ <div class="skeleton-container">
38
+ <!-- Header Skeleton -->
39
+ <div class="skeleton-box skeleton-header"></div>
40
+ <!-- Body Skeleton -->
41
+ <div class="skeleton-box skeleton-line"></div>
42
+ <div class="skeleton-box skeleton-line small"></div>
43
+ <div class="skeleton-box skeleton-line medium"></div>
44
+ </div>`
45
+
46
+ const default_placeholder_script = `function evaluateConfig(options) { return {
47
+ "mobile": {
48
+ "height": "250px",
49
+ "width": "100%"
50
+ },
51
+ "desktop": {
52
+ "height": "250px",
53
+ "width": "100%"
54
+ },
55
+ "tablet": {
56
+ "height": "250px",
57
+ "width": "100%"
58
+ }
59
+ }; }`
60
+
61
+ const defaultValues = {
62
+ menuItem: {
63
+ type: 'page',
64
+ order: 100,
65
+ active: true,
66
+ color: 'default',
67
+ size: 'md',
68
+ },
69
+ menu: {
70
+ active: true,
71
+ color: 'default',
72
+ size: 'md',
73
+ asyncLoadDeviceType: 'desktop,tablet,mobile',
74
+ },
75
+ }
76
+
77
+ const addProperty = (obj: { [key: string]: unknown }, key: string, value: unknown) => {
78
+ if (
79
+ value === undefined ||
80
+ (Array.isArray(value) && value.length === 0) ||
81
+ (typeof value === 'string' && value === '')
82
+ ) {
83
+ return
84
+ }
85
+
86
+ obj[key] = value
87
+ }
88
+
89
+ async function getMenuItem(item: Record, transform: Transform) {
90
+ const obj: { [key: string]: unknown } = {}
91
+
92
+ addProperty(obj, '$id', NowIdShape.from(item))
93
+ addProperty(obj, 'label', item.get('label'))
94
+ addProperty(obj, 'order', getFieldAsNumber(item, 'order', 100))
95
+ addProperty(obj, 'active', item.get('active').toBoolean())
96
+ addProperty(obj, 'glyph', item.get('glyph')?.ifString()?.getValue())
97
+ addProperty(obj, 'color', item.get('color')?.ifString()?.getValue())
98
+ addProperty(obj, 'hint', item.get('hint')?.ifString()?.getValue())
99
+ addProperty(obj, 'shortDescription', item.get('short_description')?.ifString()?.getValue())
100
+ addProperty(obj, 'condition', item.get('condition')?.ifString()?.getValue())
101
+ addProperty(obj, 'type', item.get('type'))
102
+
103
+ const roles = item.get('roles')
104
+ const rolesStr = roles.ifString()?.getValue() ?? ''
105
+ if (rolesStr) {
106
+ addProperty(obj, 'roles', rolesStr.split(','))
107
+ }
108
+
109
+ // Convert all type-specific fields unconditionally to ensure round-trip data preservation
110
+ const spPage = item.get('sp_page')
111
+ if (spPage?.ifString()?.getValue()) {
112
+ addProperty(obj, 'page', toReference(spPage))
113
+ }
114
+
115
+ addProperty(obj, 'url', item.get('url')?.ifString()?.getValue())
116
+ addProperty(obj, 'urlTarget', item.get('url_target')?.ifString()?.getValue())
117
+
118
+ const scCategory = item.get('sc_category')
119
+ if (scCategory?.ifString()?.getValue()) {
120
+ addProperty(obj, 'scCategory', toReference(scCategory))
121
+ }
122
+
123
+ const scCatItem = item.get('sc_cat_item')
124
+ if (scCatItem?.ifString()?.getValue()) {
125
+ addProperty(obj, 'catItem', toReference(scCatItem))
126
+ }
127
+
128
+ addProperty(obj, 'kbTopic', item.get('kb_topic')?.ifString()?.getValue())
129
+
130
+ const kbArticle = item.get('kb_article')
131
+ if (kbArticle?.ifString()?.getValue()) {
132
+ addProperty(obj, 'kbArticle', toReference(kbArticle))
133
+ }
134
+
135
+ const kbCategory = item.get('kb_category')
136
+ if (kbCategory?.ifString()?.getValue()) {
137
+ addProperty(obj, 'kbCategory', toReference(kbCategory))
138
+ }
139
+
140
+ addProperty(obj, 'table', item.get('table')?.ifString()?.getValue())
141
+ addProperty(obj, 'filter', item.get('filter')?.ifString()?.getValue())
142
+ addProperty(obj, 'display1', item.get('display_1')?.ifString()?.getValue())
143
+ addProperty(obj, 'display2', item.get('display_2')?.ifString()?.getValue())
144
+ addProperty(obj, 'displayDate', item.get('display_date')?.ifString()?.getValue())
145
+ // Handle Now.include support for script field
146
+ const recordScript = item.get('record_script')?.ifString()?.getValue()
147
+ if (recordScript && recordScript.trim() !== '') {
148
+ const script = await NowIncludeShape.fromRecord(item, item.get('record_script'), transform)
149
+ addProperty(obj, 'script', script)
150
+ }
151
+
152
+ return obj
153
+ }
154
+
155
+ async function createItemRecords(
156
+ itemsShape: Shape,
157
+ menuId: Shape | undefined,
158
+ parentItemId: Shape | undefined,
159
+ factory: Factory,
160
+ diagnostics: Diagnostics
161
+ ): Promise<Record[]> {
162
+ const items = itemsShape?.ifArray()?.getElements() ?? []
163
+ const created: Record[] = []
164
+
165
+ for (const item of items) {
166
+ const obj = item.asObject()
167
+ const type = obj.get('type').asString().getValue()
168
+
169
+ const itemRecord = await factory.createRecord({
170
+ source: item,
171
+ table: 'sp_rectangle_menu_item',
172
+ explicitId: obj.get('$id'),
173
+ properties: {
174
+ label: obj.get('label')?.ifString()?.getValue() ?? '',
175
+ order: obj.get('order').ifNumber()?.getValue() ?? defaultValues.menuItem.order,
176
+ active: obj.get('active')?.ifBoolean()?.getValue() ?? defaultValues.menuItem.active,
177
+ glyph: obj.get('glyph')?.ifString()?.getValue() ?? 'empty',
178
+ color: obj.get('color')?.ifString()?.getValue() ?? defaultValues.menuItem.color,
179
+ hint: obj.get('hint')?.ifString()?.getValue() ?? '',
180
+ short_description: obj.get('shortDescription')?.ifString()?.getValue() ?? '',
181
+ condition: obj.get('condition')?.ifString()?.getValue() ?? '',
182
+ type,
183
+ sp_rectangle_menu: menuId ?? '',
184
+ sp_rectangle_menu_item: parentItemId ?? '',
185
+ sp_page: obj.get('page') ? toReference(obj.get('page')) : '',
186
+ url: obj.get('url')?.ifString()?.getValue() ?? '',
187
+ url_target: obj.get('urlTarget')?.ifString()?.getValue() ?? '',
188
+ sc_category: obj.get('scCategory') ? toReference(obj.get('scCategory')) : '',
189
+ sc_cat_item: obj.get('catItem') ? toReference(obj.get('catItem')) : '',
190
+ kb_topic: obj.get('kbTopic')?.ifString()?.getValue() ?? '',
191
+ kb_article: obj.get('kbArticle') ? toReference(obj.get('kbArticle')) : '',
192
+ kb_category: obj.get('kbCategory') ? toReference(obj.get('kbCategory')) : '',
193
+ table: obj.get('table')?.ifString()?.getValue() ?? '',
194
+ filter: obj.get('filter')?.ifString()?.getValue() ?? '',
195
+ display_1: obj.get('display1')?.ifString()?.getValue() ?? '',
196
+ display_2: obj.get('display2')?.ifString()?.getValue() ?? '',
197
+ display_date: obj.get('displayDate')?.ifString()?.getValue() ?? '',
198
+ record_script: obj.get('script')?.ifString()?.getValue() ?? '',
199
+ roles: getRolesString(obj.get('roles'), diagnostics),
200
+ },
201
+ })
202
+
203
+ created.push(itemRecord)
204
+
205
+ const childItems = obj.get('childItems')
206
+ if (childItems?.isDefined()) {
207
+ const childRecords = await createItemRecords(
208
+ childItems,
209
+ undefined,
210
+ itemRecord.getId(),
211
+ factory,
212
+ diagnostics
213
+ )
214
+ created.push(...childRecords)
215
+ }
216
+ }
217
+ return created
218
+ }
219
+
220
+ export const SPMenuPlugin = Plugin.create({
221
+ name: 'SPMenuPlugin',
222
+ docs: [createSdkDocEntry('SPMenu', ['sp_instance_menu'])],
223
+ records: {
224
+ sp_instance_menu: {
225
+ relationships: {
226
+ sp_rectangle_menu_item: {
227
+ via: 'sp_rectangle_menu',
228
+ descendant: true,
229
+ relationships: {
230
+ sp_rectangle_menu_item: {
231
+ via: 'sp_rectangle_menu_item',
232
+ descendant: true,
233
+ },
234
+ },
235
+ },
236
+ },
237
+
238
+ async toShape(record, { descendants, transform }) {
239
+ const items = descendants.query('sp_rectangle_menu_item', { sp_rectangle_menu: record.getId() })
240
+
241
+ const menuItems = await Promise.all(
242
+ items.map(async (item) => {
243
+ const itemId = item.getId()
244
+ const childItems = descendants.query('sp_rectangle_menu_item', {
245
+ sp_rectangle_menu_item: itemId,
246
+ })
247
+ const childMenuItems = await Promise.all(
248
+ childItems.map(async (childItem) => {
249
+ return await getMenuItem(childItem, transform)
250
+ })
251
+ )
252
+
253
+ const menuItem = {
254
+ ...(await getMenuItem(item, transform)),
255
+ }
256
+
257
+ if (childMenuItems.length > 0) {
258
+ menuItem['childItems'] = childMenuItems
259
+ }
260
+
261
+ return menuItem
262
+ })
263
+ )
264
+
265
+ const rolesField = record.get('roles')
266
+ const roleStr = rolesField?.ifString()?.getValue()
267
+ let rolesArray: string[] | undefined
268
+
269
+ if (roleStr && roleStr !== '') {
270
+ const filteredRoles = roleStr.split(',').filter((r) => r !== '')
271
+ if (filteredRoles.length > 0) {
272
+ rolesArray = filteredRoles
273
+ }
274
+ }
275
+
276
+ const asyncLoadTrigger =
277
+ record.get('async_load_trigger')?.ifString()?.ifNotEmpty()?.getValue() ?? 'viewport'
278
+ const asyncLoadDeviceType = record.get('async_load_device_type')?.ifString()?.getValue() ?? ''
279
+
280
+ return {
281
+ success: true,
282
+ value: new CallExpressionShape({
283
+ source: record,
284
+ callee: 'SPMenu',
285
+ args: [
286
+ record.transform(({ $ }) => ({
287
+ $id: $.val(NowIdShape.from(record)),
288
+ title: $,
289
+ id: $.from('id').def(''),
290
+ widget: $.from('sp_widget'),
291
+ column: $.from('sp_column'),
292
+ active: $.toBoolean().def(true),
293
+ widgetParameters: $.from('widget_parameters')
294
+ .map((d) => {
295
+ const json = d.ifString()?.getValue()
296
+ if (!json) {
297
+ return ''
298
+ }
299
+
300
+ const parsed = noThrow(() => JSON.parse(json))
301
+ return parsed instanceof Error ? json : parsed
302
+ })
303
+ .def(''),
304
+ css: $.def(''),
305
+ url: $.def(''),
306
+ glyph: $.def(''),
307
+ size: $.def('md'),
308
+ color: $.def('default'),
309
+ cssClass: $.from('class_name').def(''),
310
+ order: $.from('order').toNumber().def(1),
311
+ roles: $.val(rolesArray),
312
+ shortDescription: $.from('short_description').def(''),
313
+ asyncLoad: $.from('async_load').toBoolean().def(false),
314
+ preservePlaceholderSize: $.from('preserve_placeholder_size').toBoolean().def(false),
315
+ advancedPlaceholderDimensions: $.from('advanced_placeholder_dimensions')
316
+ .toBoolean()
317
+ .def(false),
318
+ placeholderDimensions: $.from('placeholder_dimensions')
319
+ .map((d) => {
320
+ const json = d.ifString()?.getValue()
321
+
322
+ const parsed = noThrow(() => json && JSON.parse(json))
323
+ return parsed instanceof Error ? json : parsed
324
+ })
325
+ .def(''),
326
+ placeholderConfigurationScript: $.from('placeholder_dimensions_script').def(
327
+ default_placeholder_script
328
+ ),
329
+ placeholderTemplate: $.from('placeholder_template').def(default_placeholder_template),
330
+ items: $.val(menuItems),
331
+ asyncLoadTrigger: $.val(asyncLoadTrigger),
332
+ asyncLoadDeviceType: $.val(asyncLoadDeviceType),
333
+ })),
334
+ ],
335
+ }),
336
+ }
337
+ },
338
+ },
339
+ },
340
+ shapes: [
341
+ {
342
+ shape: CallExpressionShape,
343
+ fileTypes: ['fluent'],
344
+ async toRecord(callExpression, { factory, diagnostics }) {
345
+ if (callExpression.getCallee() !== 'SPMenu') {
346
+ return { success: false }
347
+ }
348
+
349
+ const menu = callExpression.getArgument(0).asObject()
350
+
351
+ // Process roles if they exist as an array
352
+ const roles = menu.get('roles')
353
+ const rolesString = getRolesString(roles, diagnostics)
354
+
355
+ const menuRecord = await factory.createRecord({
356
+ source: callExpression,
357
+ table: 'sp_instance_menu',
358
+ explicitId: menu.get('$id'),
359
+ properties: menu.transform(({ $ }) => ({
360
+ title: $,
361
+ id: $,
362
+ sp_widget: $.from('widget').map(toReference).def(''),
363
+ sp_column: $.from('column').map(toReference).def(''),
364
+ widget_parameters: $.from('widgetParameters')
365
+ .map((v) =>
366
+ v.ifString() || v instanceof NowIncludeShape ? v : JSON.stringify(v.getValue())
367
+ )
368
+ .def(''),
369
+ css: $.def(''),
370
+ url: $.def(''),
371
+ glyph: $.def(''),
372
+ size: $.def('md'),
373
+ color: $.def('default'),
374
+ class_name: $.from('cssClass').def(''),
375
+ active: $.toBoolean().def(true),
376
+ order: $.toNumber().def(1),
377
+ roles: $.val(rolesString),
378
+ short_description: $.from('shortDescription').def(''),
379
+ async_load: $.from('asyncLoad').toBoolean().def(false),
380
+ async_load_trigger: $.from('asyncLoadTrigger').def('viewport'),
381
+ async_load_device_type: $.from('asyncLoadDeviceType').def(
382
+ defaultValues.menu.asyncLoadDeviceType
383
+ ),
384
+ preserve_placeholder_size: $.from('preservePlaceholderSize').toBoolean().def(false),
385
+ placeholder_dimensions: $.from('placeholderDimensions')
386
+ .map((v) =>
387
+ v.ifString() || v instanceof NowIncludeShape ? v : JSON.stringify(v.getValue())
388
+ )
389
+ .def(default_placeholder_dimensions),
390
+ advanced_placeholder_dimensions: $.from('advancedPlaceholderDimensions').toBoolean().def(false),
391
+ placeholder_dimensions_script: $.from('placeholderConfigurationScript').def(
392
+ default_placeholder_script
393
+ ),
394
+ placeholder_template: $.from('placeholderTemplate').def(default_placeholder_template),
395
+ })),
396
+ })
397
+
398
+ const itemRecords = await createItemRecords(
399
+ menu.get('items'),
400
+ menuRecord.getId(),
401
+ undefined,
402
+ factory,
403
+ diagnostics
404
+ )
405
+
406
+ return {
407
+ success: true,
408
+ value: menuRecord.with(...itemRecords),
409
+ }
410
+ },
411
+ },
412
+ ],
413
+ })