@aztec/foundation 0.26.6 → 0.27.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/dest/testing/index.d.ts +1 -0
- package/dest/testing/index.d.ts.map +1 -1
- package/dest/testing/index.js +2 -1
- package/dest/testing/snapshot_serializer.d.ts +5 -0
- package/dest/testing/snapshot_serializer.d.ts.map +1 -0
- package/dest/testing/snapshot_serializer.js +27 -0
- package/dest/testing/test_data.d.ts +7 -0
- package/dest/testing/test_data.d.ts.map +1 -1
- package/dest/testing/test_data.js +30 -1
- package/package.json +2 -2
- package/src/testing/index.ts +1 -0
- package/src/testing/snapshot_serializer.ts +33 -0
- package/src/testing/test_data.ts +34 -0
package/dest/testing/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC"}
|
package/dest/testing/index.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export * from './test_data.js';
|
|
2
|
-
|
|
2
|
+
export * from './snapshot_serializer.js';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsMEJBQTBCLENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot_serializer.d.ts","sourceRoot":"","sources":["../../src/testing/snapshot_serializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AA2B/C,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IAAE,qBAAqB,EAAE,CAAC,UAAU,EAAE,SAAS,KAAK,IAAI,CAAA;CAAE,QAKhH"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { inspect } from 'util';
|
|
2
|
+
function makeSerializerForCustomInspect(prefix) {
|
|
3
|
+
return {
|
|
4
|
+
serialize(val) {
|
|
5
|
+
return inspect(val);
|
|
6
|
+
},
|
|
7
|
+
test(arg) {
|
|
8
|
+
return inspect(arg).startsWith(prefix);
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const bufferSerializer = {
|
|
13
|
+
serialize(val) {
|
|
14
|
+
return `Buffer<0x${val.toString('hex')}>`;
|
|
15
|
+
},
|
|
16
|
+
test(arg) {
|
|
17
|
+
return Buffer.isBuffer(arg);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
const CUSTOM_INSPECT_SERIALIZABLE_TYPES = ['AztecAddress', 'Fr', 'Fq', 'Selector', 'EthAddress'];
|
|
21
|
+
export function setupCustomSnapshotSerializers(expect) {
|
|
22
|
+
for (const type of CUSTOM_INSPECT_SERIALIZABLE_TYPES) {
|
|
23
|
+
expect.addSnapshotSerializer(makeSerializerForCustomInspect(type));
|
|
24
|
+
}
|
|
25
|
+
expect.addSnapshotSerializer(bufferSerializer);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3Rfc2VyaWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL3NuYXBzaG90X3NlcmlhbGl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixTQUFTLDhCQUE4QixDQUFDLE1BQWM7SUFDcEQsT0FBTztRQUNMLFNBQVMsQ0FBQyxHQUFRO1lBQ2hCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFFRCxJQUFJLENBQUMsR0FBUTtZQUNYLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLGdCQUFnQixHQUFjO0lBQ2xDLFNBQVMsQ0FBQyxHQUFRO1FBQ2hCLE9BQU8sWUFBWSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDNUMsQ0FBQztJQUVELElBQUksQ0FBQyxHQUFRO1FBQ1gsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRixDQUFDO0FBRUYsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUVqRyxNQUFNLFVBQVUsOEJBQThCLENBQUMsTUFBa0U7SUFDL0csS0FBSyxNQUFNLElBQUksSUFBSSxpQ0FBaUMsRUFBRSxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFDRCxNQUFNLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNqRCxDQUFDIn0=
|
|
@@ -9,4 +9,11 @@ export declare function pushTestData(itemName: string, data: {
|
|
|
9
9
|
export declare function getTestData(itemName: string): {
|
|
10
10
|
toBuffer(): Buffer;
|
|
11
11
|
}[];
|
|
12
|
+
/**
|
|
13
|
+
* Looks for a variable assignment in the target file and updates the value, only if test data generation is enabled.
|
|
14
|
+
* Note that a magic inline comment would be a cleaner approach, like `/* TEST-DATA-START *\/` and `/* TEST-DATA-END *\/`,
|
|
15
|
+
* but running nargo fmt on it panics since the comment would be erased, so we roll with this for now.
|
|
16
|
+
* @remarks Requires AZTEC_GENERATE_TEST_DATA=1 to be set
|
|
17
|
+
*/
|
|
18
|
+
export declare function updateInlineTestData(targetFileFromRepoRoot: string, itemName: string, value: string): void;
|
|
12
19
|
//# sourceMappingURL=test_data.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_data.d.ts","sourceRoot":"","sources":["../../src/testing/test_data.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"test_data.d.ts","sourceRoot":"","sources":["../../src/testing/test_data.ts"],"names":[],"mappings":";AAQA,sDAAsD;AACtD,wBAAgB,yBAAyB,YAExC;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,QAAQ,IAAI,MAAM,CAAA;CAAE,QAgB1E;AAED,sHAAsH;AACtH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,QAAQ,IAAI,MAAM,CAAA;CAAE,EAAE,CAQtE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAoBnG"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
+
import { dirname, join, resolve } from 'path';
|
|
3
|
+
import { createConsoleLogger } from '../log/console.js';
|
|
4
|
+
import { fileURLToPath } from '../url/index.js';
|
|
1
5
|
const testData = {};
|
|
2
6
|
/** Returns whether test data generation is enabled */
|
|
3
7
|
export function isGenerateTestDataEnabled() {
|
|
@@ -27,4 +31,29 @@ export function getTestData(itemName) {
|
|
|
27
31
|
const fullItemName = `${testName} ${itemName}`;
|
|
28
32
|
return testData[fullItemName];
|
|
29
33
|
}
|
|
30
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Looks for a variable assignment in the target file and updates the value, only if test data generation is enabled.
|
|
36
|
+
* Note that a magic inline comment would be a cleaner approach, like `/* TEST-DATA-START *\/` and `/* TEST-DATA-END *\/`,
|
|
37
|
+
* but running nargo fmt on it panics since the comment would be erased, so we roll with this for now.
|
|
38
|
+
* @remarks Requires AZTEC_GENERATE_TEST_DATA=1 to be set
|
|
39
|
+
*/
|
|
40
|
+
export function updateInlineTestData(targetFileFromRepoRoot, itemName, value) {
|
|
41
|
+
if (!isGenerateTestDataEnabled()) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const logger = createConsoleLogger('aztec:testing:test_data');
|
|
45
|
+
const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../../../');
|
|
46
|
+
if (!existsSync(join(repoRoot, 'CODEOWNERS'))) {
|
|
47
|
+
throw new Error(`Path to repo root is incorrect (got ${repoRoot})`);
|
|
48
|
+
}
|
|
49
|
+
const targetFile = join(repoRoot, targetFileFromRepoRoot);
|
|
50
|
+
const contents = readFileSync(targetFile, 'utf8').toString();
|
|
51
|
+
const regex = new RegExp(`let ${itemName} = .*;`, 'g');
|
|
52
|
+
if (!regex.exec(contents)) {
|
|
53
|
+
throw new Error(`Test data marker for ${itemName} not found in ${targetFile}`);
|
|
54
|
+
}
|
|
55
|
+
const updatedContents = contents.replaceAll(regex, `let ${itemName} = ${value};`);
|
|
56
|
+
writeFileSync(targetFile, updatedContents);
|
|
57
|
+
logger(`Updated test data in ${targetFile} for ${itemName} to ${value}`);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF9kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvdGVzdF9kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLElBQUksQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE1BQU0sUUFBUSxHQUFnRCxFQUFFLENBQUM7QUFFakUsc0RBQXNEO0FBQ3RELE1BQU0sVUFBVSx5QkFBeUI7SUFDdkMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixLQUFLLEdBQUcsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUM7QUFDdkYsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixNQUFNLFVBQVUsWUFBWSxDQUFDLFFBQWdCLEVBQUUsSUFBNEI7SUFDekUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsQ0FBQztRQUNqQyxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDbEMsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsZUFBZSxDQUFDO0lBQ25ELE1BQU0sWUFBWSxHQUFHLEdBQUcsUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBRS9DLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUM1QixRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxzSEFBc0g7QUFDdEgsTUFBTSxVQUFVLFdBQVcsQ0FBQyxRQUFnQjtJQUMxQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxlQUFlLENBQUM7SUFDbkQsTUFBTSxZQUFZLEdBQUcsR0FBRyxRQUFRLElBQUksUUFBUSxFQUFFLENBQUM7SUFDL0MsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLHNCQUE4QixFQUFFLFFBQWdCLEVBQUUsS0FBYTtJQUNsRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM5RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbEYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDMUQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3RCxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLFFBQVEsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsUUFBUSxpQkFBaUIsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxRQUFRLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNsRixhQUFhLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sQ0FBQyx3QkFBd0IsVUFBVSxRQUFRLFFBQVEsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzNFLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/foundation",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.27.0",
|
|
4
4
|
"packageManager": "yarn@3.4.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dest/index.js",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"rootDir": "./src"
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
|
-
"@aztec/bb.js": "0.
|
|
64
|
+
"@aztec/bb.js": "0.27.0",
|
|
65
65
|
"@koa/cors": "^4.0.0",
|
|
66
66
|
"@noble/curves": "^1.2.0",
|
|
67
67
|
"bn.js": "^5.2.1",
|
package/src/testing/index.ts
CHANGED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type NewPlugin } from 'pretty-format';
|
|
2
|
+
import { inspect } from 'util';
|
|
3
|
+
|
|
4
|
+
function makeSerializerForCustomInspect(prefix: string): NewPlugin {
|
|
5
|
+
return {
|
|
6
|
+
serialize(val: any): string {
|
|
7
|
+
return inspect(val);
|
|
8
|
+
},
|
|
9
|
+
|
|
10
|
+
test(arg: any): boolean {
|
|
11
|
+
return inspect(arg).startsWith(prefix);
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const bufferSerializer: NewPlugin = {
|
|
17
|
+
serialize(val: any): string {
|
|
18
|
+
return `Buffer<0x${val.toString('hex')}>`;
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
test(arg: any): boolean {
|
|
22
|
+
return Buffer.isBuffer(arg);
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const CUSTOM_INSPECT_SERIALIZABLE_TYPES = ['AztecAddress', 'Fr', 'Fq', 'Selector', 'EthAddress'];
|
|
27
|
+
|
|
28
|
+
export function setupCustomSnapshotSerializers(expect: { addSnapshotSerializer: (serializer: NewPlugin) => void }) {
|
|
29
|
+
for (const type of CUSTOM_INSPECT_SERIALIZABLE_TYPES) {
|
|
30
|
+
expect.addSnapshotSerializer(makeSerializerForCustomInspect(type));
|
|
31
|
+
}
|
|
32
|
+
expect.addSnapshotSerializer(bufferSerializer);
|
|
33
|
+
}
|
package/src/testing/test_data.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
+
import { dirname, join, resolve } from 'path';
|
|
3
|
+
|
|
4
|
+
import { createConsoleLogger } from '../log/console.js';
|
|
5
|
+
import { fileURLToPath } from '../url/index.js';
|
|
6
|
+
|
|
1
7
|
const testData: { [key: string]: { toBuffer(): Buffer }[] } = {};
|
|
2
8
|
|
|
3
9
|
/** Returns whether test data generation is enabled */
|
|
@@ -34,3 +40,31 @@ export function getTestData(itemName: string): { toBuffer(): Buffer }[] {
|
|
|
34
40
|
const fullItemName = `${testName} ${itemName}`;
|
|
35
41
|
return testData[fullItemName];
|
|
36
42
|
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Looks for a variable assignment in the target file and updates the value, only if test data generation is enabled.
|
|
46
|
+
* Note that a magic inline comment would be a cleaner approach, like `/* TEST-DATA-START *\/` and `/* TEST-DATA-END *\/`,
|
|
47
|
+
* but running nargo fmt on it panics since the comment would be erased, so we roll with this for now.
|
|
48
|
+
* @remarks Requires AZTEC_GENERATE_TEST_DATA=1 to be set
|
|
49
|
+
*/
|
|
50
|
+
export function updateInlineTestData(targetFileFromRepoRoot: string, itemName: string, value: string) {
|
|
51
|
+
if (!isGenerateTestDataEnabled()) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const logger = createConsoleLogger('aztec:testing:test_data');
|
|
55
|
+
const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../../../');
|
|
56
|
+
if (!existsSync(join(repoRoot, 'CODEOWNERS'))) {
|
|
57
|
+
throw new Error(`Path to repo root is incorrect (got ${repoRoot})`);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const targetFile = join(repoRoot, targetFileFromRepoRoot);
|
|
61
|
+
const contents = readFileSync(targetFile, 'utf8').toString();
|
|
62
|
+
const regex = new RegExp(`let ${itemName} = .*;`, 'g');
|
|
63
|
+
if (!regex.exec(contents)) {
|
|
64
|
+
throw new Error(`Test data marker for ${itemName} not found in ${targetFile}`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const updatedContents = contents.replaceAll(regex, `let ${itemName} = ${value};`);
|
|
68
|
+
writeFileSync(targetFile, updatedContents);
|
|
69
|
+
logger(`Updated test data in ${targetFile} for ${itemName} to ${value}`);
|
|
70
|
+
}
|