@messagevisor/core 0.0.1 → 0.1.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 +16 -0
- package/LICENSE +21 -0
- package/README.md +7 -0
- package/jest.config.js +8 -0
- package/lib/benchmark/index.d.ts +2 -0
- package/lib/benchmark/index.js +417 -0
- package/lib/benchmark/index.js.map +1 -0
- package/lib/builder/index.d.ts +70 -0
- package/lib/builder/index.js +831 -0
- package/lib/builder/index.js.map +1 -0
- package/lib/cli/index.d.ts +28 -0
- package/lib/cli/index.js +182 -0
- package/lib/cli/index.js.map +1 -0
- package/lib/config/index.d.ts +61 -0
- package/lib/config/index.js +255 -0
- package/lib/config/index.js.map +1 -0
- package/lib/create/index.d.ts +2 -0
- package/lib/create/index.js +405 -0
- package/lib/create/index.js.map +1 -0
- package/lib/datasource/filesystemAdapter.d.ts +44 -0
- package/lib/datasource/filesystemAdapter.js +424 -0
- package/lib/datasource/filesystemAdapter.js.map +1 -0
- package/lib/datasource/index.d.ts +39 -0
- package/lib/datasource/index.js +96 -0
- package/lib/datasource/index.js.map +1 -0
- package/lib/error.d.ts +6 -0
- package/lib/error.js +49 -0
- package/lib/error.js.map +1 -0
- package/lib/evaluate/cli.d.ts +8 -0
- package/lib/evaluate/cli.js +179 -0
- package/lib/evaluate/cli.js.map +1 -0
- package/lib/evaluate/index.d.ts +10 -0
- package/lib/evaluate/index.js +131 -0
- package/lib/evaluate/index.js.map +1 -0
- package/lib/examples/coerceExampleIsoDates.d.ts +12 -0
- package/lib/examples/coerceExampleIsoDates.js +81 -0
- package/lib/examples/coerceExampleIsoDates.js.map +1 -0
- package/lib/examples/index.d.ts +63 -0
- package/lib/examples/index.js +713 -0
- package/lib/examples/index.js.map +1 -0
- package/lib/exporter/index.d.ts +60 -0
- package/lib/exporter/index.js +610 -0
- package/lib/exporter/index.js.map +1 -0
- package/lib/find-duplicates/index.d.ts +41 -0
- package/lib/find-duplicates/index.js +297 -0
- package/lib/find-duplicates/index.js.map +1 -0
- package/lib/generate-code/index.d.ts +11 -0
- package/lib/generate-code/index.js +157 -0
- package/lib/generate-code/index.js.map +1 -0
- package/lib/generate-code/typescript.d.ts +14 -0
- package/lib/generate-code/typescript.js +307 -0
- package/lib/generate-code/typescript.js.map +1 -0
- package/lib/importer/index.d.ts +64 -0
- package/lib/importer/index.js +1092 -0
- package/lib/importer/index.js.map +1 -0
- package/lib/index.d.ts +18 -0
- package/lib/index.js +35 -0
- package/lib/index.js.map +1 -0
- package/lib/info/index.d.ts +17 -0
- package/lib/info/index.js +132 -0
- package/lib/info/index.js.map +1 -0
- package/lib/init/index.d.ts +30 -0
- package/lib/init/index.js +348 -0
- package/lib/init/index.js.map +1 -0
- package/lib/lint/index.d.ts +1 -0
- package/lib/lint/index.js +6 -0
- package/lib/lint/index.js.map +1 -0
- package/lib/linter/attributeSchema.d.ts +7 -0
- package/lib/linter/attributeSchema.js +36 -0
- package/lib/linter/attributeSchema.js.map +1 -0
- package/lib/linter/checkLocaleCircularDependency.d.ts +7 -0
- package/lib/linter/checkLocaleCircularDependency.js +42 -0
- package/lib/linter/checkLocaleCircularDependency.js.map +1 -0
- package/lib/linter/conditionSchema.d.ts +3 -0
- package/lib/linter/conditionSchema.js +283 -0
- package/lib/linter/conditionSchema.js.map +1 -0
- package/lib/linter/formatSchema.d.ts +325 -0
- package/lib/linter/formatSchema.js +165 -0
- package/lib/linter/formatSchema.js.map +1 -0
- package/lib/linter/icuStyleLint.d.ts +6 -0
- package/lib/linter/icuStyleLint.js +226 -0
- package/lib/linter/icuStyleLint.js.map +1 -0
- package/lib/linter/index.d.ts +34 -0
- package/lib/linter/index.js +557 -0
- package/lib/linter/index.js.map +1 -0
- package/lib/linter/localeSchema.d.ts +672 -0
- package/lib/linter/localeSchema.js +50 -0
- package/lib/linter/localeSchema.js.map +1 -0
- package/lib/linter/messageSchema.d.ts +35 -0
- package/lib/linter/messageSchema.js +115 -0
- package/lib/linter/messageSchema.js.map +1 -0
- package/lib/linter/printError.d.ts +8 -0
- package/lib/linter/printError.js +41 -0
- package/lib/linter/printError.js.map +1 -0
- package/lib/linter/schema.d.ts +33 -0
- package/lib/linter/schema.js +192 -0
- package/lib/linter/schema.js.map +1 -0
- package/lib/linter/segmentSchema.d.ts +8 -0
- package/lib/linter/segmentSchema.js +18 -0
- package/lib/linter/segmentSchema.js.map +1 -0
- package/lib/linter/targetSchema.d.ts +337 -0
- package/lib/linter/targetSchema.js +39 -0
- package/lib/linter/targetSchema.js.map +1 -0
- package/lib/linter/testSchema.d.ts +71 -0
- package/lib/linter/testSchema.js +165 -0
- package/lib/linter/testSchema.js.map +1 -0
- package/lib/linter/zodHelpers.d.ts +2 -0
- package/lib/linter/zodHelpers.js +15 -0
- package/lib/linter/zodHelpers.js.map +1 -0
- package/lib/list/index.d.ts +8 -0
- package/lib/list/index.js +524 -0
- package/lib/list/index.js.map +1 -0
- package/lib/matrix.d.ts +4 -0
- package/lib/matrix.js +66 -0
- package/lib/matrix.js.map +1 -0
- package/lib/promoter/index.d.ts +65 -0
- package/lib/promoter/index.js +1208 -0
- package/lib/promoter/index.js.map +1 -0
- package/lib/prune/index.d.ts +37 -0
- package/lib/prune/index.js +673 -0
- package/lib/prune/index.js.map +1 -0
- package/lib/sets.d.ts +10 -0
- package/lib/sets.js +120 -0
- package/lib/sets.js.map +1 -0
- package/lib/tester/cliFormat.d.ts +8 -0
- package/lib/tester/cliFormat.js +15 -0
- package/lib/tester/cliFormat.js.map +1 -0
- package/lib/tester/index.d.ts +35 -0
- package/lib/tester/index.js +713 -0
- package/lib/tester/index.js.map +1 -0
- package/lib/tester/matrix.d.ts +14 -0
- package/lib/tester/matrix.js +76 -0
- package/lib/tester/matrix.js.map +1 -0
- package/lib/tester/prettyDuration.d.ts +1 -0
- package/lib/tester/prettyDuration.js +30 -0
- package/lib/tester/prettyDuration.js.map +1 -0
- package/lib/tester/printTestResult.d.ts +2 -0
- package/lib/tester/printTestResult.js +32 -0
- package/lib/tester/printTestResult.js.map +1 -0
- package/lib/tester/types.d.ts +29 -0
- package/lib/tester/types.js +3 -0
- package/lib/tester/types.js.map +1 -0
- package/package.json +41 -13
- package/src/benchmark/index.spec.ts +375 -0
- package/src/benchmark/index.ts +433 -0
- package/src/builder/index.spec.ts +822 -0
- package/src/builder/index.ts +920 -0
- package/src/cli/index.spec.ts +54 -0
- package/src/cli/index.ts +150 -0
- package/src/config/index.spec.ts +70 -0
- package/src/config/index.ts +259 -0
- package/src/create/index.spec.ts +272 -0
- package/src/create/index.ts +295 -0
- package/src/datasource/filesystemAdapter.ts +313 -0
- package/src/datasource/index.ts +135 -0
- package/src/error.ts +33 -0
- package/src/evaluate/cli.spec.ts +368 -0
- package/src/evaluate/cli.ts +130 -0
- package/src/evaluate/index.ts +161 -0
- package/src/examples/coerceExampleIsoDates.spec.ts +81 -0
- package/src/examples/coerceExampleIsoDates.ts +98 -0
- package/src/examples/index.spec.ts +453 -0
- package/src/examples/index.ts +854 -0
- package/src/exporter/index.spec.ts +443 -0
- package/src/exporter/index.ts +643 -0
- package/src/find-duplicates/index.spec.ts +289 -0
- package/src/find-duplicates/index.ts +314 -0
- package/src/generate-code/index.ts +92 -0
- package/src/generate-code/typescript.spec.ts +241 -0
- package/src/generate-code/typescript.ts +284 -0
- package/src/importer/index.spec.ts +1101 -0
- package/src/importer/index.ts +1190 -0
- package/src/index.ts +18 -0
- package/src/info/index.ts +67 -0
- package/src/init/index.spec.ts +279 -0
- package/src/init/index.ts +292 -0
- package/src/lint/index.ts +1 -0
- package/src/linter/attributeSchema.ts +38 -0
- package/src/linter/checkLocaleCircularDependency.ts +51 -0
- package/src/linter/conditionSchema.ts +386 -0
- package/src/linter/formatSchema.ts +170 -0
- package/src/linter/icuStyleLint.ts +312 -0
- package/src/linter/index.spec.ts +824 -0
- package/src/linter/index.ts +460 -0
- package/src/linter/localeSchema.ts +70 -0
- package/src/linter/messageSchema.ts +152 -0
- package/src/linter/printError.ts +52 -0
- package/src/linter/schema.ts +230 -0
- package/src/linter/segmentSchema.ts +15 -0
- package/src/linter/targetSchema.ts +50 -0
- package/src/linter/testSchema.spec.ts +405 -0
- package/src/linter/testSchema.ts +239 -0
- package/src/linter/zodHelpers.ts +16 -0
- package/src/list/index.spec.ts +431 -0
- package/src/list/index.ts +463 -0
- package/src/matrix.ts +69 -0
- package/src/promoter/index.spec.ts +584 -0
- package/src/promoter/index.ts +1267 -0
- package/src/prune/index.spec.ts +418 -0
- package/src/prune/index.ts +693 -0
- package/src/sets.ts +74 -0
- package/src/tester/cliFormat.ts +11 -0
- package/src/tester/featurevisorIntegration.spec.ts +101 -0
- package/src/tester/index.spec.ts +577 -0
- package/src/tester/index.ts +679 -0
- package/src/tester/matrix.ts +106 -0
- package/src/tester/prettyDuration.ts +34 -0
- package/src/tester/printTestResult.ts +40 -0
- package/src/tester/types.ts +32 -0
- package/tsconfig.cjs.json +11 -0
- package/tsconfig.typecheck.json +4 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as os from "os";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
|
|
5
|
+
import { getProjectConfig } from "../config";
|
|
6
|
+
import { Datasource } from "../datasource";
|
|
7
|
+
import { benchmarkPlugin } from "./index";
|
|
8
|
+
|
|
9
|
+
async function writeFile(root: string, relativePath: string, content: string) {
|
|
10
|
+
const filePath = path.join(root, relativePath);
|
|
11
|
+
await fs.promises.mkdir(path.dirname(filePath), { recursive: true });
|
|
12
|
+
await fs.promises.writeFile(filePath, content);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async function createProject(configContent = "module.exports = {};\n") {
|
|
16
|
+
const root = await fs.promises.mkdtemp(path.join(os.tmpdir(), "messagevisor-benchmark-"));
|
|
17
|
+
|
|
18
|
+
await writeFile(root, "messagevisor.config.js", configContent);
|
|
19
|
+
await writeFile(
|
|
20
|
+
root,
|
|
21
|
+
"locales/en.yml",
|
|
22
|
+
[
|
|
23
|
+
"description: English",
|
|
24
|
+
"formats:",
|
|
25
|
+
" number:",
|
|
26
|
+
" decimal:",
|
|
27
|
+
" minimumFractionDigits: 2",
|
|
28
|
+
" maximumFractionDigits: 2",
|
|
29
|
+
"",
|
|
30
|
+
].join("\n"),
|
|
31
|
+
);
|
|
32
|
+
await writeFile(
|
|
33
|
+
root,
|
|
34
|
+
"targets/web.yml",
|
|
35
|
+
[
|
|
36
|
+
"description: Web",
|
|
37
|
+
"includeMessages:",
|
|
38
|
+
" - auth*",
|
|
39
|
+
"locales:",
|
|
40
|
+
" - en",
|
|
41
|
+
"formats:",
|
|
42
|
+
" en:",
|
|
43
|
+
" number:",
|
|
44
|
+
" money:",
|
|
45
|
+
" style: currency",
|
|
46
|
+
" currency: USD",
|
|
47
|
+
"",
|
|
48
|
+
].join("\n"),
|
|
49
|
+
);
|
|
50
|
+
await writeFile(
|
|
51
|
+
root,
|
|
52
|
+
"messages/auth/signin.yml",
|
|
53
|
+
[
|
|
54
|
+
"description: Sign in",
|
|
55
|
+
"translations:",
|
|
56
|
+
" en: Sign in",
|
|
57
|
+
"overrides:",
|
|
58
|
+
" - key: adult",
|
|
59
|
+
" segments: adult",
|
|
60
|
+
" translations:",
|
|
61
|
+
" en: Adult sign in",
|
|
62
|
+
"",
|
|
63
|
+
].join("\n"),
|
|
64
|
+
);
|
|
65
|
+
await writeFile(
|
|
66
|
+
root,
|
|
67
|
+
"segments/adult.yml",
|
|
68
|
+
[
|
|
69
|
+
"conditions:",
|
|
70
|
+
" - attribute: age",
|
|
71
|
+
" operator: greaterThanOrEquals",
|
|
72
|
+
" value: 18",
|
|
73
|
+
"",
|
|
74
|
+
].join("\n"),
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
return root;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function createSetsProject() {
|
|
81
|
+
const root = await fs.promises.mkdtemp(path.join(os.tmpdir(), "messagevisor-benchmark-sets-"));
|
|
82
|
+
await writeFile(root, "messagevisor.config.js", "module.exports = { sets: true };\n");
|
|
83
|
+
|
|
84
|
+
for (const set of ["dev", "production"]) {
|
|
85
|
+
await writeFile(root, `sets/${set}/locales/en.yml`, "description: English\n");
|
|
86
|
+
await writeFile(
|
|
87
|
+
root,
|
|
88
|
+
`sets/${set}/messages/auth/signin.yml`,
|
|
89
|
+
`description: Sign in\ntranslations:\n en: ${set}\n`,
|
|
90
|
+
);
|
|
91
|
+
await writeFile(
|
|
92
|
+
root,
|
|
93
|
+
`sets/${set}/targets/web.yml`,
|
|
94
|
+
"description: Web\nincludeMessages:\n - auth*\nlocales:\n - en\n",
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return root;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function parsedOptions(options: Record<string, unknown>) {
|
|
102
|
+
return {
|
|
103
|
+
_: [],
|
|
104
|
+
...options,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function pluginOptions(
|
|
109
|
+
root: string,
|
|
110
|
+
projectConfig: any,
|
|
111
|
+
datasource: any,
|
|
112
|
+
parsed: Record<string, unknown>,
|
|
113
|
+
) {
|
|
114
|
+
return {
|
|
115
|
+
rootDirectoryPath: root,
|
|
116
|
+
projectConfig,
|
|
117
|
+
datasource,
|
|
118
|
+
parsed: parsedOptions(parsed),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
describe("benchmarkPlugin", function () {
|
|
123
|
+
it("benchmarks keyed messages without target using a minimal datafile path", async function () {
|
|
124
|
+
const root = await createProject();
|
|
125
|
+
const projectConfig = getProjectConfig(root);
|
|
126
|
+
const datasource = new Datasource(projectConfig, root);
|
|
127
|
+
const logSpy = jest.spyOn(console, "log").mockImplementation(() => {});
|
|
128
|
+
|
|
129
|
+
await benchmarkPlugin.handler(
|
|
130
|
+
pluginOptions(root, projectConfig, datasource, {
|
|
131
|
+
message: "auth.signin",
|
|
132
|
+
locale: "en",
|
|
133
|
+
context: JSON.stringify({ age: 21 }),
|
|
134
|
+
n: "5",
|
|
135
|
+
json: true,
|
|
136
|
+
}),
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
const result = JSON.parse(logSpy.mock.calls[0][0]);
|
|
140
|
+
expect(result.message).toEqual("auth.signin");
|
|
141
|
+
expect(result.value).toEqual("Adult sign in");
|
|
142
|
+
expect(result.iterations).toEqual(5);
|
|
143
|
+
expect(result.target).toBeNull();
|
|
144
|
+
expect(result.datafileCounts).toEqual({
|
|
145
|
+
messages: 1,
|
|
146
|
+
segments: 1,
|
|
147
|
+
attributes: 1,
|
|
148
|
+
});
|
|
149
|
+
expect(result.minDuration).toBeGreaterThanOrEqual(0);
|
|
150
|
+
expect(result.medianDuration).toBeGreaterThanOrEqual(result.minDuration);
|
|
151
|
+
expect(result.maxDuration).toBeGreaterThanOrEqual(result.minDuration);
|
|
152
|
+
expect(result.averageDuration).toBeGreaterThanOrEqual(0);
|
|
153
|
+
logSpy.mockRestore();
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("benchmarks keyed messages with target and values using project-configured modules", async function () {
|
|
157
|
+
const interpolationModulePath = path.join(
|
|
158
|
+
path.resolve(__dirname, "../../../.."),
|
|
159
|
+
"packages/module-interpolation/src/index.ts",
|
|
160
|
+
);
|
|
161
|
+
const root = await createProject(
|
|
162
|
+
[
|
|
163
|
+
`const { createInterpolationModule } = require(${JSON.stringify(interpolationModulePath)});`,
|
|
164
|
+
"module.exports = {",
|
|
165
|
+
" modules: [createInterpolationModule()],",
|
|
166
|
+
"};",
|
|
167
|
+
"",
|
|
168
|
+
].join("\n"),
|
|
169
|
+
);
|
|
170
|
+
await writeFile(
|
|
171
|
+
root,
|
|
172
|
+
"messages/auth/signin.yml",
|
|
173
|
+
["description: Sign in", "translations:", " en: Hello {name}", ""].join("\n"),
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
const projectConfig = getProjectConfig(root);
|
|
177
|
+
const datasource = new Datasource(projectConfig, root);
|
|
178
|
+
const logSpy = jest.spyOn(console, "log").mockImplementation(() => {});
|
|
179
|
+
|
|
180
|
+
await benchmarkPlugin.handler(
|
|
181
|
+
pluginOptions(root, projectConfig, datasource, {
|
|
182
|
+
message: "auth.signin",
|
|
183
|
+
target: "web",
|
|
184
|
+
locale: "en",
|
|
185
|
+
values: JSON.stringify({ name: "Ada" }),
|
|
186
|
+
n: "3",
|
|
187
|
+
json: true,
|
|
188
|
+
}),
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
const result = JSON.parse(logSpy.mock.calls[0][0]);
|
|
192
|
+
expect(result.value).toEqual("Hello Ada");
|
|
193
|
+
expect(result.target).toEqual("web");
|
|
194
|
+
expect(result.datafileCounts).toEqual({
|
|
195
|
+
messages: 1,
|
|
196
|
+
segments: 0,
|
|
197
|
+
attributes: 0,
|
|
198
|
+
});
|
|
199
|
+
logSpy.mockRestore();
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it("benchmarks raw messages with locale formats and project-configured modules", async function () {
|
|
203
|
+
const icuModulePath = path.join(
|
|
204
|
+
path.resolve(__dirname, "../../../.."),
|
|
205
|
+
"packages/module-icu/src/index.ts",
|
|
206
|
+
);
|
|
207
|
+
const root = await createProject(
|
|
208
|
+
[
|
|
209
|
+
`const { createICUModule } = require(${JSON.stringify(icuModulePath)});`,
|
|
210
|
+
"module.exports = {",
|
|
211
|
+
" modules: [createICUModule()],",
|
|
212
|
+
"};",
|
|
213
|
+
"",
|
|
214
|
+
].join("\n"),
|
|
215
|
+
);
|
|
216
|
+
const projectConfig = getProjectConfig(root);
|
|
217
|
+
const datasource = new Datasource(projectConfig, root);
|
|
218
|
+
const logSpy = jest.spyOn(console, "log").mockImplementation(() => {});
|
|
219
|
+
|
|
220
|
+
await benchmarkPlugin.handler(
|
|
221
|
+
pluginOptions(root, projectConfig, datasource, {
|
|
222
|
+
rawMessage: "Amount: {amount, number, decimal}",
|
|
223
|
+
locale: "en",
|
|
224
|
+
values: JSON.stringify({ amount: 12 }),
|
|
225
|
+
n: "4",
|
|
226
|
+
json: true,
|
|
227
|
+
}),
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
const result = JSON.parse(logSpy.mock.calls[0][0]);
|
|
231
|
+
expect(result.rawMessage).toEqual("Amount: {amount, number, decimal}");
|
|
232
|
+
expect(result.value).toEqual("Amount: 12.00");
|
|
233
|
+
expect(result.datafileCounts).toEqual({
|
|
234
|
+
messages: 0,
|
|
235
|
+
segments: 0,
|
|
236
|
+
attributes: 0,
|
|
237
|
+
});
|
|
238
|
+
logSpy.mockRestore();
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it("benchmarks raw messages with target-aware formats", async function () {
|
|
242
|
+
const icuModulePath = path.join(
|
|
243
|
+
path.resolve(__dirname, "../../../.."),
|
|
244
|
+
"packages/module-icu/src/index.ts",
|
|
245
|
+
);
|
|
246
|
+
const root = await createProject(
|
|
247
|
+
[
|
|
248
|
+
`const { createICUModule } = require(${JSON.stringify(icuModulePath)});`,
|
|
249
|
+
"module.exports = {",
|
|
250
|
+
" modules: [createICUModule()],",
|
|
251
|
+
"};",
|
|
252
|
+
"",
|
|
253
|
+
].join("\n"),
|
|
254
|
+
);
|
|
255
|
+
const projectConfig = getProjectConfig(root);
|
|
256
|
+
const datasource = new Datasource(projectConfig, root);
|
|
257
|
+
const logSpy = jest.spyOn(console, "log").mockImplementation(() => {});
|
|
258
|
+
|
|
259
|
+
await benchmarkPlugin.handler(
|
|
260
|
+
pluginOptions(root, projectConfig, datasource, {
|
|
261
|
+
rawMessage: "Total: {amount, number, money}",
|
|
262
|
+
locale: "en",
|
|
263
|
+
target: "web",
|
|
264
|
+
values: JSON.stringify({ amount: 12 }),
|
|
265
|
+
json: true,
|
|
266
|
+
}),
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
const result = JSON.parse(logSpy.mock.calls[0][0]);
|
|
270
|
+
expect(String(result.value)).toContain("12");
|
|
271
|
+
expect(result.target).toEqual("web");
|
|
272
|
+
expect(result.datafileCounts).toEqual({
|
|
273
|
+
messages: 1,
|
|
274
|
+
segments: 1,
|
|
275
|
+
attributes: 1,
|
|
276
|
+
});
|
|
277
|
+
logSpy.mockRestore();
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it("prints benchmark summary in the requested order", async function () {
|
|
281
|
+
const root = await createProject();
|
|
282
|
+
const projectConfig = getProjectConfig(root);
|
|
283
|
+
const datasource = new Datasource(projectConfig, root);
|
|
284
|
+
const logSpy = jest.spyOn(console, "log").mockImplementation(() => {});
|
|
285
|
+
|
|
286
|
+
await benchmarkPlugin.handler(
|
|
287
|
+
pluginOptions(root, projectConfig, datasource, {
|
|
288
|
+
message: "auth.signin",
|
|
289
|
+
locale: "en",
|
|
290
|
+
n: "2",
|
|
291
|
+
}),
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
const output = logSpy.mock.calls.map((call) => String(call[0])).filter(Boolean);
|
|
295
|
+
expect(output[0]).toEqual("Benchmark target : auth.signin");
|
|
296
|
+
expect(output[1]).toEqual("Iterations : 2");
|
|
297
|
+
expect(output[2]).toEqual("Datafile : 1 messages, 1 segments, 1 attributes");
|
|
298
|
+
expect(output[3]).toEqual("Locale : en");
|
|
299
|
+
expect(output[4]).toEqual('Evaluated value : "Sign in"');
|
|
300
|
+
expect(output[5]).toMatch(/^Total duration : /);
|
|
301
|
+
expect(output[6]).toMatch(/^Min duration : /);
|
|
302
|
+
expect(output[7]).toMatch(/^Median duration : /);
|
|
303
|
+
expect(output[8]).toMatch(/^Max duration : /);
|
|
304
|
+
expect(output[9]).toMatch(/^Average duration : /);
|
|
305
|
+
logSpy.mockRestore();
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
it("validates required inputs and JSON parsing", async function () {
|
|
309
|
+
const root = await createProject();
|
|
310
|
+
const projectConfig = getProjectConfig(root);
|
|
311
|
+
const datasource = new Datasource(projectConfig, root);
|
|
312
|
+
const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {});
|
|
313
|
+
|
|
314
|
+
async function expectFriendlyFailure(parsed: Record<string, unknown>, message: string) {
|
|
315
|
+
await expect(
|
|
316
|
+
benchmarkPlugin.handler(pluginOptions(root, projectConfig, datasource, parsed)),
|
|
317
|
+
).resolves.toEqual(false);
|
|
318
|
+
expect(errorSpy).toHaveBeenCalledWith(message);
|
|
319
|
+
errorSpy.mockClear();
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
try {
|
|
323
|
+
await expectFriendlyFailure({}, "Pass --message=<key> or --rawMessage=<message>");
|
|
324
|
+
await expectFriendlyFailure(
|
|
325
|
+
{
|
|
326
|
+
message: "auth.signin",
|
|
327
|
+
rawMessage: "Hello",
|
|
328
|
+
locale: "en",
|
|
329
|
+
},
|
|
330
|
+
"Pass either --message=<key> or --rawMessage=<message>, not both",
|
|
331
|
+
);
|
|
332
|
+
await expectFriendlyFailure({ message: "auth.signin" }, "Pass --locale=<locale>");
|
|
333
|
+
await expectFriendlyFailure(
|
|
334
|
+
{
|
|
335
|
+
message: "auth.signin",
|
|
336
|
+
locale: "en",
|
|
337
|
+
context: "{bad}",
|
|
338
|
+
},
|
|
339
|
+
"Invalid --context: expected valid JSON",
|
|
340
|
+
);
|
|
341
|
+
await expectFriendlyFailure(
|
|
342
|
+
{
|
|
343
|
+
message: "auth.signin",
|
|
344
|
+
locale: "en",
|
|
345
|
+
values: "{bad}",
|
|
346
|
+
},
|
|
347
|
+
"Invalid --values: expected valid JSON",
|
|
348
|
+
);
|
|
349
|
+
} finally {
|
|
350
|
+
errorSpy.mockRestore();
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
it("requires --set for sets-enabled projects", async function () {
|
|
355
|
+
const root = await createSetsProject();
|
|
356
|
+
const projectConfig = getProjectConfig(root);
|
|
357
|
+
const datasource = new Datasource(projectConfig, root);
|
|
358
|
+
const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {});
|
|
359
|
+
|
|
360
|
+
try {
|
|
361
|
+
await expect(
|
|
362
|
+
benchmarkPlugin.handler(
|
|
363
|
+
pluginOptions(root, projectConfig, datasource, {
|
|
364
|
+
message: "auth.signin",
|
|
365
|
+
locale: "en",
|
|
366
|
+
}),
|
|
367
|
+
),
|
|
368
|
+
).resolves.toEqual(false);
|
|
369
|
+
|
|
370
|
+
expect(errorSpy).toHaveBeenCalledWith("Pass --set=<set>");
|
|
371
|
+
} finally {
|
|
372
|
+
errorSpy.mockRestore();
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
});
|