tm1npm 1.2.1 → 1.3.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.
- package/lib/services/DebuggerService.d.ts +214 -0
- package/lib/services/DebuggerService.d.ts.map +1 -0
- package/lib/services/DebuggerService.js +319 -0
- package/lib/services/ProcessService.d.ts +45 -0
- package/lib/services/ProcessService.d.ts.map +1 -1
- package/lib/services/ProcessService.js +152 -0
- package/lib/services/TM1Service.d.ts +2 -0
- package/lib/services/TM1Service.d.ts.map +1 -1
- package/lib/services/TM1Service.js +2 -0
- package/lib/services/index.d.ts +1 -0
- package/lib/services/index.d.ts.map +1 -1
- package/lib/services/index.js +3 -1
- package/lib/tests/debuggerService.test.d.ts +6 -0
- package/lib/tests/debuggerService.test.d.ts.map +1 -0
- package/lib/tests/debuggerService.test.js +279 -0
- package/package.json +1 -1
- package/src/services/DebuggerService.ts +399 -0
- package/src/services/ProcessService.ts +162 -0
- package/src/services/TM1Service.ts +3 -0
- package/src/services/index.ts +1 -0
- package/src/tests/debuggerService.test.ts +377 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { ObjectService } from './ObjectService';
|
|
2
|
+
import { RestService } from './RestService';
|
|
3
|
+
/**
|
|
4
|
+
* Debug session information
|
|
5
|
+
*/
|
|
6
|
+
export interface DebugSession {
|
|
7
|
+
id: string;
|
|
8
|
+
processName: string;
|
|
9
|
+
status: 'Running' | 'Paused' | 'Completed' | 'Failed';
|
|
10
|
+
currentLine?: number;
|
|
11
|
+
variables?: {
|
|
12
|
+
[key: string]: any;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Process variable information
|
|
17
|
+
*/
|
|
18
|
+
export interface ProcessVariable {
|
|
19
|
+
name: string;
|
|
20
|
+
value: any;
|
|
21
|
+
type: 'String' | 'Numeric' | 'Unknown';
|
|
22
|
+
scope: 'Local' | 'Global' | 'Parameter';
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Call stack frame
|
|
26
|
+
*/
|
|
27
|
+
export interface CallStackFrame {
|
|
28
|
+
procedureName: string;
|
|
29
|
+
lineNumber: number;
|
|
30
|
+
source?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Process validation result
|
|
34
|
+
*/
|
|
35
|
+
export interface ValidationResult {
|
|
36
|
+
isValid: boolean;
|
|
37
|
+
errors: Array<{
|
|
38
|
+
line: number;
|
|
39
|
+
message: string;
|
|
40
|
+
severity: 'Error' | 'Warning';
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* DebuggerService - Comprehensive TM1 process debugging service
|
|
45
|
+
*
|
|
46
|
+
* Provides advanced debugging capabilities including session management,
|
|
47
|
+
* variable inspection, expression evaluation, and call stack analysis.
|
|
48
|
+
*/
|
|
49
|
+
export declare class DebuggerService extends ObjectService {
|
|
50
|
+
private activeSessions;
|
|
51
|
+
constructor(rest: RestService);
|
|
52
|
+
/**
|
|
53
|
+
* Create a new debug session for a process
|
|
54
|
+
*
|
|
55
|
+
* @param processName - Name of the process to debug
|
|
56
|
+
* @returns Promise<string> - Debug session ID
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const sessionId = await debuggerService.createDebugSession('MyProcess');
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
createDebugSession(processName: string): Promise<string>;
|
|
64
|
+
/**
|
|
65
|
+
* Terminate an active debug session
|
|
66
|
+
*
|
|
67
|
+
* @param sessionId - Debug session ID
|
|
68
|
+
* @returns Promise<void>
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* await debuggerService.terminateDebugSession(sessionId);
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
terminateDebugSession(sessionId: string): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Step into the next line (enter function calls)
|
|
78
|
+
*
|
|
79
|
+
* @param sessionId - Debug session ID
|
|
80
|
+
* @returns Promise<void>
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* await debuggerService.stepInto(sessionId);
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
stepInto(sessionId: string): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Step over the next line (don't enter function calls)
|
|
90
|
+
*
|
|
91
|
+
* @param sessionId - Debug session ID
|
|
92
|
+
* @returns Promise<void>
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* await debuggerService.stepOver(sessionId);
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
stepOver(sessionId: string): Promise<void>;
|
|
100
|
+
/**
|
|
101
|
+
* Step out of current function
|
|
102
|
+
*
|
|
103
|
+
* @param sessionId - Debug session ID
|
|
104
|
+
* @returns Promise<void>
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```typescript
|
|
108
|
+
* await debuggerService.stepOut(sessionId);
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
stepOut(sessionId: string): Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Continue execution until next breakpoint or completion
|
|
114
|
+
*
|
|
115
|
+
* @param sessionId - Debug session ID
|
|
116
|
+
* @returns Promise<void>
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* await debuggerService.continueExecution(sessionId);
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
continueExecution(sessionId: string): Promise<void>;
|
|
124
|
+
/**
|
|
125
|
+
* Get all process variables in current debug session
|
|
126
|
+
*
|
|
127
|
+
* @param sessionId - Debug session ID
|
|
128
|
+
* @returns Promise<ProcessVariable[]> - Array of process variables
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```typescript
|
|
132
|
+
* const variables = await debuggerService.getProcessVariables(sessionId);
|
|
133
|
+
* console.log(variables);
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
getProcessVariables(sessionId: string): Promise<ProcessVariable[]>;
|
|
137
|
+
/**
|
|
138
|
+
* Set a process variable value during debugging
|
|
139
|
+
*
|
|
140
|
+
* @param sessionId - Debug session ID
|
|
141
|
+
* @param variable - Variable name
|
|
142
|
+
* @param value - New value
|
|
143
|
+
* @returns Promise<void>
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* await debuggerService.setProcessVariable(sessionId, 'vCounter', 10);
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
setProcessVariable(sessionId: string, variable: string, value: any): Promise<void>;
|
|
151
|
+
/**
|
|
152
|
+
* Evaluate a TM1 expression in the debug context
|
|
153
|
+
*
|
|
154
|
+
* @param sessionId - Debug session ID
|
|
155
|
+
* @param expression - TM1 expression to evaluate
|
|
156
|
+
* @returns Promise<any> - Evaluation result
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```typescript
|
|
160
|
+
* const result = await debuggerService.evaluateExpression(
|
|
161
|
+
* sessionId,
|
|
162
|
+
* 'vCounter + 10'
|
|
163
|
+
* );
|
|
164
|
+
* console.log('Result:', result);
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
evaluateExpression(sessionId: string, expression: string): Promise<any>;
|
|
168
|
+
/**
|
|
169
|
+
* Get the current call stack
|
|
170
|
+
*
|
|
171
|
+
* @param sessionId - Debug session ID
|
|
172
|
+
* @returns Promise<CallStackFrame[]> - Call stack frames
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* const callStack = await debuggerService.getCallStack(sessionId);
|
|
177
|
+
* callStack.forEach(frame => {
|
|
178
|
+
* console.log(`${frame.procedureName} at line ${frame.lineNumber}`);
|
|
179
|
+
* });
|
|
180
|
+
* ```
|
|
181
|
+
*/
|
|
182
|
+
getCallStack(sessionId: string): Promise<CallStackFrame[]>;
|
|
183
|
+
/**
|
|
184
|
+
* Get debug session info
|
|
185
|
+
*
|
|
186
|
+
* @param sessionId - Debug session ID
|
|
187
|
+
* @returns DebugSession | undefined - Session information
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```typescript
|
|
191
|
+
* const session = debuggerService.getSessionInfo(sessionId);
|
|
192
|
+
* console.log('Status:', session?.status);
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
getSessionInfo(sessionId: string): DebugSession | undefined;
|
|
196
|
+
/**
|
|
197
|
+
* List all active debug sessions
|
|
198
|
+
*
|
|
199
|
+
* @returns DebugSession[] - Array of active sessions
|
|
200
|
+
*
|
|
201
|
+
* @example
|
|
202
|
+
* ```typescript
|
|
203
|
+
* const sessions = debuggerService.listActiveSessions();
|
|
204
|
+
* console.log(`${sessions.length} active sessions`);
|
|
205
|
+
* ```
|
|
206
|
+
*/
|
|
207
|
+
listActiveSessions(): DebugSession[];
|
|
208
|
+
/**
|
|
209
|
+
* Generate a unique session ID
|
|
210
|
+
* @private
|
|
211
|
+
*/
|
|
212
|
+
private generateSessionId;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=DebuggerService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DebuggerService.d.ts","sourceRoot":"","sources":["../../src/services/DebuggerService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACvC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QACV,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;KACjC,CAAC,CAAC;CACN;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,aAAa;IAC9C,OAAO,CAAC,cAAc,CAAwC;gBAElD,IAAI,EAAE,WAAW;IAI7B;;;;;;;;;;OAUG;IACU,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBrE;;;;;;;;;;OAUG;IACU,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAepE;;;;;;;;;;OAUG;IACU,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevD;;;;;;;;;;OAUG;IACU,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevD;;;;;;;;;;OAUG;IACU,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtD;;;;;;;;;;OAUG;IACU,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYhE;;;;;;;;;;;OAWG;IACU,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA+B/E;;;;;;;;;;;;OAYG;IACU,kBAAkB,CAC3B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,GAAG,GACX,OAAO,CAAC,IAAI,CAAC;IAehB;;;;;;;;;;;;;;;OAeG;IACU,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAYpF;;;;;;;;;;;;;OAaG;IACU,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgCvE;;;;;;;;;;;OAWG;IACI,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIlE;;;;;;;;;;OAUG;IACI,kBAAkB,IAAI,YAAY,EAAE;IAI3C;;;OAGG;IACH,OAAO,CAAC,iBAAiB;CAG5B"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DebuggerService = void 0;
|
|
4
|
+
const ObjectService_1 = require("./ObjectService");
|
|
5
|
+
const Utils_1 = require("../utils/Utils");
|
|
6
|
+
/**
|
|
7
|
+
* DebuggerService - Comprehensive TM1 process debugging service
|
|
8
|
+
*
|
|
9
|
+
* Provides advanced debugging capabilities including session management,
|
|
10
|
+
* variable inspection, expression evaluation, and call stack analysis.
|
|
11
|
+
*/
|
|
12
|
+
class DebuggerService extends ObjectService_1.ObjectService {
|
|
13
|
+
constructor(rest) {
|
|
14
|
+
super(rest);
|
|
15
|
+
this.activeSessions = new Map();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create a new debug session for a process
|
|
19
|
+
*
|
|
20
|
+
* @param processName - Name of the process to debug
|
|
21
|
+
* @returns Promise<string> - Debug session ID
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const sessionId = await debuggerService.createDebugSession('MyProcess');
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
async createDebugSession(processName) {
|
|
29
|
+
const url = (0, Utils_1.formatUrl)("/Processes('{}')/tm1.BeginDebug", processName);
|
|
30
|
+
const response = await this.rest.post(url, {});
|
|
31
|
+
const sessionId = response.data.ID || response.data.SessionId || this.generateSessionId();
|
|
32
|
+
// Track the session
|
|
33
|
+
this.activeSessions.set(sessionId, {
|
|
34
|
+
id: sessionId,
|
|
35
|
+
processName,
|
|
36
|
+
status: 'Paused',
|
|
37
|
+
currentLine: 0
|
|
38
|
+
});
|
|
39
|
+
return sessionId;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Terminate an active debug session
|
|
43
|
+
*
|
|
44
|
+
* @param sessionId - Debug session ID
|
|
45
|
+
* @returns Promise<void>
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* await debuggerService.terminateDebugSession(sessionId);
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
async terminateDebugSession(sessionId) {
|
|
53
|
+
const session = this.activeSessions.get(sessionId);
|
|
54
|
+
if (!session) {
|
|
55
|
+
throw new Error(`Debug session ${sessionId} not found`);
|
|
56
|
+
}
|
|
57
|
+
const url = (0, Utils_1.formatUrl)("/Processes('{}')/tm1.EndDebug", session.processName);
|
|
58
|
+
try {
|
|
59
|
+
await this.rest.post(url, {});
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
this.activeSessions.delete(sessionId);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Step into the next line (enter function calls)
|
|
67
|
+
*
|
|
68
|
+
* @param sessionId - Debug session ID
|
|
69
|
+
* @returns Promise<void>
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* await debuggerService.stepInto(sessionId);
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
async stepInto(sessionId) {
|
|
77
|
+
const session = this.activeSessions.get(sessionId);
|
|
78
|
+
if (!session) {
|
|
79
|
+
throw new Error(`Debug session ${sessionId} not found`);
|
|
80
|
+
}
|
|
81
|
+
const url = (0, Utils_1.formatUrl)("/Processes('{}')/tm1.DebugStepIn", session.processName);
|
|
82
|
+
await this.rest.post(url, {});
|
|
83
|
+
session.status = 'Paused';
|
|
84
|
+
if (session.currentLine !== undefined) {
|
|
85
|
+
session.currentLine++;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Step over the next line (don't enter function calls)
|
|
90
|
+
*
|
|
91
|
+
* @param sessionId - Debug session ID
|
|
92
|
+
* @returns Promise<void>
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* await debuggerService.stepOver(sessionId);
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
async stepOver(sessionId) {
|
|
100
|
+
const session = this.activeSessions.get(sessionId);
|
|
101
|
+
if (!session) {
|
|
102
|
+
throw new Error(`Debug session ${sessionId} not found`);
|
|
103
|
+
}
|
|
104
|
+
const url = (0, Utils_1.formatUrl)("/Processes('{}')/tm1.DebugStepOver", session.processName);
|
|
105
|
+
await this.rest.post(url, {});
|
|
106
|
+
session.status = 'Paused';
|
|
107
|
+
if (session.currentLine !== undefined) {
|
|
108
|
+
session.currentLine++;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Step out of current function
|
|
113
|
+
*
|
|
114
|
+
* @param sessionId - Debug session ID
|
|
115
|
+
* @returns Promise<void>
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* await debuggerService.stepOut(sessionId);
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
async stepOut(sessionId) {
|
|
123
|
+
const session = this.activeSessions.get(sessionId);
|
|
124
|
+
if (!session) {
|
|
125
|
+
throw new Error(`Debug session ${sessionId} not found`);
|
|
126
|
+
}
|
|
127
|
+
const url = (0, Utils_1.formatUrl)("/Processes('{}')/tm1.DebugStepOut", session.processName);
|
|
128
|
+
await this.rest.post(url, {});
|
|
129
|
+
session.status = 'Paused';
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Continue execution until next breakpoint or completion
|
|
133
|
+
*
|
|
134
|
+
* @param sessionId - Debug session ID
|
|
135
|
+
* @returns Promise<void>
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* await debuggerService.continueExecution(sessionId);
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
async continueExecution(sessionId) {
|
|
143
|
+
const session = this.activeSessions.get(sessionId);
|
|
144
|
+
if (!session) {
|
|
145
|
+
throw new Error(`Debug session ${sessionId} not found`);
|
|
146
|
+
}
|
|
147
|
+
const url = (0, Utils_1.formatUrl)("/Processes('{}')/tm1.DebugContinue", session.processName);
|
|
148
|
+
await this.rest.post(url, {});
|
|
149
|
+
session.status = 'Running';
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get all process variables in current debug session
|
|
153
|
+
*
|
|
154
|
+
* @param sessionId - Debug session ID
|
|
155
|
+
* @returns Promise<ProcessVariable[]> - Array of process variables
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* const variables = await debuggerService.getProcessVariables(sessionId);
|
|
160
|
+
* console.log(variables);
|
|
161
|
+
* ```
|
|
162
|
+
*/
|
|
163
|
+
async getProcessVariables(sessionId) {
|
|
164
|
+
const session = this.activeSessions.get(sessionId);
|
|
165
|
+
if (!session) {
|
|
166
|
+
throw new Error(`Debug session ${sessionId} not found`);
|
|
167
|
+
}
|
|
168
|
+
const url = (0, Utils_1.formatUrl)("/Processes('{}')/Variables", session.processName);
|
|
169
|
+
const response = await this.rest.get(url);
|
|
170
|
+
const variables = [];
|
|
171
|
+
if (response.data.value) {
|
|
172
|
+
for (const variable of response.data.value) {
|
|
173
|
+
variables.push({
|
|
174
|
+
name: variable.Name,
|
|
175
|
+
value: variable.Value !== undefined ? variable.Value : null,
|
|
176
|
+
type: variable.Type || 'Unknown',
|
|
177
|
+
scope: variable.Scope || 'Local'
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Update session cache
|
|
182
|
+
session.variables = variables.reduce((acc, v) => {
|
|
183
|
+
acc[v.name] = v.value;
|
|
184
|
+
return acc;
|
|
185
|
+
}, {});
|
|
186
|
+
return variables;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Set a process variable value during debugging
|
|
190
|
+
*
|
|
191
|
+
* @param sessionId - Debug session ID
|
|
192
|
+
* @param variable - Variable name
|
|
193
|
+
* @param value - New value
|
|
194
|
+
* @returns Promise<void>
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* ```typescript
|
|
198
|
+
* await debuggerService.setProcessVariable(sessionId, 'vCounter', 10);
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
async setProcessVariable(sessionId, variable, value) {
|
|
202
|
+
const session = this.activeSessions.get(sessionId);
|
|
203
|
+
if (!session) {
|
|
204
|
+
throw new Error(`Debug session ${sessionId} not found`);
|
|
205
|
+
}
|
|
206
|
+
const url = (0, Utils_1.formatUrl)("/Processes('{}')/Variables('{}')", session.processName, variable);
|
|
207
|
+
await this.rest.patch(url, { Value: value });
|
|
208
|
+
// Update session cache
|
|
209
|
+
if (session.variables) {
|
|
210
|
+
session.variables[variable] = value;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Evaluate a TM1 expression in the debug context
|
|
215
|
+
*
|
|
216
|
+
* @param sessionId - Debug session ID
|
|
217
|
+
* @param expression - TM1 expression to evaluate
|
|
218
|
+
* @returns Promise<any> - Evaluation result
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```typescript
|
|
222
|
+
* const result = await debuggerService.evaluateExpression(
|
|
223
|
+
* sessionId,
|
|
224
|
+
* 'vCounter + 10'
|
|
225
|
+
* );
|
|
226
|
+
* console.log('Result:', result);
|
|
227
|
+
* ```
|
|
228
|
+
*/
|
|
229
|
+
async evaluateExpression(sessionId, expression) {
|
|
230
|
+
const session = this.activeSessions.get(sessionId);
|
|
231
|
+
if (!session) {
|
|
232
|
+
throw new Error(`Debug session ${sessionId} not found`);
|
|
233
|
+
}
|
|
234
|
+
const url = (0, Utils_1.formatUrl)("/Processes('{}')/tm1.Evaluate", session.processName);
|
|
235
|
+
const response = await this.rest.post(url, { Expression: expression });
|
|
236
|
+
return response.data.Result !== undefined ? response.data.Result : response.data.value;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Get the current call stack
|
|
240
|
+
*
|
|
241
|
+
* @param sessionId - Debug session ID
|
|
242
|
+
* @returns Promise<CallStackFrame[]> - Call stack frames
|
|
243
|
+
*
|
|
244
|
+
* @example
|
|
245
|
+
* ```typescript
|
|
246
|
+
* const callStack = await debuggerService.getCallStack(sessionId);
|
|
247
|
+
* callStack.forEach(frame => {
|
|
248
|
+
* console.log(`${frame.procedureName} at line ${frame.lineNumber}`);
|
|
249
|
+
* });
|
|
250
|
+
* ```
|
|
251
|
+
*/
|
|
252
|
+
async getCallStack(sessionId) {
|
|
253
|
+
var _a;
|
|
254
|
+
const session = this.activeSessions.get(sessionId);
|
|
255
|
+
if (!session) {
|
|
256
|
+
throw new Error(`Debug session ${sessionId} not found`);
|
|
257
|
+
}
|
|
258
|
+
const url = (0, Utils_1.formatUrl)("/Processes('{}')/tm1.GetCallStack", session.processName);
|
|
259
|
+
try {
|
|
260
|
+
const response = await this.rest.get(url);
|
|
261
|
+
if (response.data.value) {
|
|
262
|
+
return response.data.value.map((frame) => ({
|
|
263
|
+
procedureName: frame.ProcedureName || frame.Name,
|
|
264
|
+
lineNumber: frame.LineNumber || 0,
|
|
265
|
+
source: frame.Source
|
|
266
|
+
}));
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
// If call stack API not available, return basic info
|
|
271
|
+
if (((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === 404) {
|
|
272
|
+
return [{
|
|
273
|
+
procedureName: session.processName,
|
|
274
|
+
lineNumber: session.currentLine || 0
|
|
275
|
+
}];
|
|
276
|
+
}
|
|
277
|
+
throw error;
|
|
278
|
+
}
|
|
279
|
+
return [];
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get debug session info
|
|
283
|
+
*
|
|
284
|
+
* @param sessionId - Debug session ID
|
|
285
|
+
* @returns DebugSession | undefined - Session information
|
|
286
|
+
*
|
|
287
|
+
* @example
|
|
288
|
+
* ```typescript
|
|
289
|
+
* const session = debuggerService.getSessionInfo(sessionId);
|
|
290
|
+
* console.log('Status:', session?.status);
|
|
291
|
+
* ```
|
|
292
|
+
*/
|
|
293
|
+
getSessionInfo(sessionId) {
|
|
294
|
+
return this.activeSessions.get(sessionId);
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* List all active debug sessions
|
|
298
|
+
*
|
|
299
|
+
* @returns DebugSession[] - Array of active sessions
|
|
300
|
+
*
|
|
301
|
+
* @example
|
|
302
|
+
* ```typescript
|
|
303
|
+
* const sessions = debuggerService.listActiveSessions();
|
|
304
|
+
* console.log(`${sessions.length} active sessions`);
|
|
305
|
+
* ```
|
|
306
|
+
*/
|
|
307
|
+
listActiveSessions() {
|
|
308
|
+
return Array.from(this.activeSessions.values());
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Generate a unique session ID
|
|
312
|
+
* @private
|
|
313
|
+
*/
|
|
314
|
+
generateSessionId() {
|
|
315
|
+
return `debug_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
exports.DebuggerService = DebuggerService;
|
|
319
|
+
//# sourceMappingURL=DebuggerService.js.map
|
|
@@ -61,5 +61,50 @@ export declare class ProcessService extends ObjectService {
|
|
|
61
61
|
* Evaluate a boolean TI expression
|
|
62
62
|
*/
|
|
63
63
|
evaluateBooleanTiExpression(expression: string): Promise<boolean>;
|
|
64
|
+
/**
|
|
65
|
+
* Analyze process dependencies (what cubes/dimensions/processes it uses)
|
|
66
|
+
*
|
|
67
|
+
* @param processName - Name of the process
|
|
68
|
+
* @returns Promise<any> - Dependency information
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* const deps = await processService.analyzeProcessDependencies('ImportData');
|
|
73
|
+
* console.log('Cubes used:', deps.cubes);
|
|
74
|
+
* console.log('Dimensions used:', deps.dimensions);
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
analyzeProcessDependencies(processName: string): Promise<any>;
|
|
78
|
+
/**
|
|
79
|
+
* Validate process syntax without executing it
|
|
80
|
+
*
|
|
81
|
+
* @param processName - Name of the process
|
|
82
|
+
* @returns Promise<{isValid: boolean, errors: any[]}> - Validation result
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const result = await processService.validateProcessSyntax('MyProcess');
|
|
87
|
+
* if (!result.isValid) {
|
|
88
|
+
* console.error('Errors:', result.errors);
|
|
89
|
+
* }
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
validateProcessSyntax(processName: string): Promise<{
|
|
93
|
+
isValid: boolean;
|
|
94
|
+
errors: any[];
|
|
95
|
+
}>;
|
|
96
|
+
/**
|
|
97
|
+
* Get process execution plan (estimated resource usage)
|
|
98
|
+
*
|
|
99
|
+
* @param processName - Name of the process
|
|
100
|
+
* @returns Promise<any> - Execution plan information
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* const plan = await processService.getProcessExecutionPlan('ImportData');
|
|
105
|
+
* console.log('Estimated execution time:', plan.estimatedTime);
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
getProcessExecutionPlan(processName: string): Promise<any>;
|
|
64
109
|
}
|
|
65
110
|
//# sourceMappingURL=ProcessService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProcessService.d.ts","sourceRoot":"","sources":["../../src/services/ProcessService.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ProcessService.d.ts","sourceRoot":"","sources":["../../src/services/ProcessService.ts"],"names":[],"mappings":"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"}
|