@sonisoft/now-sdk-ext-cli 1.1.0-alpha.2 → 2.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +1825 -34
  2. package/dist/commands/app/index.d.ts +4 -1
  3. package/dist/commands/app/index.d.ts.map +1 -1
  4. package/dist/commands/app/index.js +31 -6
  5. package/dist/commands/app/index.js.map +1 -1
  6. package/dist/commands/app/install.d.ts +4 -1
  7. package/dist/commands/app/install.d.ts.map +1 -1
  8. package/dist/commands/app/install.js +40 -6
  9. package/dist/commands/app/install.js.map +1 -1
  10. package/dist/commands/app/repo-install.d.ts +19 -0
  11. package/dist/commands/app/repo-install.d.ts.map +1 -0
  12. package/dist/commands/app/repo-install.js +173 -0
  13. package/dist/commands/app/repo-install.js.map +1 -0
  14. package/dist/commands/app/repo-list.d.ts +17 -0
  15. package/dist/commands/app/repo-list.d.ts.map +1 -0
  16. package/dist/commands/app/repo-list.js +152 -0
  17. package/dist/commands/app/repo-list.js.map +1 -0
  18. package/dist/commands/app/uninstall.d.ts +16 -0
  19. package/dist/commands/app/uninstall.d.ts.map +1 -0
  20. package/dist/commands/app/uninstall.js +70 -0
  21. package/dist/commands/app/uninstall.js.map +1 -0
  22. package/dist/commands/atf/index.d.ts +71 -0
  23. package/dist/commands/atf/index.d.ts.map +1 -0
  24. package/dist/commands/atf/index.js +256 -0
  25. package/dist/commands/atf/index.js.map +1 -0
  26. package/dist/commands/exec/index.d.ts +17 -3
  27. package/dist/commands/exec/index.d.ts.map +1 -1
  28. package/dist/commands/exec/index.js +286 -26
  29. package/dist/commands/exec/index.js.map +1 -1
  30. package/dist/commands/log/index.d.ts +46 -0
  31. package/dist/commands/log/index.d.ts.map +1 -0
  32. package/dist/commands/log/index.js +418 -0
  33. package/dist/commands/log/index.js.map +1 -0
  34. package/dist/common/authenticated-command.js +2 -2
  35. package/dist/common/authenticated-command.js.map +1 -1
  36. package/dist/common/scope-autocomplete.d.ts +20 -0
  37. package/dist/common/scope-autocomplete.d.ts.map +1 -0
  38. package/dist/common/scope-autocomplete.js +94 -0
  39. package/dist/common/scope-autocomplete.js.map +1 -0
  40. package/dist/common/utils.d.ts +2 -0
  41. package/dist/common/utils.d.ts.map +1 -0
  42. package/dist/common/utils.js +4 -0
  43. package/dist/common/utils.js.map +1 -0
  44. package/oclif.manifest.json +691 -12
  45. package/package.json +32 -12
@@ -1,51 +1,311 @@
1
1
  /* eslint-disable @typescript-eslint/no-unused-vars */
2
2
  /* eslint-disable perfectionist/sort-objects */
