From 998560669fcf95478848d9a3fb436a29c3ae1a8b Mon Sep 17 00:00:00 2001 From: modesty Date: Mon, 6 Oct 2025 11:40:00 -0700 Subject: [PATCH 01/11] res: List API update for v4.0.0: is deprecated --- res/instruct/fluent_instruct_list.md | 3 ++- res/snippet/fluent_snippet_list_0001.md | 1 - res/snippet/fluent_snippet_list_0002.md | 1 - res/spec/fluent_spec_list.md | 4 +++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/res/instruct/fluent_instruct_list.md b/res/instruct/fluent_instruct_list.md index a445e85..ff83c28 100644 --- a/res/instruct/fluent_instruct_list.md +++ b/res/instruct/fluent_instruct_list.md @@ -1,5 +1,6 @@ # Instructions for Fluent List API Always reference the List API specifications for more details. 1. For the `view` field, you must either use `default_view` or create a custom view using the `Record` plugin. - - In order to use default_view, you must first import it from '@servicenow/sdk/core'. + - In order to use `default_view`, you must first import it from '@servicenow/sdk/core'. - In order to use a custom view, you must import the `Record` plugin from '@servicenow/sdk/core' and create a record in the `sys_ui_view` table. +2. $id property is deprecated since v4.0.0. diff --git a/res/snippet/fluent_snippet_list_0001.md b/res/snippet/fluent_snippet_list_0001.md index e2a9bc3..4b9cef0 100644 --- a/res/snippet/fluent_snippet_list_0001.md +++ b/res/snippet/fluent_snippet_list_0001.md @@ -4,7 +4,6 @@ import { List, default_view } from '@servicenow/sdk/core' // Creates a list view of the catalog items table using the default view and specifying 3 columns to show List({ - $id: Now.ID['default_view_list'], table: 'sc_cat_item', view: default_view, // importing and using the default_view object columns: [ diff --git a/res/snippet/fluent_snippet_list_0002.md b/res/snippet/fluent_snippet_list_0002.md index da67ffd..b43c00a 100644 --- a/res/snippet/fluent_snippet_list_0002.md +++ b/res/snippet/fluent_snippet_list_0002.md @@ -4,7 +4,6 @@ import { List, Record } from '@servicenow/sdk/core' // Define the custom view const app_task_view = Record({ - $id: Now.ID['app_task_view'], table: 'sys_ui_view', data: { name: 'app_task_view', diff --git a/res/spec/fluent_spec_list.md b/res/spec/fluent_spec_list.md index 294051b..a8bc534 100644 --- a/res/spec/fluent_spec_list.md +++ b/res/spec/fluent_spec_list.md @@ -2,7 +2,6 @@ ```typescript // spec to configure a List in Fluent List({ - $id: '', // string, unique id for the record, typically using Now.ID["value"] table: '', // string, name of the table the list is for view: get_sys_id('sys_ui_view', ''), // Record<'sys_ui_view'>, The UI view (sys_ui_view) to apply to the list. Can import and use default_view, or can define a custom view using Record plugin. columns: [ // array of {element, position} objects representing the columns to be displayed in the List and their order @@ -11,5 +10,8 @@ List({ position: 0, // number, column order } ], + $meta: { // optional, application metadata + installMethod: 'demo | first install ' // string, map the application metadata to an output directory that loads only in specific circumstances. *demo*: Outputs the application metadata to the metadata/unload.demo directory to be installed with the application when the Load demo data option is selected. *first install*: Outputs the application metadata to the metadata/unload directory to be installed only the first time an application is installed on an instance. + } }); ``` From 9de56d138fd0cce67d638df2c03ae8d25d37fc0a Mon Sep 17 00:00:00 2001 From: modesty Date: Mon, 6 Oct 2025 11:57:13 -0700 Subject: [PATCH 02/11] res: update Role API: $id is deprecated since v4.0.0 --- res/instruct/fluent_instruct_role.md | 2 +- res/snippet/fluent_snippet_role_0001.md | 6 ++---- res/spec/fluent_spec_list.md | 5 +---- res/spec/fluent_spec_role.md | 1 - 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/res/instruct/fluent_instruct_role.md b/res/instruct/fluent_instruct_role.md index 1851e5c..a4bfda3 100644 --- a/res/instruct/fluent_instruct_role.md +++ b/res/instruct/fluent_instruct_role.md @@ -1,6 +1,6 @@ # Instructions on Fluent Role API Always reference the Role API specification for more details. -1. `$id`is mandatory and should always be present, format should be `$id: Now.ID['']`, where '' is to be replaced with the role name as per user prompt or instructions. +1. `$id` is deprecated since v4.0.0. 2. `contains_roles` property is an array of Record<'sys_user_role'>, either sys_ids or Role objects. It is optional, it indicates other Role objects that this role contains. If using a new role, use the Role object. If using an existing role, use function like `get_sys_id('sys_user_role', 'name=ex_role')` - no `label` field for roles. 3. `elevated_privilege` is default to `false`, when it's `true`, it means user must manually accept the responsibility of using the role before you can access its features. 4. `can_delegate` is default to `true`, when it's `false`, it means the role cannot be delegated to other users. diff --git a/res/snippet/fluent_snippet_role_0001.md b/res/snippet/fluent_snippet_role_0001.md index 7325ebb..22362e7 100644 --- a/res/snippet/fluent_snippet_role_0001.md +++ b/res/snippet/fluent_snippet_role_0001.md @@ -3,13 +3,11 @@ import { Role } from "@servicenow/sdk/core"; const managerRole = Role({ - $id: Now.ID['manager_role'], // unique identifier - name: 'sn_xxxx.manager' // role name + name: 'x_example.manager' // role name }) const supervisorRole = Role({ - $id: Now.ID['supervisor_role'], // unique identifier - name: 'sn_xxxx.supervisor', // role name + name: 'x_example.supervisor', // role name contains_roles: [managerRole, get_sys_id('sys_user_role', 'name=itil')] // array of Record<'sys_user_role'>, this establishes a hierarchy where the sn_xxxx.supervisor role encompasses the sn_xxxx.manager and itil roles. }) ``` diff --git a/res/spec/fluent_spec_list.md b/res/spec/fluent_spec_list.md index a8bc534..63c7ef2 100644 --- a/res/spec/fluent_spec_list.md +++ b/res/spec/fluent_spec_list.md @@ -9,9 +9,6 @@ List({ element: '', // string, column name of the table position: 0, // number, column order } - ], - $meta: { // optional, application metadata - installMethod: 'demo | first install ' // string, map the application metadata to an output directory that loads only in specific circumstances. *demo*: Outputs the application metadata to the metadata/unload.demo directory to be installed with the application when the Load demo data option is selected. *first install*: Outputs the application metadata to the metadata/unload directory to be installed only the first time an application is installed on an instance. - } + ] }); ``` diff --git a/res/spec/fluent_spec_role.md b/res/spec/fluent_spec_role.md index 15f078d..1397552 100644 --- a/res/spec/fluent_spec_role.md +++ b/res/spec/fluent_spec_role.md @@ -2,7 +2,6 @@ ```typescript // Creates a new Role (`sys_user_role`) Role({ - $id: '', // string | guid, mandatory name: '', // string, mandatory description: '', // string, mandatory assignable_by: '', // string, mandatory From 8efe47b09bd13b1f2bed988c039c08c51d2f191f Mon Sep 17 00:00:00 2001 From: modesty Date: Mon, 6 Oct 2025 12:39:42 -0700 Subject: [PATCH 03/11] res: spec: update snake cased prop name to be camel case - SDKv4.0.0 --- res/spec/fluent_spec_acl.md | 10 +- res/spec/fluent_spec_application-menu.md | 20 +- res/spec/fluent_spec_atf-catalog-action.md | 6 +- res/spec/fluent_spec_atf-catalog-variable.md | 2 +- res/spec/fluent_spec_atf-email.md | 6 +- res/spec/fluent_spec_atf-form-action.md | 2 +- ...fluent_spec_atf-form-declarative-action.md | 2 +- res/spec/fluent_spec_atf-form.md | 4 +- .../fluent_spec_atf-server-catalog-item.md | 12 +- res/spec/fluent_spec_atf-server-record.md | 4 +- res/spec/fluent_spec_atf-server.md | 4 +- res/spec/fluent_spec_business-rule.md | 35 +- res/spec/fluent_spec_client-script.md | 6 +- res/spec/fluent_spec_column-generic.md | 35 +- res/spec/fluent_spec_column.md | 596 +++++++++--------- res/spec/fluent_spec_cross-scope-privilege.md | 6 +- res/spec/fluent_spec_form.md | 17 +- res/spec/fluent_spec_role.md | 12 +- res/spec/fluent_spec_scheduled-script.md | 16 +- res/spec/fluent_spec_script-include.md | 14 +- res/spec/fluent_spec_scripted-rest.md | 24 +- res/spec/fluent_spec_table.md | 58 +- res/spec/fluent_spec_ui-action.md | 58 +- 23 files changed, 476 insertions(+), 473 deletions(-) diff --git a/res/spec/fluent_spec_acl.md b/res/spec/fluent_spec_acl.md index f5cd3d6..d560900 100644 --- a/res/spec/fluent_spec_acl.md +++ b/res/spec/fluent_spec_acl.md @@ -9,13 +9,13 @@ const specAcl = Acl({ operation: 'read', // mandatory, typed string: `execute`, `create`, `read`, `write`, `delete`, `edit_task_relations`, `edit_ci_relations`, `save_as_template`, `add_to_list`, `report_on`, `list_edit`, `report_view`, `personalize_choices` table: '', // mandatory if `type` is `record` field: '*', // mandatory if `type` is `record`: `*` or comma delimited list of field names - applies_to: '', // ServiceNow encoded query, only applicable if `type` is `record` + appliesTo: '', // ServiceNow encoded query, only applicable if `type` is `record` roles: [get_sys_id('sys_user_role', '')], // array of Record<'sys_user_role'>, either sys_id for existing roles or Role object for new roles - decision_type: 'allow', // typed string, `allow`|`deny` + decisionType: 'allow', // typed string, `allow`|`deny` condition: '', // ServiceNow encoded query script: '', // ServiceNow script to fullfil the functional request in scripting, - admin_overrides: true, // boolean, default is true - security_attribute: 'user_is_authenticated', // typed string, `user_is_authenticated`|`has_admin_role`, - local_or_existing: 'Local', // typed string, 'Local'|'Exisiting': if `Local`: A security attribute based on the `condition` property that is saved only for the ACL it is created in; if `Exisiting`: An existing security attribute to reference in the `security_attribute` property + adminOverrides: true, // boolean, default is true + securityAttribute: 'LoggedIn', // typed string, `LoggedIn`|`Group`|`GroupExplicit`|`HasAdminRole`|`Impersonating`|`InteractiveSession`|`NetworkCriteria`|`Role`|`RoleExplicit`, additional security attributes may be available based on installed plugins, ex. com.glide.client_session_security_attributes + localOrExisting: 'Local', // typed string, 'Local'|'Exisiting': if `Local`: A security attribute based on the `condition` property that is saved only for the ACL it is created in; if `Exisiting`: An existing security attribute to reference in the `security_attribute` property }): Acl; // returns an Acl object ``` diff --git a/res/spec/fluent_spec_application-menu.md b/res/spec/fluent_spec_application-menu.md index 11fcb05..00b2da1 100644 --- a/res/spec/fluent_spec_application-menu.md +++ b/res/spec/fluent_spec_application-menu.md @@ -22,23 +22,23 @@ const applicationSubMenu = Record({ active: true, //default is true, unless specified to make it inactive application: applicationMenu, // applicationMenu object assessment: get_sys_id('asmt_metric_type', ''), // String, guid, second paramemter as per user instructions or prompts or devrequest - device_type: '', // '' | 'any' | 'browser' | 'mobile' + deviceType: '', // '' | 'any' | 'browser' | 'mobile' filter: '', // String, conditions applied to list view for visibility in application navigator, Servicenow encoded query hint: '', // String, max length is 255 characters - link_type: '', // '' | 'SEPARATOR' | 'TIMELINE' | 'DETAIL' | 'HTML' | 'ASSESSMENT' | 'LIST' | 'FILTER' | 'SCRIPT' | 'CONTENT_PAGE' | 'SEARCH' | 'SURVEY' | 'DOC_LINK' | 'NEW' | 'MAP' | 'REPORT' | 'DIRECT' - map_page: get_sys_id('cmn_map_page', ''), // String, guid, second paramemter as per user instructions or prompts or devrequest - mobile_title: '', // String, max length is 80 characters - mobile_view_name: '', // String, max length is 40 characters + linkType: '', // '' | 'SEPARATOR' | 'TIMELINE' | 'DETAIL' | 'HTML' | 'ASSESSMENT' | 'LIST' | 'FILTER' | 'SCRIPT' | 'CONTENT_PAGE' | 'SEARCH' | 'SURVEY' | 'DOC_LINK' | 'NEW' | 'MAP' | 'REPORT' | 'DIRECT' + mapPage: get_sys_id('cmn_map_page', ''), // String, guid, second paramemter as per user instructions or prompts or devrequest + mobileTitle: '', // String, max length is 80 characters + mobileViewName: '', // String, max length is 40 characters name: '', // table name order: 100, // number - override_menu_roles: false, // boolean, default false + overrideMenuRoles: false, // boolean, default false query: '', // String, max length is 3500 characters, is link type arguments - require_confirmation: true, // boolean, default is true + requireConfirmation: true, // boolean, default is true uncancelable: false, // boolean, default is false - view_name: '', // String - window_name: '', // String + viewName: '', // String + windowName: '', // String report: '', // String - timeline_page: get_sys_id('cmn_timeline_page', ''), // String, guid, second paramemter as per user instructions or prompts or devrequest + timelinePage: get_sys_id('cmn_timeline_page', ''), // String, guid, second paramemter as per user instructions or prompts or devrequest } }) ``` diff --git a/res/spec/fluent_spec_atf-catalog-action.md b/res/spec/fluent_spec_atf-catalog-action.md index d94cc35..683e834 100644 --- a/res/spec/fluent_spec_atf-catalog-action.md +++ b/res/spec/fluent_spec_atf-catalog-action.md @@ -10,8 +10,8 @@ atf.catalog.openCatalogItem({ atf.catalog.addItemToShoppingCart({ $id: Now.ID[''], // string | guid, mandatory assert: '' // '' | 'form_submission_cancelled_in_browser' | 'form_submitted_to_server'; -}): { - cart_item_id: '' // sys_id of the item added to the cart +}): { + cartItemId: '' // sys_id of the item added to the cart }; // Sets quantity value on the current catalog item after a call to atf.catalog.openCatalogItem @@ -25,7 +25,7 @@ atf.catalog.orderCatalogItem({ $id: Now.ID[''], // string | guid, mandatory assert: '', // 'form_submitted_to_server' | 'form_submission_cancelled_in_browser' }): { - request_id: '', // sys_id + requestId: '', // sys_id cart: '' }; diff --git a/res/spec/fluent_spec_atf-catalog-variable.md b/res/spec/fluent_spec_atf-catalog-variable.md index a6186e1..e6592f5 100644 --- a/res/spec/fluent_spec_atf-catalog-variable.md +++ b/res/spec/fluent_spec_atf-catalog-variable.md @@ -18,6 +18,6 @@ atf.catalog.submitRecordProducer({ $id: Now.ID[''], // string | guid, mandatory assert: '' // '' | 'form_submitted_to_server' | 'form_submission_cancelled_in_browser' }): { - record_id: '' // sys_id + recordId: '' // sys_id }; ``` \ No newline at end of file diff --git a/res/spec/fluent_spec_atf-email.md b/res/spec/fluent_spec_atf-email.md index 503cac2..2acb76a 100644 --- a/res/spec/fluent_spec_atf-email.md +++ b/res/spec/fluent_spec_atf-email.md @@ -27,7 +27,7 @@ atf.email.generateInboundEmail({ to: '', subject: '', body: '' -}): { output_email_record: ''}; +}): { outputEmailRecord: ''}; // generates an Email [sys_email] record that looks like an email sent in reply to a system notification. This step also creates an email.read event upon step completion. atf.email.generateInboundReplyEmail({ @@ -38,11 +38,11 @@ atf.email.generateInboundReplyEmail({ body: '', from: '', to: '', -}): { output_reply_email_record: ''}; // recordId of the inbound reply email +}): { outputReplyEmailRecord: ''}; // recordId of the inbound reply email // Generates a string that can be used as test data for another test step. By default, the string is 10 characters long. The maximum length of the string is 10,000 characters. atf.email.generateRandomString({ $id: Now.ID[''], // string | guid, mandatory length: 1024, // number -}): { random_string: '' }; +}): { randomString: '' }; ``` \ No newline at end of file diff --git a/res/spec/fluent_spec_atf-form-action.md b/res/spec/fluent_spec_atf-form-action.md index 426bb3b..94c2095 100644 --- a/res/spec/fluent_spec_atf-form-action.md +++ b/res/spec/fluent_spec_atf-form-action.md @@ -18,6 +18,6 @@ atf.form.clickUIAction({ // all props are mandatory actionType: '' // 'ui_action' | 'declarative_action' declarativeAction: get_sys_id('sys_declarative_action_assignment', ''), // sys_id | Record<'sys_declarative_action_assignment'> formUI: 'standard_ui', // 'standard_ui' | 'service_operations_workspace' | 'asset_workspace' | 'cmdb_workspace' -}): { record_id: string; table: string } +}): { recordId: string; table: string } ``` diff --git a/res/spec/fluent_spec_atf-form-declarative-action.md b/res/spec/fluent_spec_atf-form-declarative-action.md index 3c629f3..62e93d0 100644 --- a/res/spec/fluent_spec_atf-form-declarative-action.md +++ b/res/spec/fluent_spec_atf-form-declarative-action.md @@ -16,5 +16,5 @@ atf.form.clickDeclarativeAction({ // all props are mandatory declarativeAction: get_sys_id('sys_declarative_action_assignment', ''), // sys_id | Record<'sys_declarative_action_assignment'> assert: 'form_submitted_to_server' //'form_submitted_to_server' | 'form_submission_canceled_in_browser' | 'page_reloaded_or_redirected' formUI: 'standard_ui', // 'standard_ui' | 'service_operations_workspace' | 'asset_workspace' | 'cmdb_workspace' -}): { record_id: string; table: string } +}): { recordId: string; table: string } ``` \ No newline at end of file diff --git a/res/spec/fluent_spec_atf-form.md b/res/spec/fluent_spec_atf-form.md index 9fc65af..31ab869 100644 --- a/res/spec/fluent_spec_atf-form.md +++ b/res/spec/fluent_spec_atf-form.md @@ -24,7 +24,7 @@ atf.form.submitForm({ // all props are mandatory $id: Now.ID[''], // string | guid, mandatory assert: '', // '' | 'form_submitted_to_server' | 'form_submission_canceled_in_browser' formUI: 'standard_ui', // 'standard_ui' | 'service_operations_workspace' | 'asset_workspace' | 'cmdb_workspace' -}): { table: string; record_id: string }; +}): { table: string; recordId: string }; // Clicks a button within a modal in the specified Form UI atf.form.clickModalButton({ // all props are mandatory @@ -62,6 +62,6 @@ atf.form.clickUIAction({ // all props are mandatory uiAction: get_sys_id('sys_ui_action', ''), // sys_id | Record<'sys_ui_action'> declarativeAction: get_sys_id('sys_declarative_action_assignment', ''), // sys_id | Record<'sys_declarative_action_assignment'> assert: 'form_submitted_to_server' // 'form_submitted_to_server' | 'form_submission_canceled_in_browser' | 'page_reloaded_or_redirected' -}): { record_id: string; table: string } +}): { recordId: string; table: string } ``` \ No newline at end of file diff --git a/res/spec/fluent_spec_atf-server-catalog-item.md b/res/spec/fluent_spec_atf-server-catalog-item.md index 189df92..eb8494f 100644 --- a/res/spec/fluent_spec_atf-server-catalog-item.md +++ b/res/spec/fluent_spec_atf-server-catalog-item.md @@ -9,7 +9,7 @@ atf.server.searchForCatalogItem({ // all props are mandatory category: get_sys_id('sc_category', ''), // sys_id | Record<'sc_category'>; assertItem: get_sys_id('sc_cat_item', ''), // sys_id | Record<'sc_cat_item'>; assert: '', // 'assert_item_present' | 'assert_item_not_present'; -}): { catalog_item_id: string; }; +}): { catalogItemId: string; }; // Checkout the Shopping Cart and generates a new request. atf.server.checkoutShoppingCart({ // all props are mandatory @@ -18,14 +18,14 @@ atf.server.checkoutShoppingCart({ // all props are mandatory requestedFor: get_sys_id('sys_user', ''), // sys_id | Record<'sys_user'> deliveryAddress: '123 main st', // string specialInstructions: 'none', // string -}): { request_id: string; }; +}): { requestId: string; }; // Replays a previously created request item with the same values and options. atf.server.replayRequestItem({ $id: Now.ID[''], // string | guid, mandatory - request_item: get_sys_id('sc_req_item', ''), // sys_id | Record<'sc_req_item'>; -}): { - table: string; - req_item: sys_id | Record<'sc_req_item'>; + requestItem: get_sys_id('sc_req_item', ''), // sys_id | Record<'sc_req_item'>; +}): { + table: string; + reqItem: sys_id | Record<'sc_req_item'>; }; ``` \ No newline at end of file diff --git a/res/spec/fluent_spec_atf-server-record.md b/res/spec/fluent_spec_atf-server-record.md index b566d60..228031b 100644 --- a/res/spec/fluent_spec_atf-server-record.md +++ b/res/spec/fluent_spec_atf-server-record.md @@ -8,7 +8,7 @@ atf.server.recordQuery({ // all props are mandatory enforceSecurity: false, // boolean; assert: 'records_match_query', // 'records_match_query' | 'no_records_match_query'; }): { table: string; - first_record: string; // sys_id of the first record + firstRecord: string; // sys_id of the first record }; // Validates that a given record meets the specified conditions on the server-side. @@ -29,7 +29,7 @@ atf.server.recordInsert({ // all props are mandatory assert: '', // 'record_successfully_inserted' | 'record_not_inserted'; enforceSecurity: false, // boolean; }): { table: string; - record_id: string; // sys_id of the new record + recordId: string; // sys_id of the new record }; // Changes field values of a record on the server. diff --git a/res/spec/fluent_spec_atf-server.md b/res/spec/fluent_spec_atf-server.md index 8b02aa0..ac591d1 100644 --- a/res/spec/fluent_spec_atf-server.md +++ b/res/spec/fluent_spec_atf-server.md @@ -33,7 +33,7 @@ atf.server.recordQuery({ // all props are mandatory enforceSecurity: false, // boolean; assert: 'records_match_query', // 'records_match_query' | 'no_records_match_query'; }): { table: string; - first_record: string; // sys_id of the first record + firstRecord: string; // sys_id of the first record }; // Inserts a record into a table. Specify the field values to set on the new record, outputs the table and the sys_id of the new record. @@ -44,6 +44,6 @@ atf.server.recordInsert({ // all props are mandatory assert: '', // 'record_successfully_inserted' | 'record_not_inserted'; enforceSecurity: false, // boolean; }): { table: string; - record_id: string; // sys_id of the new record + recordId: string; // sys_id of the new record }; ``` \ No newline at end of file diff --git a/res/spec/fluent_spec_business-rule.md b/res/spec/fluent_spec_business-rule.md index 2e3c41c..17e45aa 100644 --- a/res/spec/fluent_spec_business-rule.md +++ b/res/spec/fluent_spec_business-rule.md @@ -1,22 +1,23 @@ -# **Context**: Business Rule spec: Used to create a new Business Rule in ServiceNow, its `script` property defines the business logic, `table` property defines the table to which the Business Rule applies. +# **Context**: Business Rule spec: Used to create a new Business Rule in ServiceNow, its `script` property defines the business logic, `table` property defines the table to which the Business Rule applies + ```typescript // Creates a new Business Rule (`sys_script`) BusinessRule({ - $id: '', // string | guid, mandatory - name: '', // string, mandatory - table: '', // string, mandatory - condition: '', // string, condition string that must be true for BusinessRule to run, for example: `current.parent !== 'NULL'` - when: 'before', // 'before' | 'after' | 'async' | 'display', mandatory - abort_action: false, // boolean - action: [], // ("insert" | "update" | "delete" | "query")[] - active: false, // boolean - add_message: false, // boolean - description: '', // string - filter_condition: '', // ServiceNow encoded query - message: '', // string - order: 100, // number - role_conditions: [], // array of string | array of Role objects indicating that the user needs to have all Roles listed to execute this Business Rule, see Role spec - script: '', // ServiceNow script to fullfil the functional request in scripting, - set_field_value: '', // string, sets a field name to a value, for example `name='new_name'` + $id: '', // string | guid, mandatory + name: '', // string, mandatory + table: '', // string, mandatory + condition: '', // string, condition string that must be true for BusinessRule to run, for example: `current.parent !== 'NULL'` + when: 'before', // 'before' | 'after' | 'async' | 'display', mandatory + abortAction: false, // boolean + action: [], // ("insert" | "update" | "delete" | "query")[] + active: false, // boolean + addMessage: false, // boolean + description: '', // string + filterCondition: '', // ServiceNow encoded query + message: '', // string + order: 100, // number + roleConditions: [], // array of string | array of Role objects indicating that the user needs to have all Roles listed to execute this Business Rule, see Role spec + script: '', // ServiceNow script to fullfil the functional request in scripting, + setFieldValue: '', // string, sets a field name to a value, for example `name='new_name'` }): BusinessRule // returns a BusinessRule object ``` diff --git a/res/spec/fluent_spec_client-script.md b/res/spec/fluent_spec_client-script.md index 7d44c59..c251690 100644 --- a/res/spec/fluent_spec_client-script.md +++ b/res/spec/fluent_spec_client-script.md @@ -5,16 +5,16 @@ ClientScript({ $id: '', // string | guid, mandatory name: '', // string, name of the client script table: '', // string, name of the table on which the client script runs - ui_type: 'desktop', // string, user interface to which the client script applies: `desktop`|`mobile_or_service_portal`|`all`. Default is `desktop`. + uiType: 'desktop', // string, user interface to which the client script applies: `desktop`|`mobile_or_service_portal`|`all`. Default is `desktop`. type: '', // string, optional, type of client script, which defines when it runs: `onCellEdit`|`onChange`|`onLoad`|`onSubmit` field: '', // string, optional, field on the table that the client script applies to. This property applies only when the type property is set to `onChange` or `onCellEdit`. description: '', // string, optional, description of the functionality and purpose of the client script messages: '', // string, optional, strings that are available to the client script as localized messages using `getmessage('[message]')`. active: true, // boolean, optional, whether the record is enabled, default true script: '', // ServiceNow script to fullfil the functional request in scripting, - applies_extended: false, // boolean, optional, indicates whether the client script applies to tables extended from the specified table, default false + appliesExtended: false, // boolean, optional, indicates whether the client script applies to tables extended from the specified table, default false global: true, // boolean, optional, indicates whether the client script runs on all views of the table or only on specific views. Default is true. view: '', // string, optional, views of the table on which the client script runs. This property applies only when the `global` property is set to `false` - isolate_script: false, // boolean, optional, indicates whether scripts run in strict mode, with access to direct DOM, `jQuery`, `prototype`, and the `window` object turned off. Default is false. + isolateScript: false, // boolean, optional, indicates whether scripts run in strict mode, with access to direct DOM, `jQuery`, `prototype`, and the `window` object turned off. Default is false. }) ``` diff --git a/res/spec/fluent_spec_column-generic.md b/res/spec/fluent_spec_column-generic.md index d1737da..3b57ace 100644 --- a/res/spec/fluent_spec_column-generic.md +++ b/res/spec/fluent_spec_column-generic.md @@ -1,35 +1,36 @@ -#**Context:** Generic Column API spec: Used to create a new Generic Column (`sys_dictionary`) in a Table schema at ServiceNow, Column is also referenced as Field in ServiceNow. This API is closely related to the Table API for its schema property definition. +# **Context:** Generic Column API spec: Used to create a new Generic Column (`sys_dictionary`) in a Table schema at ServiceNow, Column is also referenced as Field in ServiceNow. This API is closely related to the Table API for its schema property definition. + ```typescript GenericColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } - column_type: '', // see internal_types list, mandatory - default: '', // string - dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' - dynamic_value_definitions: {}, // object, see dynamic_value_definition examples - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } + columnType: '', // see internal_types list, mandatory + default: '', // string + dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' + dynamicValueDefinitions: {}, // object, see dynamic_value_definition examples + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): GenericColumn // returns a GenericColumn object // dynamic_value_definition examples const example1 = dynamic_value_definitions: { type: "dynamic_default", // constant, mandatory - dynamic_default: '' // string, function from sys_filter_option_dynamic table, mandatory + dynamicDefault: '' // string, function from sys_filter_option_dynamic table, mandatory }; const example2 = dynamic_value_definitions: { type: "dependent_field", // constant, mandatory - column_name: get_column_name("") // string, column name from the same table, mandatory + columnName: get_column_name("") // string, column name from the same table, mandatory } const example3 = dynamic_value_definitions: { type: "calculated_value", // constant, mandatory - calculated_value: '' // string, function for calculating the value, mandatory + calculatedValue: '' // string, function for calculating the value, mandatory } const example4 = dynamic_value_definitions: { diff --git a/res/spec/fluent_spec_column.md b/res/spec/fluent_spec_column.md index 8fc4a5e..687e59b 100644 --- a/res/spec/fluent_spec_column.md +++ b/res/spec/fluent_spec_column.md @@ -1,388 +1,388 @@ -#**Context:** Column API for table schema spec: Used to create a typed column object for a table schema. This group of API is working closely with the Table API to create table schema property. +# **Context:** Column API for table schema spec: Used to create a typed column object for a table schema. This group of API is working closely with the Table API to create table schema property. + ```typescript // Creates a new Column (`sys_dictionary`) StringColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } - default: '', // string - dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' - dynamic_value_definitions: {}, // object, see dynamic_value_definition examples - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } + default: '', // string + dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' + dynamicValueDefinitions: {}, // object, see dynamic_value_definition examples + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): StringColumn // returns a StringColumn object BooleanColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string | boolean - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string | boolean + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): BooleanColumn // returns an BooleanColumn object ChoiceColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } - default: '', // string | number - dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' - dynamic_value_definitions: {}, // object, see dynamic_value_definition examples - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } + default: '', // string | number + dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' + dynamicValueDefinitions: {}, // object, see dynamic_value_definition examples + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): ChoiceColumn // returns a ChoiceColumn object ReferenceColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - cascadeRule: 'none', // "none" | "cascade" | "delete_no_workflow" | "delete" | "restrict" | "clear" - default: '', // undefined | string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean - referenceTable?: '', // undefined | string + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + cascadeRule: 'none', // "none" | "cascade" | "delete_no_workflow" | "delete" | "restrict" | "clear" + default: '', // undefined | string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean + referenceTable?: '', // undefined | string }): ReferenceColumn // returns a ReferenceColumn object DateTimeColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): DateTimeColumn // returns a DateTimeColumn object DateColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): DateColumn // returns a DateColumn object IntegerColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } - default: '', // string - dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' - dynamic_value_definitions: {}, // object, see dynamic_value_definition examples - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - max: 0, // number - maxLength: 0, // number - min: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } + default: '', // string + dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' + dynamicValueDefinitions: {}, // object, see dynamic_value_definition examples + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + max: 0, // number + maxLength: 0, // number + min: 0, // number + readOnly: false // boolean }): IntegerColumn // returns an IntegerColumn object DecimalColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string | number - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string | number + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): DecimalColumn // returns a DecimalColumn object ListColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // undefined | string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean - referenceTable?: '', // undefined | string + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // undefined | string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean + referenceTable?: '', // undefined | string }): ListColumn // returns a ListColumn object FieldNameColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } - default: '', // string - dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' - dynamic_value_definitions: {}, // object, see dynamic_value_definition examples - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } + default: '', // string + dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' + dynamicValueDefinitions: {}, // object, see dynamic_value_definition examples + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): FieldNameColumn // returns a FieldNameColumn object ScriptColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // undefined | string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean - signature: '', // undefined | string + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // undefined | string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean + signature: '', // undefined | string }): ScriptColumn // returns a ScriptColumn object UserRolesColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string | Role object see spec - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string | Role object see spec + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): UserRolesColumn // returns a UserRolesColumn object TranslatedTextColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } - default: '', // string - dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' - dynamic_value_definitions: {}, // object, see dynamic_value_definition examples - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } + default: '', // string + dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' + dynamicValueDefinitions: {}, // object, see dynamic_value_definition examples + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): TranslatedTextColumn // returns a TranslatedTextColumn object ConditionsColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // undefined | string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // undefined | string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): ConditionsColumn // returns a ConditionsColumn object TranslatedFieldColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } - default: '', // string - dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' - dynamic_value_definitions: {}, // object, see dynamic_value_definition examples - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } + default: '', // string + dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' + dynamicValueDefinitions: {}, // object, see dynamic_value_definition examples + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): TranslatedFieldColumn // returns a TranslatedFieldColumn object BasicImageColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } - default: '', // string - dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' - dynamic_value_definitions: {}, // object, see dynamic_value_definition examples - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } + default: '', // string + dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' + dynamicValueDefinitions: {}, // object, see dynamic_value_definition examples + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): BasicImageColumn // returns a BasicImageColumn object IntegerDateColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string | number - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string | number + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): IntegerDateColumn // returns a IntegerDateColumn object VersionColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): VersionColumn // returns a VersionColumn object BasicDateTimeColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): BasicDateTimeColumn // returns a BasicDateTimeColumn object CalendarDateTime({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): CalendarDateTime // returns a CalendarDateTime object DueDateColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): DueDateColumn // returns a DueDateColumn object ScheduleDateTimeColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): ScheduleDateTimeColumn // returns a ScheduleDateTimeColumn object OtherDateColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): OtherDateColumn // returns a OtherDateColumn object RadioColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } - default: '', // string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } + default: '', // string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): RadioColumn // returns a RadioColumn object DomainIdColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): DomainIdColumn // returns an DomainIdColumn object DomainPathColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } - default: '', // string - dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' - dynamic_value_definitions: {}, // object, see dynamic_value_definition examples - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } + default: '', // string + dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' + dynamicValueDefinitions: {}, // object, see dynamic_value_definition examples + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): DomainPathColumn // returns a DomainPathColumn object TableNameColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string | (string & {}) - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string | (string & {}) + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): TableNameColumn // returns a TableNameColumn object SystemClassNameColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } - default: '', // string - dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' - dynamic_value_definitions: {}, // object, see dynamic_value_definition examples - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + choices: {}, // object, snake_case name value pairs, for example { choice_1: { label: 'Choice1' }, choice_2: { label: 'Choice2' } } + default: '', // string + dropdown: 'none', // 'none' | 'dropdown_with_none' | 'suggestion' | 'dropdown_without_none' + dynamicValueDefinitions: {}, // object, see dynamic_value_definition examples + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): SystemClassNameColumn // returns a SystemClassNameColumn object DocumentIdColumn({ - active: false, // boolean - attributes: {}, // object, snake_case name value pairs, see attribute list - audit: false, // boolean - default: '', // string - dependent: {}, // object TableNameColumn see above spec - function_definition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation - label: '', // string or array of Documentation object - mandatory: false, // boolean - maxLength: 0, // number - read_only: false // boolean + active: false, // boolean + attributes: {}, // object, snake_case name value pairs, see attribute list + audit: false, // boolean + default: '', // string + dependent: {}, // object TableNameColumn see above spec + functionDefinition: `glidefunction:${""}`, // string, definition of a function that the field performs, such as a mathematical operation, field length computation, or day of the week calculation + label: '', // string or array of Documentation object + mandatory: false, // boolean + maxLength: 0, // number + readOnly: false // boolean }): DocumentIdColumn // returns a DocumentIdColumn object ``` - diff --git a/res/spec/fluent_spec_cross-scope-privilege.md b/res/spec/fluent_spec_cross-scope-privilege.md index a646ddf..0ae6d85 100644 --- a/res/spec/fluent_spec_cross-scope-privilege.md +++ b/res/spec/fluent_spec_cross-scope-privilege.md @@ -3,9 +3,9 @@ // spec to create CrossScopePrivilege in Fluent CrossScopePrivilege({ $id: '', // string | guid, mandatory - target_name: '', // string, name of the table, script include, or script object being requested - target_scope: '', // string, application whose resources are being requested - target_type: 'sys_script_include', // string, type of request: `sys_script_include`|`scriptable`|`sys_db_object` + targetName: '', // string, name of the table, script include, or script object being requested + targetScope: '', // string, application whose resources are being requested + targetType: 'sys_script_include', // string, type of request: `sys_script_include`|`scriptable`|`sys_db_object` operation: 'read', // string, operation the script performs on the target: `create`|`read`|`write`|`delete`|`execute` status: 'allowed', // string, authorization for this record: `allowed`|`denied`|`requested` }) diff --git a/res/spec/fluent_spec_form.md b/res/spec/fluent_spec_form.md index 7339ebe..5970487 100644 --- a/res/spec/fluent_spec_form.md +++ b/res/spec/fluent_spec_form.md @@ -1,13 +1,14 @@ -#**Context:** Form API spec: Used to create a new Form (`sys_ui_form`) object, which specifies how to view a record in a table, including which Sections (`sys_ui_section`) and fields (`sys_ui_element`) to display. This Form can be a part of a new View (`sys_ui_view`) or existing default view (`default_view`). +# **Context:** Form API spec: Used to create a new Form (`sys_ui_form`) object, which specifies how to view a record in a table, including which Sections (`sys_ui_section`) and fields (`sys_ui_element`) to display. This Form can be a part of a new View (`sys_ui_view`) or existing default view (`default_view`). + ```typescript // spec to configure a Form (`sys_ui_form`) in Fluent using the Record Plugin const example_form = Record({ $id: '', // string, unique id for the record, typically using Now.ID["value"] table: 'sys_ui_form', // string, must always leave as 'sys_ui_form' - data: { + data: { name: '', // string, name of the table the form is for view: get_sys_id('sys_ui_view', ''), // Record<'sys_ui_view'>, The UI view (`sys_ui_view`) to contain the form. Can create a new view using Record plugin, use the sys_id of an existing view, or import and use `default_view` - sys_user: '' // String, optional, the user to apply the form view to + sysUser: '' // String, optional, the user to apply the form view to } }); @@ -31,8 +32,8 @@ Record({ element: '', // string, the name of the field to display. Must match a valid field name for the associated table, or be a special name like '.split' position: 0, // number, the position of the element in the section type: 'element', // string, optional, the type of element: 'element'|'list'|'chart'|'annotation'|'formatter'|'.split'|'.begin_split'|'.end_split'. - sys_ui_section: example_section, // Record<'sys_ui_section'> that references either a new or existing sys_ui_section record - sys_ui_formatter: get_sys_id('sys_ui_formatter', '') // optional, sys_id | Record<'sys_ui_formatter'> + sysUiSection: example_section, // Record<'sys_ui_section'> that references either a new or existing sys_ui_section record + sysUiFormatter: get_sys_id('sys_ui_formatter', '') // optional, sys_id | Record<'sys_ui_formatter'> } }) @@ -41,8 +42,8 @@ const example_form_section = Record({ $id: '', // string, unique id for the record, typically using Now.ID["value"] table: 'sys_ui_form_section', // string, must always leave as 'sys_ui_form_section' data: { - sys_ui_form: example_form, // string, the form to display the section on - sys_ui_section: example_section, // string, the section to display + sysUiForm: example_form, // string, the form to display the section on + sysUiSection: example_section, // string, the section to display position: 0 // number, the position of the section on the form } }) @@ -58,4 +59,4 @@ const example_view = Record({ roles: '' // string, optional, comma-separated list of the roles to apply the view to } }); -``` \ No newline at end of file +``` diff --git a/res/spec/fluent_spec_role.md b/res/spec/fluent_spec_role.md index 1397552..6bcc3bd 100644 --- a/res/spec/fluent_spec_role.md +++ b/res/spec/fluent_spec_role.md @@ -1,14 +1,14 @@ #**Context:** Role API spec: define Roles [sys_user_role] for users of an application. Roles are closely working with ACLs to control user's access to applications and their features. ```typescript // Creates a new Role (`sys_user_role`) -Role({ +Role({ name: '', // string, mandatory description: '', // string, mandatory - assignable_by: '', // string, mandatory - can_delegate: true, // boolean, mandatory - elevated_privilege: false, // boolean, mandatory + assignableBy: '', // string, mandatory + canDelegate: true, // boolean, mandatory + elevatedPrivilege: false, // boolean, mandatory grantable: true, // boolean, mandatory - contains_roles: [get_sys_id('sys_user_role', '')], // array of Record<'sys_user_role'>, optional, either sys_id or Role object - scoped_admin: false, // boolean, mandatory + containsRoles: [get_sys_id('sys_user_role', '')], // array of Record<'sys_user_role'>, optional, either sys_id or Role object + scopedAdmin: false, // boolean, mandatory }): Role; // returns a Role object ``` diff --git a/res/spec/fluent_spec_scheduled-script.md b/res/spec/fluent_spec_scheduled-script.md index 0833648..f8584cb 100644 --- a/res/spec/fluent_spec_scheduled-script.md +++ b/res/spec/fluent_spec_scheduled-script.md @@ -9,14 +9,14 @@ Record({ active: true, // boolean conditional: false, // boolean condition: '', // string, a ServiceNow server side script that returns a boolean (i.e. `GlidePluginManager.isActive('sn_generative_ai');`), mandatory only if `conditional` is `true` - run_type: 'daily', // string - time_zone: '', // string, the time zone for the job, mandatory only if `run_type` is `daily` or `weekly` or `monthly` - run_dayofweek: 1, // number, mandatory if `run_type` is `weekly` - run_dayofmonth: 1, // number, mandatory if `run_type` is `monthly`, can take any number between `1` and `31` which represents the specific calender day - run_period: '1970-01-01 00:00:00', // string, mandatory only if `run_type` is `periodically` - run_start: '', // string, job starting time, default value should be the user's current time, mandatory if `run_type` is `periodically` or `once` - run_time: '1970-01-01 00:00:00', // string, the execution time per job occurence, mandatory only if `run_type` is `daily`, `weekly`, or `monthly` - business_calendar: get_sys_id('business_calendar', ''), // string, mandatory only if `run_type` is `business_calendar_start` or `business_calendar_end` + runType: 'daily', // string + timeZone: '', // string, the time zone for the job, mandatory only if `runType` is `daily` or `weekly` or `monthly` + runDayofweek: 1, // number, mandatory if `runType` is `weekly` + runDayofmonth: 1, // number, mandatory if `runType` is `monthly`, can take any number between `1` and `31` which represents the specific calender day + runPeriod: '1970-01-01 00:00:00', // string, mandatory only if `runType` is `periodically` + runStart: '', // string, job starting time, default value should be the user's current time, mandatory if `runType` is `periodically` or `once` + runTime: '1970-01-01 00:00:00', // string, the execution time per job occurence, mandatory only if `runType` is `daily`, `weekly`, or `monthly` + businessCalendar: get_sys_id('business_calendar', ''), // string, mandatory only if `runType` is `business_calendar_start` or `business_calendar_end` script: '', // ServiceNow script to fullfil the functional request in scripting, } }) diff --git a/res/spec/fluent_spec_script-include.md b/res/spec/fluent_spec_script-include.md index 9a6668d..4ff27f0 100644 --- a/res/spec/fluent_spec_script-include.md +++ b/res/spec/fluent_spec_script-include.md @@ -6,17 +6,17 @@ Record({ table: 'sys_script_include', // string, must always leave as 'sys_script_include' data: { name: '', // string, the name of the script include - sys_name: '', // string, optional, the system name of the script include. Default is same as name - api_name: '', // string, optional, the API path to call the script include. Default is [app_name].[sys_name] + sysName: '', // string, optional, the system name of the script include. Default is same as name + apiName: '', // string, optional, the API path to call the script include. Default is [app_name].[sysName] description: '', // string, optional, short description of the script include script: '', // ServiceNow script to fullfil the functional request in scripting, access: 'package_private', // string, optional, 'public'|'package_private', 'public' if the script include is accessible from all application scopes, 'package_private' if accessible from this application scope only - caller_access: '', // string, optional, '1' for caller tracking, '2' for caller restriction, '' for none + callerAccess: '', // string, optional, '1' for caller tracking, '2' for caller restriction, '' for none active: true, // boolean, optional, default true - client_callable: false, // boolean, optional, whether Glide AJAX is enabled, default false - mobile_callable: false, // boolean, optional, whether the script include is callable from mobile, default false - sandbox_callable: false, // boolean, optional, whether the script include is callable from sandbox, default false - sys_policy: '', // string, optional, protection policy: ''|'read'|'protected', 'read' for read-only, 'protected' for protected + clientCallable: false, // boolean, optional, whether Glide AJAX is enabled, default false + mobileCallable: false, // boolean, optional, whether the script include is callable from mobile, default false + sandboxCallable: false, // boolean, optional, whether the script include is callable from sandbox, default false + sysPolicy: '', // string, optional, protection policy: ''|'read'|'protected', 'read' for read-only, 'protected' for protected }, }) ``` diff --git a/res/spec/fluent_spec_scripted-rest.md b/res/spec/fluent_spec_scripted-rest.md index e806920..ac8ed18 100644 --- a/res/spec/fluent_spec_scripted-rest.md +++ b/res/spec/fluent_spec_scripted-rest.md @@ -4,15 +4,15 @@ const specRestApi = RestApi({ $id: '', // string | guid, mandatory name: '', // string, mandatory - service_id: '', // string, mandatory + serviceId: '', // string, mandatory active: true, // boolean consumes: '', // string, comma delimited MIME types, ex. 'application/json,application/xml,text/xml' - doc_link: '', // string - enforce_acl: [], // array of strings that represent sys_ids of ACLs to enforce | array of ACL objects (see ACL object spec) to enforce + docLink: '', // string + enforceAcl: [], // array of strings that represent sys_ids of ACLs to enforce | array of ACL objects (see ACL object spec) to enforce policy: '', // '' | 'read' | 'protected' produces: '', // string, comma delimited MIME types, ex. 'application/json,application/xml,text/xml' routes: [], // array of Routes, see the Route spec - short_description, '', // string + shortDescription, '', // string versions: [], // array of Versions, see the Version spec }): RestApi; // returns a RestApi object @@ -25,17 +25,17 @@ const Route = { name: '', // string, defaults to the value of the path property active: true, // boolean path: '/', // string, path of the resource relative to the base API path, can contain parameters, for example: '/abc/{id}' - short_description: '', // string + shortDescription: '', // string consumes: '', // string, defines what the route will consume, defaults to the `consumes` property of the RestApi object - enforce_acl, [], // array of strings that represent sys_ids of ACLs to enforce | array of ACL objects (see ACL object spec) to enforce + enforceAcl, [], // array of strings that represent sys_ids of ACLs to enforce | array of ACL objects (see ACL object spec) to enforce produces: '', // string, ist of media types that the resource can produce, defaults to the `produces` property of the RestApi object - request_example: '', // string, valid sample request body payload for the route + requestExample: '', // string, valid sample request body payload for the route method: 'GET', // 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' authorization: true, // boolean, determines whether users must be authenticated to access the route authentication: true, // boolean, determines whether ACLs are enforced when accessing the route internalRole: true, // boolean, determines whether the route requires the user to have the 'snc_internal' role policy: '', // '' | 'read' | 'protected' - version: 0, // number, this is required if the `versions` property of the RestApi is populated, used to generate the URI with a version, for example this would be generated is version = 1: '/api/management/v1/table/{tableName}' + version: 0, // number, this is required if the `versions` property of the RestApi is populated, used to generate the URI with a version, for example this would be generated is version = 1: '/api/management/v1/table/{tableName}' } // spec to create Parameters and Headers in Fluent @@ -43,8 +43,8 @@ const specParameterAndHeader = { $id: '', // string | guid, mandatory name: '', // string, name of the parameter or header, mandatory required: false, // boolean - example_value: '', // string, example of a valid value - short_description: '', // string + exampleValue: '', // string, example of a valid value + shortDescription: '', // string } // spec to create Versions in Fluent @@ -53,7 +53,7 @@ const specVersion = { version: 0, // number, version of the rest api, mandatory active: true, // boolean deprecated: false, // boolean - short_description: '', // string - is_default: false, // boolean, determines if this version is the default for the rest api + shortDescription: '', // string + isDefault: false, // boolean, determines if this version is the default for the rest api } ``` diff --git a/res/spec/fluent_spec_table.md b/res/spec/fluent_spec_table.md index 87c16f3..543a54d 100644 --- a/res/spec/fluent_spec_table.md +++ b/res/spec/fluent_spec_table.md @@ -1,25 +1,25 @@ #**Context:** Table API spec: Used to create a new Table (`sys_db_object`) in ServiceNow, Table is also referenced as Dictionary or data model in ServiceNow. This API is closely related to the Column API for its schema property definition. ```typescript // Creates a new Table (`sys_db_object`) -Table({ +Table({ name: '', // string, table name schema: {},// object, snake_case name values pairs, ex. { column_name1: Column object, column_name2: Column object } see Column spec extends: '', // undefined | string label: '', // string or array of Documentation object - licensing_config: {}, // LicensingConfig object + licensingConfig: {}, // LicensingConfig object display: '', // string extensible: false, // boolean - live_feed: false, // boolean - accessible_from: 'package_private', // 'public' | 'package_private' - caller_access: 'none', // 'none' | 'tracking' | 'restricted' + liveFeed: false, // boolean + accessibleFrom: 'package_private', // 'public' | 'package_private' + callerAccess: 'none', // 'none' | 'tracking' | 'restricted' actions: [], // array of 'read' | 'update' | 'delete' | 'create' - allow_web_service_access: false, // boolean - allow_new_fields: false, // boolean - allow_ui_actions: false, // boolean - allow_client_scripts: false, // boolean + allowWebServiceAccess: false, // boolean + allowNewFields: false, // boolean + allowUiActions: false, // boolean + allowClientScripts: false, // boolean audit: false, // boolean - read_only: false, // boolean - text_index: false, // boolean + readOnly: false, // boolean + textIndex: false, // boolean attributes: {}, // object, snake_case name value pairs of any supported dictionary attributes in ServiceNow [sys_schema_attribute], ex. { update_sync_custom: false, update_synch: true } index: [ // Array of index definitions { @@ -28,35 +28,35 @@ Table({ element: '', // string | string[], mandatory } ], - auto_number: { // Auto-numbering configuration + autoNumber: { // Auto-numbering configuration prefix: '', // string number: 0, // number - number_of_digits: 0, // number + numberOfDigits: 0, // number }, - scriptable_table: false, // boolean + scriptableTable: false, // boolean }): Table; // returns a Table object // Creates a new LicensingConfig object LicensingConfig({ - license_model: 'none', // 'none' | 'fulfiller' | 'producer' - owner_condition: '', // string - license_condition: '', // string - is_fulfillment: false, // boolean - op_delete: false, // boolean - op_update: false, // boolean - op_insert: false, // boolean - license_roles: [], // string[] + licenseModel: 'none', // 'none' | 'fulfiller' | 'producer' + ownerCondition: '', // string + licenseCondition: '', // string + isFulfillment: false, // boolean + opDelete: false, // boolean + opUpdate: false, // boolean + opInsert: false, // boolean + licenseRoles: [], // string[] }): LicensingConfig // returns a LicensingConfig object // Creates a new Documentation (`sys_documentation`) Documentation({ - hint: '', // string - help: '', // string - label: '', // string - plural: '', // string - language: '', // string - url: '', // string - url_target: '', // string + hint: '', // string + help: '', // string + label: '', // string + plural: '', // string + language: '', // string + url: '', // string + urlTarget: '', // string }): Documentation // returns a Documentation object ``` diff --git a/res/spec/fluent_spec_ui-action.md b/res/spec/fluent_spec_ui-action.md index 2269c3d..c793a60 100644 --- a/res/spec/fluent_spec_ui-action.md +++ b/res/spec/fluent_spec_ui-action.md @@ -7,45 +7,45 @@ const uiAction = Record({ data: { name: '', // string, mandatory script: '', // ServiceNow script to fullfil the functional request in scripting, // string, inline ServiceNow client side scripting, function to be referenced for onClick action for workspace form button and workspace form menu. The script is based on devrequest. Example of function definition - /* - function onClickFunction(g_form) {} - */ + /* + function onClickFunction(g_form) {} + */ table: '', // string, mandatory - action_name: '', // string, mandatory , should always begin with 'sysverb_' + actionName: '', // string, mandatory , should always begin with 'sysverb_' active: true, //boolean client: false, //boolean. Default is false. Set to true only when onclick function specified - form_action: false, // boolean - form_button: false, // boolean - form_button_v2: false, // boolean - form_context_menu: false, // boolean - form_link: false, // boolean - form_menu_button_v2: false, // boolean - format_for_configurable_workspace: false, // boolean - isolate_script: false, // boolean - list_action: false, // boolean - list_banner_button: false, // boolean - list_button: false, // boolean - list_choice: false, // boolean - list_context_menu: false, // boolean - list_link: false, // boolean - list_save_with_form_button: false, // boolean - show_insert: false, // boolean - show_multiple_update: false, // boolean - show_query: false, // boolean - show_update: false, // boolean - ui16_compatible: false, // boolean - client_script_v2: '', // ServiceNow script to fullfil the functional request in scripting, // string, inline ServiceNow client side scripting, function to be referenced for onClick action. The script is based on devrequest. Example of function deinifition + formAction: false, // boolean + formButton: false, // boolean + formButtonV2: false, // boolean + formContextMenu: false, // boolean + formLink: false, // boolean + formMenuButtonV2: false, // boolean + formatForConfigurableWorkspace: false, // boolean + isolateScript: false, // boolean + listAction: false, // boolean + listBannerButton: false, // boolean + listButton: false, // boolean + listChoice: false, // boolean + listContextMenu: false, // boolean + listLink: false, // boolean + listSaveWithFormButton: false, // boolean + showInsert: false, // boolean + showMultipleUpdate: false, // boolean + showQuery: false, // boolean + showUpdate: false, // boolean + ui16Compatible: false, // boolean + clientScriptV2: '', // ServiceNow script to fullfil the functional request in scripting, // string, inline ServiceNow client side scripting, function to be referenced for onClick action. The script is based on devrequest. Example of function deinifition /* function onClickFunction(g_form) {} */ comments: '', // string, max length is 4000 characters - condition: '', // String, max length 254 characters, condition string is inline glide scripting expression or logic, ex: current.active == true && current.type == 'internal' && new sn_ais.StatusApi().isAisEnabled() + condition: '', // String, max length 254 characters, condition string is inline glide scripting expression or logic, ex: current.active == true && current.type == 'internal' && new sn_ais.StatusApi().isAisEnabled() hint: '', // string, max length is 254 characters messages: '', //string, max length is 4000 characters - onclick: '', // a referenced function defined in current module under client_script_v2 or script, based on devrequest. eg. onClickFunction() - sys_overrides: '', // string | guid + onclick: '', // a referenced function defined in current module under clientScriptV2 or script, based on devrequest. eg. onClickFunction() + sysOverrides: '', // string | guid order: 100, // Integer, default is 100 - sys_policy: '', //string, 'read' | 'protected'. This is the protection policy. + sysPolicy: '', //string, 'read' | 'protected'. This is the protection policy. }, }) ``` \ No newline at end of file From a830a789a0be76b4bc7ee74faa83d4455a06fd51 Mon Sep 17 00:00:00 2001 From: modesty Date: Mon, 6 Oct 2025 15:14:05 -0700 Subject: [PATCH 04/11] res: update property naming convention from snake case to camel case across board, also update prompt with new metadata types in v4 --- res/instruct/fluent_instruct_acl.md | 2 +- .../fluent_instruct_application-menu.md | 10 ++--- res/instruct/fluent_instruct_atf.md | 4 +- res/instruct/fluent_instruct_business-rule.md | 4 +- .../fluent_instruct_cross-scope-privilege.md | 2 +- res/instruct/fluent_instruct_role.md | 6 +-- .../fluent_instruct_scheduled-script.md | 14 +++---- .../fluent_instruct_script-include.md | 2 +- res/instruct/fluent_instruct_scripted-rest.md | 2 +- res/instruct/fluent_instruct_table.md | 2 +- res/instruct/fluent_instruct_ui-action.md | 14 +++---- res/prompt/coding_in_fluent.md | 22 ++++++++++ res/snippet/fluent_snippet_acl_0003.md | 2 +- .../fluent_snippet_application-menu_0002.md | 8 ++-- .../fluent_snippet_application-menu_0003.md | 2 +- .../fluent_snippet_application-menu_0004.md | 2 +- .../fluent_snippet_application-menu_0005.md | 2 +- ...fluent_snippet_atf-catalog-variable_001.md | 2 +- .../fluent_snippet_atf-form-action_0001.md | 2 +- .../fluent_snippet_atf-form-action_0002.md | 2 +- .../fluent_snippet_atf-form-action_0003.md | 6 +-- .../fluent_snippet_atf-form-field_0001.md | 2 +- res/snippet/fluent_snippet_atf-form_0001.md | 2 +- ...nt_snippet_atf-server-catalog-item_0001.md | 2 +- ...nt_snippet_atf-server-catalog-item_0002.md | 2 +- .../fluent_snippet_atf-server-record_0001.md | 6 +-- .../fluent_snippet_atf-server-record_0002.md | 2 +- res/snippet/fluent_snippet_atf-server_0001.md | 4 +- .../fluent_snippet_business-rule_0001.md | 4 +- .../fluent_snippet_business-rule_0002.md | 6 +-- .../fluent_snippet_business-rule_0003.md | 6 +-- .../fluent_snippet_business-rule_0004.md | 6 +-- .../fluent_snippet_business-rule_0005.md | 2 +- .../fluent_snippet_client-script_0001.md | 10 ++--- .../fluent_snippet_client-script_0002.md | 10 ++--- .../fluent_snippet_client-script_0003.md | 14 +++---- .../fluent_snippet_client-script_0004.md | 12 +++--- .../fluent_snippet_client-script_0005.md | 14 +++---- .../fluent_snippet_column-generic_0001.md | 12 +++--- res/snippet/fluent_snippet_column_0002.md | 2 +- ...uent_snippet_cross-scope-privilege_0001.md | 6 +-- ...uent_snippet_cross-scope-privilege_0002.md | 18 ++++---- res/snippet/fluent_snippet_role_0001.md | 4 +- .../fluent_snippet_scheduled-script_0001.md | 6 +-- .../fluent_snippet_scheduled-script_0002.md | 4 +- .../fluent_snippet_scheduled-script_0003.md | 8 ++-- .../fluent_snippet_scheduled-script_0004.md | 8 ++-- .../fluent_snippet_scheduled-script_0005.md | 4 +- .../fluent_snippet_scheduled-script_0006.md | 6 +-- .../fluent_snippet_scheduled-script_0007.md | 6 +-- .../fluent_snippet_scheduled-script_0008.md | 6 +-- .../fluent_snippet_script-include_0001.md | 6 +-- .../fluent_snippet_script-include_0002.md | 8 ++-- .../fluent_snippet_script-include_0003.md | 8 ++-- .../fluent_snippet_scripted-rest_0001.md | 10 ++--- .../fluent_snippet_scripted-rest_0002.md | 2 +- .../fluent_snippet_scripted-rest_0003.md | 16 +++---- res/snippet/fluent_snippet_table_0001.md | 42 +++++++++---------- res/snippet/fluent_snippet_table_0002.md | 10 ++--- res/snippet/fluent_snippet_table_0003.md | 2 +- res/snippet/fluent_snippet_table_0004.md | 12 +++--- res/snippet/fluent_snippet_ui-action_0001.md | 2 +- res/snippet/fluent_snippet_ui-action_0002.md | 10 ++--- res/snippet/fluent_snippet_ui-action_0003.md | 12 +++--- 64 files changed, 234 insertions(+), 212 deletions(-) diff --git a/res/instruct/fluent_instruct_acl.md b/res/instruct/fluent_instruct_acl.md index 6409b64..1dd2db9 100644 --- a/res/instruct/fluent_instruct_acl.md +++ b/res/instruct/fluent_instruct_acl.md @@ -1,6 +1,6 @@ # Instructions for Fluent Acl (Access Control List) API Always reference the Acl API specifications for more details. -1. when `type` is `record`, provide the `table` and `field` properties, `applies_to` is only applicable to `record` type ACL too but optional and `name` is not applicable. +1. when `type` is `record`, provide the `table` and `field` properties, `appliesTo` is only applicable to `record` type ACL too but optional and `name` is not applicable. 2. `roles` property is an array of Record<'sys_user_role'>, either sys_ids or Role objects. If using a new role, use the Role object. If using an existing role, use function like `get_sys_id('sys_user_role', 'name=ex_role')` - no `label` field for roles. 3. The `script` property is optional and should only be used for advanced ACLs where the condition cannot be expressed using just the `roles` and `condition` fields. 4. a `named ACL` can be created by providing a value for the `$id` , `type` and `name` properties. diff --git a/res/instruct/fluent_instruct_application-menu.md b/res/instruct/fluent_instruct_application-menu.md index e4362b6..5458d55 100644 --- a/res/instruct/fluent_instruct_application-menu.md +++ b/res/instruct/fluent_instruct_application-menu.md @@ -7,7 +7,7 @@ Follow the below instructions for top Application Menu 3. The `role` are defined by an array consisting of Role objects or role names that already exist on the platform. Follow the below instructions for Application Submenu under top Application Menu. Application Submenu is also known as app module or application module at Servicenow platform menu navigator. -1. Identify the right value for `link_type` column from the below combination of it's label and value, as per the user prompts, instructions or devrequest. +1. Identify the right value for `linkType` column from the below combination of it's label and value, as per the user prompts, instructions or devrequest. 2. The below combinations format is " or "~"". For example: "List of Records"~"LIST" - label is `List of Records` and value is `LIST`. "None"~"" "Separator"~"SEPARATOR" @@ -26,7 +26,7 @@ Follow the below instructions for Application Submenu under top Application Menu "Map Page"~"MAP" "Run a Report"~"REPORT" "URL (from Arguments:)"~"DIRECT" -3. If `link_type` is not specified in user instructions or prompts, then completely skip the field from code generation. -4. `assessment` is link type assessment and is applicable and mandatory only when `link_type` is `ASSESSMENT`. -5. `name` is table associated to link type and is applicable and mandatory only when `link_type` is `FILTER` or `LIST` or `NEW` or `SEARCH` or `DETAIL`. -6. `query` is link type arguments and is mandatory only when `link_type` is `DOC_LINK` or `HTML` or `SCRIPT` or `DIRECT`. \ No newline at end of file +3. If `linkType` is not specified in user instructions or prompts, then completely skip the field from code generation. +4. `assessment` is link type assessment and is applicable and mandatory only when `linkType` is `ASSESSMENT`. +5. `name` is table associated to link type and is applicable and mandatory only when `linkType` is `FILTER` or `LIST` or `NEW` or `SEARCH` or `DETAIL`. +6. `query` is link type arguments and is mandatory only when `linkType` is `DOC_LINK` or `HTML` or `SCRIPT` or `DIRECT`. \ No newline at end of file diff --git a/res/instruct/fluent_instruct_atf.md b/res/instruct/fluent_instruct_atf.md index a2d9907..23f9e5f 100644 --- a/res/instruct/fluent_instruct_atf.md +++ b/res/instruct/fluent_instruct_atf.md @@ -32,14 +32,14 @@ import '@servicenow/sdk-core/global' // atf.form.openExistingRecord({ // $id: Now.ID['0004'], // id the test step in the test suite // table: 'incident', - // recordId: outputOfSubmit.record_id, // use the declared variable to fill in value + // recordId: outputOfSubmit.recordId, // use the declared variable to fill in value // formUI: 'service_operations_workspace', // view: '', // selectedTabIndex: 0, // }) // atf.server.log({ // $id: Now.ID['0005'], // id the test step in the test suite - // log: `record opened: ${outputOfSubmit.record_id}` // explicitly use ${} for embedding function calls or variables in strings Template Literals + // log: `record opened: ${outputOfSubmit.recordId}` // explicitly use ${} for embedding function calls or variables in strings Template Literals // }) // Additional steps... }) diff --git a/res/instruct/fluent_instruct_business-rule.md b/res/instruct/fluent_instruct_business-rule.md index a868e71..23d49a7 100644 --- a/res/instruct/fluent_instruct_business-rule.md +++ b/res/instruct/fluent_instruct_business-rule.md @@ -2,6 +2,6 @@ Always reference the Business Rule API specifications for more details. 1. The `when` field is used to specify when the business rule should be executed. The only valid values for `when` are: before, after, async, display. 2. The `action` field is used to specify the CRUD operations that the business rule applies to. The only valid values for `action` are: insert, update, delete, query. -3. The `add_message` field indicates whether or not to display a message on the UI when the business rule runs. `add_message` === `true` means a message will be displayed. -4. The `condition` and `filter_condition` must be valid ServiceNow encoded query strings. +3. The `addMessage` field indicates whether or not to display a message on the UI when the business rule runs. `addMessage` === `true` means a message will be displayed. +4. The `condition` and `filterCondition` must be valid ServiceNow encoded query strings. 5. For Business Rule updates, do not modify the `script` property unless explicitly specified. diff --git a/res/instruct/fluent_instruct_cross-scope-privilege.md b/res/instruct/fluent_instruct_cross-scope-privilege.md index 43f4b88..284b529 100644 --- a/res/instruct/fluent_instruct_cross-scope-privilege.md +++ b/res/instruct/fluent_instruct_cross-scope-privilege.md @@ -1,4 +1,4 @@ # Instructions for Fluent Cross-Scope Privilege API Always reference the Cross-Scope Privilege API specifications for more details. -1. If target is a table (`target_type` is `sys_db_object`), the supported operations are `create`, `read`, `write`, and `delete`. If target is a script or script include, the only supported operation is `execute`. +1. If target is a table (`targetType` is `sys_db_object`), the supported operations are `create`, `read`, `write`, and `delete`. If target is a script or script include, the only supported operation is `execute`. 2. The status `requested` occurs when an application attempts to access a resource set to Caller Restriction, and requires an admin user to manually change to `allowed` or `denied`. diff --git a/res/instruct/fluent_instruct_role.md b/res/instruct/fluent_instruct_role.md index a4bfda3..14d6724 100644 --- a/res/instruct/fluent_instruct_role.md +++ b/res/instruct/fluent_instruct_role.md @@ -1,6 +1,6 @@ # Instructions on Fluent Role API Always reference the Role API specification for more details. 1. `$id` is deprecated since v4.0.0. -2. `contains_roles` property is an array of Record<'sys_user_role'>, either sys_ids or Role objects. It is optional, it indicates other Role objects that this role contains. If using a new role, use the Role object. If using an existing role, use function like `get_sys_id('sys_user_role', 'name=ex_role')` - no `label` field for roles. -3. `elevated_privilege` is default to `false`, when it's `true`, it means user must manually accept the responsibility of using the role before you can access its features. -4. `can_delegate` is default to `true`, when it's `false`, it means the role cannot be delegated to other users. +2. `containsRoles` property is an array of Record<'sys_user_role'>, either sys_ids or Role objects. It is optional, it indicates other Role objects that this role contains. If using a new role, use the Role object. If using an existing role, use function like `get_sys_id('sys_user_role', 'name=ex_role')` - no `label` field for roles. +3. `elevatedPrivilege` is default to `false`, when it's `true`, it means user must manually accept the responsibility of using the role before you can access its features. +4. `canDelegate` is default to `true`, when it's `false`, it means the role cannot be delegated to other users. diff --git a/res/instruct/fluent_instruct_scheduled-script.md b/res/instruct/fluent_instruct_scheduled-script.md index 9b9d2e6..054c742 100644 --- a/res/instruct/fluent_instruct_scheduled-script.md +++ b/res/instruct/fluent_instruct_scheduled-script.md @@ -1,8 +1,8 @@ # Instructions on Scheduled Script Execution API -Always reference the Record API specification for more details. -1. The second parameter of the get_sys_id function for `business_calendar` should always query for both `calendar_name` and `label` field, and the query value can only be one of the following: `Year`, `Quarter`, `Month`, `Week`. ex: `calendar_name=Month^ORlabel=Month`. -2. `run_period`, `run_start` and `run_time` should all follow the following date time format: `YYYY-MM-DD HH-MM-SS`. -3. `run_type` can take any 1 of these values: `daily` | `weekly` | `monthly` | `periodically` | `once` | `on_demand` | `business_calendar_start` | `business_calendar_end`. -4. `time_zone` can take any 1 of these values: `floating` | `US/Hawaii` | `Canada Pacific` | `US/Pacific` | `Canada/Mountain` | `US/Mountain` | `US/Arizona` | `Canada/Central` | `US/Central` | `Canada/Eastern` | `US/Eastern` | `Canada/Atlantic` | `Europe/Dublin` | `Europe/London` | `GMT` | `Europe/Amsterdam` | `Europe/Berlin` | `Europe/Brussels` | `Europe/Copenhagan` | `Europe/Madrid` | `Europe/Paris` | `Europe/Rome` | `Europe/Stockholm` | `Europe/Zurich` | `Hongkong`. -5. `run_dayofweek` can take any value between `1` and `7`. `1` is Monday, `2` is Tuesday, `3` is Wednesday, `4` is Thursday, `5` is Friday, `6` is Saturday, and `7` is Sunday. -6. `run_period` is calculated by the time difference between its value and January 1st 1970 at midnight. ex: a job that runs every 2 and a half days will have a `run_period` of `1970-01-03 12:00:00`. +Always reference the Record API specification for more details. +1. The second parameter of the get_sys_id function for `businessCalendar` should always query for both `calendar_name` and `label` field, and the query value can only be one of the following: `Year`, `Quarter`, `Month`, `Week`. ex: `calendar_name=Month^ORlabel=Month`. +2. `runPeriod`, `runStart` and `runTime` should all follow the following date time format: `YYYY-MM-DD HH-MM-SS`. +3. `runType` can take any 1 of these values: `daily` | `weekly` | `monthly` | `periodically` | `once` | `on_demand` | `business_calendar_start` | `business_calendar_end`. +4. `timeZone` can take any 1 of these values: `floating` | `US/Hawaii` | `Canada Pacific` | `US/Pacific` | `Canada/Mountain` | `US/Mountain` | `US/Arizona` | `Canada/Central` | `US/Central` | `Canada/Eastern` | `US/Eastern` | `Canada/Atlantic` | `Europe/Dublin` | `Europe/London` | `GMT` | `Europe/Amsterdam` | `Europe/Berlin` | `Europe/Brussels` | `Europe/Copenhagan` | `Europe/Madrid` | `Europe/Paris` | `Europe/Rome` | `Europe/Stockholm` | `Europe/Zurich` | `Hongkong`. +5. `runDayofweek` can take any value between `1` and `7`. `1` is Monday, `2` is Tuesday, `3` is Wednesday, `4` is Thursday, `5` is Friday, `6` is Saturday, and `7` is Sunday. +6. `runPeriod` is calculated by the time difference between its value and January 1st 1970 at midnight. ex: a job that runs every 2 and a half days will have a `runPeriod` of `1970-01-03 12:00:00`. diff --git a/res/instruct/fluent_instruct_script-include.md b/res/instruct/fluent_instruct_script-include.md index 09e02c2..425498f 100644 --- a/res/instruct/fluent_instruct_script-include.md +++ b/res/instruct/fluent_instruct_script-include.md @@ -1,3 +1,3 @@ # Instructions for Fluent Script Include API Always reference the Script Include API specifications for more details. -1. `caller_access` property only applies when `access` is set to `public` +1. `callerAccess` property only applies when `access` is set to `public` diff --git a/res/instruct/fluent_instruct_scripted-rest.md b/res/instruct/fluent_instruct_scripted-rest.md index b40794c..6a40814 100644 --- a/res/instruct/fluent_instruct_scripted-rest.md +++ b/res/instruct/fluent_instruct_scripted-rest.md @@ -1,7 +1,7 @@ # Instructions for Fluent Scripted REST API Always reference the Scripted REST API specifications for more details. 1. Each Scripted REST API can contain more than one Route, each route is corresponding to HTTP verb. -2. To not `enforce_acl` set this field to be an empty array, otherwise specify a list of ACL object ot sys_ids +2. To not `enforceAcl` set this field to be an empty array, otherwise specify a list of ACL object ot sys_ids 3. The `consumes` field contains a list of media types/resources that the API can consume, default values here are: application/json, application/xml, text/xml. ACL objects from the fluent ACL spec. 4. The `produces` field contains a list of media types/resources that the API can produce, default values here are: application/json, application/xml, text/xml. diff --git a/res/instruct/fluent_instruct_table.md b/res/instruct/fluent_instruct_table.md index 66b81ec..8ae1d09 100644 --- a/res/instruct/fluent_instruct_table.md +++ b/res/instruct/fluent_instruct_table.md @@ -7,7 +7,7 @@ Always reference the Table API to create Table (Dictionary) for more details. 5. The `index` takes an array of column names to generate indexes in bootstrap.xml. To specify a composite index, add multiple column names to 'element' array. 6. Columns are specified as additional function calls within the Table API on the `schema` key. The `name` field is taken from the variable name or object key provided to the Table API. 7. For creating attributes refer to the provided attributes in the table spec. -8. Here are valid `function_definition` functions that Column objects can use: [ +8. Here are valid `functionDefinition` functions that Column objects can use: [ 'add', 'coalesce', 'concat', diff --git a/res/instruct/fluent_instruct_ui-action.md b/res/instruct/fluent_instruct_ui-action.md index b4c015b..4ce729e 100644 --- a/res/instruct/fluent_instruct_ui-action.md +++ b/res/instruct/fluent_instruct_ui-action.md @@ -1,10 +1,10 @@ # Instructions for Fluent UI Action Spec API 1. Always reference the UI Action API specifications for more details. -2. Every `action_name` should always be prefixed with 'sysverb_'. +2. Every `actionName` should always be prefixed with 'sysverb_'. 3. Set field `client` to true only when `onlick` field is specified with a function name. Else, its always default to false. -4. The function name in field `onlick` should always match the function name as defined in `client_script_v2`, which is the inline Servicenow client side scripting. -5. If protection policy is specified to be set, then map to field `sys_policy`. Else, completely skip the field from code generation. -6. Workspace form button corresponds to field name `form_button_v2`, hence, when specified, set value in `form_button_v2` field. -7. Workspace form menu corresponds to field name `form_menu_button_v2`, hence, when specified, set value in `form_menu_button_v2` field. -8. Set `format_for_configurable_workspace` to true only if workspace form button and workspace form menu is enabled, else, it's false. -9. List V2 compatible corresponds to `ui11_compatible` and List V3 compatible corresponds to `ui16_compatible`, hence, when specified, set value in appropriate field. \ No newline at end of file +4. The function name in field `onlick` should always match the function name as defined in `clientScriptV2`, which is the inline Servicenow client side scripting. +5. If protection policy is specified to be set, then map to field `sysPolicy`. Else, completely skip the field from code generation. +6. Workspace form button corresponds to field name `formButtonV2`, hence, when specified, set value in `formButtonV2` field. +7. Workspace form menu corresponds to field name `formMenuButtonV2`, hence, when specified, set value in `formMenuButtonV2` field. +8. Set `formatForConfigurableWorkspace` to true only if workspace form button and workspace form menu is enabled, else, it's false. +9. List V2 compatible corresponds to `ui11_compatible` and List V3 compatible corresponds to `ui16Compatible`, hence, when specified, set value in appropriate field. \ No newline at end of file diff --git a/res/prompt/coding_in_fluent.md b/res/prompt/coding_in_fluent.md index 07b6814..20b4025 100644 --- a/res/prompt/coding_in_fluent.md +++ b/res/prompt/coding_in_fluent.md @@ -45,3 +45,25 @@ Fluent (ServiceNow SDK) is a TypeScript-based domain-specific language that allo Fluent provides specialized APIs for each ServiceNow metadata type, with methods tailored to their specific attributes and behaviors. You are currently interested in working with the following metadata types: + +- ACL: The [Access Control List API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/acl-api-now-ts.html) defines access control lists [sys_security_acl] that secure parts of an application. +- App Menu: The [Application Menu API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/app-menu-api-now-ts.html) defines menus in the application navigator [sys_app_application]. +- ATF: The [Automated Test Framework Test API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/atf-test-now-ts.html) defines automated tests [sys_atf_test] that you can run to confirm that your instance works after making a change. +- Business Rule: The [Business Rule API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/business-rule-api-now-ts.html) defines server-sides scripts [sys_script] that run when a record is displayed, inserted, updated, or deleted, or when a table is queried. +- Client Script: The [Client Script API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/client-script-api-now-ts.html) defines client-side scripts [sys_script_client] that run JavaScript on the client (web browser) when client-based events occur, such as when a form loads, after form submission, or when a field changes value. +- Cross-Scope Privilege: The [Cross-Scope Privilege API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/cs-privileges-api-now-ts.html) defines cross-scope privileges [sys_scope_privilege] for runtime access tracking and application runtime policy. +- List: The [List API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/list-api-now-ts.html) defines list views [sys_ui_list] that display records from a table with customizable columns and ordering. +- Property: The [Property API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/property-api-now-ts.html) defines system properties [sys_properties] that that control instance behavior. +- Record: The [Record AP](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/record-api-now-ts.html) defines records in any table. Use the Record API to define application metadata that doesn't have a dedicated ServiceNow Fluent API.. +- Role: The [Role API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/role-api-now-ts.html) defines roles [sys_user_role] that grant specific permissions to users of an application.. +- Scheduled Script: The [Scheduled Script Execution API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/scheduled-script-api-now-ts.html) defines scheduled jobs [sysauto_script] that execute server-side scripts at specified times or intervals. +- Script Action (*new in v4*): The [Script Action API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/fluent-script-action-api.html) defines script actions [sysevent_script_action] that run when an event occurs. +- Script Include (*new in v4*): The [Script Include API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/fluent-script-include-api.html) defines script includes [sys_script_include] that store JavaScript functions and classes for use by server-side scripts. +- Scripted REST: The [Scripted REST API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/scripted-rest-api-api-now-ts.html) defines custom REST endpoints [sys_ws_operation], query parameters, and headers for a scripted REST service [sys_ws_definition]. +- Service Portal (*new in v4*): The [Service Portal API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/fluent-service-portal-api.html) defines custom widgets [sp_widget] for portal pages, including: + - [SpWidget](https://www.servicenow.com/docs/bundle/zurich-application-development/page/build/servicenow-sdk/reference/fluent-service-portal-api.html#title_fluent-sp-widget-object) : define a custom widget [sp_widget] to include on a portal page. + - [SPWidgetDependency](https://www.servicenow.com/docs/bundle/zurich-application-development/page/build/servicenow-sdk/reference/fluent-service-portal-api.html#title_fluent-sp-widget-dependency-object): a widget dependency [sp_dependency] to link JavaScript and CSS files to widgets and use third-party libraries, external style sheets, or Angular modules. + - [SpAngularProvider](https://www.servicenow.com/docs/bundle/zurich-application-development/page/build/servicenow-sdk/reference/fluent-service-portal-api.html#title_fluent-sp-angular-provider-object): an Angular Provider [sp_angular_provider] to reuse components in multiple widgets and improve portal performance. +- Table: The [Table API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/table-api-now-ts.html) defines tables [sys_db_object] that store data and define database schema with columns and relationships. +- UI Action (*new in v4*): The [UI Action API](https://www.servicenow.com/docs/bundle/xanadu-application-development/page/build/servicenow-sdk/reference/fluent-ui-action-api.html) defines buttons, links, and context menu items [sys_ui_action] that appear on forms and lists. +- UI Page (*new in v4*): The [UI Page API](https://www.servicenow.com/docs/bundle/zurich-application-development/page/build/servicenow-sdk/reference/fluent-ui-page-api.html) defines custom user interface pages [sys_ui_page] that display forms, dialogs, lists, and other UI components. diff --git a/res/snippet/fluent_snippet_acl_0003.md b/res/snippet/fluent_snippet_acl_0003.md index e3b650f..56f3a1a 100644 --- a/res/snippet/fluent_snippet_acl_0003.md +++ b/res/snippet/fluent_snippet_acl_0003.md @@ -12,7 +12,7 @@ export default Acl({ return buildUtil.buildEnabled(); // Return true if build is enabled, false otherwise }`, active: true, - admin_overrides: true, + adminOverrides: true, type: 'rest_endpoint', name: '/api/now/ide/build', operation: 'execute', diff --git a/res/snippet/fluent_snippet_application-menu_0002.md b/res/snippet/fluent_snippet_application-menu_0002.md index c855a83..5161b2b 100644 --- a/res/snippet/fluent_snippet_application-menu_0002.md +++ b/res/snippet/fluent_snippet_application-menu_0002.md @@ -35,10 +35,10 @@ const applicationSubMenu = Record({ application: applicationMenu, active: true, hint: 'Sub menu under Application Security', - link_type: 'MAP', - map_page: 'get_sys_id("cmn_map_page", "Critical incidents")', - override_menu_roles: false, - require_confirmation: false, + linkType: 'MAP', + mapPage: 'get_sys_id("cmn_map_page", "Critical incidents")', + overrideMenuRoles: false, + requireConfirmation: false, uncancelable: false }, }) diff --git a/res/snippet/fluent_snippet_application-menu_0003.md b/res/snippet/fluent_snippet_application-menu_0003.md index 166ff62..cdf2d21 100644 --- a/res/snippet/fluent_snippet_application-menu_0003.md +++ b/res/snippet/fluent_snippet_application-menu_0003.md @@ -35,7 +35,7 @@ const applicationSubMenu = Record({ application: applicationMenu, active: true, hint: 'Sub Menu under system security', - link_type: 'ASSESSMENT', + linkType: 'ASSESSMENT', assessment: 'get_sys_id("asmt_metric_type", "Basic Flow")', }, }) diff --git a/res/snippet/fluent_snippet_application-menu_0004.md b/res/snippet/fluent_snippet_application-menu_0004.md index ab70997..89ce5a9 100644 --- a/res/snippet/fluent_snippet_application-menu_0004.md +++ b/res/snippet/fluent_snippet_application-menu_0004.md @@ -34,7 +34,7 @@ const applicationSubMenu = Record({ title: 'My Assets Analytics', application: applicationMenu, active: true, - link_type: 'DIRECT', + linkType: 'DIRECT', query: 'now/platform-analytics-workspace/dashboards/params/edit/false/sys-id/272ecbceaef925b16972c10aaa456d2b' }, }) diff --git a/res/snippet/fluent_snippet_application-menu_0005.md b/res/snippet/fluent_snippet_application-menu_0005.md index 7619ab8..56993d8 100644 --- a/res/snippet/fluent_snippet_application-menu_0005.md +++ b/res/snippet/fluent_snippet_application-menu_0005.md @@ -34,7 +34,7 @@ const applicationSubMenu = Record({ title: 'Scheduled Notifications', application: applicationMenu, active: true, - link_type: 'DIRECT', + linkType: 'DIRECT', query: 'sys_trigger_list.do?sysparm_query=job_id.handler_classSTARTSWITHcom.snc.pa.%5EORsys_id%3Da51441d1d70022004cd2a3b20e61039a%5EORDERBYnext_action' }, }) diff --git a/res/snippet/fluent_snippet_atf-catalog-variable_001.md b/res/snippet/fluent_snippet_atf-catalog-variable_001.md index b48005d..f828bcc 100644 --- a/res/snippet/fluent_snippet_atf-catalog-variable_001.md +++ b/res/snippet/fluent_snippet_atf-catalog-variable_001.md @@ -35,7 +35,7 @@ Test({ atf.form.openExistingRecord({ $id: Now.ID['006'], table: "incident", - recordId: outputOfSubmit.record_id, + recordId: outputOfSubmit.recordId, formUI: 'standard_ui', view: '', selectedTabIndex: 0 diff --git a/res/snippet/fluent_snippet_atf-form-action_0001.md b/res/snippet/fluent_snippet_atf-form-action_0001.md index fa15988..3c24360 100644 --- a/res/snippet/fluent_snippet_atf-form-action_0001.md +++ b/res/snippet/fluent_snippet_atf-form-action_0001.md @@ -29,7 +29,7 @@ Test({ atf.form.openExistingRecord({ $id: Now.ID['0003'], table: 'change_request', // Open the Change Request record - recordId: insertedChangeRequest.record_id, + recordId: insertedChangeRequest.recordId, formUI: 'standard_ui', view: '', selectedTabIndex: 0 diff --git a/res/snippet/fluent_snippet_atf-form-action_0002.md b/res/snippet/fluent_snippet_atf-form-action_0002.md index 9e9f8f3..5c291ac 100644 --- a/res/snippet/fluent_snippet_atf-form-action_0002.md +++ b/res/snippet/fluent_snippet_atf-form-action_0002.md @@ -27,7 +27,7 @@ Test({ atf.form.openExistingRecord({ $id: Now.ID['0003'], table: 'incident', - recordId: insertedIncident.record_id, + recordId: insertedIncident.recordId, formUI: 'standard_ui', view: '', selectedTabIndex: 0, diff --git a/res/snippet/fluent_snippet_atf-form-action_0003.md b/res/snippet/fluent_snippet_atf-form-action_0003.md index a5dc7c2..ebaf19b 100644 --- a/res/snippet/fluent_snippet_atf-form-action_0003.md +++ b/res/snippet/fluent_snippet_atf-form-action_0003.md @@ -47,9 +47,9 @@ Test({ }) atf.server.recordValidation({ $id: Now.ID['0006'], - table: 'incident', - fieldValues: `problem_id=${outputOfCreateProblem.record_id}`, // string, servicenow encoded query - recordId: outputOfSave.record_id, // sys_id of the record + table: 'incident', + fieldValues: `problem_id=${outputOfCreateProblem.recordId}`, // string, servicenow encoded query + recordId: outputOfSave.recordId, // sys_id of the record enforceSecurity: false, // boolean assertType: 'record_validated' // 'record_validated' | 'record_not_found' }) diff --git a/res/snippet/fluent_snippet_atf-form-field_0001.md b/res/snippet/fluent_snippet_atf-form-field_0001.md index 22df49d..ef22ad2 100644 --- a/res/snippet/fluent_snippet_atf-form-field_0001.md +++ b/res/snippet/fluent_snippet_atf-form-field_0001.md @@ -29,7 +29,7 @@ Test({ atf.form.openExistingRecord({ $id: Now.ID['0003'], table: 'change_request', // Open the 'Change Request' form - recordId: insertedRecord.record_id, + recordId: insertedRecord.recordId, formUI: 'standard_ui', view: '', selectedTabIndex: 0 diff --git a/res/snippet/fluent_snippet_atf-form_0001.md b/res/snippet/fluent_snippet_atf-form_0001.md index 6f84c83..0dfa725 100644 --- a/res/snippet/fluent_snippet_atf-form_0001.md +++ b/res/snippet/fluent_snippet_atf-form_0001.md @@ -29,7 +29,7 @@ Test({ atf.form.openExistingRecord({ $id: 'step_4_fedcba', table: "incident", - recordId: outputOfSubmit.record_id, + recordId: outputOfSubmit.recordId, formUI: 'cmdb_workspace', view: '', selectedTabIndex: 0 diff --git a/res/snippet/fluent_snippet_atf-server-catalog-item_0001.md b/res/snippet/fluent_snippet_atf-server-catalog-item_0001.md index c190390..4f32c72 100644 --- a/res/snippet/fluent_snippet_atf-server-catalog-item_0001.md +++ b/res/snippet/fluent_snippet_atf-server-catalog-item_0001.md @@ -20,7 +20,7 @@ Test({ }) atf.server.log({ $id: 'step_2_ghijkl', - log: `Found catalog item: ${searchResult.catalog_item_id}` + log: `Found catalog item: ${searchResult.catalogItemId}` }) }) ``` diff --git a/res/snippet/fluent_snippet_atf-server-catalog-item_0002.md b/res/snippet/fluent_snippet_atf-server-catalog-item_0002.md index b328f8f..6d12cee 100644 --- a/res/snippet/fluent_snippet_atf-server-catalog-item_0002.md +++ b/res/snippet/fluent_snippet_atf-server-catalog-item_0002.md @@ -18,7 +18,7 @@ Test({ }) atf.server.replayRequestItem({ $id: 'step_2_g7h8i9', - request_item: checkoutResult.request_id, + requestItem: checkoutResult.requestId, }) atf.server.log({ $id: 'step_3_j0k1l2', diff --git a/res/snippet/fluent_snippet_atf-server-record_0001.md b/res/snippet/fluent_snippet_atf-server-record_0001.md index 4fd8c48..f6884f1 100644 --- a/res/snippet/fluent_snippet_atf-server-record_0001.md +++ b/res/snippet/fluent_snippet_atf-server-record_0001.md @@ -22,7 +22,7 @@ Test({ $id: Now.ID['0002'], table: 'change_request', fieldValues: { - 'cmdb_ci': cmdbCiInsert.record_id, + 'cmdb_ci': cmdbCiInsert.recordId, 'planned_start_date': '2019-07-25 05:30:00', 'planned_end_date': '2019-07-25 05:40:00', 'short_description': 'CI Already Scheduled' @@ -36,7 +36,7 @@ Test({ $id: Now.ID['0003'], table: 'change_request', fieldValues: { - 'cmdb_ci': cmdbCiInsert.record_id, + 'cmdb_ci': cmdbCiInsert.recordId, 'planned_start_date': '2019-07-25 05:30:00', 'planned_end_date': '2019-07-25 05:40:00', 'short_description': 'CI Already Scheduled' @@ -49,7 +49,7 @@ Test({ atf.server.recordQuery({ $id: Now.ID['0004'], table: 'conflict', - fieldValues: `change=${changeRequestInsert2.record_id}^type=CI Already Scheduled`, + fieldValues: `change=${changeRequestInsert2.recordId}^type=CI Already Scheduled`, enforceSecurity: false, assertType: 'records_match_query', }) diff --git a/res/snippet/fluent_snippet_atf-server-record_0002.md b/res/snippet/fluent_snippet_atf-server-record_0002.md index 0347087..c9fcec0 100644 --- a/res/snippet/fluent_snippet_atf-server-record_0002.md +++ b/res/snippet/fluent_snippet_atf-server-record_0002.md @@ -80,7 +80,7 @@ Test({ atf.form.openExistingRecord({ $id: Now.ID['0008'], table: 'asmt_metric_type', - recordId: templateCategoryRecord.record_id, + recordId: templateCategoryRecord.recordId, formUI: 'standard_ui', view: '', selectedTabIndex: 0 diff --git a/res/snippet/fluent_snippet_atf-server_0001.md b/res/snippet/fluent_snippet_atf-server_0001.md index 9872cb3..dbb7292 100644 --- a/res/snippet/fluent_snippet_atf-server_0001.md +++ b/res/snippet/fluent_snippet_atf-server_0001.md @@ -28,14 +28,14 @@ Test({ fieldValues: { "short_description": "test update field from text2fluent" }, - recordId: newIncident.record_id, + recordId: newIncident.recordId, assert: 'record_successfully_updated', enforceSecurity: false, }) atf.server.recordDelete({ $id: 'step_4_def123', table: "incident", - recordId: newIncident.record_id, + recordId: newIncident.recordId, enforceSecurity: false, assert: 'record_successfully_deleted', }) diff --git a/res/snippet/fluent_snippet_business-rule_0001.md b/res/snippet/fluent_snippet_business-rule_0001.md index 40981da..6eda5ae 100644 --- a/res/snippet/fluent_snippet_business-rule_0001.md +++ b/res/snippet/fluent_snippet_business-rule_0001.md @@ -9,8 +9,8 @@ BusinessRule({ order: 100, when: 'before', active: true, - add_message: false, - abort_action: false, + addMessage: false, + abortAction: false, script: `(function executeRule(current, previous /*null when async*/) { // Get the field selected from the current record var selectedField = current.getValue('field'); diff --git a/res/snippet/fluent_snippet_business-rule_0002.md b/res/snippet/fluent_snippet_business-rule_0002.md index 6057add..6003294 100644 --- a/res/snippet/fluent_snippet_business-rule_0002.md +++ b/res/snippet/fluent_snippet_business-rule_0002.md @@ -6,7 +6,7 @@ import { BusinessRule } from '@servicenow/sdk/core' export default BusinessRule({ $id: Now.ID['set_state_business_rule'], action: ['update'], - filter_condition: 'state=3^parent.category=invoice_automation^parent.sub_category=invoice_exceptions', + filterCondition: 'state=3^parent.category=invoice_automation^parent.sub_category=invoice_exceptions', script: `(function executeRule(current, previous /*null when async*/) { // Check if there's a parent case if (current.parent) { @@ -32,7 +32,7 @@ export default BusinessRule({ order: 100, when: 'async', active: true, - add_message: false, - abort_action: false, + addMessage: false, + abortAction: false, }) ``` diff --git a/res/snippet/fluent_snippet_business-rule_0003.md b/res/snippet/fluent_snippet_business-rule_0003.md index 6feaba3..5cdf11d 100644 --- a/res/snippet/fluent_snippet_business-rule_0003.md +++ b/res/snippet/fluent_snippet_business-rule_0003.md @@ -5,7 +5,7 @@ import { BusinessRule } from '@servicenow/sdk/core' export default BusinessRule({ $id: Now.ID['update_rca_business_rule'], action: ['update', 'insert'], - filter_condition: 'rca!=NULL', + filterCondition: 'rca!=NULL', script: `(function executeRule(current, previous /*null when async*/) { // Check if the user is an admin if (gs.hasRole('admin')) { @@ -21,8 +21,8 @@ export default BusinessRule({ order: 100, when: 'after', active: true, - add_message: false, - abort_action: false, + addMessage: false, + abortAction: false, }) ``` diff --git a/res/snippet/fluent_snippet_business-rule_0004.md b/res/snippet/fluent_snippet_business-rule_0004.md index 98eabda..5e5ae05 100644 --- a/res/snippet/fluent_snippet_business-rule_0004.md +++ b/res/snippet/fluent_snippet_business-rule_0004.md @@ -6,7 +6,7 @@ import { BusinessRule } from '@servicenow/sdk/core' BusinessRule({ $id: '1a9b33736be23010bc5bffcd1e44af2e', action: ['insert'], - filter_condition: 'cmdb_ci!=NULL^is_sample=false', + filterCondition: 'cmdb_ci!=NULL^is_sample=false', script: `(function executeRule(current, previous /*null when async*/) { // Check if we have a CMDB CI if (current.cmdb_ci) { @@ -31,8 +31,8 @@ BusinessRule({ order: 100, when: 'after', active: true, - add_message: false, - abort_action: false, + addMessage: false, + abortAction: false, condition: 'gs.nil(current.getValue("sn_air_core_integration_usage")) || gs.nil(current.sn_air_core_integration_usage.integration) || !current.sn_air_core_integration_usage.integration.exempt_from_billing', }) diff --git a/res/snippet/fluent_snippet_business-rule_0005.md b/res/snippet/fluent_snippet_business-rule_0005.md index 240000a..f827a85 100644 --- a/res/snippet/fluent_snippet_business-rule_0005.md +++ b/res/snippet/fluent_snippet_business-rule_0005.md @@ -9,7 +9,7 @@ BusinessRule({ table: 'sn_t2fluent_eval_llm', action: ['insert', 'update'], active: false, - add_message: false, + addMessage: false, script: '(function executeRule(current, previous /*null when async*/ ) { if ((current.llm_output.toString() !== "" && current.llm_output.toString() === "") || (current.llm_output.toString() === "" && current.llm_output.toString() !== "")) { gs.addErrorMessage(gs.getMessage("content are out of sync")); current.setAbortAction(true); } })(current, previous);', order: 300, diff --git a/res/snippet/fluent_snippet_client-script_0001.md b/res/snippet/fluent_snippet_client-script_0001.md index b41c6e8..8d2f34b 100644 --- a/res/snippet/fluent_snippet_client-script_0001.md +++ b/res/snippet/fluent_snippet_client-script_0001.md @@ -3,22 +3,22 @@ import { ClientScript } from '@servicenow/sdk/core' ClientScript({ - $id: Now.ID['hello_world'], + $id: Now.ID['hello_world'], name: 'Hello world client script', table: 'incident', - ui_type: 'all', + uiType: 'all', type: 'onLoad', description: 'Displays hello world on load', script: `function onLoad() { // Display "Hello world" message when the form loads g_form.addInfoMessage("Hello world"); - + // Log to console for debugging console.log("Hello world client script executed"); }`, active: true, - applies_extended: false, + appliesExtended: false, global: true, - isolate_script: false, + isolateScript: false, }) ``` diff --git a/res/snippet/fluent_snippet_client-script_0002.md b/res/snippet/fluent_snippet_client-script_0002.md index e66605f..adfc442 100644 --- a/res/snippet/fluent_snippet_client-script_0002.md +++ b/res/snippet/fluent_snippet_client-script_0002.md @@ -3,10 +3,10 @@ import { ClientScript } from '@servicenow/sdk/core' ClientScript({ - $id: Now.ID['missing_category'], + $id: Now.ID['missing_category'], name: 'Category Needed For Search', table: 'sc_cat_item', - ui_type: 'desktop', + uiType: 'desktop', type: 'onChange', // the client script is triggered when the specified field is changed in the form view field: 'category', messages: 'If you want users to be able to search for this Item, add it to a Category', @@ -14,15 +14,15 @@ ClientScript({ if (isLoading || newValue === oldValue) { return; } - + // Show message when the category is cleared/empty if (!newValue) { g_form.addInfoMessage("If you want users to be able to search for this Item, add it to a Category"); } }`, active: true, - applies_extended: true, + appliesExtended: true, global: true, - isolate_script: false, + isolateScript: false, }) ``` diff --git a/res/snippet/fluent_snippet_client-script_0003.md b/res/snippet/fluent_snippet_client-script_0003.md index 71569a4..e9e0f19 100644 --- a/res/snippet/fluent_snippet_client-script_0003.md +++ b/res/snippet/fluent_snippet_client-script_0003.md @@ -3,29 +3,29 @@ import { ClientScript } from '@servicenow/sdk/core' ClientScript({ - $id: Now.ID['submit_task'], + $id: Now.ID['submit_task'], name: 'Task submitted', table: 'task', - ui_type: 'desktop', + uiType: 'desktop', type: 'onSubmit', description: 'Example with multiple messages', messages: 'Task has been submitted.\nWarning: approval may take several days.\nAn error has occured.', script: `function onSubmit() { // Display an info message g_form.addInfoMessage("Task has been submitted."); - + // Display a warning message g_form.addWarningMessage("Warning: approval may take several days."); - + // Display an error message g_form.addErrorMessage("An error has occured."); - + // Allow the form to be submitted return true; }`, active: true, - applies_extended: true, // applies to the task table as well as any tables that extend it, e.g. incident and problem + appliesExtended: true, // applies to the task table as well as any tables that extend it, e.g. incident and problem global: true, - isolate_script: false, + isolateScript: false, }) ``` diff --git a/res/snippet/fluent_snippet_client-script_0004.md b/res/snippet/fluent_snippet_client-script_0004.md index aed5672..1eea67d 100644 --- a/res/snippet/fluent_snippet_client-script_0004.md +++ b/res/snippet/fluent_snippet_client-script_0004.md @@ -3,10 +3,10 @@ import { ClientScript } from '@servicenow/sdk/core' ClientScript({ - $id: Now.ID['username_length'], + $id: Now.ID['username_length'], name: 'Username length alert', table: 'sys_user', - ui_type: 'desktop', + uiType: 'desktop', type: 'onCellEdit', // the client script is triggered when the specified field is edited in list view field: 'user_name', description: 'Displays an alert message when the username is too long or too short', @@ -16,18 +16,18 @@ ClientScript({ if (newValue.length < 3 || newValue.length > 20) { // Show the alert message alert("User IDs must be between 3 and 20 characters long."); - + // Return the original value to revert the change return false; } - + // Continue with the edit return true; }`, active: true, - applies_extended: false, + appliesExtended: false, global: false, view: 'workspace', // only run the client script in the workspace view - isolate_script: false, + isolateScript: false, }) ``` diff --git a/res/snippet/fluent_snippet_client-script_0005.md b/res/snippet/fluent_snippet_client-script_0005.md index 7cb086f..7eaccf3 100644 --- a/res/snippet/fluent_snippet_client-script_0005.md +++ b/res/snippet/fluent_snippet_client-script_0005.md @@ -3,29 +3,29 @@ import { ClientScript } from '@servicenow/sdk/core' ClientScript({ - $id: '4e7880f23714221002e674e8f2924b29', + $id: '4e7880f23714221002e674e8f2924b29', name: 'Task submitted', table: 'task', - ui_type: 'desktop', + uiType: 'desktop', type: 'onSubmit', description: 'Example with multiple messages', messages: 'Task has been submitted.\nWarning: approval may take several days.\nAn error has occured.', script: `function onSubmit() { // Display an info message with updated text g_form.addInfoMessage("Test Editing case."); - + // Keep existing warning message g_form.addWarningMessage("Warning: approval may take several days."); - + // Keep existing error message g_form.addErrorMessage("An error has occured."); - + // Return true to allow form submission return true; }`, active: true, - applies_extended: true, // applies to the task table as well as any tables that extend it, e.g. incident and problem + appliesExtended: true, // applies to the task table as well as any tables that extend it, e.g. incident and problem global: true, - isolate_script: false, + isolateScript: false, }) ``` diff --git a/res/snippet/fluent_snippet_column-generic_0001.md b/res/snippet/fluent_snippet_column-generic_0001.md index e036d72..04f0fa6 100644 --- a/res/snippet/fluent_snippet_column-generic_0001.md +++ b/res/snippet/fluent_snippet_column-generic_0001.md @@ -11,28 +11,28 @@ export const sys_proxy_app = Table({ label: 'App Name', mandatory: true, hint: 'The name of your app', - column_type: 'String', + columnType: 'String', }), app_key: GenericColumn({ label: 'App Type', mandatory: true, hint: "A short keyword to represent your app's function", - column_type: 'String', + columnType: 'String', }), channel: GenericColumn({ label: 'Channel', mandatory: true, hint: 'External channel type', - column_type: 'Choice', + columnType: 'Choice', choices: { slack: { label: 'Slack', sequence: 0 }, teams: { label: 'Teams', sequence: 1 }, workplace: { label: 'Facebook Workplace', sequence: 2 }, }, }), - oauth_endpoint: GenericColumn({ label: 'Oauth Endpoint', mandatory: true, column_type: 'String' }), - oauth_scope: GenericColumn({ label: 'Oauth Scope', column_type: 'String' }), - client_id: GenericColumn({ label: 'Client ID', mandatory: true, column_type: 'String' }), + oauth_endpoint: GenericColumn({ label: 'Oauth Endpoint', mandatory: true, columnType: 'String' }), + oauth_scope: GenericColumn({ label: 'Oauth Scope', columnType: 'String' }), + client_id: GenericColumn({ label: 'Client ID', mandatory: true, columnType: 'String' }), }, }) ``` \ No newline at end of file diff --git a/res/snippet/fluent_snippet_column_0002.md b/res/snippet/fluent_snippet_column_0002.md index 50058c0..5909a62 100644 --- a/res/snippet/fluent_snippet_column_0002.md +++ b/res/snippet/fluent_snippet_column_0002.md @@ -10,7 +10,7 @@ export const business_calendar_group = Table({ description: TranslatedTextColumn({}), sys_domain: DomainIdColumn({ label: 'Domain', - read_only: true, + readOnly: true, plural: 'Domains', hint: 'Domain to which the Business Calendar Group belongs', default: 'global', diff --git a/res/snippet/fluent_snippet_cross-scope-privilege_0001.md b/res/snippet/fluent_snippet_cross-scope-privilege_0001.md index 1738bec..7439485 100644 --- a/res/snippet/fluent_snippet_cross-scope-privilege_0001.md +++ b/res/snippet/fluent_snippet_cross-scope-privilege_0001.md @@ -5,10 +5,10 @@ import { CrossScopePrivilege } from '@servicenow/sdk/core' // Create a cross-scope privilege to allow this application to read records from the `sys_user` table in `x_snc_example` scope. CrossScopePrivilege({ $id: Now.ID['cross_1'], - target_name: 'sys_user', - target_scope: 'x_snc_example', + targetName: 'sys_user', + targetScope: 'x_snc_example', status: 'allowed', - target_type: 'sys_db_object', + targetType: 'sys_db_object', operation: 'read', }) ``` diff --git a/res/snippet/fluent_snippet_cross-scope-privilege_0002.md b/res/snippet/fluent_snippet_cross-scope-privilege_0002.md index c8b56fe..06917af 100644 --- a/res/snippet/fluent_snippet_cross-scope-privilege_0002.md +++ b/res/snippet/fluent_snippet_cross-scope-privilege_0002.md @@ -6,28 +6,28 @@ import { CrossScopePrivilege } from '@servicenow/sdk/core' CrossScopePrivilege({ $id: Now.ID['setValue'], - target_name: 'GlideRecord.setValue', - target_scope: 'global', + targetName: 'GlideRecord.setValue', + targetScope: 'global', status: 'allowed', - target_type: 'scriptable', + targetType: 'scriptable', operation: 'execute', }) CrossScopePrivilege({ $id: Now.ID['update'], - target_name: 'GlideRecord.update', - target_scope: 'global', + targetName: 'GlideRecord.update', + targetScope: 'global', status: 'allowed', - target_type: 'scriptable', + targetType: 'scriptable', operation: 'execute', }) CrossScopePrivilege({ $id: Now.ID['delete'], - target_name: 'GlideRecord.deleteRecord', - target_scope: 'global', + targetName: 'GlideRecord.deleteRecord', + targetScope: 'global', status: 'allowed', - target_type: 'scriptable', + targetType: 'scriptable', operation: 'execute', }) ``` diff --git a/res/snippet/fluent_snippet_role_0001.md b/res/snippet/fluent_snippet_role_0001.md index 22362e7..fad777c 100644 --- a/res/snippet/fluent_snippet_role_0001.md +++ b/res/snippet/fluent_snippet_role_0001.md @@ -6,8 +6,8 @@ const managerRole = Role({ name: 'x_example.manager' // role name }) -const supervisorRole = Role({ +const supervisorRole = Role({ name: 'x_example.supervisor', // role name - contains_roles: [managerRole, get_sys_id('sys_user_role', 'name=itil')] // array of Record<'sys_user_role'>, this establishes a hierarchy where the sn_xxxx.supervisor role encompasses the sn_xxxx.manager and itil roles. + containsRoles: [managerRole, get_sys_id('sys_user_role', 'name=itil')] // array of Record<'sys_user_role'>, this establishes a hierarchy where the sn_xxxx.supervisor role encompasses the sn_xxxx.manager and itil roles. }) ``` diff --git a/res/snippet/fluent_snippet_scheduled-script_0001.md b/res/snippet/fluent_snippet_scheduled-script_0001.md index 2a18719..0aff3b2 100644 --- a/res/snippet/fluent_snippet_scheduled-script_0001.md +++ b/res/snippet/fluent_snippet_scheduled-script_0001.md @@ -9,9 +9,9 @@ Record({ name: 'daily scheduled script execution', active: true, conditional: false, - run_type: 'daily', - time_zone: 'GMT', - run_time: '1970-01-01 15:00:00', + runType: 'daily', + timeZone: 'GMT', + runTime: '1970-01-01 15:00:00', script: `// Set the property to indicate the job has run gs.setProperty("scheduled_job_ran_1", "true"); diff --git a/res/snippet/fluent_snippet_scheduled-script_0002.md b/res/snippet/fluent_snippet_scheduled-script_0002.md index 55b04d3..82d9243 100644 --- a/res/snippet/fluent_snippet_scheduled-script_0002.md +++ b/res/snippet/fluent_snippet_scheduled-script_0002.md @@ -10,8 +10,8 @@ Record({ active: true, conditional: true, condition: `gs.getProperty('scheduled_job_2_ran') === 'false'`, - run_type: 'once', - run_start: '2025-03-13 12:00:00', + runType: 'once', + runStart: '2025-03-13 12:00:00', script: `// Set the property to indicate the job has run gs.setProperty("scheduled_job_ran_2", "true"); diff --git a/res/snippet/fluent_snippet_scheduled-script_0003.md b/res/snippet/fluent_snippet_scheduled-script_0003.md index 7019331..6625b96 100644 --- a/res/snippet/fluent_snippet_scheduled-script_0003.md +++ b/res/snippet/fluent_snippet_scheduled-script_0003.md @@ -9,10 +9,10 @@ Record({ name: 'weekly scheduled script execution', active: true, conditional: false, - run_type: 'weekly', - run_dayofweek: 4, - time_zone: 'US/Mountain', - run_time: '2025-03-13 21:00:00', + runType: 'weekly', + runDayofweek: 4, + timeZone: 'US/Mountain', + runTime: '2025-03-13 21:00:00', script: `// Create a new priority 1 incident var gr = new GlideRecord("incident"); gr.initialize(); diff --git a/res/snippet/fluent_snippet_scheduled-script_0004.md b/res/snippet/fluent_snippet_scheduled-script_0004.md index ea41861..0b2170b 100644 --- a/res/snippet/fluent_snippet_scheduled-script_0004.md +++ b/res/snippet/fluent_snippet_scheduled-script_0004.md @@ -9,10 +9,10 @@ Record({ name: 'monthly scheduled script execution', active: true, conditional: false, - run_type: 'monthly', - run_dayofweek: 21, - time_zone: 'Europe/Amsterdam', - run_time: '1970-01-01 15:00:00', + runType: 'monthly', + runDayofweek: 21, + timeZone: 'Europe/Amsterdam', + runTime: '1970-01-01 15:00:00', script: `// Log the message that the job has started gs.log("started scheduled job four", "ScheduledJobFour"); diff --git a/res/snippet/fluent_snippet_scheduled-script_0005.md b/res/snippet/fluent_snippet_scheduled-script_0005.md index 8ee74a8..77da0c5 100644 --- a/res/snippet/fluent_snippet_scheduled-script_0005.md +++ b/res/snippet/fluent_snippet_scheduled-script_0005.md @@ -9,8 +9,8 @@ Record({ name: 'quarterly scheduled script execution', active: true, conditional: false, - run_type: 'business_calendar_start', - business_calendar: get_sys_id('business_calendar', 'calendar_name=Quarter^ORlabel=Quarter'), + runType: 'business_calendar_start', + businessCalendar: get_sys_id('business_calendar', 'calendar_name=Quarter^ORlabel=Quarter'), script: `// Log the message that the job has started gs.log("started scheduled job five", "ScheduledJobFive"); diff --git a/res/snippet/fluent_snippet_scheduled-script_0006.md b/res/snippet/fluent_snippet_scheduled-script_0006.md index 11c00d6..d00f533 100644 --- a/res/snippet/fluent_snippet_scheduled-script_0006.md +++ b/res/snippet/fluent_snippet_scheduled-script_0006.md @@ -9,9 +9,9 @@ Record({ name: 'periodic scheduled script execution', active: true, conditional: false, - run_type: 'periodically', - run_start: '2025-03-13 00:00:00', - run_period: '1970-01-02 12:00:00', + runType: 'periodically', + runStart: '2025-03-13 00:00:00', + runPeriod: '1970-01-02 12:00:00', script: `// Log the message when the job runs gs.log("started scheduled job six", "ScheduledJobSix"); diff --git a/res/snippet/fluent_snippet_scheduled-script_0007.md b/res/snippet/fluent_snippet_scheduled-script_0007.md index 705279c..2cf1724 100644 --- a/res/snippet/fluent_snippet_scheduled-script_0007.md +++ b/res/snippet/fluent_snippet_scheduled-script_0007.md @@ -10,9 +10,9 @@ Record({ name: 'Daily Hello Job', active: true, conditional: false, - run_type: 'daily', - time_zone: 'US/Pacific', - run_time: '2025-03-13 08:00:00', + runType: 'daily', + timeZone: 'US/Pacific', + runTime: '2025-03-13 08:00:00', script: `// Display info message gs.info("Hello from Fluent Scheduled Job"); diff --git a/res/snippet/fluent_snippet_scheduled-script_0008.md b/res/snippet/fluent_snippet_scheduled-script_0008.md index 181319d..a8b606d 100644 --- a/res/snippet/fluent_snippet_scheduled-script_0008.md +++ b/res/snippet/fluent_snippet_scheduled-script_0008.md @@ -10,9 +10,9 @@ Record({ name: 'Daily Hello Job', active: true, conditional: false, - run_type: 'daily', - time_zone: 'US/Pacific', - run_time: '2025-01-12 23:23:23', + runType: 'daily', + timeZone: 'US/Pacific', + runTime: '2025-01-12 23:23:23', script: `// Set the system property 'test_property' to false gs.setProperty("test_property", "false"); diff --git a/res/snippet/fluent_snippet_script-include_0001.md b/res/snippet/fluent_snippet_script-include_0001.md index 48470da..cc35345 100644 --- a/res/snippet/fluent_snippet_script-include_0001.md +++ b/res/snippet/fluent_snippet_script-include_0001.md @@ -50,9 +50,9 @@ RoleChecker.prototype = { };`, access: "package_private", // accessible from this application scope only active: true, - client_callable: false, - mobile_callable: false, - sandbox_callable: false, + clientCallable: false, + mobileCallable: false, + sandboxCallable: false, } }) ``` diff --git a/res/snippet/fluent_snippet_script-include_0002.md b/res/snippet/fluent_snippet_script-include_0002.md index 7282f8f..6c4cbf5 100644 --- a/res/snippet/fluent_snippet_script-include_0002.md +++ b/res/snippet/fluent_snippet_script-include_0002.md @@ -53,11 +53,11 @@ TestAppConstants.prototype = { type: 'TestAppConstants' };`, access: "public", // accessible from all application scopes - caller_access: '1', // keep track of the caller through cross-scope privileges + callerAccess: '1', // keep track of the caller through cross-scope privileges active: true, - client_callable: false, - mobile_callable: false, - sandbox_callable: false, + clientCallable: false, + mobileCallable: false, + sandboxCallable: false, } }) ``` diff --git a/res/snippet/fluent_snippet_script-include_0003.md b/res/snippet/fluent_snippet_script-include_0003.md index 1f11b19..b61433b 100644 --- a/res/snippet/fluent_snippet_script-include_0003.md +++ b/res/snippet/fluent_snippet_script-include_0003.md @@ -34,11 +34,11 @@ TestAppConstants.prototype = { type: 'TestAppConstants' };`, access: "public", // accessible from all application scopes - caller_access: '1', // keep track of the caller through cross-scope privileges + callerAccess: '1', // keep track of the caller through cross-scope privileges active: true, - client_callable: false, - mobile_callable: false, - sandbox_callable: false, + clientCallable: false, + mobileCallable: false, + sandboxCallable: false, } }) ``` diff --git a/res/snippet/fluent_snippet_scripted-rest_0001.md b/res/snippet/fluent_snippet_scripted-rest_0001.md index b816061..e88e24a 100644 --- a/res/snippet/fluent_snippet_scripted-rest_0001.md +++ b/res/snippet/fluent_snippet_scripted-rest_0001.md @@ -5,7 +5,7 @@ import { RestApi, Acl } from '@servicenow/sdk/core' RestApi({ $id: Now.ID['get_guid_rest_api'], name: 'Get GUID', - service_id: 'custom_api', + serviceId: 'custom_api', consumes: 'application/json,application/xml,text/xml', produces: 'application/json,application/xml,text/xml', routes: [ @@ -40,11 +40,11 @@ RestApi({ headers: [], authorization: true, authentication: true, - enforce_acl: [restAcl], + enforceAcl: [restAcl], version: 1, }, ], - enforce_acl: [restAcl], + enforceAcl: [restAcl], versions: [ { $id: Now.ID['v1'], @@ -54,7 +54,7 @@ RestApi({ }) const devRole = Role({ name: 'dev' }); -const adminRole = Role({ name: 'admin', contains_roles: [devRole] }); +const adminRole = Role({ name: 'admin', containsRoles: [devRole] }); // The ACL referenced is defined using the ACL object: const restAcl = Acl({ @@ -63,7 +63,7 @@ const restAcl = Acl({ type: 'rest_endpoint', script: ``, active: true, - admin_overrides: false, + adminOverrides: false, operations: ['execute'], roles: [adminRole, devRole], }) diff --git a/res/snippet/fluent_snippet_scripted-rest_0002.md b/res/snippet/fluent_snippet_scripted-rest_0002.md index b2bc81e..496213c 100644 --- a/res/snippet/fluent_snippet_scripted-rest_0002.md +++ b/res/snippet/fluent_snippet_scripted-rest_0002.md @@ -6,7 +6,7 @@ import { RestApi } from '@servicenow/sdk/core' RestApi({ $id: Now.ID['fluent_sample_rest_api'], name: 'rest api fluent sample', - service_id: 'restapi_hello', + serviceId: 'restapi_hello', consumes: 'application/json', routes: [ { diff --git a/res/snippet/fluent_snippet_scripted-rest_0003.md b/res/snippet/fluent_snippet_scripted-rest_0003.md index 8a11935..06a7ffe 100644 --- a/res/snippet/fluent_snippet_scripted-rest_0003.md +++ b/res/snippet/fluent_snippet_scripted-rest_0003.md @@ -3,13 +3,13 @@ import { RestApi } from '@servicenow/sdk/core' RestApi({ - $id: '08899e2837ac221002e674e8f2924b14', + $id: '08899e2837ac221002e674e8f2924b14', name: 'Echo JSON via PUT', - service_id: 'my_service_id_put', + serviceId: 'my_service_id_put', active: true, consumes: 'application/json', - doc_link: '', - enforce_acl: [], + docLink: '', + enforceAcl: [], policy: '', produces: 'application/json', routes: [ @@ -39,11 +39,11 @@ RestApi({ name: 'Echo PUT', active: true, path: '/echo_put', - short_description: 'Echo parsed JSON using PUT method', + shortDescription: 'Echo parsed JSON using PUT method', consumes: 'application/json', - enforce_acl: [], + enforceAcl: [], produces: 'application/json', - request_example: '{ "name": "John", "age": 30 }', + requestExample: '{ "name": "John", "age": 30 }', method: 'PUT', authorization: true, authentication: true, @@ -52,7 +52,7 @@ RestApi({ version: 1 } ], - short_description: 'Simple API that echoes back JSON in PUT request', + shortDescription: 'Simple API that echoes back JSON in PUT request', versions: [ { $id: Now.ID['v1'], diff --git a/res/snippet/fluent_snippet_table_0001.md b/res/snippet/fluent_snippet_table_0001.md index 0776417..e1889cb 100644 --- a/res/snippet/fluent_snippet_table_0001.md +++ b/res/snippet/fluent_snippet_table_0001.md @@ -13,16 +13,16 @@ export const x_snc_example_to_do = Table({ label: 'deadline', // Label for the column active: true, // Indicates whether the column is active mandatory: false, // Field is not mandatory - read_only: false, // Field is editable + readOnly: false, // Field is editable maxLength: 40, // Maximum allowed length for the value dropdown: 'none', // No dropdown selection available attributes: { update_sync: false, // Prevents syncing updates automatically }, default: 'today', // Default value for the field - dynamic_value_definitions: { + dynamicValueDefinitions: { type: 'calculated_value', // Value will be dynamically calculated - calculated_value: '', // Placeholder for calculation logic + calculatedValue: '', // Placeholder for calculation logic }, choices: { // Predefined choices for the dropdown choice1: { @@ -38,25 +38,25 @@ export const x_snc_example_to_do = Table({ }, }), dynamic1: StringColumn({ - dynamic_value_definitions: { + dynamicValueDefinitions: { type: 'calculated_value', // Value is computed dynamically - calculated_value: script``, // Function that computes value + calculatedValue: script``, // Function that computes value }, }), dynamic2: StringColumn({ - dynamic_value_definitions: { + dynamicValueDefinitions: { type: 'dynamic_default', // Default value is determined dynamically - dynamic_default: `gs.info()`, // Calls a function for the default value + dynamicDefault: `gs.info()`, // Calls a function for the default value }, }), dynamic3: StringColumn({ - dynamic_value_definitions: { + dynamicValueDefinitions: { type: 'dependent_field', // Field value depends on another field - column_name: 'status', // Field it depends on + columnName: 'status', // Field it depends on }, }), dynamic4: StringColumn({ - dynamic_value_definitions: { + dynamicValueDefinitions: { type: 'choices_from_other_table', // Fetches choices from another table table: 'sc_cat_item', // Source table for choices field: 'display', // Field from which choices are retrieved @@ -65,22 +65,22 @@ export const x_snc_example_to_do = Table({ }, actions: ['create', 'read'], // Allowed actions for the table display: 'deadline', // Field used as the display value - accessible_from: 'package_private', // Scope restrictions for access - allow_client_scripts: true, // Enables client-side scripts - allow_new_fields: true, // Allows new fields to be added dynamically - allow_ui_actions: true, // Enables UI actions on the table - allow_web_service_access: true, // Allows API access + accessibleFrom: 'package_private', // Scope restrictions for access + allowClientScripts: true, // Enables client-side scripts + allowNewFields: true, // Allows new fields to be added dynamically + allowUiActions: true, // Enables UI actions on the table + allowWebServiceAccess: true, // Allows API access extensible: true, // Table can be extended further - live_feed: true, // Enables live feed updates - caller_access: 'none', // Restricts caller access - auto_number: { + liveFeed: true, // Enables live feed updates + callerAccess: 'none', // Restricts caller access + autoNumber: { number: 10, // Starting number for auto-increment - number_of_digits: 2, // Number of digits in the auto-generated number + numberOfDigits: 2, // Number of digits in the auto-generated number prefix: 'abc', // Prefix for auto-generated numbers }, audit: true, // Enables auditing for tracking changes - read_only: true, // Table is read-only - text_index: true, // Enables text indexing for search + readOnly: true, // Table is read-only + textIndex: true, // Enables text indexing for search attributes: { update_sync: true, // Enables synchronization for updates }, diff --git a/res/snippet/fluent_snippet_table_0002.md b/res/snippet/fluent_snippet_table_0002.md index 8dad6f3..db133c0 100644 --- a/res/snippet/fluent_snippet_table_0002.md +++ b/res/snippet/fluent_snippet_table_0002.md @@ -14,14 +14,14 @@ export const sys_formula_function = Table({ schema: { name: StringColumn({ label: 'Name', mandatory: true, maxLength: 255 }), internal_name: StringColumn({ - read_only: true, + readOnly: true, attributes: { update_exempt: true }, mandatory: true, virtual_type: 'script', maxLength: 255, - dynamic_value_definitions: { + dynamicValueDefinitions: { type: 'calculated_value', - calculated_value: script` + calculatedValue: script` answer = (function() { var scope = current.sys_scope.scope; if (scope.nil()) @@ -52,8 +52,8 @@ export const sys_formula_function = Table({ }), short_description: StringColumn({ label: 'Short description', mandatory: true, maxLength: 255 }), description: TranslatedTextColumn({ label: 'Description' }), - system: BooleanColumn({ label: 'System Function', read_only: true, default: 'false' }), - script: GenericColumn({ label: 'Script', column_type: 'script_plain' }), + system: BooleanColumn({ label: 'System Function', readOnly: true, default: 'false' }), + script: GenericColumn({ label: 'Script', columnType: 'script_plain' }), access: ChoiceColumn({ label: 'Accessible from', dropdown: 'dropdown_without_none', diff --git a/res/snippet/fluent_snippet_table_0003.md b/res/snippet/fluent_snippet_table_0003.md index c4b1f9f..625730a 100644 --- a/res/snippet/fluent_snippet_table_0003.md +++ b/res/snippet/fluent_snippet_table_0003.md @@ -17,7 +17,7 @@ export const sys_data_ob_configuration = Table({ attributes: { fieldChoicesScript: 'DataObserverChoiceFields', show_field_names_on_label: true }, mandatory: true, hint: 'The field to observe', - dynamic_value_definitions: { type: 'dependent_field', column_name: 'table' }, + dynamicValueDefinitions: { type: 'dependent_field', columnName: 'table' }, }), active: BooleanColumn({ default: 'true' }), start_job_immediately: BooleanColumn({ label: 'Start job immediately', default: 'false' }), diff --git a/res/snippet/fluent_snippet_table_0004.md b/res/snippet/fluent_snippet_table_0004.md index 409f3bb..0b91d1e 100644 --- a/res/snippet/fluent_snippet_table_0004.md +++ b/res/snippet/fluent_snippet_table_0004.md @@ -46,7 +46,7 @@ export const fx_configuration = Table({ label: 'Conversion Rate Table', attributes: { tableChoicesScript: 'global.CurrencyConversionTableList', allow_public: true }, hint: 'The rate table used for conversions', - dynamic_value_definitions: { type: 'dynamic_default' }, + dynamicValueDefinitions: { type: 'dynamic_default' }, }), reference_currency: ReferenceColumn({ label: 'Reference Currency', @@ -59,7 +59,7 @@ export const fx_configuration = Table({ label: 'Conversion Date Source', attributes: { allow_null: true, types: 'glide_date_time', allow_references: true }, hint: 'Dotwalked field on target table used to set conversion date', - dynamic_value_definitions: { type: 'dependent_field', column_name: 'target_table' }, + dynamicValueDefinitions: { type: 'dependent_field', columnName: 'target_table' }, }), target_table: TableNameColumn({ label: 'Table', @@ -71,19 +71,19 @@ export const fx_configuration = Table({ attributes: { fieldChoicesScript: 'FxCurrencyConfigFieldListGenerator' }, mandatory: true, hint: 'The name of the currency field', - dynamic_value_definitions: { type: 'dependent_field', column_name: 'target_table' }, + dynamicValueDefinitions: { type: 'dependent_field', columnName: 'target_table' }, }), rate_filter_target_table_field: FieldNameColumn({ label: 'Target Table Field', attributes: { allow_null: true, allow_references: true }, hint: 'Filter rates based on this dotwalked field in target table matching a field in the rate table', - dynamic_value_definitions: { type: 'dependent_field', column_name: 'target_table' }, + dynamicValueDefinitions: { type: 'dependent_field', columnName: 'target_table' }, }), rate_filter_rate_table_field: FieldNameColumn({ label: 'Rate Table Field', attributes: { allow_null: true }, hint: 'Filter rates based on this field in rate table matching a field in the target table', - dynamic_value_definitions: { type: 'dependent_field', column_name: 'rate_table' }, + dynamicValueDefinitions: { type: 'dependent_field', columnName: 'rate_table' }, }), aggregation_source: StringColumn({ label: 'Aggregation Source', @@ -100,7 +100,7 @@ export const fx_configuration = Table({ label: 'Reference Currency Source', attributes: { allow_null: true, types: 'string', reference_types: 'fx_currency', allow_references: true }, hint: 'Dotwalked field on target table used to set reference currency', - dynamic_value_definitions: { type: 'dependent_field', column_name: 'target_table' }, + dynamicValueDefinitions: { type: 'dependent_field', columnName: 'target_table' }, }), }, }) diff --git a/res/snippet/fluent_snippet_ui-action_0001.md b/res/snippet/fluent_snippet_ui-action_0001.md index cc1af54..3af8c55 100644 --- a/res/snippet/fluent_snippet_ui-action_0001.md +++ b/res/snippet/fluent_snippet_ui-action_0001.md @@ -8,7 +8,7 @@ Record({ data: { name: 'Submit', table: 'incident', - action_name: 'sysverb_insert', + actionName: 'sysverb_insert', comments: 'test comment', condition: 'gs.hasRole("admin");', hint: 'Test hint on mouse hover', diff --git a/res/snippet/fluent_snippet_ui-action_0002.md b/res/snippet/fluent_snippet_ui-action_0002.md index 9f724f6..2d0e80c 100644 --- a/res/snippet/fluent_snippet_ui-action_0002.md +++ b/res/snippet/fluent_snippet_ui-action_0002.md @@ -14,18 +14,18 @@ Record({ return false; }`, table: 'incident', - action_name: 'sysverb_insert', + actionName: 'sysverb_insert', active: true, client: true, - ui16_compatible: true, - format_for_configurable_workspace: true, + ui16Compatible: true, + formatForConfigurableWorkspace: true, comments: 'test comment', condition: 'gs.hasRole("admin");', hint: 'Test hint on mouse hover', messages: 'Test message on mouse hover', onclick: 'onClickFunction()', - sys_overrides: '', - sys_policy: 'read', + sysOverrides: '', + sysPolicy: 'read', }, }) ``` \ No newline at end of file diff --git a/res/snippet/fluent_snippet_ui-action_0003.md b/res/snippet/fluent_snippet_ui-action_0003.md index 66d3e61..fcd4927 100644 --- a/res/snippet/fluent_snippet_ui-action_0003.md +++ b/res/snippet/fluent_snippet_ui-action_0003.md @@ -8,12 +8,12 @@ Record({ data: { name: 'Submit', table: 'incident', - action_name: 'sysverb_insert', + actionName: 'sysverb_insert', active: true, client: true, - ui16_compatible: true, - format_for_configurable_workspace: true, - client_script_v2: `function onClickFunction() { + ui16Compatible: true, + formatForConfigurableWorkspace: true, + clientScriptV2: `function onClickFunction() { // Display info message g_form.addInfoMessage("Dummy function call for onlick action"); // Return false to prevent default action @@ -24,8 +24,8 @@ Record({ hint: 'Test hint on mouse hover', messages: 'Test message on mouse hover', onclick: 'onClickFunction()', - sys_overrides: '', - sys_policy: 'read', + sysOverrides: '', + sysPolicy: 'read', }, }) ``` \ No newline at end of file From 9162052acced7de3a9079b6019c0e2efe1f57733 Mon Sep 17 00:00:00 2001 From: modesty Date: Mon, 6 Oct 2025 15:39:45 -0700 Subject: [PATCH 05/11] res: update Script Include, replace Record based implemented with API supported in Fluent@v4. --- res/instruct/fluent_instruct_atf.md | 2 +- res/instruct/fluent_instruct_form.md | 4 +-- res/instruct/fluent_instruct_role.md | 4 +-- .../fluent_instruct_script-include.md | 9 ++++- .../fluent_snippet_script-include_0001.md | 25 ++++++-------- .../fluent_snippet_script-include_0002.md | 27 +++++++-------- .../fluent_snippet_script-include_0003.md | 27 +++++++-------- res/spec/fluent_spec_script-include.md | 34 ++++++++----------- 8 files changed, 63 insertions(+), 69 deletions(-) diff --git a/res/instruct/fluent_instruct_atf.md b/res/instruct/fluent_instruct_atf.md index 23f9e5f..4aed54c 100644 --- a/res/instruct/fluent_instruct_atf.md +++ b/res/instruct/fluent_instruct_atf.md @@ -4,7 +4,7 @@ To generate ATF (Automated Test Framework) Test in Fluent, ALWAYS start respondi // Fluent ATF Test import { Test } from '@servicenow/sdk/core' import '@servicenow/sdk-core/global' - Test({ // all properties are mandatory +Test({ // all properties are mandatory $id: Now.ID[''], // fill in a valid GUID string or the name of the test name: 'Fill in a name for the test', // string description: 'Fill in a description of the test', // string diff --git a/res/instruct/fluent_instruct_form.md b/res/instruct/fluent_instruct_form.md index f2856a6..d5275b1 100644 --- a/res/instruct/fluent_instruct_form.md +++ b/res/instruct/fluent_instruct_form.md @@ -4,8 +4,8 @@ Always reference the Form API specifications for more details. 2. To create a new Form view from scratch, you must utilize ALL of the following types of records: `sys_ui_form`, `sys_ui_section`, `sys_ui_form_section`, and `sys_ui_element` - `sys_ui_form` is a container for multiple form sections - `sys_ui_section` is a reusable container for form elements - - `sys_ui_form_section` tracks the m2m relationships between sections and forms. Each section in the form MUST have a corresponding `sys_ui_form_section` record - - `sys_ui_element` tracks the fields that will be displayed in a section + - `sys_ui_form_section` tracks the m2m relationships between sections and forms. Each section in the form MUST have a corresponding `sys_ui_form_section` record + - `sys_ui_element` tracks the fields that will be displayed in a section 3. Typically, the first section in a form has no `caption`, but the following sections do have a `caption` that serves as a section title 4. `sys_ui_element` records usually store ordinary fields. However, you can also add column breaks between fields by using `.split` and `.end_split`. 5. Exclude any scripts or duplicate code from your output unless explicitly instructed in the prompt. diff --git a/res/instruct/fluent_instruct_role.md b/res/instruct/fluent_instruct_role.md index 14d6724..2a6a679 100644 --- a/res/instruct/fluent_instruct_role.md +++ b/res/instruct/fluent_instruct_role.md @@ -2,5 +2,5 @@ Always reference the Role API specification for more details. 1. `$id` is deprecated since v4.0.0. 2. `containsRoles` property is an array of Record<'sys_user_role'>, either sys_ids or Role objects. It is optional, it indicates other Role objects that this role contains. If using a new role, use the Role object. If using an existing role, use function like `get_sys_id('sys_user_role', 'name=ex_role')` - no `label` field for roles. -3. `elevatedPrivilege` is default to `false`, when it's `true`, it means user must manually accept the responsibility of using the role before you can access its features. -4. `canDelegate` is default to `true`, when it's `false`, it means the role cannot be delegated to other users. +3. `elevatedPrivilege` is default to `false`. `true` means user must manually accept the responsibility of using the role before you can access its features. +4. `canDelegate` is default to `true`. `false` means the role cannot be delegated to other users. diff --git a/res/instruct/fluent_instruct_script-include.md b/res/instruct/fluent_instruct_script-include.md index 425498f..6218070 100644 --- a/res/instruct/fluent_instruct_script-include.md +++ b/res/instruct/fluent_instruct_script-include.md @@ -1,3 +1,10 @@ # Instructions for Fluent Script Include API Always reference the Script Include API specifications for more details. -1. `callerAccess` property only applies when `access` is set to `public` + +**Key Changes in v4:** +* Import the API as `import { ScriptInclude } from '@servicenow/sdk/core';`. +* The `script` property can now use the `Now.include()` helper to include a script from a file (e.g., `script: Now.include("./SampleClass.server.js")`). + +**Best Practices:** +1. `callerAccess` property only applies when `accessibleFrom` is set to `package_private`. +2. Use `Now.include()` to keep your script logic in separate files for better organization and maintainability. \ No newline at end of file diff --git a/res/snippet/fluent_snippet_script-include_0001.md b/res/snippet/fluent_snippet_script-include_0001.md index cc35345..0d92a90 100644 --- a/res/snippet/fluent_snippet_script-include_0001.md +++ b/res/snippet/fluent_snippet_script-include_0001.md @@ -1,14 +1,12 @@ # create a script include with a function to check roles, accessible from this application scope only ```typescript -import { Record } from '@servicenow/sdk/core' +import { ScriptInclude } from '@servicenow/sdk/core' -Record({ +ScriptInclude({ $id: Now.ID["role_checker_si"], - table: "sys_script_include", - data: { - name: "RoleChecker", - description: "Utility to check for role.", - script: `var RoleChecker = Class.create(); + name: "RoleChecker", + description: "Utility to check for role.", + script: `var RoleChecker = Class.create(); RoleChecker.prototype = { initialize: function() { this.currentUser = gs.getUser(); @@ -48,11 +46,10 @@ RoleChecker.prototype = { type: 'RoleChecker' };`, - access: "package_private", // accessible from this application scope only - active: true, - clientCallable: false, - mobileCallable: false, - sandboxCallable: false, - } + accessibleFrom: "package_private", // accessible from this application scope only + active: true, + clientCallable: false, + mobileCallable: false, + sandboxCallable: false, }) -``` +``` \ No newline at end of file diff --git a/res/snippet/fluent_snippet_script-include_0002.md b/res/snippet/fluent_snippet_script-include_0002.md index 6c4cbf5..59c24a7 100644 --- a/res/snippet/fluent_snippet_script-include_0002.md +++ b/res/snippet/fluent_snippet_script-include_0002.md @@ -1,14 +1,12 @@ # create a script include to store constants for the app, accessible from all application scopes with caller tracking ```typescript -import { Record } from '@servicenow/sdk/core' +import { ScriptInclude } from '@servicenow/sdk/core' -Record({ +ScriptInclude({ $id: Now.ID["test_app_constants_si"], - table: "sys_script_include", - data: { - name: "TestAppConstants", - description: "Constants for TestApp", - script: `var TestAppConstants = Class.create(); + name: "TestAppConstants", + description: "Constants for TestApp", + script: `var TestAppConstants = Class.create(); TestAppConstants.prototype = { initialize: function() { @@ -52,12 +50,11 @@ TestAppConstants.prototype = { type: 'TestAppConstants' };`, - access: "public", // accessible from all application scopes - callerAccess: '1', // keep track of the caller through cross-scope privileges - active: true, - clientCallable: false, - mobileCallable: false, - sandboxCallable: false, - } + accessibleFrom: "public", // accessible from all application scopes + callerAccess: 'tracking', // keep track of the caller through cross-scope privileges + active: true, + clientCallable: false, + mobileCallable: false, + sandboxCallable: false, }) -``` +``` \ No newline at end of file diff --git a/res/snippet/fluent_snippet_script-include_0003.md b/res/snippet/fluent_snippet_script-include_0003.md index b61433b..884e863 100644 --- a/res/snippet/fluent_snippet_script-include_0003.md +++ b/res/snippet/fluent_snippet_script-include_0003.md @@ -1,14 +1,12 @@ # Script Include API example: editing a script include to update the script add a function to log caller name ```typescript -import { Record } from '@servicenow/sdk/core' +import { ScriptInclude } from '@servicenow/sdk/core' -Record({ +ScriptInclude({ $id: '4e7880f23714221002e674e8f2924b29', - table: "sys_script_include", - data: { - name: "TestAppConstants", - description: "Constants for TestApp", - script: `var TestAppConstants = Class.create(); + name: "TestAppConstants", + description: "Constants for TestApp", + script: `var TestAppConstants = Class.create(); TestAppConstants.prototype = { initialize: function() { @@ -33,12 +31,11 @@ TestAppConstants.prototype = { type: 'TestAppConstants' };`, - access: "public", // accessible from all application scopes - callerAccess: '1', // keep track of the caller through cross-scope privileges - active: true, - clientCallable: false, - mobileCallable: false, - sandboxCallable: false, - } + accessibleFrom: "public", // accessible from all application scopes + callerAccess: 'tracking', // keep track of the caller through cross-scope privileges + active: true, + clientCallable: false, + mobileCallable: false, + sandboxCallable: false, }) -``` +``` \ No newline at end of file diff --git a/res/spec/fluent_spec_script-include.md b/res/spec/fluent_spec_script-include.md index 4ff27f0..d6310ad 100644 --- a/res/spec/fluent_spec_script-include.md +++ b/res/spec/fluent_spec_script-include.md @@ -1,22 +1,18 @@ -#**Context:** Script Include API spec: Create script includes to store JavaScript functions and classes for use by server scripts. Each script include defines either an object class or a function. Although Script Inlcudes are primarily intended for server side usage, they can be used at client level IF `client_callable` is true. +#**Context:** Script Include API spec: Define a Script Include to store JavaScript functions and classes that can be resued in different script modules. Each script include defines either an object class or a function. Although Script Inlcudes are primarily intended for server side usage, they can be used at client IF `clientCallable` is true. ```typescript -// spec to create a script include in Fluent using the Record plugin -Record({ +import { ScriptInclude } from '@servicenow/sdk/core'; + +ScriptInclude({ $id: '',// string, unique id for the record, typically using Now.ID["value"] - table: 'sys_script_include', // string, must always leave as 'sys_script_include' - data: { - name: '', // string, the name of the script include - sysName: '', // string, optional, the system name of the script include. Default is same as name - apiName: '', // string, optional, the API path to call the script include. Default is [app_name].[sysName] - description: '', // string, optional, short description of the script include - script: '', // ServiceNow script to fullfil the functional request in scripting, - access: 'package_private', // string, optional, 'public'|'package_private', 'public' if the script include is accessible from all application scopes, 'package_private' if accessible from this application scope only - callerAccess: '', // string, optional, '1' for caller tracking, '2' for caller restriction, '' for none - active: true, // boolean, optional, default true - clientCallable: false, // boolean, optional, whether Glide AJAX is enabled, default false - mobileCallable: false, // boolean, optional, whether the script include is callable from mobile, default false - sandboxCallable: false, // boolean, optional, whether the script include is callable from sandbox, default false - sysPolicy: '', // string, optional, protection policy: ''|'read'|'protected', 'read' for read-only, 'protected' for protected - }, + name: '', // string, the name of the script include + apiName: '', // string, optional, the API path to call the script include. Default is [scope].[sysName] + description: '', // string, optional, short description of the script include + script: '', // ServiceNow script to fullfil the functional request in scripting, + accessibleFrom: 'package_private', // string, optional, 'public'|'package_private', 'public' if the script include is accessible from all application scopes, 'package_private' if accessible from this application scope only + callerAccess: '', // string, optional, 'tracking' for caller tracking, 'restriction' for caller restriction, '' for none + active: true, // boolean, optional, default true + clientCallable: false, // boolean, optional, whether GlideAJAX is enabled to enable it runnable from browser client, default false + mobileCallable: false, // boolean, optional, whether the script include is callable from mobile, default false + sandboxCallable: false, // boolean, optional, whether the script include is callable from sandbox, default false }) -``` +``` \ No newline at end of file From 2ac43af8d2d3abca220ee5f411763698f35c5988 Mon Sep 17 00:00:00 2001 From: modesty Date: Mon, 6 Oct 2025 16:13:40 -0700 Subject: [PATCH 06/11] res: add spec, snippet and instruct for Script Action (new in Fluent@v4) --- res/instruct/fluent_instruct_script-action.md | 9 ++++++++ .../fluent_snippet_script-action_0001.md | 20 ++++++++++++++++++ .../fluent_snippet_script-action_0002.md | 21 +++++++++++++++++++ res/spec/fluent_spec_script-action.md | 16 ++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 res/instruct/fluent_instruct_script-action.md create mode 100644 res/snippet/fluent_snippet_script-action_0001.md create mode 100644 res/snippet/fluent_snippet_script-action_0002.md create mode 100644 res/spec/fluent_spec_script-action.md diff --git a/res/instruct/fluent_instruct_script-action.md b/res/instruct/fluent_instruct_script-action.md new file mode 100644 index 0000000..59e21c7 --- /dev/null +++ b/res/instruct/fluent_instruct_script-action.md @@ -0,0 +1,9 @@ +# Instructions for Fluent Script Action API +Always reference the Script Action API specifications for more details. +1. Use the `ScriptAction` API to define a server-side script that executes when a specific event is triggered. +2. The `eventName` property must match the name of a registered event in the Event Registry (`sysevent_registry`). +3. The `script` property should be a function that contains the JavaScript code to be executed. This script has access to the `current` (the record that triggered the event) and `event` (the event object itself) variables. You can provide an inline arrow function or import a function from another module. +4. By default, Script Actions run asynchronously. This is a best practice to avoid performance impacts on user transactions. +5. Use the `event.parm1` and `event.parm2` properties to pass additional information from the triggering script to the Script Action. +6. The `conditionScript` is a string containing a server-side script that must evaluate to true for the action to execute (e.g., `"gs.hasRole('admin')"`). +7. Before creating a Script Action, ensure the event it responds to is registered in the ServiceNow Event Registry. \ No newline at end of file diff --git a/res/snippet/fluent_snippet_script-action_0001.md b/res/snippet/fluent_snippet_script-action_0001.md new file mode 100644 index 0000000..dcdce82 --- /dev/null +++ b/res/snippet/fluent_snippet_script-action_0001.md @@ -0,0 +1,20 @@ +# Script Action API example: creating a new Script Action that logs event details +```typescript +import { ScriptAction } from '@servicenow/sdk/core' + +ScriptAction({ + $id: Now.ID['log_event_details_action'], + name: 'Log Event Details', + eventName: 'my.custom.event', + script: ` + gs.log('Event received: ' + event.name); + gs.log('Event parameter 1: ' + event.parm1); + gs.log('Event parameter 2: ' + event.parm2); + gs.log('Processing table: ' + current.getTableName()); + gs.log('Processing record sys_id: ' + current.sys_id); + }`, + active: true, + description: 'Logs details of the my.custom.event to the system log.', + order: 100 +}) +``` \ No newline at end of file diff --git a/res/snippet/fluent_snippet_script-action_0002.md b/res/snippet/fluent_snippet_script-action_0002.md new file mode 100644 index 0000000..8053caf --- /dev/null +++ b/res/snippet/fluent_snippet_script-action_0002.md @@ -0,0 +1,21 @@ +# Script Action API example: creating a new Script Action to update an incident +```typescript +import { ScriptAction } from '@servicenow/sdk/core' + +ScriptAction({ + $id: Now.ID['update_incident_action'], + name: 'Update Incident Work Notes on custom event', + eventName: 'incident.custom.update', + script: ` + var incidentGR = new GlideRecord('incident'); + if (incidentGR.get(current.sys_id)) { + incidentGR.work_notes = 'Event processed: ' + event.name + ' with parameter: ' + event.parm1; + incidentGR.update(); + } + }`, + active: true, + description: 'Updates the work notes of an incident when the incident.custom.update event is fired.', + order: 200, + conditionScript: "current.active == true" +}) +``` \ No newline at end of file diff --git a/res/spec/fluent_spec_script-action.md b/res/spec/fluent_spec_script-action.md new file mode 100644 index 0000000..0a521aa --- /dev/null +++ b/res/spec/fluent_spec_script-action.md @@ -0,0 +1,16 @@ +#**Context:** Script Action API spec: Used to create a new Script Action (`sysevent_script_action`) in ServiceNow. Script Actions are server-side scripts that run in response to events. +```typescript +import { ScriptAction } from '@servicenow/sdk/core'; + +// Creates a new Script Action (`sysevent_script_action`) +ScriptAction({ + $id: '', // string | guid, mandatory. A unique identifier for the script action. + name: '', // string, mandatory. The name of the script action. + eventName: '', // string, mandatory. The name of the event that triggers this script action. + script: '', // mandatory. A server-side script that runs when triggered by an event. This property supports a function from a JavaScript module, a reference to another file in the application that contains a script, or inline JavaScript. Format:- For functions, use the name of a function, function expression, or default function exported from a JavaScript module and import it into the .now.ts file. For information about JavaScript modules, see JavaScript modules and third-party libraries. - To use text content from another file, refer to a file in the application using the following format: Now.include('path/to/file'). - To provide an inline script, use string literals or template literals for multiple lines of code: 'Script' or `Script`. + active: true, // boolean, optional. Whether the script action is active. Defaults to true. + description: '', // string, optional. A description of what the script action does. + order: 100, // number, optional. The order of execution for script actions on the same event. Lower numbers execute first. Defaults to 100. + conditionScript: '', // string, optional. A server-side script that must evaluate to true for the script action to run. For example: "gs.hasRole('admin')" +}); +``` \ No newline at end of file From dce6e260f0d2cfab6ae3d1c15729213e89a85d1d Mon Sep 17 00:00:00 2001 From: modesty Date: Mon, 6 Oct 2025 17:06:12 -0700 Subject: [PATCH 07/11] res: add resources for service portal, also add prompt for create custom UI --- .../fluent_instruct_service-portal.md | 64 ++++++++++++++ res/prompt/create_custom_ui.md | 83 +++++++++++++++++++ .../fluent_snippet_service-portal_0001.md | 23 +++++ .../fluent_snippet_service-portal_0002.md | 27 ++++++ .../fluent_snippet_service-portal_0003.md | 29 +++++++ .../fluent_snippet_service-portal_0004.md | 45 ++++++++++ .../fluent_snippet_service-portal_0005.md | 26 ++++++ .../fluent_snippet_service-portal_0006.md | 24 ++++++ .../fluent_snippet_service-portal_0007.md | 22 +++++ .../fluent_snippet_service-portal_0008.md | 33 ++++++++ .../fluent_snippet_service-portal_0009.md | 19 +++++ .../fluent_snippet_service-portal_0010.md | 31 +++++++ .../fluent_snippet_service-portal_0011.md | 35 ++++++++ .../fluent_snippet_service-portal_0012.md | 29 +++++++ .../fluent_snippet_service-portal_0013.md | 37 +++++++++ .../fluent_snippet_service-portal_0014.md | 29 +++++++ .../fluent_snippet_service-portal_0015.md | 31 +++++++ res/spec/fluent_spec_service-portal.md | 66 +++++++++++++++ 18 files changed, 653 insertions(+) create mode 100644 res/instruct/fluent_instruct_service-portal.md create mode 100644 res/prompt/create_custom_ui.md create mode 100644 res/snippet/fluent_snippet_service-portal_0001.md create mode 100644 res/snippet/fluent_snippet_service-portal_0002.md create mode 100644 res/snippet/fluent_snippet_service-portal_0003.md create mode 100644 res/snippet/fluent_snippet_service-portal_0004.md create mode 100644 res/snippet/fluent_snippet_service-portal_0005.md create mode 100644 res/snippet/fluent_snippet_service-portal_0006.md create mode 100644 res/snippet/fluent_snippet_service-portal_0007.md create mode 100644 res/snippet/fluent_snippet_service-portal_0008.md create mode 100644 res/snippet/fluent_snippet_service-portal_0009.md create mode 100644 res/snippet/fluent_snippet_service-portal_0010.md create mode 100644 res/snippet/fluent_snippet_service-portal_0011.md create mode 100644 res/snippet/fluent_snippet_service-portal_0012.md create mode 100644 res/snippet/fluent_snippet_service-portal_0013.md create mode 100644 res/snippet/fluent_snippet_service-portal_0014.md create mode 100644 res/snippet/fluent_snippet_service-portal_0015.md create mode 100644 res/spec/fluent_spec_service-portal.md diff --git a/res/instruct/fluent_instruct_service-portal.md b/res/instruct/fluent_instruct_service-portal.md new file mode 100644 index 0000000..1266403 --- /dev/null +++ b/res/instruct/fluent_instruct_service-portal.md @@ -0,0 +1,64 @@ +# Instructions for Fluent Service Portal APIs + +Always reference the Service Portal API specifications for more details. + +## SpWidget API + +1. **Templates and Controllers**: + - Use AngularJS data binding: `{{c.data.property}}` (controller accessible as `c` by default) + - Override controller alias with `controllerAs` property if needed + - Use `cssTemplate` for simple styles, `sassSrc` for complex SCSS with variables + +2. **Scripts**: + - **Client script**: AngularJS controller function. Use `c.server.get()` or `c.server.update()` to communicate with server + - **Server script**: Runs before rendering. Access `input`, store data in `data`, use `options` for widget configuration + - **Link function**: Only for direct DOM manipulation. Avoid unless necessary + +3. **Configuration**: + - Define `optionSchema` as JSON array for configurable widgets: `{name, label, type, default_value}` + - Use `field_list` to specify which fields from `dataTable` are available + - Set `controllable: true` to allow widget communication via events (`$scope.$on()`) + +4. **Security**: + - Set `roles` property to restrict visibility + - Use `public: true` for unauthenticated access + - Always check `gs.hasRole()` in server script for sensitive operations + +5. **Dependencies**: + - Use `scriptIncludes` array for server-side script includes + - Create SPWidgetDependency records for client-side libraries + +## SPWidgetDependency API + +1. **Loading**: + - Use `order` to control load sequence (lower numbers load first, default: 100) + - Separate multiple URLs with newlines in `jsIncludes` or `cssIncludes` + +2. **Angular Modules**: + - Set `angularModuleName` when including Angular modules + - Module name must match the actual Angular module name + +3. **Inline Code**: + - Include inline JavaScript or CSS directly for small utilities + - Use `version` property to track external library versions + +## SpAngularProvider API + +1. **Provider Types** (lowercase): + - **service**: Business logic, instantiated as singleton with `new` + - **factory**: Returns object/function, more flexible than service + - **directive**: Reusable UI components. Use `restrict: 'E'` for elements, `'A'` for attributes + - **filter**: Data transformation in templates. Keep pure functions + - **constant**: Immutable configuration values + - **value**: Simple values that can be overridden + - **provider**: Advanced configuration with `$get` method + +2. **Best Practices**: + - Inject dependencies as function parameters: `$http`, `$q`, `$timeout`, `$sce` + - Set `restricted: true` and specify `roles` for role-based access + - Name services/factories in PascalCase, directives/filters in camelCase + +3. **Common Issues**: + - Avoid heavy computations in filters (run on every digest cycle) + - Don't manipulate DOM in services/factories - use directives + - Always handle promise rejections with error callbacks diff --git a/res/prompt/create_custom_ui.md b/res/prompt/create_custom_ui.md new file mode 100644 index 0000000..c24a37a --- /dev/null +++ b/res/prompt/create_custom_ui.md @@ -0,0 +1,83 @@ +# Create a Custom UI with Framework You Choose + +Starting Fluent v4, you can create custom UIs using frameworks of your choice, such as React, Svelte, Vue.js, or SolidJS. This guide will walk you through the steps to set up a custom UI project. + +Fluent (ServiceNow SDK) supports building front-end applications with standard frameworks to run on ServiceNow! For this first release, we are natively supporting [React](https://react.dev/) out of the box, and we are aiming to support a "bring your own front end" (BYOF) approach. This new feature will let you use a more modern development experience for building UI applications. + +To get started building front ends, simply choose a template with included front-end framework support such as now-sdk + fullstack React when running init to get started! + +This is just the beginning of the BYOF support we are adding to the SDK and we will be following up soon with more support for providing your own bundler and tooling for other frameworks like Svelte, Vue, etc... + +## How does it work + +Front-end applications utilize the `UiPage` Fluent API for bundling and hosting the application and its entry point. The SDK detects importing from an .html page that is being assigned to the html attribute on `UiPage` Fluent API and bundles your front end into static assets served with your application. +By default, the front-end application code lives in your src/client directory (configurable in now.config.json with the clientDir property). Add all your images, style sheets, fonts, etc. here the same way you would for any typical React application that you're building. The out of the box bundler we have included is [Rollup](https://rollupjs.org/) to package up the your front end application. + +Example with React: + +```typescript +import { UiPage } from '@servicenow/sdk/core' +import indexPage from '../client/index.html' + +UiPage({ + $id: Now.ID['sample-frontend'], + endpoint: 'x_sampleapp-uipage-fe.do', + description: 'Sample Front-End Application', + category: 'general', + html: indexPage, + direct: true, +}) +``` + +In the `src/client` folder create an `index.html` page like this: + +```html + + + Sample Front-End Application + + + + + + + + +
+ + +``` + +In the `src/client/*` folder add a `main.tsx` file with your React code, CSS, and other assets to build your application. + +```tsx +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './app' + +const rootElement = document.getElementById('root') +if (rootElement) { + ReactDOM.createRoot(rootElement).render( + + + + ) +} +``` + +When you are ready, just build and install then open the UI Page on the instance to view your application! + +- React Sample: https://github.com/ServiceNow/sdk-examples/tree/main/react-ui-page-ts-sample +- Svelte Sample: https://github.com/ServiceNow/sdk-examples/tree/main/svelte-ui-page-sample +- Vue Sample: https://github.com/ServiceNow/sdk-examples/tree/main/vue-ui-page-sample +- SolidJS Sample: https://github.com/ServiceNow/sdk-examples/tree/main/solidjs-ui-page-sample + +## Limitations + +- Only hash routing is currently supported by UI Pages. +- Maximum file size of assets is limited to the `com.glide.attachment.max_size` system property +- Preloading content linked from HTML isn't supported (`rel="preload"`) +- Relative style sheets linked from HTML aren't supported (`rel="stylesheet"`). Import your style sheets into code instead (`import "path/to/style-sheet"`) +- Relative @import in CSS isn't supported +- CSS modules aren't supported +- Server-side rendering and React server components aren't supported diff --git a/res/snippet/fluent_snippet_service-portal_0001.md b/res/snippet/fluent_snippet_service-portal_0001.md new file mode 100644 index 0000000..4a46e0c --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0001.md @@ -0,0 +1,23 @@ +# Create a simple Service Portal widget with HTML template, CSS, and server script + +```typescript +import { SpWidget } from '@servicenow/sdk/core' + +SpWidget({ + $id: Now.ID['hello_world_widget'], + name: 'Hello World', + description: 'A simple hello world widget', + htmlTemplate: `
+
Hello World Widget
+
+ {{c.data.greeting}} +
+
`, + cssTemplate: `.panel { + margin-bottom: 20px; +}`, + serverScript: `(function() { + data.greeting = "Hello, World!"; +})();`, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0002.md b/res/snippet/fluent_snippet_service-portal_0002.md new file mode 100644 index 0000000..525c7e9 --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0002.md @@ -0,0 +1,27 @@ +# Create a Service Portal widget with client script for interactivity + +```typescript +import { SpWidget } from '@servicenow/sdk/core' + +SpWidget({ + $id: Now.ID['interactive_widget'], + name: 'Interactive Widget', + description: 'Widget with client-side interaction', + htmlTemplate: `
+

{{c.data.title}}

+ +

{{c.data.message}}

+
`, + clientScript: `function() { + var c = this; + + c.refresh = function() { + c.server.refresh(); + }; +}`, + serverScript: `(function() { + data.title = "Interactive Example"; + data.message = "Click the button to refresh the widget"; +})();`, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0003.md b/res/snippet/fluent_snippet_service-portal_0003.md new file mode 100644 index 0000000..d93aed4 --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0003.md @@ -0,0 +1,29 @@ +# Create a Service Portal widget with option schema for configuration + +```typescript +import { SpWidget } from '@servicenow/sdk/core' + +SpWidget({ + $id: Now.ID['configurable_widget'], + name: 'Configurable Widget', + description: 'Widget with configurable options', + htmlTemplate: `
+

{{c.options.title}}

+

{{c.options.message}}

+
`, + optionSchema: `[ + { + "name": "title", + "label": "Widget Title", + "type": "string", + "default_value": "Default Title" + }, + { + "name": "message", + "label": "Message", + "type": "string", + "default_value": "Default message text" + } +]`, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0004.md b/res/snippet/fluent_snippet_service-portal_0004.md new file mode 100644 index 0000000..ebcdd08 --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0004.md @@ -0,0 +1,45 @@ +# Create a Service Portal widget with SASS styling + +```typescript +import { SpWidget } from '@servicenow/sdk/core' + +SpWidget({ + $id: Now.ID['sass_styled_widget'], + name: 'SASS Styled Widget', + description: 'Widget using SASS for styling', + htmlTemplate: `
+
+

{{c.data.title}}

+
+
+

{{c.data.content}}

+
+
`, + sassSrc: `$primary-color: #337ab7; +$padding: 15px; + +.custom-widget { + padding: $padding; + border: 1px solid #ddd; + + .widget-header { + background-color: $primary-color; + color: white; + padding: $padding / 2; + margin: -$padding -$padding $padding -$padding; + + h3 { + margin: 0; + } + } + + .widget-body { + padding: $padding / 2; + } +}`, + serverScript: `(function() { + data.title = "SASS Example"; + data.content = "This widget uses SASS for styling"; +})();`, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0005.md b/res/snippet/fluent_snippet_service-portal_0005.md new file mode 100644 index 0000000..95466d4 --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0005.md @@ -0,0 +1,26 @@ +# Create a Service Portal widget with link function for DOM manipulation + +```typescript +import { SpWidget } from '@servicenow/sdk/core' + +SpWidget({ + $id: Now.ID['link_function_widget'], + name: 'Widget with Link Function', + description: 'Widget demonstrating link function usage', + htmlTemplate: `
+

Link Function Example

+
+
`, + linkFunction: `function(scope, element, attrs, controller) { + // Direct DOM manipulation using link function + var contentDiv = element.find('#dynamic-content'); + contentDiv.html('

Content added via link function

'); + + // Access controller data + contentDiv.append('

Server data: ' + controller.data.message + '

'); +}`, + serverScript: `(function() { + data.message = "Hello from server"; +})();`, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0006.md b/res/snippet/fluent_snippet_service-portal_0006.md new file mode 100644 index 0000000..5a4b328 --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0006.md @@ -0,0 +1,24 @@ +# Create a Service Portal widget with role-based access control + +```typescript +import { SpWidget } from '@servicenow/sdk/core' + +SpWidget({ + $id: Now.ID['admin_widget'], + name: 'Admin Only Widget', + description: 'Widget restricted to admin role', + htmlTemplate: `
+

Administrator Dashboard

+

{{c.data.adminMessage}}

+
`, + serverScript: `(function() { + // Server-side role check + if (gs.hasRole('admin')) { + data.adminMessage = "Welcome, Administrator!"; + } else { + data.adminMessage = "Access Denied"; + } +})();`, + roles: 'admin', +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0007.md b/res/snippet/fluent_snippet_service-portal_0007.md new file mode 100644 index 0000000..33ea5bd --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0007.md @@ -0,0 +1,22 @@ +# Create a Service Portal widget dependency for custom JavaScript utilities + +```typescript +import { SPWidgetDependency } from '@servicenow/sdk/core' + +SPWidgetDependency({ + $id: Now.ID['custom_utilities'], + name: 'Custom Utilities', + jsIncludes: `// Custom utility functions +(function() { + window.customUtils = { + formatDate: function(date) { + return new Date(date).toLocaleDateString(); + }, + formatCurrency: function(amount) { + return '$' + parseFloat(amount).toFixed(2); + } + }; +})();`, + order: 100, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0008.md b/res/snippet/fluent_snippet_service-portal_0008.md new file mode 100644 index 0000000..588ffd5 --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0008.md @@ -0,0 +1,33 @@ +# Create a Service Portal widget dependency for custom CSS styles + +```typescript +import { SPWidgetDependency } from '@servicenow/sdk/core' + +SPWidgetDependency({ + $id: Now.ID['custom_styles'], + name: 'Custom Portal Styles', + cssIncludes: `/* Custom CSS for portal widgets */ +.custom-card { + background: white; + border: 1px solid #ddd; + border-radius: 4px; + padding: 15px; + margin-bottom: 15px; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +.custom-button { + background-color: #337ab7; + color: white; + border: none; + padding: 10px 15px; + border-radius: 3px; + cursor: pointer; +} + +.custom-button:hover { + background-color: #286090; +}`, + order: 50, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0009.md b/res/snippet/fluent_snippet_service-portal_0009.md new file mode 100644 index 0000000..808dc8f --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0009.md @@ -0,0 +1,19 @@ +# Create a Service Portal widget dependency with Angular module + +```typescript +import { SPWidgetDependency } from '@servicenow/sdk/core' + +SPWidgetDependency({ + $id: Now.ID['custom_angular_module'], + name: 'Custom Angular Module', + angularModuleName: 'customModule', + jsIncludes: `// Define custom Angular module +angular.module('customModule', []) + .service('customService', function() { + this.getMessage = function() { + return 'Hello from custom service'; + }; + });`, + order: 200, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0010.md b/res/snippet/fluent_snippet_service-portal_0010.md new file mode 100644 index 0000000..d7e6fbe --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0010.md @@ -0,0 +1,31 @@ +# Create a Service Portal Angular Provider as a service + +```typescript +import { SpAngularProvider } from '@servicenow/sdk/core' + +SpAngularProvider({ + $id: Now.ID['data_service'], + name: 'DataService', + type: 'service', + script: `function($http) { + var service = this; + + service.getData = function() { + return $http.get('/api/now/table/incident?sysparm_limit=10') + .then(function(response) { + return response.data.result; + }); + }; + + service.processData = function(data) { + return data.map(function(item) { + return { + id: item.sys_id, + number: item.number, + description: item.short_description + }; + }); + }; +}`, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0011.md b/res/snippet/fluent_snippet_service-portal_0011.md new file mode 100644 index 0000000..cee56d4 --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0011.md @@ -0,0 +1,35 @@ +# Create a Service Portal Angular Provider as a factory + +```typescript +import { SpAngularProvider } from '@servicenow/sdk/core' + +SpAngularProvider({ + $id: Now.ID['utility_factory'], + name: 'UtilityFactory', + type: 'factory', + script: `function() { + return { + formatDate: function(dateString) { + if (!dateString) return ''; + var date = new Date(dateString); + return date.toLocaleDateString(); + }, + + truncate: function(text, length) { + if (!text) return ''; + if (text.length <= length) return text; + return text.substring(0, length) + '...'; + }, + + getStatusClass: function(status) { + var statusMap = { + 'new': 'label-primary', + 'in_progress': 'label-warning', + 'closed': 'label-success' + }; + return statusMap[status] || 'label-default'; + } + }; +}`, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0012.md b/res/snippet/fluent_snippet_service-portal_0012.md new file mode 100644 index 0000000..3f47d1d --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0012.md @@ -0,0 +1,29 @@ +# Create a Service Portal Angular Provider as a directive + +```typescript +import { SpAngularProvider } from '@servicenow/sdk/core' + +SpAngularProvider({ + $id: Now.ID['loading_spinner_directive'], + name: 'loadingSpinner', + type: 'directive', + script: `function() { + return { + restrict: 'E', + scope: { + show: '=' + }, + template: '
' + + '' + + '
', + link: function(scope, element, attrs) { + // Add custom styling + element.find('.loading-spinner').css({ + 'text-align': 'center', + 'padding': '20px' + }); + } + }; +}`, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0013.md b/res/snippet/fluent_snippet_service-portal_0013.md new file mode 100644 index 0000000..c61a632 --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0013.md @@ -0,0 +1,37 @@ +# Create a Service Portal Angular Provider as a filter + +```typescript +import { SpAngularProvider } from '@servicenow/sdk/core' + +SpAngularProvider({ + $id: Now.ID['time_ago_filter'], + name: 'timeAgo', + type: 'filter', + script: `function() { + return function(dateString) { + if (!dateString) return ''; + + var date = new Date(dateString); + var now = new Date(); + var seconds = Math.floor((now - date) / 1000); + + var interval = Math.floor(seconds / 31536000); + if (interval >= 1) return interval + ' year' + (interval > 1 ? 's' : '') + ' ago'; + + interval = Math.floor(seconds / 2592000); + if (interval >= 1) return interval + ' month' + (interval > 1 ? 's' : '') + ' ago'; + + interval = Math.floor(seconds / 86400); + if (interval >= 1) return interval + ' day' + (interval > 1 ? 's' : '') + ' ago'; + + interval = Math.floor(seconds / 3600); + if (interval >= 1) return interval + ' hour' + (interval > 1 ? 's' : '') + ' ago'; + + interval = Math.floor(seconds / 60); + if (interval >= 1) return interval + ' minute' + (interval > 1 ? 's' : '') + ' ago'; + + return 'just now'; + }; +}`, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0014.md b/res/snippet/fluent_snippet_service-portal_0014.md new file mode 100644 index 0000000..7a6bf87 --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0014.md @@ -0,0 +1,29 @@ +# Create a Service Portal Angular Provider as a constant + +```typescript +import { SpAngularProvider } from '@servicenow/sdk/core' + +SpAngularProvider({ + $id: Now.ID['app_config'], + name: 'APP_CONFIG', + type: 'constant', + script: `{ + apiVersion: 'v1', + itemsPerPage: 25, + defaultLanguage: 'en', + dateFormat: 'YYYY-MM-DD', + timeFormat: 'HH:mm:ss', + statusValues: { + NEW: 1, + IN_PROGRESS: 2, + CLOSED: 3, + CANCELLED: 4 + }, + errorMessages: { + generic: 'An error occurred. Please try again.', + notFound: 'The requested resource was not found.', + unauthorized: 'You do not have permission to access this resource.' + } +}`, +}) +``` diff --git a/res/snippet/fluent_snippet_service-portal_0015.md b/res/snippet/fluent_snippet_service-portal_0015.md new file mode 100644 index 0000000..fe8325c --- /dev/null +++ b/res/snippet/fluent_snippet_service-portal_0015.md @@ -0,0 +1,31 @@ +# Create a Service Portal Angular Provider with role restrictions + +```typescript +import { SpAngularProvider } from '@servicenow/sdk/core' + +SpAngularProvider({ + $id: Now.ID['admin_service'], + name: 'AdminService', + type: 'service', + script: `function($http) { + var service = this; + + service.performAdminAction = function(action) { + return $http.post('/api/x_custom/admin/action', { + action: action + }).then(function(response) { + return response.data; + }); + }; + + service.getSystemStats = function() { + return $http.get('/api/x_custom/admin/stats') + .then(function(response) { + return response.data.result; + }); + }; +}`, + restricted: true, + roles: 'admin', +}) +``` diff --git a/res/spec/fluent_spec_service-portal.md b/res/spec/fluent_spec_service-portal.md new file mode 100644 index 0000000..93f92b5 --- /dev/null +++ b/res/spec/fluent_spec_service-portal.md @@ -0,0 +1,66 @@ +# **Context**: Service Portal API spec: defines custom widgets, widget dependencies, and Angular providers for Service Portal pages + +## SpWidget API + +Creates a custom widget (`sp_widget`) to include on a portal page. Widgets are reusable UI components that display data and provide interactivity in Service Portal. + +```typescript +// Creates a new Service Portal Widget (sp_widget) +SpWidget({ + $id: '', // string | guid, mandatory + name: '', // string, mandatory, name of the widget + description: '', // string, optional, description of the widget's functionality + htmlTemplate: '', // string, optional, HTML template for the widget's client-side view + cssTemplate: '', // string, optional, CSS styling for the widget + clientScript: '', // string, optional, client-side controller script (AngularJS controller function) + serverScript: '', // string, optional, server-side script that runs before the widget is rendered + controllerAs: '', // string, optional, alias for the controller in the template (default: 'c') + demoData: '', // string, optional, JSON data used for widget preview/demo in Service Portal Designer + optionSchema: '', // string, optional, JSON schema defining configurable options for the widget + dataTable: '', // string, optional, primary table the widget interacts with + scriptIncludes: [], // string[], optional, array of script include sys_ids or names to be used in server script + sassSrc: '', // string, optional, SASS source for advanced styling with variables and nesting + linkFunction: '', // string, optional, AngularJS link function for direct DOM manipulation + controllable: false, // boolean, optional, whether the widget can be controlled by other widgets via events, default false + hasPreview: false, // boolean, optional, whether the widget has a preview template, default false + servicenowNative: false, // boolean, optional, indicates if this is a ServiceNow native widget, default false + internal: false, // boolean, optional, whether the widget is for internal use only, default false + public: false, // boolean, optional, whether the widget is available for public access, default false + roles: '', // string, optional, comma-separated list of roles required to view the widget + category: '', // string, optional, widget category for organization in Service Portal Designer + field_list: '', // string, optional, comma-separated list of fields from dataTable to be available in the widget +}) +``` + +## SPWidgetDependency API + +Creates a widget dependency (`sp_dependency`) to link JavaScript and CSS files to widgets and use third-party libraries, external style sheets, or Angular modules. + +```typescript +// Creates a new Service Portal Widget Dependency (sp_dependency) +SPWidgetDependency({ + $id: '', // string | guid, mandatory + name: '', // string, mandatory, name of the dependency + angularModuleName: '', // string, optional, name of the Angular module to be injected (for Angular dependencies) + jsIncludes: '', // string, optional, JavaScript code or URLs to include (multiple URLs separated by newlines) + cssIncludes: '', // string, optional, CSS code or URLs to include (multiple URLs separated by newlines) + source: '', // string, optional, source URL of the dependency (e.g., CDN URL) + version: '', // string, optional, version of the library/dependency for tracking + order: 100, // number, optional, load order for the dependency (lower numbers load first), default 100 +}) +``` + +## SpAngularProvider API + +Creates an Angular Provider (`sp_angular_provider`) to reuse components in multiple widgets and improve portal performance by centralizing common functionality. + +```typescript +// Creates a new Service Portal Angular Provider (sp_angular_provider) +SpAngularProvider({ + $id: '', // string | guid, mandatory + name: '', // string, mandatory, name of the Angular provider (used to inject into widgets) + type: '', // string, mandatory, type of Angular provider: 'service'|'factory'|'directive'|'filter'|'value'|'constant'|'provider' + script: '', // string, mandatory, JavaScript code defining the Angular provider implementation + restricted: false, // boolean, optional, whether access to the provider is restricted by roles, default false + roles: '', // string, optional, comma-separated list of roles required to use the provider (only applies when restricted=true) +}) From f2acb7b910d138ab4ceb4a985ddfe5b7192164b8 Mon Sep 17 00:00:00 2001 From: modesty Date: Mon, 6 Oct 2025 17:29:08 -0700 Subject: [PATCH 08/11] res: update resources for UiAction, no more Record API based solution --- res/instruct/fluent_instruct_ui-action.md | 96 +++++++++++++-- res/snippet/fluent_snippet_ui-action_0001.md | 18 --- res/snippet/fluent_snippet_ui-action_0002.md | 30 ----- res/snippet/fluent_snippet_ui-action_0003.md | 30 ----- res/snippet/fluent_snippet_ui-action_0004.md | 1 + res/snippet/fluent_snippet_ui-action_0005.md | 1 + res/snippet/fluent_snippet_ui-action_0006.md | 1 + res/snippet/fluent_snippet_ui-action_0007.md | 1 + res/snippet/fluent_snippet_ui-action_0008.md | 1 + res/snippet/fluent_snippet_ui-action_0009.md | 1 + res/snippet/fluent_snippet_ui-action_0010.md | 1 + res/spec/fluent_spec_ui-action.md | 119 +++++++++++-------- 12 files changed, 163 insertions(+), 137 deletions(-) create mode 100644 res/snippet/fluent_snippet_ui-action_0004.md create mode 100644 res/snippet/fluent_snippet_ui-action_0005.md create mode 100644 res/snippet/fluent_snippet_ui-action_0006.md create mode 100644 res/snippet/fluent_snippet_ui-action_0007.md create mode 100644 res/snippet/fluent_snippet_ui-action_0008.md create mode 100644 res/snippet/fluent_snippet_ui-action_0009.md create mode 100644 res/snippet/fluent_snippet_ui-action_0010.md diff --git a/res/instruct/fluent_instruct_ui-action.md b/res/instruct/fluent_instruct_ui-action.md index 4ce729e..6cfb146 100644 --- a/res/instruct/fluent_instruct_ui-action.md +++ b/res/instruct/fluent_instruct_ui-action.md @@ -1,10 +1,86 @@ -# Instructions for Fluent UI Action Spec API -1. Always reference the UI Action API specifications for more details. -2. Every `actionName` should always be prefixed with 'sysverb_'. -3. Set field `client` to true only when `onlick` field is specified with a function name. Else, its always default to false. -4. The function name in field `onlick` should always match the function name as defined in `clientScriptV2`, which is the inline Servicenow client side scripting. -5. If protection policy is specified to be set, then map to field `sysPolicy`. Else, completely skip the field from code generation. -6. Workspace form button corresponds to field name `formButtonV2`, hence, when specified, set value in `formButtonV2` field. -7. Workspace form menu corresponds to field name `formMenuButtonV2`, hence, when specified, set value in `formMenuButtonV2` field. -8. Set `formatForConfigurableWorkspace` to true only if workspace form button and workspace form menu is enabled, else, it's false. -9. List V2 compatible corresponds to `ui11_compatible` and List V3 compatible corresponds to `ui16Compatible`, hence, when specified, set value in appropriate field. \ No newline at end of file +# Instructions for Fluent UI Action API + +Always reference the UI Action API specifications for more details. + +## Import Statement + +1. **Always import UiAction**: Use `import { UiAction } from '@servicenow/sdk/core'` - the dedicated `UiAction` construct provides better type safety than the generic `Record` API. + +## Naming Conventions + +1. **actionName prefix**: Every `actionName` should always be prefixed with 'sysverb_' (e.g., `sysverb_save`, `sysverb_custom_action`). +1. **Unique identifiers**: Use descriptive `$id` values with `Now.ID['unique_identifier']` to avoid conflicts. + +## API Structure + +1. **Nested objects**: The UiAction API uses nested objects for logical grouping: `form`, `list`, `client`, and `workspace` objects contain related properties. +1. **Optional objects**: All nested objects are optional - only include them when you need to set properties within them. + +## Form Display Properties + +1. **form object**: Use the `form` object to control form-level display: `{ showButton, showLink, showContextMenu, style }`. +1. **showButton**: Set `form.showButton: true` to display as form button. +1. **showLink**: Set `form.showLink: true` to display as related link on form. +1. **showContextMenu**: Set `form.showContextMenu: true` to display in form context menu (right-click). +1. **style**: Use `form.style` to set button styling: `'primary'`, `'destructive'`, or `'unstyled'`. + +## List Display Properties + +1. **list object**: Use the `list` object to control list-level display: `{ showButton, showLink, showContextMenu, style, showListChoice, showBannerButton, showSaveWithFormButton }`. +1. **showButton**: Set `list.showButton: true` to display as list button. +1. **showListChoice**: Set `list.showListChoice: true` to display in list choice menu. +1. **showBannerButton**: Set `list.showBannerButton: true` to display as banner button. +1. **showContextMenu**: Set `list.showContextMenu: true` to display in list context menu. + +## Client-Side Scripting + +1. **client object**: Use the `client` object for client-side script configuration: `{ isClient, isUi11Compatible, isUi16Compatible, onClick }`. +1. **isClient**: Set `client.isClient: true` when using client-side scripts. +1. **onClick**: Use `client.onClick` to specify the function name to execute (e.g., `'onClickFunction(g_form)'`). +1. **script property**: The `script` property (at root level) contains the actual function definition that will be called by onClick. +1. **Return values**: Client scripts should return `true` to proceed with default action, or `false` to prevent it. + +## Workspace Compatibility + +1. **workspace object**: Use the `workspace` object for workspace configuration: `{ isConfigurableWorkspace, showFormButtonV2, showFormMenuButtonV2, clientScriptV2 }`. +1. **isConfigurableWorkspace**: Set `workspace.isConfigurableWorkspace: true` to enable workspace compatibility. +1. **showFormButtonV2**: Set `workspace.showFormButtonV2: true` for workspace form buttons. +1. **showFormMenuButtonV2**: Set `workspace.showFormMenuButtonV2: true` for workspace form menu items. +1. **clientScriptV2**: Use `workspace.clientScriptV2` to define workspace-specific client scripts (alternative to root-level `script`). + +## UI Compatibility + +1. **isUi16Compatible**: Set `client.isUi16Compatible: true` for UI16/Next Experience compatibility (List V3). +1. **isUi11Compatible**: Set `client.isUi11Compatible: true` for UI11 compatibility (List V2). + +## Display Conditions + +1. **showInsert/showUpdate**: Use `showInsert: true` for new records, `showUpdate: true` for existing records, or both to show on all forms. +1. **condition field**: Use server-side condition scripts to control visibility (e.g., `'gs.hasRole("admin")'`, `'current.state != 6'`). Conditions are evaluated server-side. +1. **Complex conditions**: Combine multiple conditions with `&&` and `||` operators (e.g., `'current.priority <= 2 && current.state != 6 && gs.hasRole("itil")'`). + +## Additional Properties + +1. **order field**: Use `order` property to control display sequence - lower numbers appear first (default is 100). +1. **comments**: Always add descriptive `comments` for documentation purposes. +1. **hint**: Use `hint` for tooltip text shown on hover. +1. **messages**: Use `messages` array for user-facing messages or notifications (e.g., `messages: ['Success message']`). +1. **roles**: Use `roles` array to restrict access to specific roles (e.g., `roles: ['admin', 'itil']`). + +## Best Practices + +1. **Server-side vs client-side**: If no user interaction is needed, omit the `client` object entirely - the UI Action will perform server-side action only. +1. **Error handling**: Always validate data in client scripts before processing (check for null/empty values). +1. **User feedback**: Use `g_form.addInfoMessage()`, `g_form.addErrorMessage()`, or `g_form.addWarningMessage()` to provide clear feedback. +1. **List actions**: For list actions using `g_list.getChecked()`, always verify that records are selected before processing. +1. **Confirmation dialogs**: Use `confirm()` for destructive actions to prevent accidental execution. +1. **isolateScript**: Set `isolateScript: true` for enhanced security when running scripts in strict mode, though this limits access to DOM and global objects. + +## Common Pitfalls + +1. **Nested structure**: Don't use flat properties like `formButton: true` - use `form: { showButton: true }` instead. +1. **script vs clientScriptV2**: Use `script` at root level for standard forms, or `workspace.clientScriptV2` for workspace-specific scripts. +1. **Active state**: Ensure `active: true` is set, otherwise the UI Action won't be visible to users. +1. **Role-based conditions**: Always test conditions with appropriate user roles to ensure visibility works as expected. +1. **GlideAjax calls**: When using GlideAjax in client scripts, ensure the corresponding Script Include is client-callable. +1. **messages array**: Remember `messages` is an array of strings, not a single string. diff --git a/res/snippet/fluent_snippet_ui-action_0001.md b/res/snippet/fluent_snippet_ui-action_0001.md index 3af8c55..8b13789 100644 --- a/res/snippet/fluent_snippet_ui-action_0001.md +++ b/res/snippet/fluent_snippet_ui-action_0001.md @@ -1,19 +1 @@ -# create a new UI Action on incident table, showing message and hint on UI action for mouse hover on the record. Needs user to have 'admin' role for this UI action to be executed. -```typescript -import { Record } from '@servicenow/sdk/core' -Record({ - $id: Now.ID['rec5'], - table: 'sys_ui_action', - data: { - name: 'Submit', - table: 'incident', - actionName: 'sysverb_insert', - comments: 'test comment', - condition: 'gs.hasRole("admin");', - hint: 'Test hint on mouse hover', - messages: 'Test message hint on mouse hover', - order: 10, - }, -}) -``` \ No newline at end of file diff --git a/res/snippet/fluent_snippet_ui-action_0002.md b/res/snippet/fluent_snippet_ui-action_0002.md index 2d0e80c..8b13789 100644 --- a/res/snippet/fluent_snippet_ui-action_0002.md +++ b/res/snippet/fluent_snippet_ui-action_0002.md @@ -1,31 +1 @@ -# create a new UI Action on incident table, showing message and hint on UI action mouse hover on the record. Needs user to have 'admin' role for this UI action to be executed. This UI action has a protection policy of 'read' only. Also, defining client scripts to show info message on onClick function, both on form and workspace form, which sets the 'client' field to true since 'onlick' function is specified. -```typescript -import { Record } from '@servicenow/sdk/core' -Record({ - $id: Now.ID['rec0'], - table: 'sys_ui_action', - data: { - name: 'Submit', - script: `function onClickFunction() { - // Display info message - g_form.addInfoMessage("Dummy function call for onlick action from workspace"); - // Return false to prevent default action - return false; -}`, - table: 'incident', - actionName: 'sysverb_insert', - active: true, - client: true, - ui16Compatible: true, - formatForConfigurableWorkspace: true, - comments: 'test comment', - condition: 'gs.hasRole("admin");', - hint: 'Test hint on mouse hover', - messages: 'Test message on mouse hover', - onclick: 'onClickFunction()', - sysOverrides: '', - sysPolicy: 'read', - }, -}) -``` \ No newline at end of file diff --git a/res/snippet/fluent_snippet_ui-action_0003.md b/res/snippet/fluent_snippet_ui-action_0003.md index fcd4927..8b13789 100644 --- a/res/snippet/fluent_snippet_ui-action_0003.md +++ b/res/snippet/fluent_snippet_ui-action_0003.md @@ -1,31 +1 @@ -# create a new UI Action on incident table, showing message and hint on UI action mouse hover on the record. Needs user to have 'admin' role for this UI action to be executed. This UI action has a protection policy of 'read' only. Also, defining client scripts to show info message on onClick function, both on form and workspace form, which sets the 'client' field to true since 'onlick' function is specified. -```typescript -import { Record } from '@servicenow/sdk/core' -Record({ - $id: Now.ID['rec0'], - table: 'sys_ui_action', - data: { - name: 'Submit', - table: 'incident', - actionName: 'sysverb_insert', - active: true, - client: true, - ui16Compatible: true, - formatForConfigurableWorkspace: true, - clientScriptV2: `function onClickFunction() { - // Display info message - g_form.addInfoMessage("Dummy function call for onlick action"); - // Return false to prevent default action - return false; -}`, - comments: 'test comment', - condition: 'gs.hasRole("admin");', - hint: 'Test hint on mouse hover', - messages: 'Test message on mouse hover', - onclick: 'onClickFunction()', - sysOverrides: '', - sysPolicy: 'read', - }, -}) -``` \ No newline at end of file diff --git a/res/snippet/fluent_snippet_ui-action_0004.md b/res/snippet/fluent_snippet_ui-action_0004.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-action_0004.md @@ -0,0 +1 @@ + diff --git a/res/snippet/fluent_snippet_ui-action_0005.md b/res/snippet/fluent_snippet_ui-action_0005.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-action_0005.md @@ -0,0 +1 @@ + diff --git a/res/snippet/fluent_snippet_ui-action_0006.md b/res/snippet/fluent_snippet_ui-action_0006.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-action_0006.md @@ -0,0 +1 @@ + diff --git a/res/snippet/fluent_snippet_ui-action_0007.md b/res/snippet/fluent_snippet_ui-action_0007.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-action_0007.md @@ -0,0 +1 @@ + diff --git a/res/snippet/fluent_snippet_ui-action_0008.md b/res/snippet/fluent_snippet_ui-action_0008.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-action_0008.md @@ -0,0 +1 @@ + diff --git a/res/snippet/fluent_snippet_ui-action_0009.md b/res/snippet/fluent_snippet_ui-action_0009.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-action_0009.md @@ -0,0 +1 @@ + diff --git a/res/snippet/fluent_snippet_ui-action_0010.md b/res/snippet/fluent_snippet_ui-action_0010.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-action_0010.md @@ -0,0 +1 @@ + diff --git a/res/spec/fluent_spec_ui-action.md b/res/spec/fluent_spec_ui-action.md index c793a60..ac2c965 100644 --- a/res/spec/fluent_spec_ui-action.md +++ b/res/spec/fluent_spec_ui-action.md @@ -1,51 +1,72 @@ -#**Context:** UI Action spec: define UI Actions [sys_ui_action] to enhance interactivity and customization in user interfaces. UI Actions include buttons, context menu items and related links of forms. +#**Context:** UI Action API spec: define UI Actions [sys_ui_action] to enhance interactivity and customization in user interfaces. UI Actions include buttons, context menu items and related links on forms and lists. Use the dedicated `UiAction` construct for cleaner, type-safe UI Action definitions. + ```typescript -// Creates a new UI Action (`sys_ui_action`) -const uiAction = Record({ - $id: '', // string | guid, mandatory - table: 'sys_ui_action', // string, mandatory, should always be 'sys_ui_action' - data: { - name: '', // string, mandatory - script: '', // ServiceNow script to fullfil the functional request in scripting, // string, inline ServiceNow client side scripting, function to be referenced for onClick action for workspace form button and workspace form menu. The script is based on devrequest. Example of function definition - /* - function onClickFunction(g_form) {} - */ - table: '', // string, mandatory - actionName: '', // string, mandatory , should always begin with 'sysverb_' - active: true, //boolean - client: false, //boolean. Default is false. Set to true only when onclick function specified - formAction: false, // boolean - formButton: false, // boolean - formButtonV2: false, // boolean - formContextMenu: false, // boolean - formLink: false, // boolean - formMenuButtonV2: false, // boolean - formatForConfigurableWorkspace: false, // boolean - isolateScript: false, // boolean - listAction: false, // boolean - listBannerButton: false, // boolean - listButton: false, // boolean - listChoice: false, // boolean - listContextMenu: false, // boolean - listLink: false, // boolean - listSaveWithFormButton: false, // boolean - showInsert: false, // boolean - showMultipleUpdate: false, // boolean - showQuery: false, // boolean - showUpdate: false, // boolean - ui16Compatible: false, // boolean - clientScriptV2: '', // ServiceNow script to fullfil the functional request in scripting, // string, inline ServiceNow client side scripting, function to be referenced for onClick action. The script is based on devrequest. Example of function deinifition - /* - function onClickFunction(g_form) {} - */ - comments: '', // string, max length is 4000 characters - condition: '', // String, max length 254 characters, condition string is inline glide scripting expression or logic, ex: current.active == true && current.type == 'internal' && new sn_ais.StatusApi().isAisEnabled() - hint: '', // string, max length is 254 characters - messages: '', //string, max length is 4000 characters - onclick: '', // a referenced function defined in current module under clientScriptV2 or script, based on devrequest. eg. onClickFunction() - sysOverrides: '', // string | guid - order: 100, // Integer, default is 100 - sysPolicy: '', //string, 'read' | 'protected'. This is the protection policy. +import { UiAction } from '@servicenow/sdk/core'; + +// Creates a new UI Action (`sys_ui_action`) using the UiAction construct +UiAction({ + $id: '', // string | guid, mandatory - Unique identifier for the UI Action + table: '', // string, mandatory - Table on which UI Action appears + name: '', // string, mandatory - Name of the UI Action. It must be unique within the table + actionName: '', // string, optional - Unique string that can be referenced in scripts + active: true, // boolean, optional - If true, the UI Action is enabled + + // UI action on form view and related properties + form: { // object, optional - UI action on form view and related properties + showButton: false, // boolean, optional - Display as form button + showLink: false, // boolean, optional - Display as form link + showContextMenu: false, // boolean, optional - Display in form context menu + style: '', // string, optional - 'primary' | 'destructive' | 'unstyled' }, -}) -``` \ No newline at end of file + + // UI action on list view and related properties + list: { // object, optional - UI action on list view and related properties + showButton: false, // boolean, optional - Display as list button + showLink: false, // boolean, optional - Display as list link + showContextMenu: false, // boolean, optional - Display in list context menu + style: '', // string, optional - 'primary' | 'destructive' | 'unstyled' + showListChoice: false, // boolean, optional - Display in list choice menu + showBannerButton: false, // boolean, optional - Display as banner button on list + showSaveWithFormButton: false, // boolean, optional - Display as save with form button + }, + + // Client side script and related properties + client: { // object, optional - Client side script and related properties + isClient: false, // boolean, optional - Set to true when using client-side script + isUi11Compatible: false, // boolean, optional - Compatible with UI11 (List V2) + isUi16Compatible: false, // boolean, optional - Compatible with UI16/Next Experience (List V3) + onClick: '', // string, optional - Client-side function to execute on click + }, + + // UI action on workspace configuration and related properties + workspace: { // object, optional - UI action on workspace configuration and related properties + isConfigurableWorkspace: false, // boolean, optional - Enable for configurable workspace + showFormButtonV2: false, // boolean, optional - Display as workspace form button + showFormMenuButtonV2: false, // boolean, optional - Display as workspace form menu button + clientScriptV2: '', // string, optional - Client-side script for workspace + }, + + // Display conditions - Control when UI Action is visible + showInsert: false, // boolean, optional - Checked, the UI Action appears in insert + showUpdate: false, // boolean, optional - Checked, the UI Action appears in update + showQuery: false, // boolean, optional - Checked, the UI Action appears in insert, update, query or update multiple(bulk edit) mode + showMultipleUpdate: false, // boolean, optional - Checked, the UI Action appears in insert, update, query or update multiple(bulk edit) mode + + // Scripts and conditions + condition: '', // string, optional - A script or condition that determines whether the UI Action is visible + script: '', // string | function, optional - Script runs automatically as part of the UI Action when the client calls it + // Note: server module scripts (sys_module) can only be used on server-side UI Actions + // Example: function(current) { gs.addInfoMessage('Action executed'); } + + // Additional properties + comments: '', // string, optional - Text field used by developers and admins to add internal notes + messages: [], // string[], optional - Messages field holds user facing messages or notification text that the UI Action may display when it executes + hint: '', // string, optional - A tooltip or hover text that appears when users hover their mouse pointer over + order: 100, // number, optional - Determines the order in which the UI Action appears. Lower values show first + isolateScript: false, // boolean, optional - Checked, script in a UI Action runs in an isolated script + overrides: '', // string | Record<'sys_ui_action'>, optional - Action being overridden by the current record + roles: [], // (string | Role)[], optional - Stores roles associated with a UI Action, defining which users can see or execute that UI Action based on their roles + includeInViews: [], // string[], optional - Specifies views in which UI action to be included + excludeFromViews: [], // string[], optional - Specifies views from which UI action to be excluded +}): UiAction; // returns a UiAction object +``` From c80dd8af55697d709d682b7a57e086894652716e Mon Sep 17 00:00:00 2001 From: modesty Date: Mon, 6 Oct 2025 17:44:29 -0700 Subject: [PATCH 09/11] res: add resources for UI Pge, which is the foundation for BYOF for custom UI --- res/instruct/fluent_instruct_ui-page.md | 173 +++++++++++++++++++++ res/snippet/fluent_snippet_ui-page_0001.md | 21 +++ res/snippet/fluent_snippet_ui-page_0002.md | 46 ++++++ res/snippet/fluent_snippet_ui-page_0003.md | 47 ++++++ res/snippet/fluent_snippet_ui-page_0004.md | 64 ++++++++ res/snippet/fluent_snippet_ui-page_0005.md | 52 +++++++ res/snippet/fluent_snippet_ui-page_0006.md | 52 +++++++ res/snippet/fluent_snippet_ui-page_0007.md | 89 +++++++++++ res/snippet/fluent_snippet_ui-page_0008.md | 78 ++++++++++ res/snippet/fluent_snippet_ui-page_0009.md | 55 +++++++ res/snippet/fluent_snippet_ui-page_0010.md | 96 ++++++++++++ res/spec/fluent_spec_ui-page.md | 58 +++++++ 12 files changed, 831 insertions(+) create mode 100644 res/instruct/fluent_instruct_ui-page.md create mode 100644 res/snippet/fluent_snippet_ui-page_0001.md create mode 100644 res/snippet/fluent_snippet_ui-page_0002.md create mode 100644 res/snippet/fluent_snippet_ui-page_0003.md create mode 100644 res/snippet/fluent_snippet_ui-page_0004.md create mode 100644 res/snippet/fluent_snippet_ui-page_0005.md create mode 100644 res/snippet/fluent_snippet_ui-page_0006.md create mode 100644 res/snippet/fluent_snippet_ui-page_0007.md create mode 100644 res/snippet/fluent_snippet_ui-page_0008.md create mode 100644 res/snippet/fluent_snippet_ui-page_0009.md create mode 100644 res/snippet/fluent_snippet_ui-page_0010.md create mode 100644 res/spec/fluent_spec_ui-page.md diff --git a/res/instruct/fluent_instruct_ui-page.md b/res/instruct/fluent_instruct_ui-page.md new file mode 100644 index 0000000..01ecfc0 --- /dev/null +++ b/res/instruct/fluent_instruct_ui-page.md @@ -0,0 +1,173 @@ +# Instructions for Fluent UI Page API + +Always reference the UI Page API specifications for more details. + +## Import Statement + +1. **Always import UiPage**: Use `import { UiPage } from '@servicenow/sdk/core'` - the dedicated `UiPage` construct provides better type safety than the generic `Record` API. + +## Naming Conventions + +1. **endpoint format**: Every `endpoint` must end with `.do` and should follow the format `_.do`. +1. **Unique identifiers**: Use descriptive `$id` values with `Now.ID['unique_identifier']` to avoid conflicts. +1. **Scoped naming**: Prefix page names with your application scope (e.g., `x_myapp_dashboard.do`). + +## Page Types + +1. **Standard UI Pages**: Default pages load with ServiceNow navigation and header (set `direct: false` or omit). +1. **Direct UI Pages**: Set `direct: true` to create standalone pages without ServiceNow chrome - useful for: + - Custom landing pages + - External-facing interfaces + - Embedded iframes + - Login pages or portals +1. **Category selection**: Choose appropriate category for organization: + - `general` - Most custom pages (default) + - `homepages` - Dashboard and landing pages + - `htmleditor` - Rich text editing interfaces + - `kb` - Knowledge base related pages + - `cms` - Content management pages + - `catalog` - Service catalog related pages + +## HTML Content + +1. **Static HTML**: Use the `html` property for simple static content with standard HTML/XHTML markup. +1. **Jelly templates**: Use Jelly tags (``, ``) for server-side dynamic content generation. +1. **UI Macros**: Reference UI Macros (e.g., ``) to use reusable ServiceNow components. +1. **Proper XML declaration**: When using Jelly, start with ``. +1. **Namespace declarations**: Include required namespaces in Jelly root: `xmlns:j="jelly:core" xmlns:g="glide"`. + +## Client-Side Scripting + +1. **clientScript property**: Use for JavaScript that runs in the browser after page load. +1. **DOM manipulation**: Access DOM elements using standard JavaScript or jQuery. +1. **Event handlers**: Define functions in `clientScript` that can be called from HTML `onclick`, `onchange`, etc. +1. **GlideAjax calls**: Use `GlideAjax` to communicate with server-side Script Includes. +1. **Client-callable**: Ensure Script Includes used with GlideAjax are marked as client-callable. +1. **AngularJS support**: UI Pages support AngularJS for dynamic, reactive interfaces. +1. **jQuery availability**: jQuery is available by default in ServiceNow - use `$` or `jQuery`. + +## Server-Side Scripting + +1. **processingScript property**: Use for server-side code that executes on form submission or POST requests. +1. **Form parameters**: Access submitted form data using `g_request.getParameter('param_name')`. +1. **Database operations**: Use `GlideRecord` for CRUD operations in processing script. +1. **User feedback**: Use `gs.addInfoMessage()`, `gs.addErrorMessage()` to provide user feedback after processing. +1. **Jelly evaluation**: Use `` tags for server-side logic within HTML content. +1. **Function syntax**: processingScript can be a string or function - strings are more common for UI Pages. + +## Security Best Practices + +1. **Input validation**: Always validate and sanitize user input in both client and server scripts. +1. **XSS prevention**: Escape user-provided content before displaying in HTML. +1. **Role-based access**: Control access to UI Pages through ACLs (Access Control Lists). +1. **CSRF protection**: ServiceNow provides automatic CSRF tokens for form submissions. +1. **Direct page security**: Direct pages bypass standard security - implement custom authentication if needed. +1. **Script injection**: Never use `eval()` or directly execute user-provided code. + +## Performance Optimization + +1. **Minimize Jelly processing**: Excessive Jelly evaluation can slow page rendering - keep logic simple. +1. **Client-side rendering**: Move complex logic to client-side when possible to reduce server load. +1. **Lazy loading**: Load data asynchronously with AJAX instead of rendering everything on page load. +1. **Caching**: Consider caching frequently accessed data in client-side or using ServiceNow cache APIs. +1. **Query optimization**: Use GlideAggregate and indexed fields for efficient database queries. +1. **Image optimization**: Optimize images and use ServiceNow's built-in image handling. + +## Common Use Cases + +1. **Custom dashboards**: Use category `homepages` and combine Jelly with charts for dashboards. +1. **Forms**: Create custom forms with HTML form elements and processingScript for submissions. +1. **Reports**: Display custom reports with dynamic data from Jelly evaluation. +1. **Integration pages**: Direct pages work well for external system integrations. +1. **Knowledge base**: Use category `kb` for custom article viewers or search interfaces. +1. **Wizard interfaces**: Multi-step processes using client-side state management. + +## Jelly Template Guidelines + +1. **Variable scope**: Variables created with `` are available in Jelly context. +1. **Server-side execution**: Jelly code executes on the server before being sent to client. +1. **JSON data passing**: Use `JSON.stringify()` in Jelly to pass data to client-side JavaScript. +1. **Conditional rendering**: Use `` and `` for conditional content. +1. **Loops**: Use `` or `` for iterating over collections. +1. **Error handling**: Jelly errors can break the entire page - test thoroughly. + +## AngularJS Integration + +1. **Bootstrap directive**: Use `ng-app` directive to bootstrap AngularJS on your page. +1. **Controllers**: Define controllers in `clientScript` property. +1. **Two-way binding**: Leverage `ng-model` for reactive forms and data binding. +1. **Directives**: Use built-in AngularJS directives (`ng-repeat`, `ng-if`, `ng-click`, etc.). +1. **Service integration**: Create or inject AngularJS services for shared functionality. +1. **Version compatibility**: ServiceNow includes specific AngularJS version - check compatibility. + +## URL Parameters and Navigation + +1. **Query parameters**: Access URL parameters with `g_request.getParameter('param')` in Jelly. +1. **Client access**: Use JavaScript `URLSearchParams` or parse `window.location.search` for client-side access. +1. **Navigation**: Use `window.location.href = 'page.do'` for client-side navigation. +1. **Breadcrumbs**: Standard pages show in navigation history; direct pages don't. +1. **Deep linking**: Support direct links to specific content by handling URL parameters. + +## GlideAjax Best Practices + +1. **Script Include setup**: Create client-callable Script Include with functions returning string values. +1. **Parameter passing**: Use `ga.addParam('sysparm_name', 'functionName')` to specify the function to call. +1. **Additional params**: Pass data with `ga.addParam('param_name', 'value')`. +1. **Callback handling**: Use `ga.getXMLAnswer(callback)` for asynchronous response handling. +1. **Error handling**: Always handle errors in callback - check if answer is valid. +1. **JSON responses**: Parse JSON responses with `JSON.parse(answer)` in callback. + +## Testing and Debugging + +1. **Browser console**: Use browser developer tools to debug client-side scripts. +1. **Script debugger**: Use `gs.log()` in server scripts and check system logs. +1. **Jelly debugging**: Jelly errors appear in system logs - check for XML syntax issues. +1. **Incremental testing**: Test HTML, then add Jelly, then add scripts incrementally. +1. **Cross-browser**: Test UI Pages in different browsers for compatibility. +1. **Mobile testing**: Test responsiveness if page will be accessed from mobile devices. + +## Common Pitfalls + +1. **Missing .do extension**: Always include `.do` in endpoint - pages won't load without it. +1. **XML syntax errors**: Invalid XML in Jelly templates will break the page - validate carefully. +1. **Namespace conflicts**: Declare all required Jelly namespaces or tags won't work. +1. **Script scope issues**: Client script variables are global - avoid naming conflicts. +1. **Direct page authentication**: Direct pages bypass login - implement security checks if needed. +1. **Form submission without processing**: Set `method="POST"` on forms and provide processingScript. +1. **Missing Script Include**: GlideAjax calls fail silently if Script Include doesn't exist or isn't client-callable. +1. **Jelly variable naming**: Always prefix Jelly variables with `jvar_` to avoid conflicts. +1. **Client/server confusion**: Remember Jelly runs server-side before clientScript runs. + +## Maintenance Considerations + +1. **Documentation**: Add comprehensive `description` to explain page purpose and usage. +1. **Code comments**: Comment complex logic in both client and server scripts. +1. **Version control**: UI Pages are code - use source control best practices. +1. **Update management**: Consider impact on users when updating frequently accessed pages. +1. **Deprecation path**: If replacing a UI Page, provide redirect or migration notice. +1. **Dependencies**: Document any external libraries, Script Includes, or UI Macros used. + +## Advanced Techniques + +1. **Custom CSS**: Include ` + + +
+

Welcome to Our Application

+

This is a custom landing page without ServiceNow chrome.

+ +
+ + + `, +}) +``` diff --git a/res/snippet/fluent_snippet_ui-page_0003.md b/res/snippet/fluent_snippet_ui-page_0003.md new file mode 100644 index 0000000..940520c --- /dev/null +++ b/res/snippet/fluent_snippet_ui-page_0003.md @@ -0,0 +1,47 @@ +# Create a UI Page with Jelly template for dynamic content + +```typescript +import { UiPage } from '@servicenow/sdk/core' + +UiPage({ + $id: Now.ID['dynamic_user_info_page'], + endpoint: 'x_myapp_user_info.do', + description: 'A UI page using Jelly to display dynamic user information', + category: 'general', + html: ` + + + + var user = gs.getUser(); + user; + + +
+

User Information

+ + + + + + + + + + + + + + + + + + + + + +
User Name:${jvar_user.getName()}
User ID:${jvar_user.getUserID()}
Email:${jvar_user.getEmail()}
First Name:${jvar_user.getFirstName()}
Last Name:${jvar_user.getLastName()}
+
+
+ `, +}) +``` diff --git a/res/snippet/fluent_snippet_ui-page_0004.md b/res/snippet/fluent_snippet_ui-page_0004.md new file mode 100644 index 0000000..c21e441 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-page_0004.md @@ -0,0 +1,64 @@ +# Create a UI Page with client-side JavaScript + +```typescript +import { UiPage } from '@servicenow/sdk/core' + +UiPage({ + $id: Now.ID['interactive_calculator_page'], + endpoint: 'x_myapp_calculator.do', + description: 'A UI page with interactive client-side JavaScript functionality', + category: 'general', + html: ` +
+

Simple Calculator

+
+ + + + +
+
+
+ `, + clientScript: ` + function calculate() { + var num1 = parseFloat(document.getElementById('num1').value); + var num2 = parseFloat(document.getElementById('num2').value); + var operator = document.getElementById('operator').value; + var resultDiv = document.getElementById('result'); + + if (isNaN(num1) || isNaN(num2)) { + resultDiv.innerHTML = 'Please enter valid numbers'; + return; + } + + var result; + switch(operator) { + case '+': + result = num1 + num2; + break; + case '-': + result = num1 - num2; + break; + case '*': + result = num1 * num2; + break; + case '/': + if (num2 === 0) { + resultDiv.innerHTML = 'Cannot divide by zero'; + return; + } + result = num1 / num2; + break; + } + + resultDiv.innerHTML = 'Result: ' + result; + } + `, +}) +``` diff --git a/res/snippet/fluent_snippet_ui-page_0005.md b/res/snippet/fluent_snippet_ui-page_0005.md new file mode 100644 index 0000000..026091a --- /dev/null +++ b/res/snippet/fluent_snippet_ui-page_0005.md @@ -0,0 +1,52 @@ +# Create a UI Page with form submission and processing script + +```typescript +import { UiPage } from '@servicenow/sdk/core' + +UiPage({ + $id: Now.ID['feedback_form_page'], + endpoint: 'x_myapp_feedback.do', + description: 'A UI page with form submission and server-side processing', + category: 'general', + html: ` +
+

Submit Feedback

+
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+
+ `, + processingScript: ` + // Get form parameters + var name = g_request.getParameter('name'); + var email = g_request.getParameter('email'); + var feedback = g_request.getParameter('feedback'); + + if (name && email && feedback) { + // Create a record in a feedback table (example) + var gr = new GlideRecord('x_myapp_feedback'); + gr.initialize(); + gr.setValue('name', name); + gr.setValue('email', email); + gr.setValue('comments', feedback); + gr.insert(); + + gs.addInfoMessage('Thank you for your feedback!'); + } + `, +}) +``` diff --git a/res/snippet/fluent_snippet_ui-page_0006.md b/res/snippet/fluent_snippet_ui-page_0006.md new file mode 100644 index 0000000..2a87db8 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-page_0006.md @@ -0,0 +1,52 @@ +# Create a UI Page with AJAX calls using GlideAjax + +```typescript +import { UiPage } from '@servicenow/sdk/core' + +UiPage({ + $id: Now.ID['ajax_data_loader_page'], + endpoint: 'x_myapp_ajax_loader.do', + description: 'A UI page demonstrating AJAX calls to load data dynamically', + category: 'general', + html: ` +
+

Load Data with AJAX

+ + +
+
+ `, + clientScript: ` + function loadData() { + var loading = document.getElementById('loading'); + var container = document.getElementById('dataContainer'); + + // Show loading indicator + loading.style.display = 'block'; + container.innerHTML = ''; + + // Make AJAX call using GlideAjax + var ga = new GlideAjax('MyScriptInclude'); // Replace with your Script Include name + ga.addParam('sysparm_name', 'getIncidentCount'); + ga.getXMLAnswer(function(answer) { + loading.style.display = 'none'; + + if (answer) { + var data = JSON.parse(answer); + var html = '
'; + html += '

Incident Statistics

'; + html += '

Total Incidents: ' + data.total + '

'; + html += '

Open Incidents: ' + data.open + '

'; + html += '

Closed Incidents: ' + data.closed + '

'; + html += '
'; + container.innerHTML = html; + } else { + container.innerHTML = '
Failed to load data
'; + } + }); + } + `, +}) +``` diff --git a/res/snippet/fluent_snippet_ui-page_0007.md b/res/snippet/fluent_snippet_ui-page_0007.md new file mode 100644 index 0000000..c86a414 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-page_0007.md @@ -0,0 +1,89 @@ +# Create a UI Page for custom dashboard with charts + +```typescript +import { UiPage } from '@servicenow/sdk/core' + +UiPage({ + $id: Now.ID['custom_dashboard_page'], + endpoint: 'x_myapp_dashboard.do', + description: 'A custom dashboard UI page with charts and data visualization', + category: 'homepages', + html: ` + + + + // Server-side logic to gather statistics + var stats = {}; + + var incGr = new GlideAggregate('incident'); + incGr.addAggregate('COUNT'); + incGr.query(); + if (incGr.next()) { + stats.totalIncidents = incGr.getAggregate('COUNT'); + } + + var openGr = new GlideAggregate('incident'); + openGr.addQuery('active', true); + openGr.addAggregate('COUNT'); + openGr.query(); + if (openGr.next()) { + stats.openIncidents = openGr.getAggregate('COUNT'); + } + + JSON.stringify(stats); + + +
+

Custom Dashboard

+
+
+
+
Total Incidents
+
+ + +
+
+
+
+
+
Open Incidents
+
+ +
+
+
+
+
+ +
+
+
+ `, + clientScript: ` + // Initialize chart using Chart.js (if available) + window.addEventListener('load', function() { + var ctx = document.getElementById('myChart'); + if (ctx && typeof Chart !== 'undefined') { + new Chart(ctx, { + type: 'bar', + data: { + labels: ['Total', 'Open', 'Closed'], + datasets: [{ + label: 'Incidents', + data: [data.totalIncidents || 0, data.openIncidents || 0, + (data.totalIncidents - data.openIncidents) || 0], + backgroundColor: ['#3498db', '#f39c12', '#27ae60'] + }] + } + }); + } + }); + `, +}) +``` diff --git a/res/snippet/fluent_snippet_ui-page_0008.md b/res/snippet/fluent_snippet_ui-page_0008.md new file mode 100644 index 0000000..5f6ade9 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-page_0008.md @@ -0,0 +1,78 @@ +# Create a UI Page using AngularJS for dynamic content + +```typescript +import { UiPage } from '@servicenow/sdk/core' + +UiPage({ + $id: Now.ID['angular_todo_page'], + endpoint: 'x_myapp_todo.do', + description: 'A UI page using AngularJS for interactive todo list', + category: 'general', + html: ` +
+

My Todo List

+
+ + +
+
    +
  • + + + {{todo.text}} + + +
  • +
+
+ Total: {{todos.length}} | + Completed: {{getCompletedCount()}} | + Remaining: {{getRemainingCount()}} +
+
+ `, + clientScript: ` + var app = angular.module('todoApp', []); + + app.controller('TodoController', function($scope) { + $scope.todos = []; + $scope.newTodo = ''; + + $scope.addTodo = function() { + if ($scope.newTodo.trim()) { + $scope.todos.push({ + text: $scope.newTodo, + completed: false + }); + $scope.newTodo = ''; + } + }; + + $scope.deleteTodo = function(index) { + $scope.todos.splice(index, 1); + }; + + $scope.updateTodo = function(todo) { + // Update logic (e.g., save to server) + }; + + $scope.getCompletedCount = function() { + return $scope.todos.filter(function(todo) { + return todo.completed; + }).length; + }; + + $scope.getRemainingCount = function() { + return $scope.todos.length - $scope.getCompletedCount(); + }; + }); + `, +}) +``` diff --git a/res/snippet/fluent_snippet_ui-page_0009.md b/res/snippet/fluent_snippet_ui-page_0009.md new file mode 100644 index 0000000..554e4f6 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-page_0009.md @@ -0,0 +1,55 @@ +# Create a UI Page with UI Macro integration + +```typescript +import { UiPage } from '@servicenow/sdk/core' + +UiPage({ + $id: Now.ID['ui_macro_demo_page'], + endpoint: 'x_myapp_macro_demo.do', + description: 'A UI page demonstrating UI Macro integration for reusable components', + category: 'general', + html: ` + + +
+

UI Macro Integration Demo

+ + + + +
+ + +
+
+
+
+

Reference Field Example

+
+
+

Select an incident using the reference field above.

+ +
+
+
+
+
+
+
+
+
+ `, + clientScript: ` + function getSelectedIncident() { + var incidentRef = document.getElementById('incident_ref'); + if (incidentRef && incidentRef.value) { + document.getElementById('selectedInfo').innerHTML = + '
Selected Incident: ' + incidentRef.value + '
'; + } else { + document.getElementById('selectedInfo').innerHTML = + '
No incident selected
'; + } + } + `, +}) +``` diff --git a/res/snippet/fluent_snippet_ui-page_0010.md b/res/snippet/fluent_snippet_ui-page_0010.md new file mode 100644 index 0000000..54721d9 --- /dev/null +++ b/res/snippet/fluent_snippet_ui-page_0010.md @@ -0,0 +1,96 @@ +# Create a UI Page for knowledge base article display + +```typescript +import { UiPage } from '@servicenow/sdk/core' + +UiPage({ + $id: Now.ID['kb_article_viewer_page'], + endpoint: 'x_myapp_kb_viewer.do', + description: 'A UI page for displaying knowledge base articles with search functionality', + category: 'kb', + html: ` + + + + g_request.getParameter('article') || ''; + + +
+
+ + +
+ + + + var gr = new GlideRecord('kb_knowledge'); + if (gr.get('${jvar_article_sys_id}')) { + var article = { + number: gr.getValue('number'), + short_description: gr.getValue('short_description'), + text: gr.getValue('text'), + author: gr.getDisplayValue('author'), + created: gr.getDisplayValue('sys_created_on') + }; + JSON.stringify(article); + } else { + '{}'; + } + + +
+
+

+ +

+
+
+ +
+ +
+
+ + +
+ Please search for an article or select one from the list. +
+
+
+
+ `, + clientScript: ` + function searchArticles() { + var searchTerm = document.getElementById('searchBox').value; + if (searchTerm) { + // Navigate to search results or use AJAX to load results + window.location.href = 'x_myapp_kb_search.do?query=' + encodeURIComponent(searchTerm); + } + } + + // Add enter key support for search + document.addEventListener('DOMContentLoaded', function() { + var searchBox = document.getElementById('searchBox'); + if (searchBox) { + searchBox.addEventListener('keypress', function(e) { + if (e.key === 'Enter') { + searchArticles(); + } + }); + } + }); + `, +}) +``` diff --git a/res/spec/fluent_spec_ui-page.md b/res/spec/fluent_spec_ui-page.md new file mode 100644 index 0000000..33fecbf --- /dev/null +++ b/res/spec/fluent_spec_ui-page.md @@ -0,0 +1,58 @@ +# **Context**: UI Page API spec: define custom UI Pages [sys_ui_page] for custom user interfaces and landing pages. UI Pages provide flexible HTML/XHTML interfaces that can include static content, dynamic Jelly templates, or custom scripts. Use the dedicated `UiPage` construct for cleaner, type-safe UI Page definitions. + +```typescript +import { UiPage } from '@servicenow/sdk/core'; + +// Creates a new UI Page (`sys_ui_page`) using the UiPage construct +UiPage({ + $id: '', // string | guid, mandatory - Unique identifier for the UI Page + + // Core properties + endpoint: '', // string, mandatory - Endpoint for the page, must end with '.do' + // Format: `_.do` + // Example: 'x_myapp_custom_page.do' + + description: '', // string, optional - Description about the UI page's purpose and functionality + + // Page type configuration + direct: false, // boolean, optional - If true, creates a direct UI page that loads without ServiceNow UI wrapper + // Direct pages bypass standard ServiceNow chrome/navigation + // Default: false (page loads with standard UI wrapper) + + // Content definition + html: '', // string, optional - Define what is rendered when the page is shown + // Can contain: + // - Static XHTML/HTML markup + // - Dynamically generated content using Jelly tags + // - Calls to UI Macros and Script Includes + // - AngularJS directives and templates + // Example: '
Hello World
' or Jelly template + + // Categorization + category: 'general', // string, optional - Category for organizing UI pages + // Valid values: 'general' | 'homepages' | 'htmleditor' | 'kb' | 'cms' | 'catalog' + // Default: 'general' + + // Client-side scripting + clientScript: '', // string, optional - Client-side JavaScript that runs in the browser + // Used for: + // - Event handlers for buttons and form elements + // - DOM manipulation and DHTML features + // - Setting focus to fields + // - Client-side validation + // - AJAX calls and async operations + // Note: Runs after the page is loaded + + // Server-side scripting + processingScript: '', // string | function, optional - Script that runs on the server when the page is submitted + // Executes on form submission or page POST + // Used for: + // - Form data processing + // - Database operations + // - Server-side validation + // - Business logic execution + // Can be a string or function + // Example as string: 'gs.addInfoMessage("Processed");' + // Example as function: function() { gs.addInfoMessage("Processed"); } +}): UiPage; // returns a UiPage object +``` From 286e7091638dd80306bc64f378ca3cc155571409 Mon Sep 17 00:00:00 2001 From: modesty Date: Mon, 6 Oct 2025 17:49:33 -0700 Subject: [PATCH 10/11] feat: update metadata types and tests --- src/types/index.ts | 3 +++ test/res/resourceManager.test.ts | 22 +++++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/types/index.ts b/src/types/index.ts index 368e98c..f903ed8 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -33,10 +33,13 @@ export enum ServiceNowMetadataType { PROPERTY = 'property', ROLE = 'role', SCHEDULED_SCRIPT = 'scheduled-script', + SCRIPT_ACTION = 'script-action', SCRIPT_INCLUDE = 'script-include', SCRIPTED_REST = 'scripted-rest', + SERVICE_PORTAL = 'service-portal', TABLE = 'table', UI_ACTION = 'ui-action', + UI_PAGE = 'ui-page', USER_PREFERENCE = 'user-preference', } diff --git a/test/res/resourceManager.test.ts b/test/res/resourceManager.test.ts index e82b93d..eb5e4e6 100644 --- a/test/res/resourceManager.test.ts +++ b/test/res/resourceManager.test.ts @@ -24,8 +24,12 @@ jest.mock("../../src/utils/resourceLoader.js", () => { // Create a mock implementation with controlled behavior const mockGetAvailableMetadataTypes = jest.fn().mockResolvedValue([ "business-rule", + "script-action", "script-include", - "table" + "service-portal", + "table", + "ui-action", + "ui-page" ]); const mockGetResource = jest.fn().mockImplementation((resourceType, metadataType, id) => { @@ -72,8 +76,12 @@ describe("ResourceManager", () => { await resourceManager.initialize(); expect(resourceManager.getMetadataTypes()).toEqual([ "business-rule", + "script-action", "script-include", - "table" + "service-portal", + "table", + "ui-action", + "ui-page" ]); }); @@ -81,20 +89,20 @@ describe("ResourceManager", () => { await resourceManager.initialize(); const resources = await resourceManager.listResources(); - // Should have 3 metadata types * (1 spec + 1 instruct + 1 snippet) = 9 resources - expect(resources.length).toBe(9); + // Should have 7 metadata types * (1 spec + 1 instruct + 1 snippet) = 21 resources + expect(resources.length).toBe(21); // Check for spec resources const specResources = resources.filter(r => r.uri.startsWith('sn-spec://')); - expect(specResources.length).toBe(3); + expect(specResources.length).toBe(7); // Check for instruction resources const instructResources = resources.filter(r => r.uri.startsWith('sn-instruct://')); - expect(instructResources.length).toBe(3); + expect(instructResources.length).toBe(7); // Check for snippet resources const snippetResources = resources.filter(r => r.uri.startsWith('sn-snippet://')); - expect(snippetResources.length).toBe(3); + expect(snippetResources.length).toBe(7); // Check that each resource has the required properties resources.forEach(resource => { From 3634dfd1f97d8d3298518c367029894187b06b36 Mon Sep 17 00:00:00 2001 From: modesty Date: Mon, 6 Oct 2025 19:17:29 -0700 Subject: [PATCH 11/11] maint: bump fluent version to 4.0.2 plus other dependencies --- package-lock.json | 1520 ++++++++++++++++++++++----------------------- package.json | 20 +- 2 files changed, 766 insertions(+), 774 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7bc6261..c1e3e22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@modesty/fluent-mcp", - "version": "0.0.16", + "version": "0.0.17", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@modesty/fluent-mcp", - "version": "0.0.16", + "version": "0.0.17", "license": "MIT", "dependencies": { - "@modelcontextprotocol/sdk": "1.18.1", - "@servicenow/sdk": "4.0.1", + "@modelcontextprotocol/sdk": "1.19.1", + "@servicenow/sdk": "4.0.2", "zod": "^3.25.76", "zod-to-json-schema": "^3.24.6" }, @@ -18,26 +18,26 @@ "fluent-mcp": "dist/index.js" }, "devDependencies": { - "@eslint/js": "^9.36.0", + "@eslint/js": "^9.37.0", "@rollup/plugin-commonjs": "^28.0.6", "@rollup/plugin-eslint": "^9.0.5", "@rollup/plugin-json": "^6.0.1", - "@rollup/plugin-node-resolve": "^16.0.1", + "@rollup/plugin-node-resolve": "^16.0.2", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.4", "@types/jest": "^30.0.0", - "@types/node": "^24.5.2", + "@types/node": "^24.7.0", "@typescript-eslint/eslint-plugin": "^8.44.0", "@typescript-eslint/parser": "^8.44.0", - "eslint": "^9.36.0", - "jest": "^30.1.3", - "rollup": "^4.52.0", + "eslint": "^9.37.0", + "jest": "^30.2.0", + "rollup": "^4.52.4", "rollup-plugin-node-builtins": "^2.1.2", "rollup-plugin-sourcemaps": "^0.6.3", "ts-jest": "^29.4.4", "ts-node": "^10.9.2", "tslib": "^2.8.1", - "typescript": "~5.9.2" + "typescript": "~5.9.3" }, "engines": { "node": ">=20.18.0" @@ -74,6 +74,7 @@ "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -645,13 +646,13 @@ "optional": true }, "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "version": "2.0.8", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", "optional": true, "dependencies": { - "colorspace": "1.1.x", + "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", "kuler": "^2.0.0" } @@ -756,19 +757,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", "devOptional": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.16.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -850,9 +854,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.36.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@eslint/js/-/js-9.36.0.tgz", - "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "version": "9.37.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", "devOptional": true, "license": "MIT", "engines": { @@ -873,13 +877,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.16.0", "levn": "^0.4.1" }, "engines": { @@ -1030,9 +1034,9 @@ } }, "node_modules/@inquirer/checkbox/node_modules/@types/node": { - "version": "20.19.17", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.17.tgz", - "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==", + "version": "20.19.19", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", "license": "MIT", "optional": true, "dependencies": { @@ -1088,9 +1092,9 @@ } }, "node_modules/@inquirer/confirm/node_modules/@types/node": { - "version": "20.19.17", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.17.tgz", - "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==", + "version": "20.19.19", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", "license": "MIT", "optional": true, "dependencies": { @@ -1131,9 +1135,9 @@ } }, "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "20.19.17", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.17.tgz", - "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==", + "version": "20.19.19", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", "license": "MIT", "optional": true, "dependencies": { @@ -1190,9 +1194,9 @@ } }, "node_modules/@inquirer/editor/node_modules/@types/node": { - "version": "20.19.17", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.17.tgz", - "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==", + "version": "20.19.19", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", "license": "MIT", "optional": true, "dependencies": { @@ -1249,9 +1253,9 @@ } }, "node_modules/@inquirer/expand/node_modules/@types/node": { - "version": "20.19.17", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.17.tgz", - "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==", + "version": "20.19.19", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", "license": "MIT", "optional": true, "dependencies": { @@ -1307,9 +1311,9 @@ } }, "node_modules/@inquirer/input/node_modules/@types/node": { - "version": "20.19.17", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.17.tgz", - "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==", + "version": "20.19.19", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", "license": "MIT", "optional": true, "dependencies": { @@ -1366,9 +1370,9 @@ } }, "node_modules/@inquirer/password/node_modules/@types/node": { - "version": "20.19.17", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.17.tgz", - "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==", + "version": "20.19.19", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", "license": "MIT", "optional": true, "dependencies": { @@ -1445,9 +1449,9 @@ } }, "node_modules/@inquirer/rawlist/node_modules/@types/node": { - "version": "20.19.17", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.17.tgz", - "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==", + "version": "20.19.19", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", "license": "MIT", "optional": true, "dependencies": { @@ -1505,9 +1509,9 @@ } }, "node_modules/@inquirer/select/node_modules/@types/node": { - "version": "20.19.17", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.17.tgz", - "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==", + "version": "20.19.19", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", "license": "MIT", "optional": true, "dependencies": { @@ -1730,17 +1734,17 @@ } }, "node_modules/@jest/console": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/console/-/console-30.1.2.tgz", - "integrity": "sha512-BGMAxj8VRmoD0MoA/jo9alMXSRoqW8KPeqOfEo1ncxnRLatTBCpRoOwlwlEMdudp68Q6WSGwYrrLtTGOh8fLzw==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", - "jest-message-util": "30.1.0", - "jest-util": "30.0.5", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -1748,39 +1752,39 @@ } }, "node_modules/@jest/core": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/core/-/core-30.1.3.tgz", - "integrity": "sha512-LIQz7NEDDO1+eyOA2ZmkiAyYvZuo6s1UxD/e2IHldR6D7UYogVq3arTmli07MkENLq6/3JEQjp0mA8rrHHJ8KQ==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.1.2", + "@jest/console": "30.2.0", "@jest/pattern": "30.0.1", - "@jest/reporters": "30.1.3", - "@jest/test-result": "30.1.3", - "@jest/transform": "30.1.2", - "@jest/types": "30.0.5", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-changed-files": "30.0.5", - "jest-config": "30.1.3", - "jest-haste-map": "30.1.0", - "jest-message-util": "30.1.0", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.1.3", - "jest-resolve-dependencies": "30.1.3", - "jest-runner": "30.1.3", - "jest-runtime": "30.1.3", - "jest-snapshot": "30.1.2", - "jest-util": "30.0.5", - "jest-validate": "30.1.0", - "jest-watcher": "30.1.3", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", "micromatch": "^4.0.8", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -1796,9 +1800,9 @@ } }, "node_modules/@jest/core/node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "version": "4.3.1", + "resolved": "https://artifact.devsnc.com/repository/npm-all/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -1822,39 +1826,39 @@ } }, "node_modules/@jest/environment": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/environment/-/environment-30.1.2.tgz", - "integrity": "sha512-N8t1Ytw4/mr9uN28OnVf0SYE2dGhaIxOVYcwsf9IInBKjvofAjbFRvedvBBlyTYk2knbJTiEjEJ2PyyDIBnd9w==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.1.2", - "@jest/types": "30.0.5", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-mock": "30.0.5" + "jest-mock": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/expect/-/expect-30.1.2.tgz", - "integrity": "sha512-tyaIExOwQRCxPCGNC05lIjWJztDwk2gPDNSDGg1zitXJJ8dC3++G/CRjE5mb2wQsf89+lsgAgqxxNpDLiCViTA==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.1.2", - "jest-snapshot": "30.1.2" + "expect": "30.2.0", + "jest-snapshot": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/expect-utils/-/expect-utils-30.1.2.tgz", - "integrity": "sha512-HXy1qT/bfdjCv7iC336ExbqqYtZvljrV8odNdso7dWK9bSeHtLlvwWWC3YSybSPL03Gg5rug6WLCZAZFH72m0A==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", "dependencies": { @@ -1865,18 +1869,18 @@ } }, "node_modules/@jest/fake-timers": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/fake-timers/-/fake-timers-30.1.2.tgz", - "integrity": "sha512-Beljfv9AYkr9K+ETX9tvV61rJTY706BhBUtiaepQHeEGfe0DbpvUA5Z3fomwc5Xkhns6NWrcFDZn+72fLieUnA==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", - "jest-message-util": "30.1.0", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -1893,16 +1897,16 @@ } }, "node_modules/@jest/globals": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/globals/-/globals-30.1.2.tgz", - "integrity": "sha512-teNTPZ8yZe3ahbYnvnVRDeOjr+3pu2uiAtNtrEsiMjVPPj+cXd5E/fr8BL7v/T7F31vYdEHrI5cC/2OoO/vM9A==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.1.2", - "@jest/expect": "30.1.2", - "@jest/types": "30.0.5", - "jest-mock": "30.0.5" + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -1923,17 +1927,17 @@ } }, "node_modules/@jest/reporters": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/reporters/-/reporters-30.1.3.tgz", - "integrity": "sha512-VWEQmJWfXMOrzdFEOyGjUEOuVXllgZsoPtEHZzfdNz18RmzJ5nlR6kp8hDdY8dDS1yGOXAY7DHT+AOHIPSBV0w==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.1.2", - "@jest/test-result": "30.1.3", - "@jest/transform": "30.1.2", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", "chalk": "^4.1.2", @@ -1946,9 +1950,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "30.1.0", - "jest-util": "30.0.5", - "jest-worker": "30.1.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", "slash": "^3.0.0", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" @@ -1979,13 +1983,13 @@ } }, "node_modules/@jest/snapshot-utils": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/snapshot-utils/-/snapshot-utils-30.1.2.tgz", - "integrity": "sha512-vHoMTpimcPSR7OxS2S0V1Cpg8eKDRxucHjoWl5u4RQcnxqQrV3avETiFpl8etn4dqxEGarBeHbIBety/f8mLXw==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "natural-compare": "^1.4.0" @@ -2010,14 +2014,14 @@ } }, "node_modules/@jest/test-result": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/test-result/-/test-result-30.1.3.tgz", - "integrity": "sha512-P9IV8T24D43cNRANPPokn7tZh0FAFnYS2HIfi5vK18CjRkTDR9Y3e1BoEcAJnl4ghZZF4Ecda4M/k41QkvurEQ==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.1.2", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" }, @@ -2026,15 +2030,15 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/test-sequencer/-/test-sequencer-30.1.3.tgz", - "integrity": "sha512-82J+hzC0qeQIiiZDThh+YUadvshdBswi5nuyXlEmXzrhw5ZQSRHeQ5LpVMD/xc8B3wPePvs6VMzHnntxL+4E3w==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.1.3", + "@jest/test-result": "30.2.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.1.0", + "jest-haste-map": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -2042,23 +2046,23 @@ } }, "node_modules/@jest/transform": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/transform/-/transform-30.1.2.tgz", - "integrity": "sha512-UYYFGifSgfjujf1Cbd3iU/IQoSd6uwsj8XHj5DSDf5ERDcWMdJOPTkHWXj4U+Z/uMagyOQZ6Vne8C4nRIrCxqA==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.0", + "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.1.0", + "jest-haste-map": "30.2.0", "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "micromatch": "^4.0.8", "pirates": "^4.0.7", "slash": "^3.0.0", @@ -2069,9 +2073,9 @@ } }, "node_modules/@jest/types": { - "version": "30.0.5", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/types/-/types-30.0.5.tgz", - "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", "dependencies": { @@ -2149,9 +2153,9 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.18.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@modelcontextprotocol/sdk/-/sdk-1.18.1.tgz", - "integrity": "sha512-d//GE8/Yh7aC3e7p+kZG8JqqEAwwDUmAfvH1quogtbk+ksS6E0RR6toKKESPYYZVre0meqkJb27zb+dhqE9Sgw==", + "version": "1.19.1", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@modelcontextprotocol/sdk/-/sdk-1.19.1.tgz", + "integrity": "sha512-3Y2h3MZKjec1eAqSTBclATlX+AbC6n1LgfVzRMJLt3v6w0RCYgwLrjbxPDbhsYHt6Wdqc/aCceNJYgj448ELQQ==", "license": "MIT", "dependencies": { "ajv": "^6.12.6", @@ -2679,14 +2683,14 @@ } }, "node_modules/@rollup/plugin-eslint": { - "version": "9.0.5", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/plugin-eslint/-/plugin-eslint-9.0.5.tgz", - "integrity": "sha512-C4nh0sSeJuxVW5u5tDX+dCMjKcNfHm4hS+zeUVh1si7gttnhgGbrmPkUxIX7iZgYABwdEh/ewyMbZB+WXjSJdA==", + "version": "9.1.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/plugin-eslint/-/plugin-eslint-9.1.0.tgz", + "integrity": "sha512-QacjRIg4O/1hNWaS9Y16uDzbIGGQ+7HlsXkkv5BkfEbxUkgQxteBsZW6gAWuGdE4UEm5+ao72wxJOxjNi5CvGA==", "dev": true, "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", - "eslint": "^8.24.0" + "eslint": "^8.57.1" }, "engines": { "node": ">=14.0.0" @@ -2910,9 +2914,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "16.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz", - "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==", + "version": "16.0.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.2.tgz", + "integrity": "sha512-tCtHJ2BlhSoK4cCs25NMXfV7EALKr0jyasmqVCq3y9cBrKdmJhtsy1iTz36Xhk/O+pDJbzawxF4K6ZblqCnITQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3008,9 +3012,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.0.tgz", - "integrity": "sha512-VxDYCDqOaR7NXzAtvRx7G1u54d2kEHopb28YH/pKzY6y0qmogP3gG7CSiWsq9WvDFxOQMpNEyjVAHZFXfH3o/A==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", "cpu": [ "arm" ], @@ -3022,9 +3026,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.0.tgz", - "integrity": "sha512-pqDirm8koABIKvzL59YI9W9DWbRlTX7RWhN+auR8HXJxo89m4mjqbah7nJZjeKNTNYopqL+yGg+0mhCpf3xZtQ==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", "cpu": [ "arm64" ], @@ -3036,9 +3040,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.0.tgz", - "integrity": "sha512-YCdWlY/8ltN6H78HnMsRHYlPiKvqKagBP1r+D7SSylxX+HnsgXGCmLiV3Y4nSyY9hW8qr8U9LDUx/Lo7M6MfmQ==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", "cpu": [ "arm64" ], @@ -3050,9 +3054,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.0.tgz", - "integrity": "sha512-z4nw6y1j+OOSGzuVbSWdIp1IUks9qNw4dc7z7lWuWDKojY38VMWBlEN7F9jk5UXOkUcp97vA1N213DF+Lz8BRg==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", "cpu": [ "x64" ], @@ -3064,9 +3068,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.0.tgz", - "integrity": "sha512-Q/dv9Yvyr5rKlK8WQJZVrp5g2SOYeZUs9u/t2f9cQ2E0gJjYB/BWoedXfUT0EcDJefi2zzVfhcOj8drWCzTviw==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", "cpu": [ "arm64" ], @@ -3078,9 +3082,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.0.tgz", - "integrity": "sha512-kdBsLs4Uile/fbjZVvCRcKB4q64R+1mUq0Yd7oU1CMm1Av336ajIFqNFovByipciuUQjBCPMxwJhCgfG2re3rg==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", "cpu": [ "x64" ], @@ -3092,9 +3096,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.0.tgz", - "integrity": "sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", "cpu": [ "arm" ], @@ -3106,9 +3110,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.0.tgz", - "integrity": "sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", "cpu": [ "arm" ], @@ -3120,9 +3124,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.0.tgz", - "integrity": "sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", "cpu": [ "arm64" ], @@ -3134,9 +3138,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.0.tgz", - "integrity": "sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", "cpu": [ "arm64" ], @@ -3148,9 +3152,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.0.tgz", - "integrity": "sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", "cpu": [ "loong64" ], @@ -3188,9 +3192,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.0.tgz", - "integrity": "sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", "cpu": [ "ppc64" ], @@ -3202,9 +3206,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.0.tgz", - "integrity": "sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", "cpu": [ "riscv64" ], @@ -3216,9 +3220,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.0.tgz", - "integrity": "sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", "cpu": [ "riscv64" ], @@ -3230,9 +3234,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.0.tgz", - "integrity": "sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", "cpu": [ "s390x" ], @@ -3244,9 +3248,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.0.tgz", - "integrity": "sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", "cpu": [ "x64" ], @@ -3258,9 +3262,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.0.tgz", - "integrity": "sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", "cpu": [ "x64" ], @@ -3272,9 +3276,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.0.tgz", - "integrity": "sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", "cpu": [ "arm64" ], @@ -3286,9 +3290,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.0.tgz", - "integrity": "sha512-YQugafP/rH0eOOHGjmNgDURrpYHrIX0yuojOI8bwCyXwxC9ZdTd3vYkmddPX0oHONLXu9Rb1dDmT0VNpjkzGGw==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", "cpu": [ "arm64" ], @@ -3300,9 +3304,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.0.tgz", - "integrity": "sha512-zYdUYhi3Qe2fndujBqL5FjAFzvNeLxtIqfzNEVKD1I7C37/chv1VxhscWSQHTNfjPCrBFQMnynwA3kpZpZ8w4A==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", "cpu": [ "ia32" ], @@ -3314,9 +3318,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.0.tgz", - "integrity": "sha512-fGk03kQylNaCOQ96HDMeT7E2n91EqvCDd3RwvT5k+xNdFCeMGnj5b5hEgTGrQuyidqSsD3zJDQ21QIaxXqTBJw==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", "cpu": [ "x64" ], @@ -3328,9 +3332,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.0.tgz", - "integrity": "sha512-6iKDCVSIUQ8jPMoIV0OytRKniaYyy5EbY/RRydmLW8ZR3cEBhxbWl5ro0rkUNe0ef6sScvhbY79HrjRm8i3vDQ==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", "cpu": [ "x64" ], @@ -3342,9 +3346,9 @@ ] }, "node_modules/@servicenow/eslint-plugin-sdk-app-plugin": { - "version": "4.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/eslint-plugin-sdk-app-plugin/-/eslint-plugin-sdk-app-plugin-4.0.1.tgz", - "integrity": "sha512-8g5HiYzLuEePToGngwvE+S+hvo5pyTtXTxgU9E/hvW67HSFRPynGSQGktYyEAAq+wiva/ah0IHLwIw44CMJImA==", + "version": "4.0.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/eslint-plugin-sdk-app-plugin/-/eslint-plugin-sdk-app-plugin-4.0.2.tgz", + "integrity": "sha512-JXktXAlyT4sy1vNr5U9nAi8LehMZ2M6l+k1DBtPBIIayrEU14Ig9NsDdU+YfvZ+dwxJwnbCspeNyFanLhyz3/Q==", "license": "MIT", "optional": true, "dependencies": { @@ -3578,9 +3582,9 @@ } }, "node_modules/@servicenow/isomorphic-rollup": { - "version": "1.2.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/isomorphic-rollup/-/isomorphic-rollup-1.2.2.tgz", - "integrity": "sha512-lzEa8jucfmBk17an6Eu5OrzU4lxzobKSLs2kr465kYNpXuiRb3mq7k0t2oC8QK7McUMyg31ZsdyljhKa2laRVw==", + "version": "1.2.3", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/isomorphic-rollup/-/isomorphic-rollup-1.2.3.tgz", + "integrity": "sha512-WE5LvEiZEIMFji0PVZR304VGPsVAXgy0/Mr6H/+95kJIXm0fLaF/BwFEyv7vTSldAHEr6+62aokBQ4+zEZR/VQ==", "license": "MIT", "optional": true, "dependencies": { @@ -3588,12 +3592,12 @@ } }, "node_modules/@servicenow/sdk": { - "version": "4.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk/-/sdk-4.0.1.tgz", - "integrity": "sha512-RJ356rYghMqxJ+EvWumjS3P0esQIGfvyI7suSzdBAbJkHPLMiYlAfP4PtDNj5mBURf4ZNQoL1mCPeG57/vA+3A==", + "version": "4.0.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk/-/sdk-4.0.2.tgz", + "integrity": "sha512-AEoBVedfTxI3RmorkgSUg9YQSfXrv8Q/5Me7jbcTsmhaiiEKqpLLfdMFGQdFX0R3RGEoveXcVR/AzTRKbFUP8Q==", "license": "MIT", "dependencies": { - "@servicenow/sdk-core": "4.0.1" + "@servicenow/sdk-core": "4.0.2" }, "bin": { "now-sdk": "bin/index.js", @@ -3606,20 +3610,20 @@ "pnpm": ">=10.8.0" }, "optionalDependencies": { - "@servicenow/sdk-api": "4.0.1", - "@servicenow/sdk-cli": "4.0.1", + "@servicenow/sdk-api": "4.0.2", + "@servicenow/sdk-cli": "4.0.2", "undici": "6.19.8" } }, "node_modules/@servicenow/sdk-api": { - "version": "4.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk-api/-/sdk-api-4.0.1.tgz", - "integrity": "sha512-aYzhyUQ5f39JgFqtKCOz0LEDELK0cuQpn+pmx8W3KcYxiW04jt7qvxEvnWqoyEu41o6mGAzjGzeupJPxmFbC8g==", + "version": "4.0.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk-api/-/sdk-api-4.0.2.tgz", + "integrity": "sha512-aIDZ7EDOatB0q5jmqdmitFrCQFKAekG4Ztrx5AawC7MjqRlEwi7URnFHcAwYt62cEoFbdrtt+6g7NC2lJ8XfYg==", "license": "MIT", "optional": true, "dependencies": { - "@servicenow/sdk-build-core": "4.0.1", - "@servicenow/sdk-build-plugins": "4.0.1", + "@servicenow/sdk-build-core": "4.0.2", + "@servicenow/sdk-build-plugins": "4.0.2", "crypto-js": "4.2.0", "fast-xml-parser": "4.4.1", "handlebars": "4.7.8", @@ -3642,13 +3646,13 @@ } }, "node_modules/@servicenow/sdk-build-core": { - "version": "4.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk-build-core/-/sdk-build-core-4.0.1.tgz", - "integrity": "sha512-VF2fRNaddqXPE7UzMmGOPSJweUTDThsEyi2CJ1kcSNjz9eZaD75BEzsZuVvErl9vDj5DQSCr0XOs1lEs2SVesg==", + "version": "4.0.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk-build-core/-/sdk-build-core-4.0.2.tgz", + "integrity": "sha512-BzvNuL3PQ5m57rCoZyIHZnSh1TpCybiJ0xie743JJky7T5bxmYACf4g+5+auviUAh6tqT35b3tAxgg+/rmsp9w==", "license": "MIT", "optional": true, "dependencies": { - "@servicenow/sdk-core": "4.0.1", + "@servicenow/sdk-core": "4.0.2", "fast-glob": "3.3.2", "fflate": "0.8.2", "json5": "2.2.3", @@ -3679,18 +3683,18 @@ } }, "node_modules/@servicenow/sdk-build-plugins": { - "version": "4.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk-build-plugins/-/sdk-build-plugins-4.0.1.tgz", - "integrity": "sha512-BpGN4HRtGaBPYOJpqjr8aZnPOOc/DckR/iX5WpL0c8+lcOmkBKv6Cv+v+o0G+MaoSJqRPZX/5P7pfEswDfzs1g==", + "version": "4.0.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk-build-plugins/-/sdk-build-plugins-4.0.2.tgz", + "integrity": "sha512-dlCRPqvhS6ehP082ffWS9a+ojXjj5ywGUdVdox5lIvNgNmGXOdkvN6ETaSewobY0Vos+4VSERYg97/SZQypPWA==", "license": "MIT", "optional": true, "dependencies": { "@cyclonedx/cyclonedx-library": "7.1.0", - "@servicenow/eslint-plugin-sdk-app-plugin": "4.0.1", + "@servicenow/eslint-plugin-sdk-app-plugin": "4.0.2", "@servicenow/glide": "26.0.1", - "@servicenow/sdk-build-core": "4.0.1", - "@servicenow/sdk-core": "4.0.1", - "@servicenow/sdk-repack": "4.0.1", + "@servicenow/sdk-build-core": "4.0.2", + "@servicenow/sdk-core": "4.0.2", + "@servicenow/sdk-repack": "4.0.2", "eslint": "8.50.0", "eslint-formatter-stylish": "8.40.0", "eslint-plugin-es-x": "7.2.0", @@ -3924,15 +3928,15 @@ } }, "node_modules/@servicenow/sdk-cli": { - "version": "4.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk-cli/-/sdk-cli-4.0.1.tgz", - "integrity": "sha512-OBQhHZgMVnyk1jdi5azAPGieQhld6WkVgbc8xjWcssf4YZa4UHmYX3/j2mX0n9NAObb2flEKbiVN7NkS+1OZEw==", + "version": "4.0.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk-cli/-/sdk-cli-4.0.2.tgz", + "integrity": "sha512-MtxZJRf6lxcg1832GeAlK9BltxJw0xFWI5QLkmCGYtYgHQI4A+T884vskutmMysjJJOttyuagl6LQQ04cyInmw==", "license": "MIT", "optional": true, "dependencies": { "@inquirer/prompts": "3.1.1", - "@servicenow/sdk-api": "4.0.1", - "@servicenow/sdk-build-core": "4.0.1", + "@servicenow/sdk-api": "4.0.2", + "@servicenow/sdk-build-core": "4.0.2", "chalk": "4.1.2", "ci-info": "4.1.0", "clipboardy": "4.0.0", @@ -3954,9 +3958,9 @@ } }, "node_modules/@servicenow/sdk-core": { - "version": "4.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk-core/-/sdk-core-4.0.1.tgz", - "integrity": "sha512-CADvN566g0YtW9eojZHRDRp16i7HRL0lqFwJe7yL4H5YHL91i2ZzhFGgzqFtGGququGpv9rcTiNzE/1etSvmXw==", + "version": "4.0.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk-core/-/sdk-core-4.0.2.tgz", + "integrity": "sha512-VW2a6v87xQ5mzPU9LPuAwizR0VpPDyu/xU0owoYaBHAhq4sbf1sFK2dvPMcSF6/BbOe6QehEicyYgL5QNZ8uKA==", "license": "MIT", "engines": { "node": ">=20.18.0", @@ -3964,14 +3968,14 @@ } }, "node_modules/@servicenow/sdk-repack": { - "version": "4.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk-repack/-/sdk-repack-4.0.1.tgz", - "integrity": "sha512-giiCdi0o6rddEHKSTdLhdDJIrFg7cl+ft5n0I6CWFjVP61jMbvlYI1Ki469/vtopYEVu4KzS1b6IoBZnaNd6Dg==", + "version": "4.0.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@servicenow/sdk-repack/-/sdk-repack-4.0.2.tgz", + "integrity": "sha512-46Ucuz04UBqXo13uRArUQZExrvI9jtsFAEfekqJISyq23eLXoiCtd4uJrl1/bsB2WtK/Quikm+SsF1BjnJIhmQ==", "license": "MIT", "optional": true, "dependencies": { - "@servicenow/isomorphic-rollup": "1.2.2", - "@servicenow/sdk-build-core": "4.0.1", + "@servicenow/isomorphic-rollup": "1.2.3", + "@servicenow/sdk-build-core": "4.0.2", "rollup": "4.43.0" } }, @@ -4283,6 +4287,17 @@ "@sinonjs/commons": "^3.0.1" } }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", + "optional": true, + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, "node_modules/@ts-morph/common": { "version": "0.24.0", "resolved": "https://artifact.devsnc.com/repository/npm-all/@ts-morph/common/-/common-0.24.0.tgz", @@ -4459,13 +4474,14 @@ } }, "node_modules/@types/node": { - "version": "24.5.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-24.5.2.tgz", - "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", + "version": "24.7.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@types/node/-/node-24.7.0.tgz", + "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { - "undici-types": "~7.12.0" + "undici-types": "~7.14.0" } }, "node_modules/@types/resolve": { @@ -4514,17 +4530,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.44.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz", - "integrity": "sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==", + "version": "8.46.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz", + "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/type-utils": "8.44.0", - "@typescript-eslint/utils": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/type-utils": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -4538,22 +4554,23 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.44.0", + "@typescript-eslint/parser": "^8.46.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.44.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/parser/-/parser-8.44.0.tgz", - "integrity": "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==", + "version": "8.46.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/parser/-/parser-8.46.0.tgz", + "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4" }, "engines": { @@ -4569,14 +4586,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.44.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/project-service/-/project-service-8.44.0.tgz", - "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==", + "version": "8.46.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/project-service/-/project-service-8.46.0.tgz", + "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.44.0", - "@typescript-eslint/types": "^8.44.0", + "@typescript-eslint/tsconfig-utils": "^8.46.0", + "@typescript-eslint/types": "^8.46.0", "debug": "^4.3.4" }, "engines": { @@ -4591,14 +4608,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.44.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz", - "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==", + "version": "8.46.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz", + "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0" + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4609,9 +4626,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.44.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz", - "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==", + "version": "8.46.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz", + "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==", "dev": true, "license": "MIT", "engines": { @@ -4626,15 +4643,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.44.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/type-utils/-/type-utils-8.44.0.tgz", - "integrity": "sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==", + "version": "8.46.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz", + "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/utils": "8.44.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -4651,9 +4668,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.44.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/types/-/types-8.44.0.tgz", - "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", + "version": "8.46.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/types/-/types-8.46.0.tgz", + "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==", "dev": true, "license": "MIT", "engines": { @@ -4665,16 +4682,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.44.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz", - "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==", + "version": "8.46.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz", + "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.44.0", - "@typescript-eslint/tsconfig-utils": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/project-service": "8.46.0", + "@typescript-eslint/tsconfig-utils": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -4707,16 +4724,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.44.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/utils/-/utils-8.44.0.tgz", - "integrity": "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==", + "version": "8.46.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/utils/-/utils-8.46.0.tgz", + "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0" + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4750,13 +4767,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.44.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz", - "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==", + "version": "8.46.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz", + "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/types": "8.46.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -5139,6 +5156,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "devOptional": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5198,6 +5216,7 @@ "resolved": "https://artifact.devsnc.com/repository/npm-all/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5393,7 +5412,7 @@ "version": "1.0.7", "resolved": "https://artifact.devsnc.com/repository/npm-all/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -5406,16 +5425,16 @@ } }, "node_modules/babel-jest": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/babel-jest/-/babel-jest-30.1.2.tgz", - "integrity": "sha512-IQCus1rt9kaSh7PQxLYRY5NmkNrNlU2TpabzwV7T2jljnpdHOcmnYYv8QmE04Li4S3a2Lj8/yXyET5pBarPr6g==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "30.1.2", + "@jest/transform": "30.2.0", "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.0", - "babel-preset-jest": "30.0.1", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" @@ -5424,7 +5443,7 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.11.0" + "@babel/core": "^7.11.0 || ^8.0.0-0" } }, "node_modules/babel-plugin-istanbul": { @@ -5448,14 +5467,12 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "30.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.0.1.tgz", - "integrity": "sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", "@types/babel__core": "^7.20.5" }, "engines": { @@ -5490,20 +5507,20 @@ } }, "node_modules/babel-preset-jest": { - "version": "30.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/babel-preset-jest/-/babel-preset-jest-30.0.1.tgz", - "integrity": "sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "30.0.1", - "babel-preset-current-node-syntax": "^1.1.0" + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.11.0" + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, "node_modules/balanced-match": { @@ -5535,9 +5552,9 @@ "optional": true }, "node_modules/baseline-browser-mapping": { - "version": "2.8.6", - "resolved": "https://artifact.devsnc.com/repository/npm-all/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", - "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", + "version": "2.8.12", + "resolved": "https://artifact.devsnc.com/repository/npm-all/baseline-browser-mapping/-/baseline-browser-mapping-2.8.12.tgz", + "integrity": "sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5715,37 +5732,22 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/browserify-sign/-/browserify-sign-4.2.3.tgz", - "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "version": "4.2.5", + "resolved": "https://artifact.devsnc.com/repository/npm-all/browserify-sign/-/browserify-sign-4.2.5.tgz", + "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", "dev": true, "license": "ISC", "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", + "bn.js": "^5.2.2", + "browserify-rsa": "^4.1.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", + "elliptic": "^6.6.1", "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", + "parse-asn1": "^5.1.9", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1" }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/browserify-sign/node_modules/hash-base": { - "version": "3.0.5", - "resolved": "https://artifact.devsnc.com/repository/npm-all/hash-base/-/hash-base-3.0.5.tgz", - "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, "engines": { "node": ">= 0.10" } @@ -5798,9 +5800,9 @@ "license": "MIT" }, "node_modules/browserslist": { - "version": "4.26.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/browserslist/-/browserslist-4.26.2.tgz", - "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "version": "4.26.3", + "resolved": "https://artifact.devsnc.com/repository/npm-all/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "dev": true, "funding": [ { @@ -5817,10 +5819,11 @@ } ], "license": "MIT", + "peer": true, "dependencies": { - "baseline-browser-mapping": "^2.8.3", - "caniuse-lite": "^1.0.30001741", - "electron-to-chromium": "^1.5.218", + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, @@ -5967,7 +5970,7 @@ "version": "1.0.8", "resolved": "https://artifact.devsnc.com/repository/npm-all/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -6032,9 +6035,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001743", - "resolved": "https://artifact.devsnc.com/repository/npm-all/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", - "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", + "version": "1.0.30001748", + "resolved": "https://artifact.devsnc.com/repository/npm-all/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz", + "integrity": "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==", "dev": true, "funding": [ { @@ -6129,14 +6132,15 @@ } }, "node_modules/cipher-base": { - "version": "1.0.6", - "resolved": "https://artifact.devsnc.com/repository/npm-all/cipher-base/-/cipher-base-1.0.6.tgz", - "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "version": "1.0.7", + "resolved": "https://artifact.devsnc.com/repository/npm-all/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" }, "engines": { "node": ">= 0.10" @@ -6291,14 +6295,17 @@ "license": "MIT" }, "node_modules/color": { - "version": "3.2.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "version": "5.0.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/color/-/color-5.0.2.tgz", + "integrity": "sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==", "license": "MIT", "optional": true, "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "color-convert": "^3.0.1", + "color-string": "^2.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/color-convert": { @@ -6322,42 +6329,49 @@ "license": "MIT" }, "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "version": "2.1.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/color-string/-/color-string-2.1.2.tgz", + "integrity": "sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==", "license": "MIT", "optional": true, "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-string/node_modules/color-name": { + "version": "2.0.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/color-name/-/color-name-2.0.2.tgz", + "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12.20" } }, "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "3.1.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/color-convert/-/color-convert-3.1.2.tgz", + "integrity": "sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==", "license": "MIT", "optional": true, "dependencies": { - "color-name": "1.1.3" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" } }, "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT", - "optional": true - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://artifact.devsnc.com/repository/npm-all/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "version": "2.0.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/color-name/-/color-name-2.0.2.tgz", + "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", "license": "MIT", "optional": true, - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" + "engines": { + "node": ">=12.20" } }, "node_modules/commander": { @@ -6487,7 +6501,7 @@ "version": "1.0.3", "resolved": "https://artifact.devsnc.com/repository/npm-all/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/cors": { @@ -6719,7 +6733,7 @@ "version": "1.1.4", "resolved": "https://artifact.devsnc.com/repository/npm-all/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -6764,9 +6778,9 @@ } }, "node_modules/detect-libc": { - "version": "2.1.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/detect-libc/-/detect-libc-2.1.0.tgz", - "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", + "version": "2.1.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "optional": true, "engines": { @@ -6873,9 +6887,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.222", - "resolved": "https://artifact.devsnc.com/repository/npm-all/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz", - "integrity": "sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==", + "version": "1.5.231", + "resolved": "https://artifact.devsnc.com/repository/npm-all/electron-to-chromium/-/electron-to-chromium-1.5.231.tgz", + "integrity": "sha512-cyl6vqZGkEBnz/PmvFHn/u9G/hbo+FF2CNAOXriG87QOeLsUdifCZ9UbHNscE9wGdrC8XstNMli0CbQnZQ+fkA==", "dev": true, "license": "ISC" }, @@ -7058,20 +7072,21 @@ } }, "node_modules/eslint": { - "version": "9.36.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/eslint/-/eslint-9.36.0.tgz", - "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "version": "9.37.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.36.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -7574,18 +7589,18 @@ } }, "node_modules/expect": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/expect/-/expect-30.1.2.tgz", - "integrity": "sha512-xvHszRavo28ejws8FpemjhwswGj4w/BetHIL8cU49u4sGyXDw2+p3YbeDbj6xzlxi6kWTjIRSTJ+9sNXPnF0Zg==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.1.2", + "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.1.2", - "jest-message-util": "30.1.0", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -7977,7 +7992,7 @@ "version": "0.3.5", "resolved": "https://artifact.devsnc.com/repository/npm-all/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -8342,7 +8357,7 @@ "version": "1.0.2", "resolved": "https://artifact.devsnc.com/repository/npm-all/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -8367,7 +8382,7 @@ "version": "1.0.2", "resolved": "https://artifact.devsnc.com/repository/npm-all/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -8380,35 +8395,68 @@ } }, "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "version": "3.1.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", "devOptional": true, "license": "MIT", "dependencies": { "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, + "node_modules/hash-base/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "devOptional": true, + "license": "MIT" + }, "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "2.3.8", + "resolved": "https://artifact.devsnc.com/repository/npm-all/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "devOptional": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, + "node_modules/hash-base/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/hash-base/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://artifact.devsnc.com/repository/npm-all/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/hash-base/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "devOptional": true, + "license": "MIT" + }, "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://artifact.devsnc.com/repository/npm-all/hash.js/-/hash.js-1.1.7.tgz", @@ -8721,7 +8769,7 @@ "version": "1.2.7", "resolved": "https://artifact.devsnc.com/repository/npm-all/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8897,7 +8945,7 @@ "version": "1.1.15", "resolved": "https://artifact.devsnc.com/repository/npm-all/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -8945,7 +8993,7 @@ "version": "2.0.5", "resolved": "https://artifact.devsnc.com/repository/npm-all/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/isbuffer": { @@ -9049,16 +9097,17 @@ } }, "node_modules/jest": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest/-/jest-30.1.3.tgz", - "integrity": "sha512-Ry+p2+NLk6u8Agh5yVqELfUJvRfV51hhVBRIB5yZPY7mU0DGBmOuFG5GebZbMbm86cdQNK0fhJuDX8/1YorISQ==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@jest/core": "30.1.3", - "@jest/types": "30.0.5", + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", "import-local": "^3.2.0", - "jest-cli": "30.1.3" + "jest-cli": "30.2.0" }, "bin": { "jest": "bin/jest.js" @@ -9076,14 +9125,14 @@ } }, "node_modules/jest-changed-files": { - "version": "30.0.5", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-changed-files/-/jest-changed-files-30.0.5.tgz", - "integrity": "sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", "dev": true, "license": "MIT", "dependencies": { "execa": "^5.1.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "p-limit": "^3.1.0" }, "engines": { @@ -9207,29 +9256,29 @@ } }, "node_modules/jest-circus": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-circus/-/jest-circus-30.1.3.tgz", - "integrity": "sha512-Yf3dnhRON2GJT4RYzM89t/EXIWNxKTpWTL9BfF3+geFetWP4XSvJjiU1vrWplOiUkmq8cHLiwuhz+XuUp9DscA==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.1.2", - "@jest/expect": "30.1.2", - "@jest/test-result": "30.1.3", - "@jest/types": "30.0.5", + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", - "jest-each": "30.1.0", - "jest-matcher-utils": "30.1.2", - "jest-message-util": "30.1.0", - "jest-runtime": "30.1.3", - "jest-snapshot": "30.1.2", - "jest-util": "30.0.5", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", "p-limit": "^3.1.0", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" @@ -9239,21 +9288,21 @@ } }, "node_modules/jest-cli": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-cli/-/jest-cli-30.1.3.tgz", - "integrity": "sha512-G8E2Ol3OKch1DEeIBl41NP7OiC6LBhfg25Btv+idcusmoUSpqUkbrneMqbW9lVpI/rCKb/uETidb7DNteheuAQ==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.1.3", - "@jest/test-result": "30.1.3", - "@jest/types": "30.0.5", + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", - "jest-config": "30.1.3", - "jest-util": "30.0.5", - "jest-validate": "30.1.0", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "yargs": "^17.7.2" }, "bin": { @@ -9313,34 +9362,34 @@ } }, "node_modules/jest-config": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-config/-/jest-config-30.1.3.tgz", - "integrity": "sha512-M/f7gqdQEPgZNA181Myz+GXCe8jXcJsGjCMXUzRj22FIXsZOyHNte84e0exntOvdPaeh9tA0w+B8qlP2fAezfw==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", "@jest/get-type": "30.1.0", "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.1.3", - "@jest/types": "30.0.5", - "babel-jest": "30.1.2", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", "glob": "^10.3.10", "graceful-fs": "^4.2.11", - "jest-circus": "30.1.3", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.1.2", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.1.3", - "jest-runner": "30.1.3", - "jest-util": "30.0.5", - "jest-validate": "30.1.0", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "micromatch": "^4.0.8", "parse-json": "^5.2.0", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -9365,9 +9414,9 @@ } }, "node_modules/jest-config/node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "version": "4.3.1", + "resolved": "https://artifact.devsnc.com/repository/npm-all/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -9381,25 +9430,25 @@ } }, "node_modules/jest-diff": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-diff/-/jest-diff-30.1.2.tgz", - "integrity": "sha512-4+prq+9J61mOVXCa4Qp8ZjavdxzrWQXrI80GNxP8f4tkI2syPuPrJgdRPZRrfUTRvIoUwcmNLbqEJy9W800+NQ==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.0.5" + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-docblock": { - "version": "30.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-docblock/-/jest-docblock-30.0.1.tgz", - "integrity": "sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", "dev": true, "license": "MIT", "dependencies": { @@ -9410,56 +9459,56 @@ } }, "node_modules/jest-each": { - "version": "30.1.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-each/-/jest-each-30.1.0.tgz", - "integrity": "sha512-A+9FKzxPluqogNahpCv04UJvcZ9B3HamqpDNWNKDjtxVRYB8xbZLFuCr8JAJFpNp83CA0anGQFlpQna9Me+/tQ==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "chalk": "^4.1.2", - "jest-util": "30.0.5", - "pretty-format": "30.0.5" + "jest-util": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-environment-node": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-environment-node/-/jest-environment-node-30.1.2.tgz", - "integrity": "sha512-w8qBiXtqGWJ9xpJIA98M0EIoq079GOQRQUyse5qg1plShUCQ0Ek1VTTcczqKrn3f24TFAgFtT+4q3aOXvjbsuA==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.1.2", - "@jest/fake-timers": "30.1.2", - "@jest/types": "30.0.5", + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-mock": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.1.0" + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-haste-map": { - "version": "30.1.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-haste-map/-/jest-haste-map-30.1.0.tgz", - "integrity": "sha512-JLeM84kNjpRkggcGpQLsV7B8W4LNUWz7oDNVnY1Vjj22b5/fAb3kk3htiD+4Na8bmJmjJR7rBtS2Rmq/NEcADg==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", - "jest-worker": "30.1.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, @@ -9471,49 +9520,49 @@ } }, "node_modules/jest-leak-detector": { - "version": "30.1.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-leak-detector/-/jest-leak-detector-30.1.0.tgz", - "integrity": "sha512-AoFvJzwxK+4KohH60vRuHaqXfWmeBATFZpzpmzNmYTtmRMiyGPVhkXpBqxUQunw+dQB48bDf4NpUs6ivVbRv1g==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", - "pretty-format": "30.0.5" + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-matcher-utils/-/jest-matcher-utils-30.1.2.tgz", - "integrity": "sha512-7ai16hy4rSbDjvPTuUhuV8nyPBd6EX34HkBsBcBX2lENCuAQ0qKCPb/+lt8OSWUa9WWmGYLy41PrEzkwRwoGZQ==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.1.2", - "pretty-format": "30.0.5" + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { - "version": "30.1.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-message-util/-/jest-message-util-30.1.0.tgz", - "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -9522,15 +9571,15 @@ } }, "node_modules/jest-mock": { - "version": "30.0.5", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-mock/-/jest-mock-30.0.5.tgz", - "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-util": "30.0.5" + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -9565,18 +9614,18 @@ } }, "node_modules/jest-resolve": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-resolve/-/jest-resolve-30.1.3.tgz", - "integrity": "sha512-DI4PtTqzw9GwELFS41sdMK32Ajp3XZQ8iygeDMWkxlRhm7uUTOFSZFVZABFuxr0jvspn8MAYy54NxZCsuCTSOw==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.1.0", + "jest-haste-map": "30.2.0", "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.0.5", - "jest-validate": "30.1.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "slash": "^3.0.0", "unrs-resolver": "^1.7.11" }, @@ -9585,46 +9634,46 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-resolve-dependencies/-/jest-resolve-dependencies-30.1.3.tgz", - "integrity": "sha512-DNfq3WGmuRyHRHfEet+Zm3QOmVFtIarUOQHHryKPc0YL9ROfgWZxl4+aZq/VAzok2SS3gZdniP+dO4zgo59hBg==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", "dev": true, "license": "MIT", "dependencies": { "jest-regex-util": "30.0.1", - "jest-snapshot": "30.1.2" + "jest-snapshot": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runner": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-runner/-/jest-runner-30.1.3.tgz", - "integrity": "sha512-dd1ORcxQraW44Uz029TtXj85W11yvLpDuIzNOlofrC8GN+SgDlgY4BvyxJiVeuabA1t6idjNbX59jLd2oplOGQ==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.1.2", - "@jest/environment": "30.1.2", - "@jest/test-result": "30.1.3", - "@jest/transform": "30.1.2", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.1.2", - "jest-haste-map": "30.1.0", - "jest-leak-detector": "30.1.0", - "jest-message-util": "30.1.0", - "jest-resolve": "30.1.3", - "jest-runtime": "30.1.3", - "jest-util": "30.0.5", - "jest-watcher": "30.1.3", - "jest-worker": "30.1.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -9633,32 +9682,32 @@ } }, "node_modules/jest-runtime": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-runtime/-/jest-runtime-30.1.3.tgz", - "integrity": "sha512-WS8xgjuNSphdIGnleQcJ3AKE4tBKOVP+tKhCD0u+Tb2sBmsU8DxfbBpZX7//+XOz81zVs4eFpJQwBNji2Y07DA==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.1.2", - "@jest/fake-timers": "30.1.2", - "@jest/globals": "30.1.2", + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", "@jest/source-map": "30.0.1", - "@jest/test-result": "30.1.3", - "@jest/transform": "30.1.2", - "@jest/types": "30.0.5", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.1.0", "collect-v8-coverage": "^1.0.2", "glob": "^10.3.10", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.1.0", - "jest-message-util": "30.1.0", - "jest-mock": "30.0.5", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.1.3", - "jest-snapshot": "30.1.2", - "jest-util": "30.0.5", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -9667,9 +9716,9 @@ } }, "node_modules/jest-snapshot": { - "version": "30.1.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-snapshot/-/jest-snapshot-30.1.2.tgz", - "integrity": "sha512-4q4+6+1c8B6Cy5pGgFvjDy/Pa6VYRiGu0yQafKkJ9u6wQx4G5PqI2QR6nxTl43yy7IWsINwz6oT4o6tD12a8Dg==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", "dependencies": { @@ -9678,20 +9727,20 @@ "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.1.2", + "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.1.2", - "@jest/transform": "30.1.2", - "@jest/types": "30.0.5", - "babel-preset-current-node-syntax": "^1.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", - "expect": "30.1.2", + "expect": "30.2.0", "graceful-fs": "^4.2.11", - "jest-diff": "30.1.2", - "jest-matcher-utils": "30.1.2", - "jest-message-util": "30.1.0", - "jest-util": "30.0.5", - "pretty-format": "30.0.5", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", "semver": "^7.7.2", "synckit": "^0.11.8" }, @@ -9713,13 +9762,13 @@ } }, "node_modules/jest-util": { - "version": "30.0.5", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-util/-/jest-util-30.0.5.tgz", - "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -9731,9 +9780,9 @@ } }, "node_modules/jest-util/node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "version": "4.3.1", + "resolved": "https://artifact.devsnc.com/repository/npm-all/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -9747,18 +9796,18 @@ } }, "node_modules/jest-validate": { - "version": "30.1.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-validate/-/jest-validate-30.1.0.tgz", - "integrity": "sha512-7P3ZlCFW/vhfQ8pE7zW6Oi4EzvuB4sgR72Q1INfW9m0FGo0GADYlPwIkf4CyPq7wq85g+kPMtPOHNAdWHeBOaA==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", - "pretty-format": "30.0.5" + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -9778,19 +9827,19 @@ } }, "node_modules/jest-watcher": { - "version": "30.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-watcher/-/jest-watcher-30.1.3.tgz", - "integrity": "sha512-6jQUZCP1BTL2gvG9E4YF06Ytq4yMb4If6YoQGRR6PpjtqOXSP3sKe2kqwB6SQ+H9DezOfZaSLnmka1NtGm3fCQ==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.1.3", - "@jest/types": "30.0.5", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "string-length": "^4.0.2" }, "engines": { @@ -9798,15 +9847,15 @@ } }, "node_modules/jest-worker": { - "version": "30.1.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-worker/-/jest-worker-30.1.0.tgz", - "integrity": "sha512-uvWcSjlwAAgIu133Tt77A05H7RIk3Ho8tZL50bQM2AkvLdluw9NG48lRCl3Dt+MOH719n/0nnb5YxUwcuJiKRA==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" }, @@ -10815,9 +10864,9 @@ "optional": true }, "node_modules/napi-postinstall": { - "version": "0.3.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/napi-postinstall/-/napi-postinstall-0.3.3.tgz", - "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", + "version": "0.3.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, "license": "MIT", "bin": { @@ -10877,9 +10926,9 @@ "license": "MIT" }, "node_modules/node-abi": { - "version": "3.77.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/node-abi/-/node-abi-3.77.0.tgz", - "integrity": "sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==", + "version": "3.78.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/node-abi/-/node-abi-3.78.0.tgz", + "integrity": "sha512-E2wEyrgX/CqvicaQYU3Ze1PFGjc4QYPGsjUrlYkqAE0WjHEZwgOsGMPMzkMse4LjJbDmaEuDX3CM036j5K2DSQ==", "license": "MIT", "optional": true, "dependencies": { @@ -10955,9 +11004,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.21", - "resolved": "https://artifact.devsnc.com/repository/npm-all/node-releases/-/node-releases-2.0.21.tgz", - "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "version": "2.0.23", + "resolved": "https://artifact.devsnc.com/repository/npm-all/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", "dev": true, "license": "MIT" }, @@ -11315,31 +11364,16 @@ } }, "node_modules/parse-asn1": { - "version": "5.1.7", - "resolved": "https://artifact.devsnc.com/repository/npm-all/parse-asn1/-/parse-asn1-5.1.7.tgz", - "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "version": "5.1.9", + "resolved": "https://artifact.devsnc.com/repository/npm-all/parse-asn1/-/parse-asn1-5.1.9.tgz", + "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", "dev": true, "license": "ISC", "dependencies": { "asn1.js": "^4.10.1", "browserify-aes": "^1.2.0", "evp_bytestokey": "^1.0.3", - "hash-base": "~3.0", - "pbkdf2": "^3.1.2", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-asn1/node_modules/hash-base": { - "version": "3.0.5", - "resolved": "https://artifact.devsnc.com/repository/npm-all/hash-base/-/hash-base-3.0.5.tgz", - "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", + "pbkdf2": "^3.1.5", "safe-buffer": "^5.2.1" }, "engines": { @@ -11459,55 +11493,21 @@ "optional": true }, "node_modules/pbkdf2": { - "version": "3.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/pbkdf2/-/pbkdf2-3.1.3.tgz", - "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", + "version": "3.1.5", + "resolved": "https://artifact.devsnc.com/repository/npm-all/pbkdf2/-/pbkdf2-3.1.5.tgz", + "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", "dev": true, "license": "MIT", "dependencies": { - "create-hash": "~1.1.3", + "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "ripemd160": "=2.0.1", + "ripemd160": "^2.0.3", "safe-buffer": "^5.2.1", - "sha.js": "^2.4.11", - "to-buffer": "^1.2.0" + "sha.js": "^2.4.12", + "to-buffer": "^1.2.1" }, "engines": { - "node": ">=0.12" - } - }, - "node_modules/pbkdf2/node_modules/create-hash": { - "version": "1.1.3", - "resolved": "https://artifact.devsnc.com/repository/npm-all/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "sha.js": "^2.4.0" - } - }, - "node_modules/pbkdf2/node_modules/hash-base": { - "version": "2.0.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1" - } - }, - "node_modules/pbkdf2/node_modules/ripemd160": { - "version": "2.0.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^2.0.0", - "inherits": "^2.0.1" + "node": ">= 0.10" } }, "node_modules/picocolors": { @@ -11523,6 +11523,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -11622,7 +11623,7 @@ "version": "1.1.0", "resolved": "https://artifact.devsnc.com/repository/npm-all/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -11682,9 +11683,9 @@ } }, "node_modules/pretty-format": { - "version": "30.0.5", - "resolved": "https://artifact.devsnc.com/repository/npm-all/pretty-format/-/pretty-format-30.0.5.tgz", - "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "version": "30.2.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", "dependencies": { @@ -11740,7 +11741,7 @@ "version": "2.0.1", "resolved": "https://artifact.devsnc.com/repository/npm-all/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/promise-retry": { @@ -12197,22 +12198,26 @@ } }, "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "version": "2.0.3", + "resolved": "https://artifact.devsnc.com/repository/npm-all/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", "dev": true, "license": "MIT", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" } }, "node_modules/rollup": { - "version": "4.52.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/rollup/-/rollup-4.52.0.tgz", - "integrity": "sha512-+IuescNkTJQgX7AkIDtITipZdIGcWF0pnVvZTWStiazUmcGA2ag8dfg0urest2XlXUi9kuhfQ+qmdc5Stc3z7g==", + "version": "4.52.4", + "resolved": "https://artifact.devsnc.com/repository/npm-all/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -12224,28 +12229,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.0", - "@rollup/rollup-android-arm64": "4.52.0", - "@rollup/rollup-darwin-arm64": "4.52.0", - "@rollup/rollup-darwin-x64": "4.52.0", - "@rollup/rollup-freebsd-arm64": "4.52.0", - "@rollup/rollup-freebsd-x64": "4.52.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.0", - "@rollup/rollup-linux-arm-musleabihf": "4.52.0", - "@rollup/rollup-linux-arm64-gnu": "4.52.0", - "@rollup/rollup-linux-arm64-musl": "4.52.0", - "@rollup/rollup-linux-loong64-gnu": "4.52.0", - "@rollup/rollup-linux-ppc64-gnu": "4.52.0", - "@rollup/rollup-linux-riscv64-gnu": "4.52.0", - "@rollup/rollup-linux-riscv64-musl": "4.52.0", - "@rollup/rollup-linux-s390x-gnu": "4.52.0", - "@rollup/rollup-linux-x64-gnu": "4.52.0", - "@rollup/rollup-linux-x64-musl": "4.52.0", - "@rollup/rollup-openharmony-arm64": "4.52.0", - "@rollup/rollup-win32-arm64-msvc": "4.52.0", - "@rollup/rollup-win32-ia32-msvc": "4.52.0", - "@rollup/rollup-win32-x64-gnu": "4.52.0", - "@rollup/rollup-win32-x64-msvc": "4.52.0", + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", "fsevents": "~2.3.2" } }, @@ -12562,7 +12567,7 @@ "version": "1.2.2", "resolved": "https://artifact.devsnc.com/repository/npm-all/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -12756,23 +12761,6 @@ "simple-concat": "^1.0.0" } }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://artifact.devsnc.com/repository/npm-all/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://artifact.devsnc.com/repository/npm-all/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT", - "optional": true - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://artifact.devsnc.com/repository/npm-all/slash/-/slash-3.0.0.tgz", @@ -12978,8 +12966,8 @@ "version": "1.3.0", "resolved": "https://artifact.devsnc.com/repository/npm-all/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "devOptional": true, "license": "MIT", + "optional": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -13502,10 +13490,10 @@ "license": "BSD-3-Clause" }, "node_modules/to-buffer": { - "version": "1.2.1", - "resolved": "https://artifact.devsnc.com/repository/npm-all/to-buffer/-/to-buffer-1.2.1.tgz", - "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", - "dev": true, + "version": "1.2.2", + "resolved": "https://artifact.devsnc.com/repository/npm-all/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "devOptional": true, "license": "MIT", "dependencies": { "isarray": "^2.0.5", @@ -13670,6 +13658,7 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -13713,7 +13702,8 @@ "resolved": "https://artifact.devsnc.com/repository/npm-all/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -13803,7 +13793,7 @@ "version": "1.0.3", "resolved": "https://artifact.devsnc.com/repository/npm-all/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -13829,11 +13819,12 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://artifact.devsnc.com/repository/npm-all/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://artifact.devsnc.com/repository/npm-all/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13867,9 +13858,9 @@ } }, "node_modules/undici-types": { - "version": "7.12.0", - "resolved": "https://artifact.devsnc.com/repository/npm-all/undici-types/-/undici-types-7.12.0.tgz", - "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", + "version": "7.14.0", + "resolved": "https://artifact.devsnc.com/repository/npm-all/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", "devOptional": true, "license": "MIT" }, @@ -14091,7 +14082,7 @@ "version": "1.1.19", "resolved": "https://artifact.devsnc.com/repository/npm-all/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -14463,6 +14454,7 @@ "resolved": "https://artifact.devsnc.com/repository/npm-all/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 2721166..66e9321 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modesty/fluent-mcp", - "version": "0.0.16", + "version": "0.0.17", "description": "MCP server for Fluent (ServiceNow SDK)", "keywords": [ "Servicenow SDK", @@ -49,32 +49,32 @@ } }, "dependencies": { - "@modelcontextprotocol/sdk": "1.18.1", - "@servicenow/sdk": "4.0.1", + "@modelcontextprotocol/sdk": "1.19.1", + "@servicenow/sdk": "4.0.2", "zod": "^3.25.76", "zod-to-json-schema": "^3.24.6" }, "devDependencies": { - "@eslint/js": "^9.36.0", + "@eslint/js": "^9.37.0", "@rollup/plugin-commonjs": "^28.0.6", "@rollup/plugin-eslint": "^9.0.5", "@rollup/plugin-json": "^6.0.1", - "@rollup/plugin-node-resolve": "^16.0.1", + "@rollup/plugin-node-resolve": "^16.0.2", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.4", "@types/jest": "^30.0.0", - "@types/node": "^24.5.2", + "@types/node": "^24.7.0", "@typescript-eslint/eslint-plugin": "^8.44.0", "@typescript-eslint/parser": "^8.44.0", - "eslint": "^9.36.0", - "jest": "^30.1.3", - "rollup": "^4.52.0", + "eslint": "^9.37.0", + "jest": "^30.2.0", + "rollup": "^4.52.4", "rollup-plugin-node-builtins": "^2.1.2", "rollup-plugin-sourcemaps": "^0.6.3", "ts-jest": "^29.4.4", "ts-node": "^10.9.2", "tslib": "^2.8.1", - "typescript": "~5.9.2" + "typescript": "~5.9.3" }, "publishConfig": { "access": "public"