@messagevisor/core 0.16.0 → 0.17.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/CHANGELOG.md +11 -0
- package/lib/linter/testSchema.js +24 -2
- package/lib/linter/testSchema.js.map +1 -1
- package/package.json +5 -5
- package/src/linter/testSchema.spec.ts +57 -1
- package/src/linter/testSchema.ts +33 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [0.17.0](https://github.com/messagevisor/messagevisor/compare/v0.16.0...v0.17.0) (2026-06-27)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* lint test specs for redundant expectations ([#23](https://github.com/messagevisor/messagevisor/issues/23)) ([a758121](https://github.com/messagevisor/messagevisor/commit/a7581210b320926160298ff8b2703563ff7792a8))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
# [0.16.0](https://github.com/messagevisor/messagevisor/compare/v0.15.0...v0.16.0) (2026-06-11)
|
|
7
18
|
|
|
8
19
|
|
package/lib/linter/testSchema.js
CHANGED
|
@@ -6,8 +6,27 @@ var zodHelpers_1 = require("./zodHelpers");
|
|
|
6
6
|
function getTestZodSchema(messageKeys, segmentKeys, localeKeys, targetKeys) {
|
|
7
7
|
var matrixZodSchema = zod_1.z.record(zod_1.z.string(), zod_1.z.array(zod_1.z.union([zod_1.z.string(), zod_1.z.number(), zod_1.z.boolean(), zod_1.z.null()])));
|
|
8
8
|
var formatPresets = zod_1.z.record(zod_1.z.string(), zod_1.z.unknown());
|
|
9
|
-
var expectedByRuntime = zod_1.z
|
|
9
|
+
var expectedByRuntime = zod_1.z
|
|
10
|
+
.record(zod_1.z.string(), zod_1.z.string())
|
|
11
|
+
.refine(function (value) { return Object.keys(value).length > 0; }, {
|
|
12
|
+
message: "`expectedByRuntime` must define at least one runtime.",
|
|
13
|
+
});
|
|
10
14
|
var targetOrMatrixValue = (0, zodHelpers_1.refineWithMessage)(zod_1.z.string(), function (value) { return targetKeys.includes(value) || /^\$\{\{.+\}\}$/.test(value); }, function (value) { return "Unknown target \"".concat(value, "\""); });
|
|
15
|
+
var validateExpectedByRuntime = function (data, ctx) {
|
|
16
|
+
if (!data.expectedTranslation || !data.expectedByRuntime) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
for (var _i = 0, _a = Object.entries(data.expectedByRuntime); _i < _a.length; _i++) {
|
|
20
|
+
var _b = _a[_i], runtime = _b[0], expectedTranslation = _b[1];
|
|
21
|
+
if (expectedTranslation === data.expectedTranslation) {
|
|
22
|
+
ctx.addIssue({
|
|
23
|
+
code: zod_1.z.ZodIssueCode.custom,
|
|
24
|
+
message: "`expectedByRuntime` entries must differ from `expectedTranslation`; remove redundant runtime expectations.",
|
|
25
|
+
path: ["expectedByRuntime", runtime],
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
11
30
|
var messageAssertion = zod_1.z
|
|
12
31
|
.object({
|
|
13
32
|
matrix: matrixZodSchema.optional(),
|
|
@@ -24,7 +43,8 @@ function getTestZodSchema(messageKeys, segmentKeys, localeKeys, targetKeys) {
|
|
|
24
43
|
expectedTranslation: zod_1.z.string(),
|
|
25
44
|
expectedByRuntime: expectedByRuntime.optional(),
|
|
26
45
|
})
|
|
27
|
-
.strict()
|
|
46
|
+
.strict()
|
|
47
|
+
.superRefine(validateExpectedByRuntime);
|
|
28
48
|
var segmentAssertion = zod_1.z
|
|
29
49
|
.object({
|
|
30
50
|
matrix: matrixZodSchema.optional(),
|
|
@@ -51,6 +71,7 @@ function getTestZodSchema(messageKeys, segmentKeys, localeKeys, targetKeys) {
|
|
|
51
71
|
})
|
|
52
72
|
.strict()
|
|
53
73
|
.superRefine(function (data, ctx) {
|
|
74
|
+
validateExpectedByRuntime(data, ctx);
|
|
54
75
|
var hasExpectedFormats = typeof data.expectedFormats !== "undefined";
|
|
55
76
|
var hasRawMessage = typeof data.rawMessage !== "undefined";
|
|
56
77
|
var hasExpectedTranslation = typeof data.expectedTranslation !== "undefined";
|
|
@@ -93,6 +114,7 @@ function getTestZodSchema(messageKeys, segmentKeys, localeKeys, targetKeys) {
|
|
|
93
114
|
})
|
|
94
115
|
.strict()
|
|
95
116
|
.superRefine(function (data, ctx) {
|
|
117
|
+
validateExpectedByRuntime(data, ctx);
|
|
96
118
|
var hasRawMessage = typeof data.rawMessage !== "undefined";
|
|
97
119
|
var hasMessage = typeof data.message !== "undefined";
|
|
98
120
|
var hasExpectedTranslation = typeof data.expectedTranslation !== "undefined";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testSchema.js","sourceRoot":"","sources":["../../src/linter/testSchema.ts"],"names":[],"mappings":";;AAIA,
|
|
1
|
+
{"version":3,"file":"testSchema.js","sourceRoot":"","sources":["../../src/linter/testSchema.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@messagevisor/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "Core package of Messagevisor for Node.js usage",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -31,13 +31,13 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@featurevisor/parsers": "^2.24.0",
|
|
33
33
|
"@featurevisor/sdk": "^2.23.0",
|
|
34
|
-
"@messagevisor/catalog": "0.
|
|
35
|
-
"@messagevisor/sdk": "0.
|
|
36
|
-
"@messagevisor/types": "0.
|
|
34
|
+
"@messagevisor/catalog": "0.17.0",
|
|
35
|
+
"@messagevisor/sdk": "0.17.0",
|
|
36
|
+
"@messagevisor/types": "0.17.0",
|
|
37
37
|
"intl-messageformat": "^10.7.16",
|
|
38
38
|
"tar": "^7.5.11",
|
|
39
39
|
"yargs": "^17.7.2",
|
|
40
40
|
"zod": "^4.3.6"
|
|
41
41
|
},
|
|
42
|
-
"gitHead": "
|
|
42
|
+
"gitHead": "a7603f5b942fb9a1c28c9e71f4fb99bded9c7542"
|
|
43
43
|
}
|
|
@@ -29,7 +29,7 @@ describe("getTestZodSchema", function () {
|
|
|
29
29
|
},
|
|
30
30
|
expectedTranslation: "Hello ${{ name }}",
|
|
31
31
|
expectedByRuntime: {
|
|
32
|
-
go: "
|
|
32
|
+
go: "Hi ${{ name }}",
|
|
33
33
|
},
|
|
34
34
|
},
|
|
35
35
|
],
|
|
@@ -183,6 +183,62 @@ describe("getTestZodSchema", function () {
|
|
|
183
183
|
).toEqual(true);
|
|
184
184
|
});
|
|
185
185
|
|
|
186
|
+
it("rejects empty runtime-specific expected values", function () {
|
|
187
|
+
const result = schema.safeParse({
|
|
188
|
+
message: "auth.signin",
|
|
189
|
+
assertions: [
|
|
190
|
+
{
|
|
191
|
+
locale: "en",
|
|
192
|
+
target: "web",
|
|
193
|
+
expectedTranslation: "Sign in",
|
|
194
|
+
expectedByRuntime: {},
|
|
195
|
+
},
|
|
196
|
+
],
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
expect(result.success).toEqual(false);
|
|
200
|
+
const nestedIssues =
|
|
201
|
+
result.error.issues[0]?.code === "invalid_union"
|
|
202
|
+
? result.error.issues[0].errors.flat()
|
|
203
|
+
: result.error.issues;
|
|
204
|
+
expect(
|
|
205
|
+
nestedIssues.some(
|
|
206
|
+
(issue) =>
|
|
207
|
+
issue.path.join(".") === "assertions.0.expectedByRuntime" &&
|
|
208
|
+
issue.message.includes("at least one runtime"),
|
|
209
|
+
),
|
|
210
|
+
).toEqual(true);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it("rejects runtime-specific expected values that duplicate expectedTranslation", function () {
|
|
214
|
+
const result = schema.safeParse({
|
|
215
|
+
message: "auth.signin",
|
|
216
|
+
assertions: [
|
|
217
|
+
{
|
|
218
|
+
locale: "en",
|
|
219
|
+
target: "web",
|
|
220
|
+
expectedTranslation: "Sign in",
|
|
221
|
+
expectedByRuntime: {
|
|
222
|
+
java: "Sign in",
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
],
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
expect(result.success).toEqual(false);
|
|
229
|
+
const nestedIssues =
|
|
230
|
+
result.error.issues[0]?.code === "invalid_union"
|
|
231
|
+
? result.error.issues[0].errors.flat()
|
|
232
|
+
: result.error.issues;
|
|
233
|
+
expect(
|
|
234
|
+
nestedIssues.some(
|
|
235
|
+
(issue) =>
|
|
236
|
+
issue.path.join(".") === "assertions.0.expectedByRuntime.java" &&
|
|
237
|
+
issue.message.includes("remove redundant runtime expectations"),
|
|
238
|
+
),
|
|
239
|
+
).toEqual(true);
|
|
240
|
+
});
|
|
241
|
+
|
|
186
242
|
it("keeps key-like fields strict and literal", function () {
|
|
187
243
|
const result = schema.safeParse({
|
|
188
244
|
message: "auth.signin",
|
package/src/linter/testSchema.ts
CHANGED
|
@@ -13,12 +13,38 @@ export function getTestZodSchema(
|
|
|
13
13
|
z.array(z.union([z.string(), z.number(), z.boolean(), z.null()])),
|
|
14
14
|
);
|
|
15
15
|
const formatPresets = z.record(z.string(), z.unknown());
|
|
16
|
-
const expectedByRuntime = z
|
|
16
|
+
const expectedByRuntime = z
|
|
17
|
+
.record(z.string(), z.string())
|
|
18
|
+
.refine((value) => Object.keys(value).length > 0, {
|
|
19
|
+
message: "`expectedByRuntime` must define at least one runtime.",
|
|
20
|
+
});
|
|
17
21
|
const targetOrMatrixValue = refineWithMessage(
|
|
18
22
|
z.string(),
|
|
19
23
|
(value) => targetKeys.includes(value) || /^\$\{\{.+\}\}$/.test(value),
|
|
20
24
|
(value) => `Unknown target "${value}"`,
|
|
21
25
|
);
|
|
26
|
+
const validateExpectedByRuntime = (
|
|
27
|
+
data: {
|
|
28
|
+
expectedTranslation?: string;
|
|
29
|
+
expectedByRuntime?: Record<string, string>;
|
|
30
|
+
},
|
|
31
|
+
ctx: z.RefinementCtx,
|
|
32
|
+
) => {
|
|
33
|
+
if (!data.expectedTranslation || !data.expectedByRuntime) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
for (const [runtime, expectedTranslation] of Object.entries(data.expectedByRuntime)) {
|
|
38
|
+
if (expectedTranslation === data.expectedTranslation) {
|
|
39
|
+
ctx.addIssue({
|
|
40
|
+
code: z.ZodIssueCode.custom,
|
|
41
|
+
message:
|
|
42
|
+
"`expectedByRuntime` entries must differ from `expectedTranslation`; remove redundant runtime expectations.",
|
|
43
|
+
path: ["expectedByRuntime", runtime],
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
22
48
|
|
|
23
49
|
const messageAssertion = z
|
|
24
50
|
.object({
|
|
@@ -40,7 +66,8 @@ export function getTestZodSchema(
|
|
|
40
66
|
expectedTranslation: z.string(),
|
|
41
67
|
expectedByRuntime: expectedByRuntime.optional(),
|
|
42
68
|
})
|
|
43
|
-
.strict()
|
|
69
|
+
.strict()
|
|
70
|
+
.superRefine(validateExpectedByRuntime);
|
|
44
71
|
|
|
45
72
|
const segmentAssertion = z
|
|
46
73
|
.object({
|
|
@@ -73,6 +100,8 @@ export function getTestZodSchema(
|
|
|
73
100
|
})
|
|
74
101
|
.strict()
|
|
75
102
|
.superRefine((data, ctx) => {
|
|
103
|
+
validateExpectedByRuntime(data, ctx);
|
|
104
|
+
|
|
76
105
|
const hasExpectedFormats = typeof data.expectedFormats !== "undefined";
|
|
77
106
|
const hasRawMessage = typeof data.rawMessage !== "undefined";
|
|
78
107
|
const hasExpectedTranslation = typeof data.expectedTranslation !== "undefined";
|
|
@@ -139,6 +168,8 @@ export function getTestZodSchema(
|
|
|
139
168
|
})
|
|
140
169
|
.strict()
|
|
141
170
|
.superRefine((data, ctx) => {
|
|
171
|
+
validateExpectedByRuntime(data, ctx);
|
|
172
|
+
|
|
142
173
|
const hasRawMessage = typeof data.rawMessage !== "undefined";
|
|
143
174
|
const hasMessage = typeof data.message !== "undefined";
|
|
144
175
|
const hasExpectedTranslation = typeof data.expectedTranslation !== "undefined";
|