3
- import { Args } from '@oclif/core';
3
+ import { Args, Flags } from '@oclif/core';
4
4
  import { BackgroundScriptExecutor, Logger, 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';
8
10
  export class Exec extends AuthenticatedCommand {
9
11
  static args = {
10
- scope: Args.string({ description: 'Scope to execute file in.', required: true }),
11
- file: Args.string({ description: 'File to execute in scripts background.', required: true }),
12
+ scope: Args.string({
13
+ description: 'Scope to execute script in. Use "global" for global scope.',
14
+ required: true
15
+ }),
16
+ file: Args.string({ description: 'File to execute in scripts background. If omitted, starts REPL mode.', required: false }),
12
17
  };
13
- static description = 'Execute a local javascript file on a ServiceNow instance using Scripts - Background remotely. Returns the output/raw console output that Scripts - Background outputs to the browser in order to support the execution and result being piped to another command.';
18
+ // Autocomplete hook for scope argument
19
+ static autocomplete = {
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
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
- `<%= config.bin %> <%= command.id %> exec global test.js --auth sn_alias
16
- test
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
- // from: Flags.string({char: 'f', description: 'Who is saying hello', required: true}),
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
126
  _logger = new Logger("ExecCommand");
23
127
  async run() {
24
128
  const { args, flags } = await this.parse(Exec);
25
- if (!NowStringUtil.isStringEmpty(args.file) && !NowStringUtil.isStringEmpty(args.scope)) {
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 params = JSON.parse(paramsJson);
144
+ if (typeof params !== 'object' || params === null) {
145
+ this.error('Parameters must be a valid JSON object');
146
+ return script;
147
+ }
148
+ let processedScript = script;
149
+ // Replace each parameter in the script
150
+ for (const [key, value] of Object.entries(params)) {
151
+ const placeholder = `{${key}}`;
152
+ const replacement = String(value);
153
+ // Replace all occurrences of the placeholder
154
+ processedScript = processedScript.split(placeholder).join(replacement);
155
+ }
156
+ // Log parameter replacements in debug mode
157
+ this._logger.debug(`Applied ${Object.keys(params).length} parameter replacement(s)`, params);
158
+ return processedScript;
159
+ }
160
+ catch (error) {
161
+ this._logger.error("Error parsing parameters JSON", error);
162
+ this.error(`Invalid JSON in --params: ${error.message}`);
163
+ return script;
164
+ }
165
+ }
166
+ async executeFromFile(filePath, scope, params) {
167
+ try {
168
+ const resolvedPath = path.resolve(filePath);
169
+ let script = fs.readFileSync(resolvedPath).toString('utf8');
170
+ // Apply parameter replacement if params provided
171
+ if (params) {
172
+ script = this.applyParameters(script, params);
173
+ }
174
+ await this.executeScript(script, scope);
175
+ }
176
+ catch (error) {
177
+ this._logger.error("Error occurred when executing background script from file.", error);
178
+ this.error(error);
179
+ }
180
+ }
181
+ async executeScript(script, scope) {
182
+ try {
183
+ const executor = new BackgroundScriptExecutor(this.instance, scope);
184
+ const result = await executor.executeScript(script, scope, this.instance);
185
+ this._logger.debug("Ran background script", result);
186
+ if (result !== null && result.scriptResults !== null) {
187
+ const { scriptResults } = result;
188
+ for (const scriptResult of scriptResults) {
189
+ console.log(scriptResult.line);
190
+ this._logger.debug(scriptResult.line);
191
+ }
192
+ }
193
+ else {
194
+ throw new Error("Response from script execution was null or undefined. Please review logs to identify the problem.");
195
+ }
196
+ }
197
+ catch (error) {
198
+ this._logger.error("Error occurred when executing background script.", error);
199
+ throw error;
200
+ }
201
+ }
202
+ async startREPL(scope) {
203
+ this.log(`\n╔═══════════════════════════════════════════════════════════════╗`);
204
+ this.log(`║ ServiceNow Script Executor REPL ║`);
205
+ this.log(`╚═══════════════════════════════════════════════════════════════╝`);
206
+ this.log(` Scope: ${scope}`);
207
+ this.log(` Instance: ${this.instance.getHost()}`);
208
+ this.log(`\n Commands:`);
209
+ this.log(` .exec - Execute the current script`);
210
+ this.log(` .clear - Clear the current input`);
211
+ this.log(` .exit - Exit REPL`);
212
+ this.log(` Ctrl+D - Execute the current script`);
213
+ this.log(` Ctrl+C - Cancel current input or exit (press twice)`);
214
+ this.log(`\n Type your script below (press Enter for new lines):\n`);
215
+ const rl = readline.createInterface({
216
+ input: process.stdin,
217
+ output: process.stdout,
218
+ prompt: 'sn> ',
219
+ terminal: true
220
+ });
221
+ let scriptBuffer = [];
222
+ let lineCount = 0;
223
+ const executeBufferedScript = async () => {
224
+ if (scriptBuffer.length === 0) {
225
+ this.log(' (No script to execute)\n');
226
+ rl.prompt();
227
+ return;
228
+ }
229
+ const script = scriptBuffer.join('\n');
230
+ this.log(`\n Executing script (${scriptBuffer.length} lines)...\n`);
231
+ this.log(` ${'─'.repeat(63)}\n`);
26
232
  try {
27
- const filePath = path.resolve(args.file);
28
- const script = fs.readFileSync(filePath).toString('utf8');
29
- const scope = args.scope ?? "global";
30
- const executor = new BackgroundScriptExecutor(this.instance, args.scope);
31
- ;
32
- const result = await executor.executeScript(script, scope, this.instance);
33
- this._logger.debug("Ran background script", result);
34
- if (result !== null && result.scriptResults !== null) {
35
- const { scriptResults } = result;
36
- for (const scriptResult of scriptResults) {
37
- this.log(scriptResult.line);
38
- }
233
+ await this.executeScript(script, scope);
234
+ this.log(`\n ${'─'.repeat(63)}`);
235
+ this.log(` ✓ Script executed successfully\n`);
236
+ }
237
+ catch (error) {
238
+ this.log(`\n ${'─'.repeat(63)}`);
239
+ this.log(` ✗ Script execution failed`);
240
+ this.log(` Error: ${error.message}\n`);
241
+ }
242
+ scriptBuffer = [];
243
+ lineCount = 0;
244
+ rl.setPrompt('sn> ');
245
+ rl.prompt();
246
+ };
247
+ const clearBuffer = () => {
248
+ scriptBuffer = [];
249
+ lineCount = 0;
250
+ this.log(' (Input cleared)\n');
251
+ rl.setPrompt('sn> ');
252
+ rl.prompt();
253
+ };
254
+ rl.on('line', async (line) => {
255
+ const trimmedLine = line.trim();
256
+ // Handle REPL commands
257
+ if (trimmedLine === '.exec') {
258
+ await executeBufferedScript();
259
+ return;
260
+ }
261
+ if (trimmedLine === '.clear') {
262
+ clearBuffer();
263
+ return;
264
+ }
265
+ if (trimmedLine === '.exit') {
266
+ this.log('\n Goodbye! 👋\n');
267
+ rl.close();
268
+ return;
269
+ }
270
+ // Add line to buffer
271
+ scriptBuffer.push(line);
272
+ lineCount++;
273
+ // Update prompt to show continuation
274
+ rl.setPrompt(`... `);
275
+ rl.prompt();
276
+ });
277
+ rl.on('close', async () => {
278
+ // Execute on Ctrl+D
279
+ if (scriptBuffer.length > 0) {
280
+ this.log('\n');
281
+ await executeBufferedScript();
282
+ }
283
+ this.exit(0);
284
+ });
285
+ // Handle Ctrl+C
286
+ let ctrlCCount = 0;
287
+ rl.on('SIGINT', () => {
288
+ ctrlCCount++;
289
+ if (ctrlCCount === 1) {
290
+ if (scriptBuffer.length > 0) {
291
+ // First Ctrl+C: clear buffer
292
+ this.log('\n (Input cancelled. Press Ctrl+C again to exit)\n');
293
+ clearBuffer();
294
+ ctrlCCount = 0;
39
295
  }
40
296
  else {
41
- throw new Error("Response from script execution was null or undefined. Please review logs to identify the problem.");
297
+ this.log('\n (Press Ctrl+C again to exit)\n');
298
+ rl.prompt();
42
299
  }
43
300
  }
44
- catch (error) {
45
- this._logger.error("Error occurred when executing background script.", error);
46
- this.error(error);
301
+ else {
302
+ // Second Ctrl+C: exit
303
+ this.log('\n Goodbye! 👋\n');
304
+ rl.close();
305
+ this.exit(0);
47
306
  }
48
- }
307
+ });
308
+ rl.prompt();
49
309
  }
50
310
  }
51
311
  //# 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,EAAiB,MAAM,aAAa,CAAA;AAChD,OAAO,EAAG,wBAAwB,EAAG,MAAM,EAAE,aAAa,EAAuB,MAAM,4BAA4B,CAAC;AACpH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAE5E,MAAM,OAAO,IAAK,SAAQ,oBAAiC;IAEzD,MAAM,CAAC,IAAI,GAAG;QACZ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAC,WAAW,EAAE,2BAA2B,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;QAC9E,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAC,WAAW,EAAE,wCAAwC,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;KAC3F,CAAA;IAED,MAAM,CAAC,WAAW,GAAG,mQAAmQ,CAAC;IAEzR,MAAM,CAAC,QAAQ,GAAG;QAChB;;CAEH;KACE,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;IACb,uFAAuF;KACxF,CAAA;IAEO,OAAO,GAAU,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC;IAEnD,KAAK,CAAC,GAAG;QACP,MAAM,EAAC,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAG,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAC,CAAC;YACtF,IAAG,CAAC;gBACF,MAAM,QAAQ,GAAU,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChD,MAAM,MAAM,GAAU,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACjE,MAAM,KAAK,GAAU,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;gBAE5C,MAAM,QAAQ,GAA6B,IAAI,wBAAwB,CAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAE,CAAC;gBAAA,CAAC;gBACtG,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAE,CAAC;gBAC5E,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;gBACpD,IAAG,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,aAAa,KAAK,IAAI,EAAC,CAAC;oBACnD,MAAM,EAAC,aAAa,EAAC,GAAG,MAAM,CAAC;oBAC/B,KAAI,MAAM,YAAY,IAAI,aAAa,EAAC,CAAC;wBACvC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;oBAC9B,CAAC;gBAEH,CAAC;qBAAI,CAAC;oBACJ,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;gBACvH,CAAC;YAEH,CAAC;YAAA,OAAM,KAAK,EAAC,CAAC;gBACZ,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAc,CAAC,CAAC;gBACvF,IAAI,CAAC,KAAK,CAAC,KAAc,CAAC,CAAC;YAC7B,CAAC;QAGH,CAAC;IAEH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/exec/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { AuthenticatedCommand } from '../../common/authenticated-command.js';
2
+ export declare class Log extends AuthenticatedCommand<typeof Log> {
3
+ static args: {};
4
+ static description: string;
5
+ static examples: {
6
+ description: string;
7
+ command: string;
8
+ }[];
9
+ static flags: {
10
+ output: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
11
+ interval: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<number, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ 'no-color': import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
13
+ filter: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
14
+ };
15
+ private _logger;
16
+ private filterRules;
17
+ private syslogReader?;
18
+ run(): Promise<void>;
19
+ private displayHeader;
20
+ private displayLog;
21
+ private handleExit;
22
+ private highlightKeywords;
23
+ /**
24
+ * Check if a log record matches a single filter rule
25
+ * @param log The log record to check
26
+ * @param rule The filter rule to apply
27
+ * @returns true if the log matches the filter, false otherwise
28
+ */
29
+ private matchesFilter;
30
+ /**
31
+ * Check if a log record matches all filter rules
32
+ * @param log The log record to check
33
+ * @returns true if the log matches all filters (AND logic), false otherwise
34
+ */
35
+ private matchesFilters;
36
+ /**
37
+ * Parse a filter string into a FilterRule object
38
+ * Supports formats:
39
+ * - "field OPERATOR value"
40
+ * - "OPERATOR value" (defaults to message field)
41
+ * @param filterStr The filter string to parse
42
+ * @returns A FilterRule object
43
+ */
44
+ private parseFilter;
45
+ }
46
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/log/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAiB5E,qBAAa,GAAI,SAAQ,oBAAoB,CAAC,OAAO,GAAG,CAAC;IAEvD,MAAM,CAAC,IAAI,KAAK;IAEhB,MAAM,CAAC,WAAW,SAoCiD;IAEnE,MAAM,CAAC,QAAQ;;;QAiCd;IAED,MAAM,CAAC,KAAK;;;;;MA0BX;IAED,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,YAAY,CAAC,CAAe;IAE9B,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA6D1B,OAAO,CAAC,aAAa;IAoDrB,OAAO,CAAC,UAAU;IA0ElB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,iBAAiB;IAYzB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAyErB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAatB;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;CAsDpB"}