@forgehive/record-tape 0.1.0 → 0.1.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/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -51
- package/dist/index.js.map +1 -1
- package/dist/tests/safe-run.test.js +15 -14
- package/dist/tests/safe-run.test.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +46 -54
- package/src/tests/safe-run.test.ts +21 -19
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { type ExecutionRecord, type Boundaries } from '@forgehive/task';
|
|
|
3
3
|
export interface LogRecord<TInput = unknown, TOutput = unknown, B extends Boundaries = Boundaries> extends ExecutionRecord<TInput, TOutput, B> {
|
|
4
4
|
name: string;
|
|
5
5
|
type: 'success' | 'error';
|
|
6
|
+
context?: Record<string, string>;
|
|
6
7
|
}
|
|
7
8
|
export interface SuccessLogItem<TInput = unknown, TOutput = unknown> {
|
|
8
9
|
input: TInput;
|
|
@@ -30,14 +31,13 @@ export type Mode = 'record' | 'replay';
|
|
|
30
31
|
export declare class RecordTape<TInput = unknown, TOutput = unknown, B extends Boundaries = Boundaries> {
|
|
31
32
|
private _path;
|
|
32
33
|
private _mode;
|
|
33
|
-
private _boundaries;
|
|
34
34
|
private _log;
|
|
35
35
|
constructor(config?: Config<TInput, TOutput, B>);
|
|
36
36
|
getLog(): LogRecord<TInput, TOutput, B>[];
|
|
37
37
|
getMode(): Mode;
|
|
38
38
|
setMode(mode: Mode): void;
|
|
39
|
-
addLogItem(name: string, logItem:
|
|
40
|
-
push(name: string, record: ExecutionRecord<TInput,
|
|
39
|
+
addLogItem(name: string, logItem: LogItem<TInput, TOutput>): void;
|
|
40
|
+
push(name: string, record: ExecutionRecord<TInput, unknown, B>, context?: Record<string, string>): LogRecord<TInput, TOutput, B>;
|
|
41
41
|
addLogRecord(logRecord: LogRecord<TInput, TOutput, B>): void;
|
|
42
42
|
stringify(): string;
|
|
43
43
|
parse(content: string): LogRecord<TInput, TOutput, B>[];
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEvE,MAAM,WAAW,SAAS,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC,SAAS,UAAU,GAAG,UAAU,CAAE,SAAQ,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5I,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,SAAS,GAAG,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,18 +6,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.RecordTape = void 0;
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
|
-
function isSuccessLogItem(log) {
|
|
10
|
-
return log.output !== undefined;
|
|
11
|
-
}
|
|
12
|
-
function isErrorLogItem(log) {
|
|
13
|
-
return log.error !== undefined;
|
|
14
|
-
}
|
|
15
9
|
class RecordTape {
|
|
16
10
|
constructor(config = {}) {
|
|
17
|
-
var _a
|
|
11
|
+
var _a;
|
|
18
12
|
this._path = typeof config.path === 'string' ? `${config.path}.log` : undefined;
|
|
19
13
|
this._log = (_a = config.log) !== null && _a !== void 0 ? _a : [];
|
|
20
|
-
this._boundaries = (_b = config.boundaries) !== null && _b !== void 0 ? _b : {};
|
|
21
14
|
this._mode = 'record';
|
|
22
15
|
}
|
|
23
16
|
// Data functions
|
|
@@ -39,8 +32,9 @@ class RecordTape {
|
|
|
39
32
|
if (logItem.boundaries) {
|
|
40
33
|
for (const key in logItem.boundaries) {
|
|
41
34
|
// Check if the source is from safe-run (if it has error field in entries)
|
|
42
|
-
const
|
|
43
|
-
|
|
35
|
+
const boundaryEntries = logItem.boundaries[key];
|
|
36
|
+
const isSafeRun = boundaryEntries.some(entry => entry.error !== undefined);
|
|
37
|
+
formattedBoundaries[key] = boundaryEntries.map(entry => {
|
|
44
38
|
var _a, _b;
|
|
45
39
|
// Only add error field if it's from safe-run
|
|
46
40
|
return isSafeRun ?
|
|
@@ -56,9 +50,10 @@ class RecordTape {
|
|
|
56
50
|
});
|
|
57
51
|
}
|
|
58
52
|
}
|
|
59
|
-
// Handle LogItem interface
|
|
60
|
-
|
|
61
|
-
|
|
53
|
+
// Handle LogItem interface - need to type cast to access properties safely
|
|
54
|
+
const typedLogItem = logItem;
|
|
55
|
+
if ('output' in typedLogItem && typedLogItem.output !== undefined) {
|
|
56
|
+
const { input, output } = typedLogItem;
|
|
62
57
|
this._log.push({
|
|
63
58
|
name,
|
|
64
59
|
type: 'success',
|
|
@@ -67,29 +62,8 @@ class RecordTape {
|
|
|
67
62
|
boundaries: formattedBoundaries
|
|
68
63
|
});
|
|
69
64
|
}
|
|
70
|
-
else if (
|
|
71
|
-
const { input, error } =
|
|
72
|
-
this._log.push({
|
|
73
|
-
name,
|
|
74
|
-
type: 'error',
|
|
75
|
-
input,
|
|
76
|
-
error,
|
|
77
|
-
boundaries: formattedBoundaries
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
// Handle TaskRecord interface
|
|
81
|
-
else if (logItem.output !== undefined) {
|
|
82
|
-
const { input, output } = logItem;
|
|
83
|
-
this._log.push({
|
|
84
|
-
name,
|
|
85
|
-
type: 'success',
|
|
86
|
-
input,
|
|
87
|
-
output,
|
|
88
|
-
boundaries: formattedBoundaries
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
else if (logItem.error !== undefined) {
|
|
92
|
-
const { input, error } = logItem;
|
|
65
|
+
else if ('error' in typedLogItem && typedLogItem.error !== undefined) {
|
|
66
|
+
const { input, error } = typedLogItem;
|
|
93
67
|
this._log.push({
|
|
94
68
|
name,
|
|
95
69
|
type: 'error',
|
|
@@ -102,15 +76,16 @@ class RecordTape {
|
|
|
102
76
|
throw new Error('invalid log item');
|
|
103
77
|
}
|
|
104
78
|
}
|
|
105
|
-
push(name, record) {
|
|
79
|
+
push(name, record, context) {
|
|
106
80
|
if (this._mode === 'replay') {
|
|
107
|
-
return;
|
|
81
|
+
return {};
|
|
108
82
|
}
|
|
109
83
|
// For safeRun records, always include both error and output fields
|
|
110
84
|
const formattedBoundaries = {};
|
|
111
85
|
if (record.boundaries) {
|
|
112
86
|
for (const key in record.boundaries) {
|
|
113
|
-
|
|
87
|
+
const boundaryArray = record.boundaries[key];
|
|
88
|
+
formattedBoundaries[key] = boundaryArray.map(entry => {
|
|
114
89
|
var _a, _b;
|
|
115
90
|
return {
|
|
116
91
|
input: entry.input,
|
|
@@ -120,29 +95,38 @@ class RecordTape {
|
|
|
120
95
|
});
|
|
121
96
|
}
|
|
122
97
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
98
|
+
let logRecord;
|
|
99
|
+
if ('output' in record && record.output !== undefined) {
|
|
100
|
+
const input = record.input;
|
|
101
|
+
// Handle Promise outputs by setting to null in the log
|
|
102
|
+
const output = record.output instanceof Promise ? null : record.output;
|
|
103
|
+
logRecord = {
|
|
126
104
|
name,
|
|
127
105
|
type: 'success',
|
|
128
106
|
input,
|
|
129
|
-
output
|
|
130
|
-
boundaries: formattedBoundaries
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
107
|
+
output,
|
|
108
|
+
boundaries: formattedBoundaries,
|
|
109
|
+
context
|
|
110
|
+
};
|
|
111
|
+
this._log.push(logRecord);
|
|
112
|
+
}
|
|
113
|
+
else if ('error' in record && record.error !== undefined) {
|
|
114
|
+
const input = record.input;
|
|
115
|
+
const error = record.error;
|
|
116
|
+
logRecord = {
|
|
136
117
|
name,
|
|
137
118
|
type: 'error',
|
|
138
119
|
input,
|
|
139
120
|
error,
|
|
140
|
-
boundaries: formattedBoundaries
|
|
141
|
-
|
|
121
|
+
boundaries: formattedBoundaries,
|
|
122
|
+
context
|
|
123
|
+
};
|
|
124
|
+
this._log.push(logRecord);
|
|
142
125
|
}
|
|
143
126
|
else {
|
|
144
127
|
throw new Error('invalid record type');
|
|
145
128
|
}
|
|
129
|
+
return logRecord;
|
|
146
130
|
}
|
|
147
131
|
addLogRecord(logRecord) {
|
|
148
132
|
this._log.push(logRecord);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAmB;AACnB,gDAAuB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,18 +31,17 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
31
31
|
const recordedLog = tape.getLog();
|
|
32
32
|
// Verify the log was recorded correctly
|
|
33
33
|
expect(recordedLog).toHaveLength(1);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
34
|
+
const logItem = recordedLog[0];
|
|
35
|
+
expect(logItem.name).toEqual('test-task');
|
|
36
|
+
expect(logItem.type).toEqual('success');
|
|
37
|
+
expect(logItem.input).toEqual({ value: 5 });
|
|
38
|
+
expect(logItem.output).toEqual({ result: 10, success: true });
|
|
39
|
+
expect(logItem.boundaries).toEqual({
|
|
40
|
+
fetchData: [{
|
|
41
|
+
input: [5],
|
|
42
|
+
output: 10,
|
|
43
|
+
error: null
|
|
44
|
+
}]
|
|
46
45
|
});
|
|
47
46
|
});
|
|
48
47
|
it('should record log items from safeRun successfully', async () => {
|
|
@@ -72,6 +71,7 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
72
71
|
return (Object.assign(Object.assign({}, entry), { error: (_a = entry.error) !== null && _a !== void 0 ? _a : null, output: (_b = entry.output) !== null && _b !== void 0 ? _b : null }));
|
|
73
72
|
});
|
|
74
73
|
}
|
|
74
|
+
// Cast the record to LogItem type to satisfy TypeScript
|
|
75
75
|
tape.addLogItem('test-task', record);
|
|
76
76
|
});
|
|
77
77
|
// Run the task with safeRun
|
|
@@ -127,6 +127,7 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
127
127
|
return (Object.assign(Object.assign({}, entry), { error: (_a = entry.error) !== null && _a !== void 0 ? _a : null, output: (_b = entry.output) !== null && _b !== void 0 ? _b : null }));
|
|
128
128
|
});
|
|
129
129
|
}
|
|
130
|
+
// Cast the record to LogItem type to satisfy TypeScript
|
|
130
131
|
tape.addLogItem('test-task', record);
|
|
131
132
|
});
|
|
132
133
|
// Run the task with safeRun with a value that will cause an error
|
|
@@ -176,7 +177,7 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
176
177
|
const tape = new index_1.RecordTape();
|
|
177
178
|
// Run the task with safeRun with a value that will cause an error
|
|
178
179
|
const [result, error, record] = await task.safeRun({ value: -5 });
|
|
179
|
-
// Push the error record directly
|
|
180
|
+
// Push the error record directly with type parameter
|
|
180
181
|
tape.push('test-error', record);
|
|
181
182
|
// Verify the execution failed as expected
|
|
182
183
|
expect(result).toBeNull();
|
|
@@ -258,7 +259,7 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
258
259
|
]
|
|
259
260
|
}
|
|
260
261
|
};
|
|
261
|
-
// Push the record with Promise output
|
|
262
|
+
// Push the record with Promise output using type parameter
|
|
262
263
|
tape.push('promise-record', promiseRecord);
|
|
263
264
|
// Get the recorded log from the tape
|
|
264
265
|
const recordedLog = tape.getLog();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-run.test.js","sourceRoot":"","sources":["../../src/tests/safe-run.test.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"safe-run.test.js","sourceRoot":"","sources":["../../src/tests/safe-run.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forgehive/record-tape",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"typescript": "^5.3.3"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@forgehive/
|
|
23
|
-
"@forgehive/
|
|
22
|
+
"@forgehive/task": "0.1.7",
|
|
23
|
+
"@forgehive/schema": "0.1.4"
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
26
|
"build": "tsc",
|
package/src/index.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { type ExecutionRecord, type Boundaries } from '@forgehive/task'
|
|
|
5
5
|
export interface LogRecord<TInput = unknown, TOutput = unknown, B extends Boundaries = Boundaries> extends ExecutionRecord<TInput, TOutput, B> {
|
|
6
6
|
name: string
|
|
7
7
|
type: 'success' | 'error'
|
|
8
|
+
context?: Record<string, string>
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
export interface SuccessLogItem<TInput = unknown, TOutput = unknown> {
|
|
@@ -19,14 +20,6 @@ export interface ErrorLogItem<TInput = unknown> {
|
|
|
19
20
|
boundaries?: Record<string, unknown>
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
function isSuccessLogItem<TInput, TOutput>(log: SuccessLogItem<TInput, TOutput> | ErrorLogItem<TInput>): log is SuccessLogItem<TInput, TOutput> {
|
|
23
|
-
return (log as SuccessLogItem<TInput, TOutput>).output !== undefined
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function isErrorLogItem<TInput>(log: SuccessLogItem<TInput> | ErrorLogItem<TInput>): log is ErrorLogItem<TInput> {
|
|
27
|
-
return (log as ErrorLogItem<TInput>).error !== undefined
|
|
28
|
-
}
|
|
29
|
-
|
|
30
23
|
export type LogItem<TInput = unknown, TOutput = unknown> = SuccessLogItem<TInput, TOutput> | ErrorLogItem<TInput>
|
|
31
24
|
|
|
32
25
|
// Additional type to handle TaskRecord compatibility
|
|
@@ -48,13 +41,11 @@ export type Mode = 'record' | 'replay'
|
|
|
48
41
|
export class RecordTape<TInput = unknown, TOutput = unknown, B extends Boundaries = Boundaries> {
|
|
49
42
|
private _path: fs.PathLike | undefined
|
|
50
43
|
private _mode: Mode
|
|
51
|
-
private _boundaries: Record<string, unknown>
|
|
52
44
|
private _log: LogRecord<TInput, TOutput, B>[]
|
|
53
45
|
|
|
54
46
|
constructor(config: Config<TInput, TOutput, B> = {}) {
|
|
55
47
|
this._path = typeof config.path === 'string' ? `${config.path}.log` : undefined
|
|
56
48
|
this._log = config.log ?? []
|
|
57
|
-
this._boundaries = config.boundaries ?? {}
|
|
58
49
|
this._mode = 'record'
|
|
59
50
|
}
|
|
60
51
|
|
|
@@ -71,19 +62,20 @@ export class RecordTape<TInput = unknown, TOutput = unknown, B extends Boundarie
|
|
|
71
62
|
this._mode = mode
|
|
72
63
|
}
|
|
73
64
|
|
|
74
|
-
addLogItem(name: string, logItem:
|
|
65
|
+
addLogItem(name: string, logItem: LogItem<TInput, TOutput>): void {
|
|
75
66
|
if (this._mode === 'replay') {
|
|
76
67
|
return
|
|
77
68
|
}
|
|
78
69
|
|
|
79
70
|
// Format boundaries to ensure both error and output fields are set if needed
|
|
80
|
-
const formattedBoundaries: Record<string,
|
|
71
|
+
const formattedBoundaries: Record<string, unknown> = {}
|
|
81
72
|
if (logItem.boundaries) {
|
|
82
73
|
for (const key in logItem.boundaries) {
|
|
83
74
|
// Check if the source is from safe-run (if it has error field in entries)
|
|
84
|
-
const
|
|
75
|
+
const boundaryEntries = logItem.boundaries[key] as Array<Record<string, unknown>>
|
|
76
|
+
const isSafeRun = boundaryEntries.some(entry => entry.error !== undefined)
|
|
85
77
|
|
|
86
|
-
formattedBoundaries[key] =
|
|
78
|
+
formattedBoundaries[key] = boundaryEntries.map(entry => {
|
|
87
79
|
// Only add error field if it's from safe-run
|
|
88
80
|
return isSafeRun ?
|
|
89
81
|
{
|
|
@@ -99,29 +91,11 @@ export class RecordTape<TInput = unknown, TOutput = unknown, B extends Boundarie
|
|
|
99
91
|
}
|
|
100
92
|
}
|
|
101
93
|
|
|
102
|
-
// Handle LogItem interface
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
type: 'success',
|
|
108
|
-
input,
|
|
109
|
-
output,
|
|
110
|
-
boundaries: formattedBoundaries
|
|
111
|
-
} as LogRecord<TInput, TOutput, B>)
|
|
112
|
-
} else if (isErrorLogItem(logItem)) {
|
|
113
|
-
const { input, error } = logItem
|
|
114
|
-
this._log.push({
|
|
115
|
-
name,
|
|
116
|
-
type: 'error',
|
|
117
|
-
input,
|
|
118
|
-
error,
|
|
119
|
-
boundaries: formattedBoundaries
|
|
120
|
-
} as LogRecord<TInput, TOutput, B>)
|
|
121
|
-
}
|
|
122
|
-
// Handle TaskRecord interface
|
|
123
|
-
else if (logItem.output !== undefined) {
|
|
124
|
-
const { input, output } = logItem
|
|
94
|
+
// Handle LogItem interface - need to type cast to access properties safely
|
|
95
|
+
const typedLogItem = logItem as (SuccessLogItem<TInput, TOutput> | ErrorLogItem<TInput>)
|
|
96
|
+
|
|
97
|
+
if ('output' in typedLogItem && typedLogItem.output !== undefined) {
|
|
98
|
+
const { input, output } = typedLogItem
|
|
125
99
|
this._log.push({
|
|
126
100
|
name,
|
|
127
101
|
type: 'success',
|
|
@@ -129,8 +103,8 @@ export class RecordTape<TInput = unknown, TOutput = unknown, B extends Boundarie
|
|
|
129
103
|
output,
|
|
130
104
|
boundaries: formattedBoundaries
|
|
131
105
|
} as LogRecord<TInput, TOutput, B>)
|
|
132
|
-
} else if (
|
|
133
|
-
const { input, error } =
|
|
106
|
+
} else if ('error' in typedLogItem && typedLogItem.error !== undefined) {
|
|
107
|
+
const { input, error } = typedLogItem
|
|
134
108
|
this._log.push({
|
|
135
109
|
name,
|
|
136
110
|
type: 'error',
|
|
@@ -143,16 +117,21 @@ export class RecordTape<TInput = unknown, TOutput = unknown, B extends Boundarie
|
|
|
143
117
|
}
|
|
144
118
|
}
|
|
145
119
|
|
|
146
|
-
push(
|
|
120
|
+
push(
|
|
121
|
+
name: string,
|
|
122
|
+
record: ExecutionRecord<TInput, unknown, B>,
|
|
123
|
+
context?: Record<string, string>
|
|
124
|
+
): LogRecord<TInput, TOutput, B> {
|
|
147
125
|
if (this._mode === 'replay') {
|
|
148
|
-
return
|
|
126
|
+
return {} as LogRecord<TInput, TOutput, B>
|
|
149
127
|
}
|
|
150
128
|
|
|
151
129
|
// For safeRun records, always include both error and output fields
|
|
152
|
-
const formattedBoundaries: Record<string,
|
|
130
|
+
const formattedBoundaries: Record<string, unknown> = {}
|
|
153
131
|
if (record.boundaries) {
|
|
154
132
|
for (const key in record.boundaries) {
|
|
155
|
-
|
|
133
|
+
const boundaryArray = record.boundaries[key] as Array<Record<string, unknown>>
|
|
134
|
+
formattedBoundaries[key] = boundaryArray.map(entry => {
|
|
156
135
|
return {
|
|
157
136
|
input: entry.input,
|
|
158
137
|
output: entry.output ?? null,
|
|
@@ -162,27 +141,40 @@ export class RecordTape<TInput = unknown, TOutput = unknown, B extends Boundarie
|
|
|
162
141
|
}
|
|
163
142
|
}
|
|
164
143
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
144
|
+
let logRecord: LogRecord<TInput, TOutput, B>
|
|
145
|
+
|
|
146
|
+
if ('output' in record && record.output !== undefined) {
|
|
147
|
+
const input = record.input
|
|
148
|
+
// Handle Promise outputs by setting to null in the log
|
|
149
|
+
const output = record.output instanceof Promise ? null : record.output
|
|
150
|
+
|
|
151
|
+
logRecord = {
|
|
168
152
|
name,
|
|
169
153
|
type: 'success',
|
|
170
154
|
input,
|
|
171
|
-
output
|
|
172
|
-
boundaries: formattedBoundaries
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
155
|
+
output,
|
|
156
|
+
boundaries: formattedBoundaries,
|
|
157
|
+
context
|
|
158
|
+
} as LogRecord<TInput, TOutput, B>
|
|
159
|
+
this._log.push(logRecord)
|
|
160
|
+
} else if ('error' in record && record.error !== undefined) {
|
|
161
|
+
const input = record.input
|
|
162
|
+
const error = record.error
|
|
163
|
+
|
|
164
|
+
logRecord = {
|
|
177
165
|
name,
|
|
178
166
|
type: 'error',
|
|
179
167
|
input,
|
|
180
168
|
error,
|
|
181
|
-
boundaries: formattedBoundaries
|
|
182
|
-
|
|
169
|
+
boundaries: formattedBoundaries,
|
|
170
|
+
context
|
|
171
|
+
} as LogRecord<TInput, TOutput, B>
|
|
172
|
+
this._log.push(logRecord)
|
|
183
173
|
} else {
|
|
184
174
|
throw new Error('invalid record type')
|
|
185
175
|
}
|
|
176
|
+
|
|
177
|
+
return logRecord
|
|
186
178
|
}
|
|
187
179
|
|
|
188
180
|
addLogRecord(logRecord: LogRecord<TInput, TOutput, B>): void {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RecordTape } from '../index'
|
|
1
|
+
import { RecordTape, type LogItem } from '../index'
|
|
2
2
|
import { createTask, Schema, type ExecutionRecord, type TaskRecord } from '@forgehive/task'
|
|
3
3
|
|
|
4
4
|
describe('RecordTape safeRun integration tests', () => {
|
|
@@ -41,18 +41,18 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
41
41
|
|
|
42
42
|
// Verify the log was recorded correctly
|
|
43
43
|
expect(recordedLog).toHaveLength(1)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
44
|
+
|
|
45
|
+
const logItem = recordedLog[0]
|
|
46
|
+
expect(logItem.name).toEqual('test-task')
|
|
47
|
+
expect(logItem.type).toEqual('success')
|
|
48
|
+
expect(logItem.input).toEqual({ value: 5 })
|
|
49
|
+
expect(logItem.output).toEqual({ result: 10, success: true })
|
|
50
|
+
expect(logItem.boundaries).toEqual({
|
|
51
|
+
fetchData: [{
|
|
52
|
+
input: [5],
|
|
53
|
+
output: 10,
|
|
54
|
+
error: null
|
|
55
|
+
}]
|
|
56
56
|
})
|
|
57
57
|
})
|
|
58
58
|
|
|
@@ -86,14 +86,15 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
86
86
|
task.addListener((record: TaskRecord<{ value: number }, { result: number; success: boolean }>) => {
|
|
87
87
|
// Manually ensure boundary records have error field for consistency with safeRun
|
|
88
88
|
if (record.boundaries && record.boundaries.fetchData && Array.isArray(record.boundaries.fetchData)) {
|
|
89
|
-
record.boundaries.fetchData = record.boundaries.fetchData.map((entry:
|
|
89
|
+
record.boundaries.fetchData = record.boundaries.fetchData.map((entry: Record<string, unknown>) => ({
|
|
90
90
|
...entry,
|
|
91
91
|
error: entry.error ?? null,
|
|
92
92
|
output: entry.output ?? null
|
|
93
93
|
}))
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
|
|
96
|
+
// Cast the record to LogItem type to satisfy TypeScript
|
|
97
|
+
tape.addLogItem('test-task', record as unknown as LogItem<{ value: number }, { result: number; success: boolean }>)
|
|
97
98
|
})
|
|
98
99
|
|
|
99
100
|
// Run the task with safeRun
|
|
@@ -156,14 +157,15 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
156
157
|
task.addListener((record: TaskRecord<{ value: number }, { result: number; success: boolean }>) => {
|
|
157
158
|
// Manually ensure boundary records have error field for consistency with safeRun
|
|
158
159
|
if (record.boundaries && record.boundaries.fetchData && Array.isArray(record.boundaries.fetchData)) {
|
|
159
|
-
record.boundaries.fetchData = record.boundaries.fetchData.map((entry:
|
|
160
|
+
record.boundaries.fetchData = record.boundaries.fetchData.map((entry: Record<string, unknown>) => ({
|
|
160
161
|
...entry,
|
|
161
162
|
error: entry.error ?? null,
|
|
162
163
|
output: entry.output ?? null
|
|
163
164
|
}))
|
|
164
165
|
}
|
|
165
166
|
|
|
166
|
-
|
|
167
|
+
// Cast the record to LogItem type to satisfy TypeScript
|
|
168
|
+
tape.addLogItem('test-task', record as unknown as LogItem<{ value: number }, { result: number; success: boolean }>)
|
|
167
169
|
})
|
|
168
170
|
|
|
169
171
|
// Run the task with safeRun with a value that will cause an error
|
|
@@ -226,7 +228,7 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
226
228
|
// Run the task with safeRun with a value that will cause an error
|
|
227
229
|
const [result, error, record] = await task.safeRun({ value: -5 })
|
|
228
230
|
|
|
229
|
-
// Push the error record directly
|
|
231
|
+
// Push the error record directly with type parameter
|
|
230
232
|
tape.push('test-error', record)
|
|
231
233
|
|
|
232
234
|
// Verify the execution failed as expected
|
|
@@ -319,7 +321,7 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
319
321
|
}
|
|
320
322
|
}
|
|
321
323
|
|
|
322
|
-
// Push the record with Promise output
|
|
324
|
+
// Push the record with Promise output using type parameter
|
|
323
325
|
tape.push('promise-record', promiseRecord)
|
|
324
326
|
|
|
325
327
|
// Get the recorded log from the tape
|