@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
@@ -22,6 +22,7 @@ export class NowIdShape extends ElementAccessExpressionShape {
22
22
 
23
23
  export const NowIdPlugin = Plugin.create({
24
24
  name: 'NowIdPlugin',
25
+ docs: [],
25
26
  shapes: [
26
27
  {
27
28
  shape: ElementAccessExpressionShape,
@@ -60,6 +60,7 @@ export class NowIncludeShape extends CallExpressionShape {
60
60
 
61
61
  export const NowIncludePlugin = Plugin.create({
62
62
  name: 'NowIncludePlugin',
63
+ docs: [],
63
64
  shapes: [
64
65
  {
65
66
  shape: CallExpressionShape,
@@ -3,6 +3,7 @@ import { CallExpressionPlugin } from './call-expression-plugin'
3
3
 
4
4
  export const NowRefPlugin = Plugin.create({
5
5
  name: 'NowRefPlugin',
6
+ docs: [],
6
7
  nodes: [
7
8
  {
8
9
  node: 'CallExpression',
@@ -2,6 +2,7 @@ import { Plugin, UnresolvedShape } from '@servicenow/sdk-build-core'
2
2
 
3
3
  export const NowUnresolvedPlugin = Plugin.create({
4
4
  name: 'NowUnresolvedPlugin',
5
+ docs: [],
5
6
  shapes: [
6
7
  {
7
8
  shape: UnresolvedShape,
@@ -12,6 +12,7 @@ import { JsonFileShape } from './json-plugin'
12
12
 
13
13
  export const PackageJsonPlugin = Plugin.create({
14
14
  name: 'PackageJsonPlugin',
15
+ docs: [],
15
16
  shapes: [
16
17
  {
17
18
  shape: JsonFileShape,
@@ -1,6 +1,7 @@
1
1
  import { isSNScope } from '@servicenow/sdk-build-core'
2
2
  import { CallExpressionShape, Plugin, type Shape } from '@servicenow/sdk-build-core'
3
3
  import { NowIdShape } from './now-id-plugin'
4
+ import { createSdkDocEntry } from './utils'
4
5
 
5
6
  const getRolesArray = (roles: string): Array<string> => {
6
7
  return roles
@@ -11,6 +12,7 @@ const getRolesArray = (roles: string): Array<string> => {
11
12
 
12
13
  export const PropertyPlugin = Plugin.create({
13
14
  name: 'PropertyPlugin',
15
+ docs: [createSdkDocEntry('Property', ['sys_properties'])],
14
16
  records: {
15
17
  sys_properties: {
16
18
  toShape(record, { config }) {
@@ -68,7 +70,10 @@ export const PropertyPlugin = Plugin.create({
68
70
  const name = prop.get('name').asString()
69
71
 
70
72
  if (!isSNScope(scope) && config.scope !== 'global' && !name.asString().startsWith(`${scope}.`)) {
71
- diagnostics.error(name.getOriginalNode(), `Property name must begin with '${scope}.'`)
73
+ diagnostics.warn(
74
+ name.getOriginalNode(),
75
+ `Property names should begin with '${scope}.' to match the app scope and avoid collisions with properties from other scopes`
76
+ )
72
77
  }
73
78
 
74
79
  return {
@@ -1,5 +1,6 @@
1
1
  import { CallExpressionShape, Database, Plugin, unloadBuilder, type Record } from '@servicenow/sdk-build-core'
2
2
  import { NowIdShape } from './now-id-plugin'
3
+ import { createSdkDocEntry } from './utils'
3
4
  import {
4
5
  Acl,
5
6
  ApplicationMenu,
@@ -13,11 +14,17 @@ import {
13
14
  Sla,
14
15
  } from '@servicenow/sdk-core/runtime/app'
15
16
  import {
17
+ ServicePortal,
16
18
  SPWidget,
19
+ SPHeaderFooter,
17
20
  SPAngularProvider,
18
21
  SPWidgetDependency,
19
22
  CssInclude,
20
23
  JsInclude,
24
+ SPPage,
25
+ SPTheme,
26
+ SPMenu,
27
+ SPPageRouteMap,
21
28
  } from '@servicenow/sdk-core/runtime/service-portal'
22
29
  import {
23
30
  CatalogItem,
@@ -27,21 +34,27 @@ import {
27
34
  CatalogItemRecordProducer,
28
35
  } from '@servicenow/sdk-core/runtime/service-catalog'
29
36
  import { ClientScript } from '@servicenow/sdk-core/runtime/clientscript'
30
- import { ScriptAction, ScriptInclude } from '@servicenow/sdk-core/runtime/sys'
31
- import { List } from '@servicenow/sdk-core/runtime/ui'
37
+ import { ScriptAction, ScriptInclude, ScheduledScript } from '@servicenow/sdk-core/runtime/sys'
38
+ import { List, Form } from '@servicenow/sdk-core/runtime/ui'
32
39
  import { Table } from '@servicenow/sdk-core/runtime/db'
33
40
  import { RestApi } from '@servicenow/sdk-core/runtime/rest'
34
- import { EmailNotification } from '@servicenow/sdk-core/runtime/notification'
41
+ import { EmailNotification, InboundEmailAction } from '@servicenow/sdk-core/runtime/notification'
35
42
  import { UiAction, UiPage, UiPolicy } from '@servicenow/sdk-core/runtime/ui'
43
+ import { ActionStepDefinition } from '@servicenow/sdk-core/runtime/flow'
36
44
  import { Applicability, UxListMenuConfig, Workspace } from '@servicenow/sdk-core/runtime/uxf'
37
45
  import { Dashboard } from '@servicenow/sdk-core/runtime/dashboard'
46
+ import { ColumnTypeCheck, LinterCheck, ScriptOnlyCheck, TableCheck } from '@servicenow/sdk-core/runtime/instancescan'
38
47
 
39
48
  export const RecordPlugin = Plugin.create({
40
49
  name: 'RecordPlugin',
50
+ docs: [createSdkDocEntry('Record', ['*'])],
41
51
  records: {
42
52
  '*': {
43
53
  getUpdateName(record) {
44
- return { success: true, value: `${record.getTable()}_${record.getId().getValue()}` }
54
+ return {
55
+ success: true,
56
+ value: `${record.getTable()}_${record.getId().getValue()}`,
57
+ }
45
58
  },
46
59
  async diff(existing, incoming) {
47
60
  const changeDatabase = existing.compare(incoming)
@@ -213,6 +226,10 @@ export const TableOwnership = {
213
226
  sys_script: BusinessRule.name,
214
227
  sys_script_client: ClientScript.name,
215
228
  sys_scope_privilege: CrossScopePrivilege.name,
229
+ sys_ui_form: Form.name,
230
+ sys_ui_section: Form.name,
231
+ sys_ui_form_section: Form.name,
232
+ sys_ui_element: Form.name,
216
233
  sys_ui_list_element: List.name,
217
234
  sys_ui_list: List.name,
218
235
  sys_properties: Property.name,
@@ -220,16 +237,26 @@ export const TableOwnership = {
220
237
  sys_user_role_contains: Role.name,
221
238
  sys_script_include: ScriptInclude.name,
222
239
  sp_widget: SPWidget.name,
240
+ sp_header_footer: SPHeaderFooter.name,
223
241
  m2m_sp_widget_dependency: SPWidget.name,
224
242
  m2m_sp_ng_pro_sp_widget: SPWidget.name,
243
+ sp_portal: ServicePortal.name,
225
244
  sp_ng_template: SPWidget.name,
226
245
  sp_dependency: SPWidgetDependency.name,
246
+ sp_container: SPPage.name,
247
+ sp_page: SPPage.name,
248
+ sp_row: SPPage.name,
249
+ sp_column: SPPage.name,
250
+ sp_instance: SPPage.name,
227
251
  m2m_sp_dependency_css_include: SPWidgetDependency.name,
228
252
  m2m_sp_dependency_js_include: SPWidgetDependency.name,
229
253
  sp_css_include: CssInclude.name,
230
254
  sp_js_include: JsInclude.name,
231
255
  sp_angular_provider: SPAngularProvider.name,
232
256
  m2m_sp_ng_pro_sp_ng_pro: SPAngularProvider.name,
257
+ sp_instance_menu: SPMenu.name,
258
+ sp_rectangle_menu_item: SPMenu.name,
259
+ sp_page_route_map: SPPageRouteMap.name,
233
260
  sys_atf_test: Test.name,
234
261
  sys_ws_header_map: RestApi.name,
235
262
  sys_ws_query_parameter_map: RestApi.name,
@@ -247,7 +274,9 @@ export const TableOwnership = {
247
274
  sys_ui_policy_action: UiPolicy.name,
248
275
  sys_ui_policy_rl_action: UiPolicy.name,
249
276
  sysevent_script_action: ScriptAction.name,
277
+ sysauto_script: ScheduledScript.name,
250
278
  sysevent_email_action: EmailNotification.name,
279
+ sysevent_in_email_action: InboundEmailAction.name,
251
280
  sys_db_object: Table.name,
252
281
  sys_dictionary: Table.name,
253
282
  sys_hub_flow: 'Flow',
@@ -255,10 +284,13 @@ export const TableOwnership = {
255
284
  sys_hub_action_instance_v2: 'wfa.action',
256
285
  sys_hub_sub_flow_instance_v2: 'wfa.subflow',
257
286
  sys_hub_flow_logic_instance_v2: 'wfa.flowLogic',
258
- sys_flow_step_definition: 'ActionStepDefinition',
287
+ sys_flow_step_definition: ActionStepDefinition.name,
259
288
  sys_decision: 'DecisionTablePlugin',
260
289
  sys_hub_action_type_definition: 'Action',
261
- sys_hub_step_instance: 'wfa.action_step',
290
+ sys_hub_step_instance: 'wfa.actionStep',
291
+ sp_theme: SPTheme.name,
292
+ m2m_sp_theme_css_include: SPTheme.name,
293
+ m2m_sp_theme_js_include: SPTheme.name,
262
294
  sys_transform_map: ImportSet.name,
263
295
  sys_transform_entry: ImportSet.name,
264
296
  sys_transform_script: ImportSet.name,
@@ -275,9 +307,27 @@ export const TableOwnership = {
275
307
  par_dashboard_widget: Dashboard.name,
276
308
  par_dashboard_permission: Dashboard.name,
277
309
  par_dashboard_visibility: Dashboard.name,
310
+ scan_column_type_check: ColumnTypeCheck.name,
311
+ scan_linter_check: LinterCheck.name,
312
+ scan_script_only_check: ScriptOnlyCheck.name,
313
+ scan_table_check: TableCheck.name,
278
314
  item_option_new_set: VariableSet.name,
279
315
  sc_cat_item: CatalogItem.name,
280
316
  sc_cat_item_producer: CatalogItemRecordProducer.name,
281
317
  catalog_script_client: CatalogClientScript.name,
282
318
  catalog_ui_policy: CatalogUiPolicy.name,
319
+ sn_aia_agent: 'AiAgentPlugin',
320
+ sn_aia_agent_config: 'AiAgentPlugin',
321
+ sn_aia_version: 'AiAgentPlugin',
322
+ sn_aia_tool: 'AiAgentPlugin',
323
+ sn_aia_agent_tool_m2m: 'AiAgentPlugin',
324
+ sn_aia_ltm_category_mapping: 'AiAgentPlugin',
325
+ sn_aia_trigger_configuration: 'AiAgentPlugin',
326
+ sn_aia_trigger_agent_usecase_m2m: 'AiAgentPlugin',
327
+ sn_aia_usecase: 'AiAgenticWorkflowPlugin',
328
+ sn_aia_usecase_config_override: 'AiAgenticWorkflowPlugin',
329
+ sn_aia_team: 'AiAgenticWorkflowPlugin',
330
+ sn_aia_team_member: 'AiAgenticWorkflowPlugin',
331
+ sn_nowassist_skill_config: 'NowAssistSkillPlugin',
332
+ sys_one_extend_capability: 'NowAssistSkillPlugin',
283
333
  }
@@ -1,8 +1,8 @@
1
1
  import * as globals from 'globals'
2
- import mapValues from 'lodash/mapValues'
3
2
  import omit from 'lodash/omit'
4
3
  import { GlideAPIs } from '@servicenow/glide/util'
5
- import type { Rule, Linter } from 'eslint'
4
+ import type { Rule, Linter, Scope } from 'eslint'
5
+ import { ReferenceTracker } from '@eslint-community/eslint-utils'
6
6
 
7
7
  const BROWSER_API_WARNING = 'Web APIs are not supported by the now platform'
8
8
  const GLIDE_API_WARNING = 'Glide APIs are not supported by the now platform when used from a 3rd party dependency'
@@ -21,18 +21,129 @@ const glideAPIs = GlideAPIs
21
21
 
22
22
  const globalsAllowList: string[] = ['console', 'fetch']
23
23
 
24
- export const getPluginModules = async (): Promise<Record<string, Rule.RuleModule>> => {
24
+ const coreNodeModules = [
25
+ 'assert',
26
+ 'buffer',
27
+ 'child_process',
28
+ 'cluster',
29
+ 'crypto',
30
+ 'dgram',
31
+ 'dns',
32
+ 'domain',
33
+ 'events',
34
+ 'freelist',
35
+ 'fs',
36
+ 'http',
37
+ 'https',
38
+ 'module',
39
+ 'net',
40
+ 'os',
41
+ 'path',
42
+ 'punycode',
43
+ 'querystring',
44
+ 'readline',
45
+ 'repl',
46
+ 'smalloc',
47
+ 'stream',
48
+ 'string_decoder',
49
+ 'sys',
50
+ 'timers',
51
+ 'tls',
52
+ 'tracing',
53
+ 'tty',
54
+ 'url',
55
+ 'util',
56
+ 'vm',
57
+ 'zlib',
58
+ ]
59
+
60
+ const getNodeGlobals = () => Object.keys(globals.nodeBuiltin).filter((key) => !globalsAllowList.includes(key))
61
+
62
+ function createTrackMap(isNodeGlobals: boolean): Record<string, { [key: symbol]: { name: string } }> {
63
+ const trackMapItems = isNodeGlobals ? getNodeGlobals() : coreNodeModules
64
+ const trackMap: Record<string, { [key: symbol]: { name: string } }> = {}
65
+
66
+ for (const item of trackMapItems) {
67
+ trackMap[item] = {
68
+ [ReferenceTracker.READ]: {
69
+ name: item,
70
+ },
71
+ }
72
+ }
73
+
74
+ return trackMap
75
+ }
76
+
77
+ /**
78
+ * Custom rule: disallow unsupported Node.js built-in APIs.
79
+ * Replaces @servicenow/eslint-plugin-sdk-app-plugin/no-unsupported-node-builtins.
80
+ */
81
+ const noUnsupportedNodeBuiltins: Rule.RuleModule = {
82
+ meta: {
83
+ docs: {
84
+ description: 'disallow unsupported Node.js built-in APIs',
85
+ },
86
+ messages: {
87
+ forbidden: 'The {{name}} Node.js API is not supported in now platform.',
88
+ },
89
+ schema: [],
90
+ type: 'problem',
91
+ },
92
+ create(context) {
93
+ return {
94
+ // biome-ignore lint/suspicious/noExplicitAny: ESLint rule listener typing
95
+ 'Program:exit'(node: any) {
96
+ const sourceCode = context.sourceCode
97
+ const tracker = new ReferenceTracker(sourceCode.getScope(node) as Scope.Scope, { mode: 'legacy' })
98
+ const trackMap = createTrackMap(false)
99
+ const globalsTrackMap = createTrackMap(true)
100
+
101
+ const references = [
102
+ ...tracker.iterateCjsReferences(trackMap),
103
+ ...tracker.iterateEsmReferences(trackMap),
104
+ ...tracker.iterateGlobalReferences(globalsTrackMap),
105
+ ]
106
+
107
+ for (const { node: refNode, info } of references) {
108
+ context.report({
109
+ node: refNode as Rule.Node,
110
+ messageId: 'forbidden',
111
+ data: info as Record<string, string>,
112
+ })
113
+ }
114
+ },
115
+ }
116
+ },
117
+ }
118
+
119
+ /**
120
+ * Custom rule: disallow dynamic import() syntax.
121
+ * Replaces eslint-plugin-es-x/no-dynamic-import.
122
+ */
123
+ const noDynamicImport: Rule.RuleModule = {
124
+ meta: {
125
+ docs: {
126
+ description: 'disallow dynamic import() syntax',
127
+ },
128
+ messages: {
129
+ forbidden: "Dynamic 'import()' syntax is not supported on the now platform.",
130
+ },
131
+ schema: [],
132
+ type: 'problem',
133
+ },
134
+ create(context) {
135
+ return {
136
+ ImportExpression(node: Rule.Node) {
137
+ context.report({ node, messageId: 'forbidden' })
138
+ },
139
+ }
140
+ },
141
+ }
142
+
143
+ export const getPluginRules = (): Record<string, Rule.RuleModule> => {
25
144
  return {
26
- 'es-x/no-dynamic-import': (await import('eslint-plugin-es-x/lib/rules/no-dynamic-import.js')).default,
27
- 'es-x/no-regexp-lookbehind-assertions': (
28
- await import('eslint-plugin-es-x/lib/rules/no-regexp-lookbehind-assertions.js')
29
- ).default,
30
- 'es-x/no-regexp-unicode-property-escapes': (
31
- await import('eslint-plugin-es-x/lib/rules/no-regexp-unicode-property-escapes.js')
32
- ).default,
33
- '@servicenow/sdk-app-plugin/no-unsupported-node-builtins': (
34
- await import('@servicenow/eslint-plugin-sdk-app-plugin')
35
- ).default.rules['no-unsupported-node-builtins'],
145
+ 'no-dynamic-import': noDynamicImport,
146
+ 'no-unsupported-node-builtins': noUnsupportedNodeBuiltins,
36
147
  }
37
148
  }
38
149
 
@@ -63,19 +174,29 @@ const getGlideGlobalEslintRules = () => {
63
174
  const getGlideNamespaceEslintRules = () => {
64
175
  const namespacedAPIs = omit(glideAPIs, ['defaults'])
65
176
 
66
- const namespaceRules: ESLintPropertyRule[] = []
67
- const classRules: ESLintPropertyRule[] = []
177
+ // Deduplicate rules the Glide API data contains duplicate object.property entries
178
+ // across namespaces, and ESLint v9 rejects arrays with duplicate items.
179
+ const deduplicatedRuleKeys = new Set<string>()
180
+ const rules: ESLintPropertyRule[] = []
181
+
182
+ const addRule = (rule: ESLintPropertyRule) => {
183
+ const key = `${rule.object}.${rule.property}`
184
+ if (!deduplicatedRuleKeys.has(key)) {
185
+ deduplicatedRuleKeys.add(key)
186
+ rules.push(rule)
187
+ }
188
+ }
68
189
 
69
190
  for (const [namespace, classes] of Object.entries(namespacedAPIs)) {
70
191
  for (const [className, properties] of Object.entries(classes)) {
71
- classRules.push({
192
+ addRule({
72
193
  object: namespace,
73
194
  property: className,
74
195
  message: GLIDE_API_WARNING,
75
196
  })
76
197
 
77
198
  for (const property of properties) {
78
- namespaceRules.push({
199
+ addRule({
79
200
  object: className,
80
201
  property,
81
202
  message: GLIDE_API_WARNING,
@@ -84,14 +205,42 @@ const getGlideNamespaceEslintRules = () => {
84
205
  }
85
206
  }
86
207
 
87
- return classRules.concat(namespaceRules)
208
+ return rules
209
+ }
210
+
211
+ /**
212
+ * ESLint config for local modules — Rhino compatibility rules only (no Glide restrictions).
213
+ * Local modules can use Glide APIs since they run in the ServiceNow scope.
214
+ */
215
+ export const getLocalModuleEslintConfig = (level: LogLevel = 'error'): Linter.LegacyConfig => {
216
+ const pluginRules = getPluginRules()
217
+ const restrictedGlobals = getRestrictedGlobals()
218
+ const rules: Linter.LegacyConfig['rules'] = {
219
+ ...Object.fromEntries(Object.keys(pluginRules).map((name) => [name, level])),
220
+ 'no-restricted-globals': [level, ...restrictedGlobals],
221
+ }
222
+
223
+ return {
224
+ env: {
225
+ node: true,
226
+ },
227
+ parserOptions: {
228
+ ecmaVersion: 'latest',
229
+ sourceType: 'module',
230
+ },
231
+ rules,
232
+ }
88
233
  }
89
234
 
90
- export const getEslintConfig = async (level: LogLevel = 'warn'): Promise<Linter.Config> => {
91
- const pluginModules = await getPluginModules()
235
+ /**
236
+ * ESLint config for 3rd party dependencies — Rhino compatibility + Glide API restrictions.
237
+ * 3rd party code must not use Glide APIs (they are platform-internal).
238
+ */
239
+ export const getEslintConfig = (level: LogLevel = 'warn'): Linter.LegacyConfig => {
240
+ const pluginRules = getPluginRules()
92
241
  const restrictedGlobals = getRestrictedGlobals()
93
242
  const rules = {
94
- ...mapValues(pluginModules, () => level),
243
+ ...Object.fromEntries(Object.keys(pluginRules).map((name) => [name, level])),
95
244
  ...getDependencyConfig(level, restrictedGlobals),
96
245
  }
97
246
 
@@ -107,7 +256,7 @@ export const getEslintConfig = async (level: LogLevel = 'warn'): Promise<Linter.
107
256
  }
108
257
  }
109
258
 
110
- function getDependencyConfig(level: LogLevel, restrictedGlobals: ESLintPropertyRule[]): Linter.Config['rules'] {
259
+ function getDependencyConfig(level: LogLevel, restrictedGlobals: ESLintPropertyRule[]): Linter.LegacyConfig['rules'] {
111
260
  const globalRules = getGlideGlobalEslintRules()
112
261
  const namespaceRules = getGlideNamespaceEslintRules()
113
262
  return {
@@ -1,71 +1,95 @@
1
1
  import { Linter, type ESLint } from 'eslint'
2
2
  import formatter from 'eslint-formatter-stylish'
3
- import { getEslintConfig, getPluginModules } from './Rules'
3
+ import { getEslintConfig, getLocalModuleEslintConfig, getPluginRules } from './Rules'
4
4
 
5
- export class Lint {
6
- private linter: Linter | undefined
7
- private config: Linter.Config | undefined
8
-
9
- private async initESLint() {
10
- if (!this.linter) {
11
- this.linter = new Linter()
12
- this.linter.defineRules(await getPluginModules())
13
- this.config = await getEslintConfig()
14
- }
15
-
16
- return { linter: this.linter, config: this.config }
17
- }
18
-
19
- async check(fileContent: string): Promise<string | undefined> {
20
- await this.initESLint()
5
+ // Module-level singletons — the Linter and configs are shared across all Lint instances.
6
+ // Uses configType: 'eslintrc' (legacy mode) because ESLint v9's flat config verify() path
7
+ // re-validates the config (including 7000+ no-restricted-properties entries) on every call,
8
+ // causing significant performance overhead. In legacy mode, defineRules() loads rules once
9
+ // and verify() is lightweight — matching ESLint v8 behavior.
10
+ //
11
+ // TODO: configType: 'eslintrc' is deprecated and will be removed in ESLint v10.
12
+ // When that happens, replace the 7000+ no-restricted-properties entries with a single
13
+ // custom ESLint rule that internalizes the Glide API blocklist. This would make flat
14
+ // config verify() fast by reducing the rule count, eliminating the need for legacy mode.
15
+ let sharedLinter: Linter | undefined
16
+ let dependencyConfig: Linter.LegacyConfig | undefined
17
+ let localModuleConfig: Linter.LegacyConfig | undefined
21
18
 
22
- const messages = this.linter!.verify(fileContent, this.config!)
23
- return this.outputLintingResults(messages)
19
+ function getSharedLinter(): Linter {
20
+ if (!sharedLinter) {
21
+ sharedLinter = new Linter({ configType: 'eslintrc' })
22
+ sharedLinter.defineRules(getPluginRules())
23
+ dependencyConfig = getEslintConfig()
24
+ localModuleConfig = getLocalModuleEslintConfig()
24
25
  }
26
+ return sharedLinter
27
+ }
25
28
 
26
- private outputLintingResults(messages: Linter.LintMessage[]): string | undefined {
27
- const stats = messages.reduce(
28
- (result, message) => {
29
- if (message.fatal) {
30
- result.fatalErrorCount++
31
- }
29
+ function outputLintingResults(messages: Linter.LintMessage[]): string | undefined {
30
+ const stats = messages.reduce(
31
+ (result, message) => {
32
+ if (message.fatal) {
33
+ result.fatalErrorCount++
34
+ }
32
35
 
33
- if (message.severity === 1) {
34
- result.warningCount++
35
- if (message.fix) {
36
- result.fixableWarningCount++
37
- }
36
+ if (message.severity === 1) {
37
+ result.warningCount++
38
+ if (message.fix) {
39
+ result.fixableWarningCount++
38
40
  }
39
- if (message.severity === 2) {
40
- result.errorCount++
41
- if (message.fix) {
42
- result.fixableErrorCount++
43
- }
41
+ }
42
+ if (message.severity === 2) {
43
+ result.errorCount++
44
+ if (message.fix) {
45
+ result.fixableErrorCount++
44
46
  }
45
-
46
- return result
47
- },
48
- {
49
- errorCount: 0,
50
- fatalErrorCount: 0,
51
- warningCount: 0,
52
- fixableErrorCount: 0,
53
- fixableWarningCount: 0,
54
47
  }
55
- )
56
- const results: ESLint.LintResult = {
57
- filePath: '',
58
- messages,
59
- suppressedMessages: [],
60
- usedDeprecatedRules: [],
61
- ...stats,
62
- }
63
48
 
64
- const problems = results.errorCount + results.warningCount + results.fatalErrorCount
65
- if (problems <= 0) {
66
- return
49
+ return result
50
+ },
51
+ {
52
+ errorCount: 0,
53
+ fatalErrorCount: 0,
54
+ warningCount: 0,
55
+ fixableErrorCount: 0,
56
+ fixableWarningCount: 0,
67
57
  }
58
+ )
59
+ const results: ESLint.LintResult = {
60
+ filePath: '',
61
+ messages,
62
+ suppressedMessages: [],
63
+ usedDeprecatedRules: [],
64
+ ...stats,
65
+ }
66
+
67
+ const problems = results.errorCount + results.warningCount + results.fatalErrorCount
68
+ if (problems <= 0) {
69
+ return
70
+ }
71
+
72
+ return (formatter as (results: ESLint.LintResult[]) => string)([results])
73
+ }
74
+
75
+ /**
76
+ * Lint for 3rd party dependencies — Rhino compatibility + Glide API restrictions.
77
+ */
78
+ export class Lint {
79
+ check(fileContent: string): string | undefined {
80
+ const linter = getSharedLinter()
81
+ const messages = linter.verify(fileContent, dependencyConfig!)
82
+ return outputLintingResults(messages)
83
+ }
84
+ }
68
85
 
69
- return (formatter as (results: ESLint.LintResult[]) => string)([results])
86
+ /**
87
+ * Lint for local modules — Rhino compatibility rules only (no Glide restrictions).
88
+ */
89
+ export class LocalModuleLint {
90
+ check(fileContent: string): string | undefined {
91
+ const linter = getSharedLinter()
92
+ const messages = linter.verify(fileContent, localModuleConfig!)
93
+ return outputLintingResults(messages)
70
94
  }
71
95
  }