@forgehive/record-tape 0.1.0 → 0.1.2
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 +21 -21
- 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 +27 -26
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":"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;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,cAAc,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IACjE,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,YAAY,CAAC,MAAM,GAAG,OAAO;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,MAAM,MAAM,OAAO,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;AAGjH,MAAM,MAAM,WAAW,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACxF,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC,CAAA;AAED,UAAU,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC,SAAS,UAAU,GAAG,UAAU;IACrF,IAAI,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAA;IAClB,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAA;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEtC,qBAAa,UAAU,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC,SAAS,UAAU,GAAG,UAAU;IAC5F,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,IAAI,CAAiC;gBAEjC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAM;IAOnD,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;IAIzC,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAIzB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAuDjE,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAC3C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAwDhC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,IAAI;IAI5D,SAAS,IAAI,MAAM;IASnB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;IAYvD,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAgBvC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;KAAE,GAAG,IAAI;IAcnH,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;IA8BtD,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;IAmBrC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,QAAQ,IAAI,IAAI;CAajB"}
|
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
|
|
@@ -147,8 +148,8 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
147
148
|
boundaries: {
|
|
148
149
|
fetchData: [{
|
|
149
150
|
input: [-5],
|
|
150
|
-
|
|
151
|
-
|
|
151
|
+
error: 'Value cannot be negative',
|
|
152
|
+
output: null
|
|
152
153
|
}]
|
|
153
154
|
}
|
|
154
155
|
});
|
|
@@ -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();
|
|
@@ -214,8 +215,7 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
214
215
|
fetchData: [
|
|
215
216
|
{
|
|
216
217
|
input: [10],
|
|
217
|
-
output: 20
|
|
218
|
-
error: null
|
|
218
|
+
output: 20
|
|
219
219
|
}
|
|
220
220
|
]
|
|
221
221
|
}
|
|
@@ -237,7 +237,8 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
237
237
|
output: 20,
|
|
238
238
|
error: null
|
|
239
239
|
}]
|
|
240
|
-
}
|
|
240
|
+
},
|
|
241
|
+
context: undefined
|
|
241
242
|
});
|
|
242
243
|
});
|
|
243
244
|
it('should handle execution records with Promise outputs correctly', async () => {
|
|
@@ -252,13 +253,12 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
252
253
|
fetchData: [
|
|
253
254
|
{
|
|
254
255
|
input: [15],
|
|
255
|
-
output: 30
|
|
256
|
-
error: null
|
|
256
|
+
output: 30
|
|
257
257
|
}
|
|
258
258
|
]
|
|
259
259
|
}
|
|
260
260
|
};
|
|
261
|
-
// Push the record with Promise output
|
|
261
|
+
// Push the record with Promise output using type parameter
|
|
262
262
|
tape.push('promise-record', promiseRecord);
|
|
263
263
|
// Get the recorded log from the tape
|
|
264
264
|
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.2",
|
|
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.8",
|
|
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
|
|
@@ -187,8 +189,8 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
187
189
|
boundaries: {
|
|
188
190
|
fetchData: [{
|
|
189
191
|
input: [-5],
|
|
190
|
-
|
|
191
|
-
|
|
192
|
+
error: 'Value cannot be negative',
|
|
193
|
+
output: null
|
|
192
194
|
}]
|
|
193
195
|
}
|
|
194
196
|
})
|
|
@@ -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
|
|
@@ -269,8 +271,7 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
269
271
|
fetchData: [
|
|
270
272
|
{
|
|
271
273
|
input: [10],
|
|
272
|
-
output: 20
|
|
273
|
-
error: null
|
|
274
|
+
output: 20
|
|
274
275
|
}
|
|
275
276
|
]
|
|
276
277
|
}
|
|
@@ -295,7 +296,8 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
295
296
|
output: 20,
|
|
296
297
|
error: null
|
|
297
298
|
}]
|
|
298
|
-
}
|
|
299
|
+
},
|
|
300
|
+
context: undefined
|
|
299
301
|
})
|
|
300
302
|
})
|
|
301
303
|
|
|
@@ -312,14 +314,13 @@ describe('RecordTape safeRun integration tests', () => {
|
|
|
312
314
|
fetchData: [
|
|
313
315
|
{
|
|
314
316
|
input: [15],
|
|
315
|
-
output: 30
|
|
316
|
-
error: null
|
|
317
|
+
output: 30
|
|
317
318
|
}
|
|
318
319
|
]
|
|
319
320
|
}
|
|
320
321
|
}
|
|
321
322
|
|
|
322
|
-
// Push the record with Promise output
|
|
323
|
+
// Push the record with Promise output using type parameter
|
|
323
324
|
tape.push('promise-record', promiseRecord)
|
|
324
325
|
|
|
325
326
|
// Get the recorded log from the tape
|