@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,431 @@
|
|
|
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 { listPlugin } 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() {
|
|
16
|
+
const root = await fs.promises.mkdtemp(path.join(os.tmpdir(), "messagevisor-list-"));
|
|
17
|
+
|
|
18
|
+
await writeFile(root, "messagevisor.config.js", "module.exports = {};\n");
|
|
19
|
+
await writeFile(
|
|
20
|
+
root,
|
|
21
|
+
"locales/en.yml",
|
|
22
|
+
"description: English\npromotable: true\nformats:\n number:\n money:\n style: currency\n currency: USD\n",
|
|
23
|
+
);
|
|
24
|
+
await writeFile(
|
|
25
|
+
root,
|
|
26
|
+
"locales/en-US.yml",
|
|
27
|
+
"description: English US\ninheritFormatsFrom: en\ninheritTranslationsFrom: en\n",
|
|
28
|
+
);
|
|
29
|
+
await writeFile(root, "locales/nl.yml", "description: Dutch\n");
|
|
30
|
+
await writeFile(
|
|
31
|
+
root,
|
|
32
|
+
"attributes/plan.yml",
|
|
33
|
+
"description: Plan\npromotable: true\ntype: string\n",
|
|
34
|
+
);
|
|
35
|
+
await writeFile(
|
|
36
|
+
root,
|
|
37
|
+
"attributes/birthDate.yml",
|
|
38
|
+
"description: Birth date\narchived: true\ntype: date\n",
|
|
39
|
+
);
|
|
40
|
+
await writeFile(
|
|
41
|
+
root,
|
|
42
|
+
"segments/pro.yml",
|
|
43
|
+
"description: Pro segment\npromotable: false\nconditions:\n - attribute: plan\n operator: equals\n value: pro\n",
|
|
44
|
+
);
|
|
45
|
+
await writeFile(
|
|
46
|
+
root,
|
|
47
|
+
"segments/archived.yml",
|
|
48
|
+
"description: Archived segment\narchived: true\nconditions:\n - attribute: plan\n operator: equals\n value: archived\n",
|
|
49
|
+
);
|
|
50
|
+
await writeFile(
|
|
51
|
+
root,
|
|
52
|
+
"messages/common/welcome.yml",
|
|
53
|
+
[
|
|
54
|
+
"description: Welcome message",
|
|
55
|
+
"promotable: false",
|
|
56
|
+
"deprecated: true",
|
|
57
|
+
"meta:",
|
|
58
|
+
" screen: home",
|
|
59
|
+
"translations:",
|
|
60
|
+
" en: Welcome",
|
|
61
|
+
" en-US: Welcome US",
|
|
62
|
+
"overrides:",
|
|
63
|
+
" - key: pro",
|
|
64
|
+
" segments: pro",
|
|
65
|
+
" translations:",
|
|
66
|
+
" en: Welcome Pro",
|
|
67
|
+
"",
|
|
68
|
+
].join("\n"),
|
|
69
|
+
);
|
|
70
|
+
await writeFile(
|
|
71
|
+
root,
|
|
72
|
+
"messages/common/plain.yml",
|
|
73
|
+
"description: Plain message\ntranslations:\n en: Plain\n",
|
|
74
|
+
);
|
|
75
|
+
await writeFile(
|
|
76
|
+
root,
|
|
77
|
+
"messages/common/draft.yml",
|
|
78
|
+
"description: Draft message\ntranslations:\n en: Draft\n",
|
|
79
|
+
);
|
|
80
|
+
await writeFile(
|
|
81
|
+
root,
|
|
82
|
+
"messages/common/archived.yml",
|
|
83
|
+
"description: Archived message\narchived: true\ntranslations:\n en: Archived\n",
|
|
84
|
+
);
|
|
85
|
+
await writeFile(
|
|
86
|
+
root,
|
|
87
|
+
"targets/web.yml",
|
|
88
|
+
[
|
|
89
|
+
"description: Web target",
|
|
90
|
+
"promotable: false",
|
|
91
|
+
"includeMessages:",
|
|
92
|
+
" - common*",
|
|
93
|
+
"locales:",
|
|
94
|
+
" - en",
|
|
95
|
+
" - en-US",
|
|
96
|
+
"context:",
|
|
97
|
+
" platform: web",
|
|
98
|
+
"formats:",
|
|
99
|
+
" en:",
|
|
100
|
+
" number:",
|
|
101
|
+
" webMoney:",
|
|
102
|
+
" style: currency",
|
|
103
|
+
" currency: USD",
|
|
104
|
+
"",
|
|
105
|
+
].join("\n"),
|
|
106
|
+
);
|
|
107
|
+
await writeFile(
|
|
108
|
+
root,
|
|
109
|
+
"targets/admin.yml",
|
|
110
|
+
"description: Admin target\nincludeMessages:\n - admin*\nlocales:\n - nl\n",
|
|
111
|
+
);
|
|
112
|
+
await writeFile(
|
|
113
|
+
root,
|
|
114
|
+
"tests/messages/common/welcome.spec.yml",
|
|
115
|
+
"message: common.welcome\nassertions:\n - locale: en\n target: web\n expectedTranslation: Welcome\n",
|
|
116
|
+
);
|
|
117
|
+
await writeFile(
|
|
118
|
+
root,
|
|
119
|
+
"tests/segments/pro.spec.yml",
|
|
120
|
+
"segment: pro\nassertions:\n - expectedToMatch: true\n context:\n plan: pro\n",
|
|
121
|
+
);
|
|
122
|
+
await writeFile(
|
|
123
|
+
root,
|
|
124
|
+
"tests/locales/en.spec.yml",
|
|
125
|
+
"locale: en\nassertions:\n - expectedFormats:\n number:\n money:\n currency: USD\n",
|
|
126
|
+
);
|
|
127
|
+
await writeFile(
|
|
128
|
+
root,
|
|
129
|
+
"tests/targets/web.spec.yml",
|
|
130
|
+
"target: web\nassertions:\n - locale: en\n expectedToIncludeMessages:\n - common.welcome\n",
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
return root;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function createSetsProject() {
|
|
137
|
+
const root = await fs.promises.mkdtemp(path.join(os.tmpdir(), "messagevisor-list-sets-"));
|
|
138
|
+
await writeFile(root, "messagevisor.config.js", "module.exports = { sets: true };\n");
|
|
139
|
+
|
|
140
|
+
for (const set of ["dev", "production"]) {
|
|
141
|
+
await writeFile(root, `sets/${set}/locales/en.yml`, "description: English\n");
|
|
142
|
+
await writeFile(
|
|
143
|
+
root,
|
|
144
|
+
`sets/${set}/messages/common/welcome.yml`,
|
|
145
|
+
`description: Welcome ${set}\ntranslations:\n en: ${set}\n`,
|
|
146
|
+
);
|
|
147
|
+
await writeFile(
|
|
148
|
+
root,
|
|
149
|
+
`sets/${set}/targets/web.yml`,
|
|
150
|
+
"description: Web\nincludeMessages:\n - common*\nlocales:\n - en\n",
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return root;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function getDatasource(root: string) {
|
|
158
|
+
const projectConfig = getProjectConfig(root);
|
|
159
|
+
const datasource = new Datasource(projectConfig, root);
|
|
160
|
+
|
|
161
|
+
return { projectConfig, datasource };
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
describe("listPlugin", function () {
|
|
165
|
+
it("lists entity keys in plain output", async function () {
|
|
166
|
+
const root = await createProject();
|
|
167
|
+
const { datasource } = getDatasource(root);
|
|
168
|
+
const logSpy = jest.spyOn(console, "log").mockImplementation(() => {});
|
|
169
|
+
|
|
170
|
+
await listPlugin.handler({ datasource, parsed: { messages: true } });
|
|
171
|
+
|
|
172
|
+
const output = logSpy.mock.calls.map((call) => call[0]).join("\n");
|
|
173
|
+
expect(output).toContain("Messages:");
|
|
174
|
+
expect(output).toContain("- common.archived");
|
|
175
|
+
expect(output).toContain("- common.draft");
|
|
176
|
+
expect(output).toContain("- common.plain");
|
|
177
|
+
expect(output).toContain("- common.welcome");
|
|
178
|
+
expect(output).toContain("Found 4 messages.");
|
|
179
|
+
logSpy.mockRestore();
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it("returns full entities in JSON output and supports message filters", async function () {
|
|
183
|
+
const root = await createProject();
|
|
184
|
+
const { datasource } = getDatasource(root);
|
|
185
|
+
const logSpy = jest.spyOn(console, "log").mockImplementation(() => {});
|
|
186
|
+
|
|
187
|
+
await listPlugin.handler({
|
|
188
|
+
datasource,
|
|
189
|
+
parsed: {
|
|
190
|
+
messages: true,
|
|
191
|
+
json: true,
|
|
192
|
+
pretty: true,
|
|
193
|
+
withOverrides: true,
|
|
194
|
+
withMeta: true,
|
|
195
|
+
deprecated: "true",
|
|
196
|
+
locale: "en-US",
|
|
197
|
+
promotable: "false",
|
|
198
|
+
withTests: true,
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
const result = JSON.parse(logSpy.mock.calls[0][0]);
|
|
203
|
+
expect(result).toHaveLength(1);
|
|
204
|
+
expect(result[0].key).toEqual("common.welcome");
|
|
205
|
+
expect(result[0].meta).toEqual({ screen: "home" });
|
|
206
|
+
expect(result[0].deprecated).toEqual(true);
|
|
207
|
+
logSpy.mockRestore();
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it("supports locale, segment, attribute, and target filters", async function () {
|
|
211
|
+
const root = await createProject();
|
|
212
|
+
const { datasource } = getDatasource(root);
|
|
213
|
+
const logSpy = jest.spyOn(console, "log").mockImplementation(() => {});
|
|
214
|
+
|
|
215
|
+
await listPlugin.handler({
|
|
216
|
+
datasource,
|
|
217
|
+
parsed: {
|
|
218
|
+
locales: true,
|
|
219
|
+
json: true,
|
|
220
|
+
inheritFormatsFrom: "en",
|
|
221
|
+
inheritTranslationsFrom: "en",
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
let result = JSON.parse(logSpy.mock.calls[0][0]);
|
|
225
|
+
expect(result.map((item: any) => item.key)).toEqual(["en-US"]);
|
|
226
|
+
|
|
227
|
+
logSpy.mockClear();
|
|
228
|
+
await listPlugin.handler({
|
|
229
|
+
datasource,
|
|
230
|
+
parsed: {
|
|
231
|
+
segments: true,
|
|
232
|
+
json: true,
|
|
233
|
+
archived: "false",
|
|
234
|
+
withTests: true,
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
result = JSON.parse(logSpy.mock.calls[0][0]);
|
|
238
|
+
expect(result.map((item: any) => item.key)).toEqual(["pro"]);
|
|
239
|
+
|
|
240
|
+
logSpy.mockClear();
|
|
241
|
+
await listPlugin.handler({
|
|
242
|
+
datasource,
|
|
243
|
+
parsed: {
|
|
244
|
+
attributes: true,
|
|
245
|
+
json: true,
|
|
246
|
+
type: "date",
|
|
247
|
+
archived: "true",
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
result = JSON.parse(logSpy.mock.calls[0][0]);
|
|
251
|
+
expect(result.map((item: any) => item.key)).toEqual(["birthDate"]);
|
|
252
|
+
|
|
253
|
+
logSpy.mockClear();
|
|
254
|
+
await listPlugin.handler({
|
|
255
|
+
datasource,
|
|
256
|
+
parsed: {
|
|
257
|
+
targets: true,
|
|
258
|
+
json: true,
|
|
259
|
+
locale: "en-US",
|
|
260
|
+
withContext: true,
|
|
261
|
+
withFormats: true,
|
|
262
|
+
withTests: true,
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
result = JSON.parse(logSpy.mock.calls[0][0]);
|
|
266
|
+
expect(result.map((item: any) => item.key)).toEqual(["web"]);
|
|
267
|
+
|
|
268
|
+
logSpy.mockRestore();
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
it("supports shared regex filters and without-tests", async function () {
|
|
272
|
+
const root = await createProject();
|
|
273
|
+
const { datasource } = getDatasource(root);
|
|
274
|
+
const logSpy = jest.spyOn(console, "log").mockImplementation(() => {});
|
|
275
|
+
|
|
276
|
+
await listPlugin.handler({
|
|
277
|
+
datasource,
|
|
278
|
+
parsed: {
|
|
279
|
+
messages: true,
|
|
280
|
+
json: true,
|
|
281
|
+
keyPattern: "plain|welcome",
|
|
282
|
+
description: "plain",
|
|
283
|
+
withoutTests: true,
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
const result = JSON.parse(logSpy.mock.calls[0][0]);
|
|
288
|
+
expect(result.map((item: any) => item.key)).toEqual(["common.plain"]);
|
|
289
|
+
logSpy.mockRestore();
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it("filters messages further by target includeMessages and excludeMessages patterns", async function () {
|
|
293
|
+
const root = await createProject();
|
|
294
|
+
const { datasource } = getDatasource(root);
|
|
295
|
+
const logSpy = jest.spyOn(console, "log").mockImplementation(() => {});
|
|
296
|
+
|
|
297
|
+
await listPlugin.handler({
|
|
298
|
+
datasource,
|
|
299
|
+
parsed: {
|
|
300
|
+
messages: true,
|
|
301
|
+
json: true,
|
|
302
|
+
target: "web",
|
|
303
|
+
},
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
const result = JSON.parse(logSpy.mock.calls[0][0]);
|
|
307
|
+
expect(result.map((item: any) => item.key)).toEqual([
|
|
308
|
+
"common.archived",
|
|
309
|
+
"common.draft",
|
|
310
|
+
"common.plain",
|
|
311
|
+
"common.welcome",
|
|
312
|
+
]);
|
|
313
|
+
logSpy.mockClear();
|
|
314
|
+
|
|
315
|
+
await listPlugin.handler({
|
|
316
|
+
datasource,
|
|
317
|
+
parsed: {
|
|
318
|
+
messages: true,
|
|
319
|
+
json: true,
|
|
320
|
+
target: "admin",
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
expect(JSON.parse(logSpy.mock.calls[0][0])).toEqual([]);
|
|
325
|
+
logSpy.mockRestore();
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
it("errors when selectors are missing or conflicting", async function () {
|
|
329
|
+
const root = await createProject();
|
|
330
|
+
const { datasource } = getDatasource(root);
|
|
331
|
+
const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {});
|
|
332
|
+
|
|
333
|
+
try {
|
|
334
|
+
await expect(listPlugin.handler({ datasource, parsed: {} })).resolves.toEqual(false);
|
|
335
|
+
expect(errorSpy).toHaveBeenCalledWith(
|
|
336
|
+
"Nothing to list. Pass exactly one of --messages, --locales, --segments, --attributes, --targets, or --tests.",
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
errorSpy.mockClear();
|
|
340
|
+
|
|
341
|
+
await expect(
|
|
342
|
+
listPlugin.handler({
|
|
343
|
+
datasource,
|
|
344
|
+
parsed: {
|
|
345
|
+
messages: true,
|
|
346
|
+
locales: true,
|
|
347
|
+
},
|
|
348
|
+
}),
|
|
349
|
+
).resolves.toEqual(false);
|
|
350
|
+
expect(errorSpy).toHaveBeenCalledWith(
|
|
351
|
+
"Pass exactly one of --messages, --locales, --segments, --attributes, --targets, or --tests.",
|
|
352
|
+
);
|
|
353
|
+
} finally {
|
|
354
|
+
errorSpy.mockRestore();
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
it("errors when attributes are filtered by tests", async function () {
|
|
359
|
+
const root = await createProject();
|
|
360
|
+
const { datasource } = getDatasource(root);
|
|
361
|
+
const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {});
|
|
362
|
+
|
|
363
|
+
try {
|
|
364
|
+
await expect(
|
|
365
|
+
listPlugin.handler({
|
|
366
|
+
datasource,
|
|
367
|
+
parsed: {
|
|
368
|
+
attributes: true,
|
|
369
|
+
withTests: true,
|
|
370
|
+
},
|
|
371
|
+
}),
|
|
372
|
+
).resolves.toEqual(false);
|
|
373
|
+
expect(errorSpy).toHaveBeenCalledWith(
|
|
374
|
+
"--with-tests and --without-tests are not supported for attributes.",
|
|
375
|
+
);
|
|
376
|
+
} finally {
|
|
377
|
+
errorSpy.mockRestore();
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
it("groups plain output by set and requires a set for JSON in sets projects", async function () {
|
|
382
|
+
const root = await createSetsProject();
|
|
383
|
+
const { datasource } = getDatasource(root);
|
|
384
|
+
const logSpy = jest.spyOn(console, "log").mockImplementation(() => {});
|
|
385
|
+
|
|
386
|
+
await listPlugin.handler({
|
|
387
|
+
datasource,
|
|
388
|
+
parsed: {
|
|
389
|
+
messages: true,
|
|
390
|
+
},
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
const output = logSpy.mock.calls.map((call) => call[0]).join("\n");
|
|
394
|
+
expect(output).toContain('Set "dev":');
|
|
395
|
+
expect(output).toContain('Set "production":');
|
|
396
|
+
expect(output).toContain("- common.welcome");
|
|
397
|
+
|
|
398
|
+
logSpy.mockClear();
|
|
399
|
+
const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {});
|
|
400
|
+
|
|
401
|
+
try {
|
|
402
|
+
await expect(
|
|
403
|
+
listPlugin.handler({
|
|
404
|
+
datasource,
|
|
405
|
+
parsed: {
|
|
406
|
+
messages: true,
|
|
407
|
+
json: true,
|
|
408
|
+
},
|
|
409
|
+
}),
|
|
410
|
+
).resolves.toEqual(false);
|
|
411
|
+
expect(errorSpy).toHaveBeenCalledWith(
|
|
412
|
+
"Pass --set=<set> when using --json in a project with sets enabled.",
|
|
413
|
+
);
|
|
414
|
+
} finally {
|
|
415
|
+
errorSpy.mockRestore();
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
await listPlugin.handler({
|
|
419
|
+
datasource,
|
|
420
|
+
parsed: {
|
|
421
|
+
messages: true,
|
|
422
|
+
json: true,
|
|
423
|
+
set: "dev",
|
|
424
|
+
},
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
const result = JSON.parse(logSpy.mock.calls[0][0]);
|
|
428
|
+
expect(result.map((item: any) => item.key)).toEqual(["common.welcome"]);
|
|
429
|
+
logSpy.mockRestore();
|
|
430
|
+
});
|
|
431
|
+
});
|