@sonisoft/now-sdk-ext-cli 1.1.0-alpha.3 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4587 -197
- package/dist/commands/aggregate/count.d.ts +16 -0
- package/dist/commands/aggregate/count.d.ts.map +1 -0
- package/dist/commands/aggregate/count.js +67 -0
- package/dist/commands/aggregate/count.js.map +1 -0
- package/dist/commands/aggregate/group.d.ts +24 -0
- package/dist/commands/aggregate/group.d.ts.map +1 -0
- package/dist/commands/aggregate/group.js +120 -0
- package/dist/commands/aggregate/group.js.map +1 -0
- package/dist/commands/aggregate/query.d.ts +21 -0
- package/dist/commands/aggregate/query.d.ts.map +1 -0
- package/dist/commands/aggregate/query.js +100 -0
- package/dist/commands/aggregate/query.js.map +1 -0
- package/dist/commands/app/index.d.ts +4 -2
- package/dist/commands/app/index.d.ts.map +1 -1
- package/dist/commands/app/index.js +27 -6
- package/dist/commands/app/index.js.map +1 -1
- package/dist/commands/app/install.d.ts +4 -2
- package/dist/commands/app/install.d.ts.map +1 -1
- package/dist/commands/app/install.js +41 -8
- package/dist/commands/app/install.js.map +1 -1
- package/dist/commands/app/repo-install.d.ts +18 -0
- package/dist/commands/app/repo-install.d.ts.map +1 -0
- package/dist/commands/app/repo-install.js +171 -0
- package/dist/commands/app/repo-install.js.map +1 -0
- package/dist/commands/app/repo-list.d.ts +16 -0
- package/dist/commands/app/repo-list.d.ts.map +1 -0
- package/dist/commands/app/repo-list.js +150 -0
- package/dist/commands/app/repo-list.js.map +1 -0
- package/dist/commands/app/uninstall.d.ts +15 -0
- package/dist/commands/app/uninstall.d.ts.map +1 -0
- package/dist/commands/app/uninstall.js +69 -0
- package/dist/commands/app/uninstall.js.map +1 -0
- package/dist/commands/atf/index.d.ts +25 -0
- package/dist/commands/atf/index.d.ts.map +1 -0
- package/dist/commands/atf/index.js +183 -0
- package/dist/commands/atf/index.js.map +1 -0
- package/dist/commands/attachment/get.d.ts +14 -0
- package/dist/commands/attachment/get.d.ts.map +1 -0
- package/dist/commands/attachment/get.js +44 -0
- package/dist/commands/attachment/get.js.map +1 -0
- package/dist/commands/attachment/list.d.ts +16 -0
- package/dist/commands/attachment/list.d.ts.map +1 -0
- package/dist/commands/attachment/list.js +60 -0
- package/dist/commands/attachment/list.js.map +1 -0
- package/dist/commands/attachment/upload.d.ts +17 -0
- package/dist/commands/attachment/upload.d.ts.map +1 -0
- package/dist/commands/attachment/upload.js +71 -0
- package/dist/commands/attachment/upload.js.map +1 -0
- package/dist/commands/batch/create.d.ts +15 -0
- package/dist/commands/batch/create.d.ts.map +1 -0
- package/dist/commands/batch/create.js +56 -0
- package/dist/commands/batch/create.js.map +1 -0
- package/dist/commands/batch/update.d.ts +15 -0
- package/dist/commands/batch/update.d.ts.map +1 -0
- package/dist/commands/batch/update.js +56 -0
- package/dist/commands/batch/update.js.map +1 -0
- package/dist/commands/bulk/delete.d.ts +18 -0
- package/dist/commands/bulk/delete.d.ts.map +1 -0
- package/dist/commands/bulk/delete.js +95 -0
- package/dist/commands/bulk/delete.js.map +1 -0
- package/dist/commands/bulk/update.d.ts +19 -0
- package/dist/commands/bulk/update.d.ts.map +1 -0
- package/dist/commands/bulk/update.js +110 -0
- package/dist/commands/bulk/update.js.map +1 -0
- package/dist/commands/exec/index.d.ts +17 -4
- package/dist/commands/exec/index.d.ts.map +1 -1
- package/dist/commands/exec/index.js +278 -28
- package/dist/commands/exec/index.js.map +1 -1
- package/dist/commands/flow/action.d.ts +19 -0
- package/dist/commands/flow/action.d.ts.map +1 -0
- package/dist/commands/flow/action.js +88 -0
- package/dist/commands/flow/action.js.map +1 -0
- package/dist/commands/flow/cancel.d.ts +17 -0
- package/dist/commands/flow/cancel.d.ts.map +1 -0
- package/dist/commands/flow/cancel.js +60 -0
- package/dist/commands/flow/cancel.js.map +1 -0
- package/dist/commands/flow/error.d.ts +16 -0
- package/dist/commands/flow/error.d.ts.map +1 -0
- package/dist/commands/flow/error.js +51 -0
- package/dist/commands/flow/error.js.map +1 -0
- package/dist/commands/flow/message.d.ts +18 -0
- package/dist/commands/flow/message.d.ts.map +1 -0
- package/dist/commands/flow/message.js +66 -0
- package/dist/commands/flow/message.js.map +1 -0
- package/dist/commands/flow/outputs.d.ts +16 -0
- package/dist/commands/flow/outputs.d.ts.map +1 -0
- package/dist/commands/flow/outputs.js +55 -0
- package/dist/commands/flow/outputs.js.map +1 -0
- package/dist/commands/flow/run.d.ts +19 -0
- package/dist/commands/flow/run.d.ts.map +1 -0
- package/dist/commands/flow/run.js +98 -0
- package/dist/commands/flow/run.js.map +1 -0
- package/dist/commands/flow/status.d.ts +16 -0
- package/dist/commands/flow/status.d.ts.map +1 -0
- package/dist/commands/flow/status.js +52 -0
- package/dist/commands/flow/status.js.map +1 -0
- package/dist/commands/flow/subflow.d.ts +19 -0
- package/dist/commands/flow/subflow.d.ts.map +1 -0
- package/dist/commands/flow/subflow.js +92 -0
- package/dist/commands/flow/subflow.js.map +1 -0
- package/dist/commands/health/check.d.ts +20 -0
- package/dist/commands/health/check.d.ts.map +1 -0
- package/dist/commands/health/check.js +105 -0
- package/dist/commands/health/check.js.map +1 -0
- package/dist/commands/log/index.d.ts +22 -0
- package/dist/commands/log/index.d.ts.map +1 -0
- package/dist/commands/log/index.js +190 -0
- package/dist/commands/log/index.js.map +1 -0
- package/dist/commands/query/app.d.ts +17 -0
- package/dist/commands/query/app.d.ts.map +1 -0
- package/dist/commands/query/app.js +81 -0
- package/dist/commands/query/app.js.map +1 -0
- package/dist/commands/query/columns.d.ts +16 -0
- package/dist/commands/query/columns.d.ts.map +1 -0
- package/dist/commands/query/columns.js +76 -0
- package/dist/commands/query/columns.js.map +1 -0
- package/dist/commands/query/index.d.ts +19 -0
- package/dist/commands/query/index.d.ts.map +1 -0
- package/dist/commands/query/index.js +94 -0
- package/dist/commands/query/index.js.map +1 -0
- package/dist/commands/query/syslog.d.ts +16 -0
- package/dist/commands/query/syslog.d.ts.map +1 -0
- package/dist/commands/query/syslog.js +67 -0
- package/dist/commands/query/syslog.js.map +1 -0
- package/dist/commands/schema/field.d.ts +16 -0
- package/dist/commands/schema/field.d.ts.map +1 -0
- package/dist/commands/schema/field.js +62 -0
- package/dist/commands/schema/field.js.map +1 -0
- package/dist/commands/schema/index.d.ts +19 -0
- package/dist/commands/schema/index.d.ts.map +1 -0
- package/dist/commands/schema/index.js +90 -0
- package/dist/commands/schema/index.js.map +1 -0
- package/dist/commands/schema/validate-catalog.d.ts +15 -0
- package/dist/commands/schema/validate-catalog.d.ts.map +1 -0
- package/dist/commands/schema/validate-catalog.js +58 -0
- package/dist/commands/schema/validate-catalog.js.map +1 -0
- package/dist/commands/scope/index.d.ts +14 -0
- package/dist/commands/scope/index.d.ts.map +1 -0
- package/dist/commands/scope/index.js +58 -0
- package/dist/commands/scope/index.js.map +1 -0
- package/dist/commands/scope/set.d.ts +14 -0
- package/dist/commands/scope/set.d.ts.map +1 -0
- package/dist/commands/scope/set.js +44 -0
- package/dist/commands/scope/set.js.map +1 -0
- package/dist/commands/script-sync/pull.d.ts +16 -0
- package/dist/commands/script-sync/pull.d.ts.map +1 -0
- package/dist/commands/script-sync/pull.js +74 -0
- package/dist/commands/script-sync/pull.js.map +1 -0
- package/dist/commands/script-sync/push.d.ts +16 -0
- package/dist/commands/script-sync/push.d.ts.map +1 -0
- package/dist/commands/script-sync/push.js +73 -0
- package/dist/commands/script-sync/push.js.map +1 -0
- package/dist/commands/script-sync/sync.d.ts +15 -0
- package/dist/commands/script-sync/sync.d.ts.map +1 -0
- package/dist/commands/script-sync/sync.js +71 -0
- package/dist/commands/script-sync/sync.js.map +1 -0
- package/dist/commands/search/add-table.d.ts +16 -0
- package/dist/commands/search/add-table.d.ts.map +1 -0
- package/dist/commands/search/add-table.js +68 -0
- package/dist/commands/search/add-table.js.map +1 -0
- package/dist/commands/search/groups.d.ts +12 -0
- package/dist/commands/search/groups.d.ts.map +1 -0
- package/dist/commands/search/groups.js +42 -0
- package/dist/commands/search/groups.js.map +1 -0
- package/dist/commands/search/index.d.ts +18 -0
- package/dist/commands/search/index.d.ts.map +1 -0
- package/dist/commands/search/index.js +103 -0
- package/dist/commands/search/index.js.map +1 -0
- package/dist/commands/search/tables.d.ts +14 -0
- package/dist/commands/search/tables.d.ts.map +1 -0
- package/dist/commands/search/tables.js +50 -0
- package/dist/commands/search/tables.js.map +1 -0
- package/dist/commands/store/install.d.ts +19 -0
- package/dist/commands/store/install.d.ts.map +1 -0
- package/dist/commands/store/install.js +90 -0
- package/dist/commands/store/install.js.map +1 -0
- package/dist/commands/store/search.d.ts +16 -0
- package/dist/commands/store/search.d.ts.map +1 -0
- package/dist/commands/store/search.js +67 -0
- package/dist/commands/store/search.js.map +1 -0
- package/dist/commands/store/update.d.ts +18 -0
- package/dist/commands/store/update.d.ts.map +1 -0
- package/dist/commands/store/update.js +83 -0
- package/dist/commands/store/update.js.map +1 -0
- package/dist/commands/store/validate.d.ts +14 -0
- package/dist/commands/store/validate.d.ts.map +1 -0
- package/dist/commands/store/validate.js +43 -0
- package/dist/commands/store/validate.js.map +1 -0
- package/dist/commands/task/approve.d.ts +15 -0
- package/dist/commands/task/approve.d.ts.map +1 -0
- package/dist/commands/task/approve.js +66 -0
- package/dist/commands/task/approve.js.map +1 -0
- package/dist/commands/task/assign.d.ts +17 -0
- package/dist/commands/task/assign.d.ts.map +1 -0
- package/dist/commands/task/assign.js +86 -0
- package/dist/commands/task/assign.js.map +1 -0
- package/dist/commands/task/close.d.ts +16 -0
- package/dist/commands/task/close.d.ts.map +1 -0
- package/dist/commands/task/close.js +71 -0
- package/dist/commands/task/close.js.map +1 -0
- package/dist/commands/task/comment.d.ts +17 -0
- package/dist/commands/task/comment.d.ts.map +1 -0
- package/dist/commands/task/comment.js +86 -0
- package/dist/commands/task/comment.js.map +1 -0
- package/dist/commands/task/find.d.ts +15 -0
- package/dist/commands/task/find.d.ts.map +1 -0
- package/dist/commands/task/find.js +65 -0
- package/dist/commands/task/find.js.map +1 -0
- package/dist/commands/task/resolve.d.ts +16 -0
- package/dist/commands/task/resolve.d.ts.map +1 -0
- package/dist/commands/task/resolve.js +71 -0
- package/dist/commands/task/resolve.js.map +1 -0
- package/dist/commands/update-set/clone.d.ts +15 -0
- package/dist/commands/update-set/clone.d.ts.map +1 -0
- package/dist/commands/update-set/clone.js +50 -0
- package/dist/commands/update-set/clone.js.map +1 -0
- package/dist/commands/update-set/create.d.ts +16 -0
- package/dist/commands/update-set/create.d.ts.map +1 -0
- package/dist/commands/update-set/create.js +60 -0
- package/dist/commands/update-set/create.js.map +1 -0
- package/dist/commands/update-set/current.d.ts +14 -0
- package/dist/commands/update-set/current.d.ts.map +1 -0
- package/dist/commands/update-set/current.js +55 -0
- package/dist/commands/update-set/current.js.map +1 -0
- package/dist/commands/update-set/index.d.ts +15 -0
- package/dist/commands/update-set/index.d.ts.map +1 -0
- package/dist/commands/update-set/index.js +56 -0
- package/dist/commands/update-set/index.js.map +1 -0
- package/dist/commands/update-set/inspect.d.ts +14 -0
- package/dist/commands/update-set/inspect.d.ts.map +1 -0
- package/dist/commands/update-set/inspect.js +43 -0
- package/dist/commands/update-set/inspect.js.map +1 -0
- package/dist/commands/update-set/move.d.ts +16 -0
- package/dist/commands/update-set/move.d.ts.map +1 -0
- package/dist/commands/update-set/move.js +57 -0
- package/dist/commands/update-set/move.js.map +1 -0
- package/dist/commands/workflow/create.d.ts +14 -0
- package/dist/commands/workflow/create.d.ts.map +1 -0
- package/dist/commands/workflow/create.js +50 -0
- package/dist/commands/workflow/create.js.map +1 -0
- package/dist/commands/workflow/publish.d.ts +15 -0
- package/dist/commands/workflow/publish.d.ts.map +1 -0
- package/dist/commands/workflow/publish.js +53 -0
- package/dist/commands/workflow/publish.js.map +1 -0
- package/dist/commands/xml/export.d.ts +17 -0
- package/dist/commands/xml/export.d.ts.map +1 -0
- package/dist/commands/xml/export.js +87 -0
- package/dist/commands/xml/export.js.map +1 -0
- package/dist/commands/xml/import.d.ts +16 -0
- package/dist/commands/xml/import.d.ts.map +1 -0
- package/dist/commands/xml/import.js +69 -0
- package/dist/commands/xml/import.js.map +1 -0
- package/dist/common/authenticated-command.d.ts +5 -2
- package/dist/common/authenticated-command.d.ts.map +1 -1
- package/dist/common/authenticated-command.js +14 -5
- package/dist/common/authenticated-command.js.map +1 -1
- package/dist/common/base-command.d.ts +2 -2
- package/dist/common/base-command.d.ts.map +1 -1
- package/dist/common/base-command.js +0 -1
- package/dist/common/base-command.js.map +1 -1
- package/dist/common/scope-autocomplete.d.ts +20 -0
- package/dist/common/scope-autocomplete.d.ts.map +1 -0
- package/dist/common/scope-autocomplete.js +93 -0
- package/dist/common/scope-autocomplete.js.map +1 -0
- package/dist/services/aggregate-display.service.d.ts +18 -0
- package/dist/services/aggregate-display.service.d.ts.map +1 -0
- package/dist/services/aggregate-display.service.js +83 -0
- package/dist/services/aggregate-display.service.js.map +1 -0
- package/dist/services/app-display.service.d.ts +36 -0
- package/dist/services/app-display.service.d.ts.map +1 -0
- package/dist/services/app-display.service.js +101 -0
- package/dist/services/app-display.service.js.map +1 -0
- package/dist/services/atf-result-formatter.service.d.ts +64 -0
- package/dist/services/atf-result-formatter.service.d.ts.map +1 -0
- package/dist/services/atf-result-formatter.service.js +83 -0
- package/dist/services/atf-result-formatter.service.js.map +1 -0
- package/dist/services/attachment-display.service.d.ts +18 -0
- package/dist/services/attachment-display.service.d.ts.map +1 -0
- package/dist/services/attachment-display.service.js +93 -0
- package/dist/services/attachment-display.service.js.map +1 -0
- package/dist/services/batch-display.service.d.ts +11 -0
- package/dist/services/batch-display.service.d.ts.map +1 -0
- package/dist/services/batch-display.service.js +75 -0
- package/dist/services/batch-display.service.js.map +1 -0
- package/dist/services/bulk-display.service.d.ts +11 -0
- package/dist/services/bulk-display.service.d.ts.map +1 -0
- package/dist/services/bulk-display.service.js +85 -0
- package/dist/services/bulk-display.service.js.map +1 -0
- package/dist/services/code-search-display.service.d.ts +23 -0
- package/dist/services/code-search-display.service.d.ts.map +1 -0
- package/dist/services/code-search-display.service.js +130 -0
- package/dist/services/code-search-display.service.js.map +1 -0
- package/dist/services/flow-display.service.d.ts +10 -0
- package/dist/services/flow-display.service.d.ts.map +1 -0
- package/dist/services/flow-display.service.js +164 -0
- package/dist/services/flow-display.service.js.map +1 -0
- package/dist/services/health-display.service.d.ts +8 -0
- package/dist/services/health-display.service.d.ts.map +1 -0
- package/dist/services/health-display.service.js +91 -0
- package/dist/services/health-display.service.js.map +1 -0
- package/dist/services/log-filter.service.d.ts +31 -0
- package/dist/services/log-filter.service.d.ts.map +1 -0
- package/dist/services/log-filter.service.js +117 -0
- package/dist/services/log-filter.service.js.map +1 -0
- package/dist/services/log-formatter.service.d.ts +30 -0
- package/dist/services/log-formatter.service.d.ts.map +1 -0
- package/dist/services/log-formatter.service.js +122 -0
- package/dist/services/log-formatter.service.js.map +1 -0
- package/dist/services/query-display.service.d.ts +23 -0
- package/dist/services/query-display.service.d.ts.map +1 -0
- package/dist/services/query-display.service.js +152 -0
- package/dist/services/query-display.service.js.map +1 -0
- package/dist/services/schema-display.service.d.ts +18 -0
- package/dist/services/schema-display.service.d.ts.map +1 -0
- package/dist/services/schema-display.service.js +106 -0
- package/dist/services/schema-display.service.js.map +1 -0
- package/dist/services/scope-display.service.d.ts +18 -0
- package/dist/services/scope-display.service.d.ts.map +1 -0
- package/dist/services/scope-display.service.js +83 -0
- package/dist/services/scope-display.service.js.map +1 -0
- package/dist/services/script-parameter.service.d.ts +16 -0
- package/dist/services/script-parameter.service.d.ts.map +1 -0
- package/dist/services/script-parameter.service.js +34 -0
- package/dist/services/script-parameter.service.js.map +1 -0
- package/dist/services/script-sync-display.service.d.ts +13 -0
- package/dist/services/script-sync-display.service.d.ts.map +1 -0
- package/dist/services/script-sync-display.service.js +71 -0
- package/dist/services/script-sync-display.service.js.map +1 -0
- package/dist/services/store-app-display.service.d.ts +16 -0
- package/dist/services/store-app-display.service.d.ts.map +1 -0
- package/dist/services/store-app-display.service.js +114 -0
- package/dist/services/store-app-display.service.js.map +1 -0
- package/dist/services/task-display.service.d.ts +14 -0
- package/dist/services/task-display.service.d.ts.map +1 -0
- package/dist/services/task-display.service.js +86 -0
- package/dist/services/task-display.service.js.map +1 -0
- package/dist/services/update-set-display.service.d.ts +28 -0
- package/dist/services/update-set-display.service.d.ts.map +1 -0
- package/dist/services/update-set-display.service.js +150 -0
- package/dist/services/update-set-display.service.js.map +1 -0
- package/dist/services/workflow-display.service.d.ts +13 -0
- package/dist/services/workflow-display.service.d.ts.map +1 -0
- package/dist/services/workflow-display.service.js +53 -0
- package/dist/services/workflow-display.service.js.map +1 -0
- package/dist/services/xml-display.service.d.ts +11 -0
- package/dist/services/xml-display.service.d.ts.map +1 -0
- package/dist/services/xml-display.service.js +55 -0
- package/dist/services/xml-display.service.js.map +1 -0
- package/dist/util/log-factory.d.ts +5 -0
- package/dist/util/log-factory.d.ts.map +1 -0
- package/dist/util/log-factory.js +8 -0
- package/dist/util/log-factory.js.map +1 -0
- package/oclif.manifest.json +5847 -49
- package/package.json +107 -28
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/bulk/delete.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAG5E,qBAAa,UAAW,SAAQ,oBAAoB,CAAC,OAAO,UAAU,CAAC;IAErE,MAAM,CAAC,IAAI,KAAK;IAClB,MAAM,CAAC,WAAW,SAQoE;IACtF,MAAM,CAAC,QAAQ;;;QAiBZ;IACH,MAAM,CAAC,KAAK;;;;;;MA4BT;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiC3B"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/* eslint-disable perfectionist/sort-objects */
|
|
2
|
+
import { Flags } from '@oclif/core';
|
|
3
|
+
import { QueryBatchOperations } from '@sonisoft/now-sdk-ext-core';
|
|
4
|
+
import { AuthenticatedCommand } from '../../common/authenticated-command.js';
|
|
5
|
+
import { BulkDisplayService } from '../../services/bulk-display.service.js';
|
|
6
|
+
export class BulkDelete extends AuthenticatedCommand {
|
|
7
|
+
static args = {};
|
|
8
|
+
static description = 'Bulk delete records matching an encoded query.\n\n' +
|
|
9
|
+
'Finds all records in a table matching the given query, then deletes each one. ' +
|
|
10
|
+
'Defaults to dry-run mode — use --confirm to execute.\n\n' +
|
|
11
|
+
'Features:\n' +
|
|
12
|
+
' \u2022 Safe dry-run by default (shows match count without deleting)\n' +
|
|
13
|
+
' \u2022 Encoded query filtering\n' +
|
|
14
|
+
' \u2022 Configurable record limit (default 200, max 10000)\n' +
|
|
15
|
+
' \u2022 Progress reporting for large operations\n' +
|
|
16
|
+
' \u2022 Error collection — operation continues even if individual records fail';
|
|
17
|
+
static examples = [
|
|
18
|
+
{
|
|
19
|
+
description: 'Dry run — see how many records would be deleted',
|
|
20
|
+
command: '<%= config.bin %> <%= command.id %> --table u_temp_import --query "sys_created_on<2024-01-01" --auth dev',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
description: 'Execute the delete (requires --confirm)',
|
|
24
|
+
command: '<%= config.bin %> <%= command.id %> --table u_temp_import --query "sys_created_on<2024-01-01" --confirm --auth dev',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
description: 'Delete with custom limit',
|
|
28
|
+
command: '<%= config.bin %> <%= command.id %> --table incident --query "active=false^closed_at<2023-01-01" --limit 1000 --confirm --auth dev',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
description: 'Delete as JSON output',
|
|
32
|
+
command: '<%= config.bin %> <%= command.id %> --table u_staging --query "processed=true" --confirm --json --auth dev',
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
static flags = {
|
|
36
|
+
'table': Flags.string({
|
|
37
|
+
char: 't',
|
|
38
|
+
description: 'Table name to delete records from',
|
|
39
|
+
required: true,
|
|
40
|
+
}),
|
|
41
|
+
'query': Flags.string({
|
|
42
|
+
char: 'q',
|
|
43
|
+
description: 'Encoded query to match records for deletion',
|
|
44
|
+
required: true,
|
|
45
|
+
}),
|
|
46
|
+
'confirm': Flags.boolean({
|
|
47
|
+
description: 'Execute the delete (without this flag, performs a dry run)',
|
|
48
|
+
required: false,
|
|
49
|
+
default: false,
|
|
50
|
+
}),
|
|
51
|
+
'limit': Flags.integer({
|
|
52
|
+
char: 'l',
|
|
53
|
+
description: 'Maximum number of records to delete (default 200, max 10000)',
|
|
54
|
+
required: false,
|
|
55
|
+
default: 200,
|
|
56
|
+
}),
|
|
57
|
+
'json': Flags.boolean({
|
|
58
|
+
char: 'j',
|
|
59
|
+
description: 'Output results as JSON',
|
|
60
|
+
required: false,
|
|
61
|
+
default: false,
|
|
62
|
+
}),
|
|
63
|
+
};
|
|
64
|
+
async run() {
|
|
65
|
+
const { flags } = await this.parse(BulkDelete);
|
|
66
|
+
const displayService = new BulkDisplayService();
|
|
67
|
+
try {
|
|
68
|
+
const ops = new QueryBatchOperations(this.instance);
|
|
69
|
+
if (flags.confirm) {
|
|
70
|
+
this.log(`Executing bulk delete on table: ${flags.table}`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
this.log(`Dry run — bulk delete on table: ${flags.table}`);
|
|
74
|
+
}
|
|
75
|
+
const result = await ops.queryDelete({
|
|
76
|
+
table: flags.table,
|
|
77
|
+
query: flags.query,
|
|
78
|
+
confirm: flags.confirm,
|
|
79
|
+
limit: flags.limit,
|
|
80
|
+
onProgress: (message) => {
|
|
81
|
+
this.log(` ${message}`);
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
const lines = displayService.formatDeleteResult(result, flags.table, flags.json ?? false);
|
|
85
|
+
for (const line of lines) {
|
|
86
|
+
(flags.json ?? false) ? console.log(line) : this.log(line);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
this._logger.error("Error occurred during bulk delete.", error);
|
|
91
|
+
this.error(error);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/bulk/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from '../../common/authenticated-command.js';
|
|
2
|
+
export declare class BulkUpdate extends AuthenticatedCommand<typeof BulkUpdate> {
|
|
3
|
+
static args: {};
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: {
|
|
6
|
+
description: string;
|
|
7
|
+
command: string;
|
|
8
|
+
}[];
|
|
9
|
+
static flags: {
|
|
10
|
+
table: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
11
|
+
query: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
12
|
+
data: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
13
|
+
confirm: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
14
|
+
limit: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<number, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
15
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
16
|
+
};
|
|
17
|
+
run(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/bulk/update.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAG5E,qBAAa,UAAW,SAAQ,oBAAoB,CAAC,OAAO,UAAU,CAAC;IAErE,MAAM,CAAC,IAAI,KAAK;IAClB,MAAM,CAAC,WAAW,SASoE;IACtF,MAAM,CAAC,QAAQ;;;QAiBZ;IACH,MAAM,CAAC,KAAK;;;;;;;MAiCT;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA0C3B"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/* eslint-disable perfectionist/sort-objects */
|
|
2
|
+
import { Flags } from '@oclif/core';
|
|
3
|
+
import { QueryBatchOperations } from '@sonisoft/now-sdk-ext-core';
|
|
4
|
+
import { AuthenticatedCommand } from '../../common/authenticated-command.js';
|
|
5
|
+
import { BulkDisplayService } from '../../services/bulk-display.service.js';
|
|
6
|
+
export class BulkUpdate extends AuthenticatedCommand {
|
|
7
|
+
static args = {};
|
|
8
|
+
static description = 'Bulk update records matching an encoded query.\n\n' +
|
|
9
|
+
'Finds all records in a table matching the given query, then applies field updates to each one. ' +
|
|
10
|
+
'Defaults to dry-run mode — use --confirm to execute.\n\n' +
|
|
11
|
+
'Features:\n' +
|
|
12
|
+
' \u2022 Safe dry-run by default (shows match count without modifying data)\n' +
|
|
13
|
+
' \u2022 Encoded query filtering\n' +
|
|
14
|
+
' \u2022 JSON field=value pairs for update data\n' +
|
|
15
|
+
' \u2022 Configurable record limit (default 200, max 10000)\n' +
|
|
16
|
+
' \u2022 Progress reporting for large operations\n' +
|
|
17
|
+
' \u2022 Error collection — operation continues even if individual records fail';
|
|
18
|
+
static examples = [
|
|
19
|
+
{
|
|
20
|
+
description: 'Dry run — see how many records would be updated',
|
|
21
|
+
command: '<%= config.bin %> <%= command.id %> --table incident --query "active=true^priority=5" --data \'{"priority":"4"}\' --auth dev',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
description: 'Execute the update (requires --confirm)',
|
|
25
|
+
command: '<%= config.bin %> <%= command.id %> --table incident --query "active=true^priority=5" --data \'{"priority":"4"}\' --confirm --auth dev',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
description: 'Update with custom limit',
|
|
29
|
+
command: '<%= config.bin %> <%= command.id %> --table incident --query "state=1" --data \'{"assignment_group":"group-sys-id"}\' --limit 500 --confirm --auth dev',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
description: 'Update as JSON output',
|
|
33
|
+
command: '<%= config.bin %> <%= command.id %> --table incident --query "active=true" --data \'{"state":"6"}\' --confirm --json --auth dev',
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
static flags = {
|
|
37
|
+
'table': Flags.string({
|
|
38
|
+
char: 't',
|
|
39
|
+
description: 'Table name to update records in',
|
|
40
|
+
required: true,
|
|
41
|
+
}),
|
|
42
|
+
'query': Flags.string({
|
|
43
|
+
char: 'q',
|
|
44
|
+
description: 'Encoded query to match records',
|
|
45
|
+
required: true,
|
|
46
|
+
}),
|
|
47
|
+
'data': Flags.string({
|
|
48
|
+
char: 'd',
|
|
49
|
+
description: 'JSON object of field=value pairs to apply (e.g. \'{"priority":"4","state":"2"}\')',
|
|
50
|
+
required: true,
|
|
51
|
+
}),
|
|
52
|
+
'confirm': Flags.boolean({
|
|
53
|
+
description: 'Execute the update (without this flag, performs a dry run)',
|
|
54
|
+
required: false,
|
|
55
|
+
default: false,
|
|
56
|
+
}),
|
|
57
|
+
'limit': Flags.integer({
|
|
58
|
+
char: 'l',
|
|
59
|
+
description: 'Maximum number of records to update (default 200, max 10000)',
|
|
60
|
+
required: false,
|
|
61
|
+
default: 200,
|
|
62
|
+
}),
|
|
63
|
+
'json': Flags.boolean({
|
|
64
|
+
char: 'j',
|
|
65
|
+
description: 'Output results as JSON',
|
|
66
|
+
required: false,
|
|
67
|
+
default: false,
|
|
68
|
+
}),
|
|
69
|
+
};
|
|
70
|
+
async run() {
|
|
71
|
+
const { flags } = await this.parse(BulkUpdate);
|
|
72
|
+
const displayService = new BulkDisplayService();
|
|
73
|
+
try {
|
|
74
|
+
let data;
|
|
75
|
+
try {
|
|
76
|
+
data = JSON.parse(flags.data);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
this.error('Invalid JSON in --data flag. Provide a valid JSON object, e.g. \'{"field":"value"}\'');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const ops = new QueryBatchOperations(this.instance);
|
|
83
|
+
if (flags.confirm) {
|
|
84
|
+
this.log(`Executing bulk update on table: ${flags.table}`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.log(`Dry run — bulk update on table: ${flags.table}`);
|
|
88
|
+
}
|
|
89
|
+
const result = await ops.queryUpdate({
|
|
90
|
+
table: flags.table,
|
|
91
|
+
query: flags.query,
|
|
92
|
+
data,
|
|
93
|
+
confirm: flags.confirm,
|
|
94
|
+
limit: flags.limit,
|
|
95
|
+
onProgress: (message) => {
|
|
96
|
+
this.log(` ${message}`);
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
const lines = displayService.formatUpdateResult(result, flags.table, flags.json ?? false);
|
|
100
|
+
for (const line of lines) {
|
|
101
|
+
(flags.json ?? false) ? console.log(line) : this.log(line);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
this._logger.error("Error occurred during bulk update.", error);
|
|
106
|
+
this.error(error);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/bulk/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,25 @@ import { AuthenticatedCommand } from '../../common/authenticated-command.js';
|
|
|
2
2
|
export declare class Exec extends AuthenticatedCommand<typeof Exec> {
|
|
3
3
|
static args: {
|
|
4
4
|
scope: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
5
|
-
file: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
5
|
+
file: import("@oclif/core/lib/interfaces/parser.js").Arg<string | undefined, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static autocomplete: {
|
|
8
|
+
scope(ctx: {
|
|
9
|
+
flags: Record<string, any>;
|
|
10
|
+
}): Promise<string[]>;
|
|
6
11
|
};
|
|
7
12
|
static description: string;
|
|
8
|
-
static examples:
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
static examples: {
|
|
14
|
+
description: string;
|
|
15
|
+
command: string;
|
|
16
|
+
}[];
|
|
17
|
+
static flags: {
|
|
18
|
+
params: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
19
|
+
};
|
|
11
20
|
run(): Promise<void>;
|
|
21
|
+
private applyParameters;
|
|
22
|
+
private executeFromFile;
|
|
23
|
+
private executeScript;
|
|
24
|
+
private startREPL;
|
|
12
25
|
}
|
|
13
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/exec/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/exec/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAI5E,qBAAa,IAAK,SAAQ,oBAAoB,CAAC,OAAO,IAAI,CAAC;IAEzD,MAAM,CAAC,IAAI;;;MAMV;IAED,MAAM,CAAC,YAAY;mBAEA;YAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;SAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;MASlE;IACH,MAAM,CAAC,WAAW,SA4CwD;IAC1E,MAAM,CAAC,QAAQ;;;QAyCZ;IACH,MAAM,CAAC,KAAK;;MAMT;IAIK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAc1B,OAAO,CAAC,eAAe;YAUT,eAAe;YAoBf,aAAa;YAyBb,SAAS;CA0HxB"}
|
|
@@ -1,51 +1,301 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
2
|
/* eslint-disable perfectionist/sort-objects */
|
|
3
|
-
import { Args } from '@oclif/core';
|
|
4
|
-
import { BackgroundScriptExecutor,
|
|
3
|
+
import { Args, Flags } from '@oclif/core';
|
|
4
|
+
import { BackgroundScriptExecutor, NowStringUtil } from '@sonisoft/now-sdk-ext-core';
|
|
5
5
|
import fs from 'node:fs';
|
|
6
6
|
import path from 'node:path';
|
|
7
|
+
import * as readline from 'node:readline';
|
|
7
8
|
import { AuthenticatedCommand } from '../../common/authenticated-command.js';
|
|
9
|
+
import { getCachedScopes } from '../../common/scope-autocomplete.js';
|
|
10
|
+
import { ScriptParameterService } from '../../services/script-parameter.service.js';
|
|
8
11
|
export class Exec extends AuthenticatedCommand {
|
|
9
12
|
static args = {
|
|
10
|
-
scope: Args.string({
|
|
11
|
-
|
|
13
|
+
scope: Args.string({
|
|
14
|
+
description: 'Scope to execute script in. Use "global" for global scope.',
|
|
15
|
+
required: true
|
|
16
|
+
}),
|
|
17
|
+
file: Args.string({ description: 'File to execute in scripts background. If omitted, starts REPL mode.', required: false }),
|
|
12
18
|
};
|
|
13
|
-
|
|
19
|
+
// Autocomplete hook for scope argument
|
|
20
|
+
static autocomplete = {
|
|
21
|
+
async scope(ctx) {
|
|
22
|
+
const authFlag = ctx.flags?.auth;
|
|
23
|
+
try {
|
|
24
|
+
const scopes = await getCachedScopes(authFlag);
|
|
25
|
+
return ['global', ...scopes];
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return ['global'];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
static description = 'Execute JavaScript on a ServiceNow instance remotely using Scripts - Background.\n\n' +
|
|
33
|
+
'This command allows you to run JavaScript either from files or interactively via REPL mode. ' +
|
|
34
|
+
'It mimics the functionality of the Scripts - Background interface in ServiceNow, providing a way to ' +
|
|
35
|
+
'execute scripts programmatically without manual interaction. The output is returned in real-time and can be ' +
|
|
36
|
+
'piped to other commands or saved to files.\n\n' +
|
|
37
|
+
'Modes:\n' +
|
|
38
|
+
' • File Mode: Provide a file path to execute scripts from a file\n' +
|
|
39
|
+
' • REPL Mode: Omit the file path to start an interactive session\n\n' +
|
|
40
|
+
'Features:\n' +
|
|
41
|
+
' • Execute local JavaScript files remotely\n' +
|
|
42
|
+
' • Interactive REPL for ad-hoc script execution\n' +
|
|
43
|
+
' • Script parameterization with {placeholder} replacement\n' +
|
|
44
|
+
' • Multi-line script support in REPL\n' +
|
|
45
|
+
' • Scope-aware execution (global or custom scope)\n' +
|
|
46
|
+
' • Real-time console output capture\n' +
|
|
47
|
+
' • Pipe-able output for command chaining\n' +
|
|
48
|
+
' • Debug logging support\n' +
|
|
49
|
+
' • Useful for data migration, testing, and administrative tasks\n\n' +
|
|
50
|
+
'Script Parameterization:\n' +
|
|
51
|
+
' Use {paramName} placeholders in your script files, then provide values via --params:\n' +
|
|
52
|
+
' • Supports any JSON-serializable values (strings, numbers, booleans)\n' +
|
|
53
|
+
' • Multiple parameters supported\n' +
|
|
54
|
+
' • All occurrences of each placeholder are replaced\n' +
|
|
55
|
+
' • Example: {token}, {username}, {environment}\n\n' +
|
|
56
|
+
'REPL Controls:\n' +
|
|
57
|
+
' • Press Enter to add a new line\n' +
|
|
58
|
+
' • Type .exec or press Ctrl+D to execute the script\n' +
|
|
59
|
+
' • Type .clear to clear the current input\n' +
|
|
60
|
+
' • Type .exit or press Ctrl+C twice to exit REPL\n\n' +
|
|
61
|
+
'⚠️ IMPORTANT SECURITY WARNING:\n' +
|
|
62
|
+
'This command executes scripts with the same permissions and risks as using Scripts - Background directly\n' +
|
|
63
|
+
'in ServiceNow. Always:\n' +
|
|
64
|
+
' • Review scripts before execution\n' +
|
|
65
|
+
' • Test in non-production environments first\n' +
|
|
66
|
+
' • Use appropriate scoping to limit access\n' +
|
|
67
|
+
' • Be aware of data modification risks\n' +
|
|
68
|
+
' • Follow your organization\'s security policies\n' +
|
|
69
|
+
' • Never execute untrusted scripts\n\n' +
|
|
70
|
+
'Script Capabilities:\n' +
|
|
71
|
+
' Scripts run with full GlideSystem API access and can:\n' +
|
|
72
|
+
' • Query and modify database records\n' +
|
|
73
|
+
' • Create, update, and delete data\n' +
|
|
74
|
+
' • Execute business rules and workflows\n' +
|
|
75
|
+
' • Access all APIs available in Scripts - Background\n' +
|
|
76
|
+
' • Use gs, GlideRecord, GlideAggregate, and other server-side APIs';
|
|
14
77
|
static examples = [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
78
|
+
{
|
|
79
|
+
description: 'Start REPL in global scope',
|
|
80
|
+
command: '<%= config.bin %> <%= command.id %> global --auth dev-instance',
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
description: 'Start REPL in custom application scope',
|
|
84
|
+
command: '<%= config.bin %> <%= command.id %> x_my_custom_app --auth dev-instance',
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
description: 'Execute a script file in global scope',
|
|
88
|
+
command: '<%= config.bin %> <%= command.id %> global ./scripts/cleanup.js --auth dev-instance',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
description: 'Execute a script file in a custom application scope',
|
|
92
|
+
command: '<%= config.bin %> <%= command.id %> x_my_custom_app ./scripts/app-config.js --auth dev-instance',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
description: 'Execute a parameterized script with single parameter',
|
|
96
|
+
command: '<%= config.bin %> <%= command.id %> global ./scripts/query-user.js --auth dev-instance --params \'{"username":"admin"}\'',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
description: 'Execute a parameterized script with multiple parameters',
|
|
100
|
+
command: '<%= config.bin %> <%= command.id %> global ./scripts/update-record.js --auth dev-instance --params \'{"table":"incident","field":"priority","value":"1"}\'',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
description: 'Execute and save output to a file',
|
|
104
|
+
command: '<%= config.bin %> <%= command.id %> global ./scripts/report.js --auth dev-instance > report.txt',
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
description: 'Execute and pipe output to grep for filtering',
|
|
108
|
+
command: '<%= config.bin %> <%= command.id %> global ./scripts/list-users.js --auth dev-instance | grep "admin"',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
description: 'Execute with debug logging to troubleshoot issues',
|
|
112
|
+
command: '<%= config.bin %> <%= command.id %> global ./script.js --auth dev-instance --log-level debug',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
description: 'Execute with parameters for template replacement',
|
|
116
|
+
command: '<%= config.bin %> <%= command.id %> global ./script.js --auth dev-instance --params \'{"token":"abc123","env":"dev"}\'',
|
|
117
|
+
},
|
|
18
118
|
];
|
|
19
119
|
static flags = {
|
|
20
|
-
|
|
120
|
+
params: Flags.string({
|
|
121
|
+
char: 'p',
|
|
122
|
+
description: 'JSON object of parameters to replace in script file. Use {paramName} syntax in your script.',
|
|
123
|
+
required: false
|
|
124
|
+
}),
|
|
21
125
|
};
|
|
22
|
-
_logger = new Logger("ExecCommand");
|
|
126
|
+
// private _logger:Logger = new Logger("ExecCommand");
|
|
23
127
|
async run() {
|
|
24
128
|
const { args, flags } = await this.parse(Exec);
|
|
25
|
-
if (
|
|
129
|
+
if (NowStringUtil.isStringEmpty(args.scope)) {
|
|
130
|
+
this.error("Scope is required.");
|
|
131
|
+
}
|
|
132
|
+
else if (!NowStringUtil.isStringEmpty(args.file) && args.file) {
|
|
133
|
+
// File mode - execute script from file
|
|
134
|
+
await this.executeFromFile(args.file, args.scope, flags.params);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// REPL mode - interactive script execution
|
|
138
|
+
await this.startREPL(args.scope);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
applyParameters(script, paramsJson) {
|
|
142
|
+
try {
|
|
143
|
+
const paramService = new ScriptParameterService(this._logger);
|
|
144
|
+
return paramService.applyParameters(script, paramsJson);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
this.error(error.message);
|
|
148
|
+
return script;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async executeFromFile(filePath, scope, params) {
|
|
152
|
+
this.log(`Executing script from file: ${filePath}`);
|
|
153
|
+
this.log(`Scope: ${scope}`);
|
|
154
|
+
this.log(`Params: ${params}`);
|
|
155
|
+
try {
|
|
156
|
+
const resolvedPath = path.resolve(filePath);
|
|
157
|
+
let script = fs.readFileSync(resolvedPath).toString('utf8');
|
|
158
|
+
// Apply parameter replacement if params provided
|
|
159
|
+
if (params) {
|
|
160
|
+
script = this.applyParameters(script, params);
|
|
161
|
+
}
|
|
162
|
+
await this.executeScript(script, scope);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
this._logger.error("Error occurred when executing background script from file.", error);
|
|
166
|
+
this.error(error);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async executeScript(script, scope) {
|
|
170
|
+
this.log('Executing script...');
|
|
171
|
+
this.log(`Scope: ${scope}`);
|
|
172
|
+
try {
|
|
173
|
+
const executor = new BackgroundScriptExecutor(this.instance, scope);
|
|
174
|
+
const result = await executor.executeScript(script, scope, this.instance);
|
|
175
|
+
this._logger.debug("Ran background script", result);
|
|
176
|
+
if (result && result.scriptResults && Array.isArray(result.scriptResults)) {
|
|
177
|
+
const { scriptResults } = result;
|
|
178
|
+
for (const scriptResult of scriptResults) {
|
|
179
|
+
console.log(scriptResult.line);
|
|
180
|
+
this._logger.debug(scriptResult.line);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
throw new Error("Response from script execution was null or undefined. Please review logs to identify the problem.");
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
this._logger.error("Error occurred when executing background script.", error);
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async startREPL(scope) {
|
|
193
|
+
this.log(`\n╔═══════════════════════════════════════════════════════════════╗`);
|
|
194
|
+
this.log(`║ ServiceNow Script Executor REPL ║`);
|
|
195
|
+
this.log(`╚═══════════════════════════════════════════════════════════════╝`);
|
|
196
|
+
this.log(` Scope: ${scope}`);
|
|
197
|
+
this.log(` Instance: ${this.instance.getHost()}`);
|
|
198
|
+
this.log(`\n Commands:`);
|
|
199
|
+
this.log(` .exec - Execute the current script`);
|
|
200
|
+
this.log(` .clear - Clear the current input`);
|
|
201
|
+
this.log(` .exit - Exit REPL`);
|
|
202
|
+
this.log(` Ctrl+D - Execute the current script`);
|
|
203
|
+
this.log(` Ctrl+C - Cancel current input or exit (press twice)`);
|
|
204
|
+
this.log(`\n Type your script below (press Enter for new lines):\n`);
|
|
205
|
+
const rl = readline.createInterface({
|
|
206
|
+
input: process.stdin,
|
|
207
|
+
output: process.stdout,
|
|
208
|
+
prompt: 'sn> ',
|
|
209
|
+
terminal: true
|
|
210
|
+
});
|
|
211
|
+
let scriptBuffer = [];
|
|
212
|
+
let lineCount = 0;
|
|
213
|
+
const executeBufferedScript = async () => {
|
|
214
|
+
if (scriptBuffer.length === 0) {
|
|
215
|
+
this.log(' (No script to execute)\n');
|
|
216
|
+
rl.prompt();
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const script = scriptBuffer.join('\n');
|
|
220
|
+
this.log(`\n Executing script (${scriptBuffer.length} lines)...\n`);
|
|
221
|
+
this.log(` ${'─'.repeat(63)}\n`);
|
|
26
222
|
try {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
this.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
223
|
+
await this.executeScript(script, scope);
|
|
224
|
+
this.log(`\n ${'─'.repeat(63)}`);
|
|
225
|
+
this.log(` ✓ Script executed successfully\n`);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
this.log(`\n ${'─'.repeat(63)}`);
|
|
229
|
+
this.log(` ✗ Script execution failed`);
|
|
230
|
+
this.log(` Error: ${error.message}\n`);
|
|
231
|
+
}
|
|
232
|
+
scriptBuffer = [];
|
|
233
|
+
lineCount = 0;
|
|
234
|
+
rl.setPrompt('sn> ');
|
|
235
|
+
rl.prompt();
|
|
236
|
+
};
|
|
237
|
+
const clearBuffer = () => {
|
|
238
|
+
scriptBuffer = [];
|
|
239
|
+
lineCount = 0;
|
|
240
|
+
this.log(' (Input cleared)\n');
|
|
241
|
+
rl.setPrompt('sn> ');
|
|
242
|
+
rl.prompt();
|
|
243
|
+
};
|
|
244
|
+
rl.on('line', async (line) => {
|
|
245
|
+
const trimmedLine = line.trim();
|
|
246
|
+
// Handle REPL commands
|
|
247
|
+
if (trimmedLine === '.exec') {
|
|
248
|
+
await executeBufferedScript();
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
if (trimmedLine === '.clear') {
|
|
252
|
+
clearBuffer();
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (trimmedLine === '.exit') {
|
|
256
|
+
this.log('\n Goodbye! 👋\n');
|
|
257
|
+
rl.close();
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
// Add line to buffer
|
|
261
|
+
scriptBuffer.push(line);
|
|
262
|
+
lineCount++;
|
|
263
|
+
// Update prompt to show continuation
|
|
264
|
+
rl.setPrompt(`... `);
|
|
265
|
+
rl.prompt();
|
|
266
|
+
});
|
|
267
|
+
rl.on('close', async () => {
|
|
268
|
+
// Execute on Ctrl+D
|
|
269
|
+
if (scriptBuffer.length > 0) {
|
|
270
|
+
this.log('\n');
|
|
271
|
+
await executeBufferedScript();
|
|
272
|
+
}
|
|
273
|
+
this.exit(0);
|
|
274
|
+
});
|
|
275
|
+
// Handle Ctrl+C
|
|
276
|
+
let ctrlCCount = 0;
|
|
277
|
+
rl.on('SIGINT', () => {
|
|
278
|
+
ctrlCCount++;
|
|
279
|
+
if (ctrlCCount === 1) {
|
|
280
|
+
if (scriptBuffer.length > 0) {
|
|
281
|
+
// First Ctrl+C: clear buffer
|
|
282
|
+
this.log('\n (Input cancelled. Press Ctrl+C again to exit)\n');
|
|
283
|
+
clearBuffer();
|
|
284
|
+
ctrlCCount = 0;
|
|
39
285
|
}
|
|
40
286
|
else {
|
|
41
|
-
|
|
287
|
+
this.log('\n (Press Ctrl+C again to exit)\n');
|
|
288
|
+
rl.prompt();
|
|
42
289
|
}
|
|
43
290
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
this.
|
|
291
|
+
else {
|
|
292
|
+
// Second Ctrl+C: exit
|
|
293
|
+
this.log('\n Goodbye! 👋\n');
|
|
294
|
+
rl.close();
|
|
295
|
+
this.exit(0);
|
|
47
296
|
}
|
|
48
|
-
}
|
|
297
|
+
});
|
|
298
|
+
rl.prompt();
|
|
49
299
|
}
|
|
50
300
|
}
|
|
51
301
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/exec/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,+CAA+C;AAC/C,OAAO,EAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/exec/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,+CAA+C;AAC/C,OAAO,EAAC,IAAI,EAAW,KAAK,EAAC,MAAM,aAAa,CAAA;AAChD,OAAO,EAAG,wBAAwB,EAAW,aAAa,EAAuB,MAAM,4BAA4B,CAAC;AACpH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAA;AAEnF,MAAM,OAAO,IAAK,SAAQ,oBAAiC;IAEzD,MAAM,CAAC,IAAI,GAAG;QACZ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,4DAA4D;YACzE,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAC,WAAW,EAAE,sEAAsE,EAAE,QAAQ,EAAE,KAAK,EAAC,CAAC;KAC1H,CAAA;IACH,uCAAuC;IACrC,MAAM,CAAC,YAAY,GAAG;QAEpB,KAAK,CAAC,KAAK,CAAC,GAAiC;YAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,EAAE,IAA0B,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAC/C,OAAO,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;KACF,CAAA;IACH,MAAM,CAAC,WAAW,GAAG,sFAAsF;QACvG,8FAA8F;QAC9F,sGAAsG;QACtG,8GAA8G;QAC9G,gDAAgD;QAChD,UAAU;QACV,qEAAqE;QACrE,uEAAuE;QACvE,aAAa;QACb,+CAA+C;QAC/C,oDAAoD;QACpD,8DAA8D;QAC9D,yCAAyC;QACzC,sDAAsD;QACtD,wCAAwC;QACxC,6CAA6C;QAC7C,6BAA6B;QAC7B,sEAAsE;QACtE,4BAA4B;QAC5B,0FAA0F;QAC1F,0EAA0E;QAC1E,qCAAqC;QACrC,wDAAwD;QACxD,qDAAqD;QACrD,kBAAkB;QAClB,qCAAqC;QACrC,wDAAwD;QACxD,8CAA8C;QAC9C,uDAAuD;QACvD,mCAAmC;QACnC,4GAA4G;QAC5G,0BAA0B;QAC1B,uCAAuC;QACvC,iDAAiD;QACjD,+CAA+C;QAC/C,2CAA2C;QAC3C,qDAAqD;QACrD,yCAAyC;QACzC,wBAAwB;QACxB,2DAA2D;QAC3D,yCAAyC;QACzC,uCAAuC;QACvC,4CAA4C;QAC5C,yDAAyD;QACzD,qEAAqE,CAAC;IAC1E,MAAM,CAAC,QAAQ,GAAG;QACd;YACE,WAAW,EAAE,4BAA4B;YACzC,OAAO,EAAE,gEAAgE;SAC1E;QACD;YACE,WAAW,EAAE,wCAAwC;YACrD,OAAO,EAAE,yEAAyE;SACnF;QACD;YACE,WAAW,EAAE,uCAAuC;YACpD,OAAO,EAAE,qFAAqF;SAC/F;QACD;YACE,WAAW,EAAE,qDAAqD;YAClE,OAAO,EAAE,iGAAiG;SAC3G;QACD;YACE,WAAW,EAAE,sDAAsD;YACnE,OAAO,EAAE,0HAA0H;SACpI;QACD;YACE,WAAW,EAAE,yDAAyD;YACtE,OAAO,EAAE,4JAA4J;SACtK;QACD;YACE,WAAW,EAAE,mCAAmC;YAChD,OAAO,EAAE,iGAAiG;SAC3G;QACD;YACE,WAAW,EAAE,+CAA+C;YAC5D,OAAO,EAAE,uGAAuG;SACjH;QACD;YACE,WAAW,EAAE,mDAAmD;YAChE,OAAO,EAAE,8FAA8F;SACxG;QACD;YACE,WAAW,EAAE,kDAAkD;YAC/D,OAAO,EAAE,wHAAwH;SAClI;KACF,CAAA;IACH,MAAM,CAAC,KAAK,GAAG;QACX,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,6FAA6F;YAC1G,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAA;IAED,sDAAsD;IAEtD,KAAK,CAAC,GAAG;QACP,MAAM,EAAC,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAChE,uCAAuC;YACvC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,MAAc,EAAE,UAAkB;QACxD,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,OAAO,YAAY,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,KAAa,EAAE,MAAe;QAC5E,IAAI,CAAC,GAAG,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,YAAY,GAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,MAAM,GAAW,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAEpE,iDAAiD;YACjD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,4DAA4D,EAAE,KAAc,CAAC,CAAC;YACjG,IAAI,CAAC,KAAK,CAAC,KAAc,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,KAAa;QACvD,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QAE5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAA6B,IAAI,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC9F,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE1E,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;YAEpD,IAAI,MAAM,IAAI,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1E,MAAM,EAAC,aAAa,EAAC,GAAG,MAAM,CAAC;gBAC/B,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;oBACzC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;oBAC/B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;YACvH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAc,CAAC,CAAC;YACvF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAa;QACnC,IAAI,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QAChF,IAAI,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QAC9E,IAAI,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QAC9E,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QAEtE,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,IAAI,YAAY,GAAa,EAAE,CAAC;QAChC,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,MAAM,qBAAqB,GAAG,KAAK,IAAI,EAAE;YACvC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBACvC,EAAE,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,yBAAyB,YAAY,CAAC,MAAM,cAAc,CAAC,CAAC;YACrE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAElC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClC,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClC,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBACxC,IAAI,CAAC,GAAG,CAAC,YAAa,KAAe,CAAC,OAAO,IAAI,CAAC,CAAC;YACrD,CAAC;YAED,YAAY,GAAG,EAAE,CAAC;YAClB,SAAS,GAAG,CAAC,CAAC;YACd,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACrB,EAAE,CAAC,MAAM,EAAE,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,YAAY,GAAG,EAAE,CAAC;YAClB,SAAS,GAAG,CAAC,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAChC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACrB,EAAE,CAAC,MAAM,EAAE,CAAC;QACd,CAAC,CAAC;QAEF,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAEhC,uBAAuB;YACvB,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;gBAC5B,MAAM,qBAAqB,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YAED,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC7B,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;gBAC9B,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YAED,qBAAqB;YACrB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,SAAS,EAAE,CAAC;YAEZ,qCAAqC;YACrC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACrB,EAAE,CAAC,MAAM,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;YACxB,oBAAoB;YACpB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACf,MAAM,qBAAqB,EAAE,CAAC;YAChC,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACnB,UAAU,EAAE,CAAC;YACb,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACrB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,6BAA6B;oBAC7B,IAAI,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;oBAChE,WAAW,EAAE,CAAC;oBACd,UAAU,GAAG,CAAC,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;oBAC/C,EAAE,CAAC,MAAM,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,sBAAsB;gBACtB,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;gBAC9B,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC"}
|