@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,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.evaluatePlugin = void 0;
|
|
40
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
41
|
+
var sdk_1 = require("@messagevisor/sdk");
|
|
42
|
+
var builder_1 = require("../builder");
|
|
43
|
+
var error_1 = require("../error");
|
|
44
|
+
var sets_1 = require("../sets");
|
|
45
|
+
var index_1 = require("./index");
|
|
46
|
+
function readAllSegments(datasource) {
|
|
47
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
48
|
+
var segmentKeys, entries;
|
|
49
|
+
var _this = this;
|
|
50
|
+
return __generator(this, function (_a) {
|
|
51
|
+
switch (_a.label) {
|
|
52
|
+
case 0: return [4 /*yield*/, datasource.listSegments()];
|
|
53
|
+
case 1:
|
|
54
|
+
segmentKeys = _a.sent();
|
|
55
|
+
return [4 /*yield*/, Promise.all(segmentKeys.map(function (segmentKey) { return __awaiter(_this, void 0, void 0, function () {
|
|
56
|
+
var segment;
|
|
57
|
+
return __generator(this, function (_a) {
|
|
58
|
+
switch (_a.label) {
|
|
59
|
+
case 0: return [4 /*yield*/, datasource.readSegment(segmentKey)];
|
|
60
|
+
case 1:
|
|
61
|
+
segment = (_a.sent());
|
|
62
|
+
return [2 /*return*/, [segmentKey, segment]];
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}); }))];
|
|
66
|
+
case 2:
|
|
67
|
+
entries = _a.sent();
|
|
68
|
+
return [2 /*return*/, Object.fromEntries(entries)];
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function parseJsonOption(optionName, value) {
|
|
74
|
+
try {
|
|
75
|
+
return JSON.parse(value);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
throw new error_1.MessagevisorCLIError("Invalid ".concat(optionName, ": expected valid JSON"));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.evaluatePlugin = {
|
|
82
|
+
command: "evaluate",
|
|
83
|
+
handler: function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
|
|
84
|
+
var execution, target, context, values, segments, matched, result, locale, revision, datafile, messagevisor, translation, result, translation, result, error_2;
|
|
85
|
+
var projectConfig = _b.projectConfig, datasource = _b.datasource, parsed = _b.parsed;
|
|
86
|
+
return __generator(this, function (_c) {
|
|
87
|
+
switch (_c.label) {
|
|
88
|
+
case 0:
|
|
89
|
+
_c.trys.push([0, 7, , 8]);
|
|
90
|
+
if (projectConfig.sets && !parsed.set) {
|
|
91
|
+
throw new error_1.MessagevisorCLIError("Pass --set=<set>");
|
|
92
|
+
}
|
|
93
|
+
if (!projectConfig.sets) return [3 /*break*/, 2];
|
|
94
|
+
return [4 /*yield*/, (0, sets_1.getProjectSetExecutions)(projectConfig, datasource, parsed.set)];
|
|
95
|
+
case 1:
|
|
96
|
+
execution = (_c.sent())[0];
|
|
97
|
+
projectConfig = execution.projectConfig;
|
|
98
|
+
datasource = execution.datasource;
|
|
99
|
+
_c.label = 2;
|
|
100
|
+
case 2:
|
|
101
|
+
target = parsed.target;
|
|
102
|
+
context = parsed.context ? parseJsonOption("--context", parsed.context) : {};
|
|
103
|
+
values = parsed.values ? parseJsonOption("--values", parsed.values) : undefined;
|
|
104
|
+
if (parsed.message && parsed.rawMessage) {
|
|
105
|
+
throw new error_1.MessagevisorCLIError("Pass either --message=<key> or --rawMessage=<message>, not both");
|
|
106
|
+
}
|
|
107
|
+
if (!parsed.segment) return [3 /*break*/, 4];
|
|
108
|
+
return [4 /*yield*/, readAllSegments(datasource)];
|
|
109
|
+
case 3:
|
|
110
|
+
segments = _c.sent();
|
|
111
|
+
matched = (0, index_1.evaluateSegment)(parsed.segment, {
|
|
112
|
+
segments: segments,
|
|
113
|
+
context: context,
|
|
114
|
+
});
|
|
115
|
+
result = { segment: parsed.segment, matched: matched };
|
|
116
|
+
console.log(parsed.json
|
|
117
|
+
? JSON.stringify(result, null, parsed.pretty ? 2 : 0)
|
|
118
|
+
: "Segment \"".concat(parsed.segment, "\" matched: ").concat(matched));
|
|
119
|
+
return [2 /*return*/];
|
|
120
|
+
case 4:
|
|
121
|
+
if (!parsed.locale) {
|
|
122
|
+
throw new error_1.MessagevisorCLIError("Pass --locale=<locale>");
|
|
123
|
+
}
|
|
124
|
+
locale = parsed.locale;
|
|
125
|
+
return [4 /*yield*/, datasource.readRevision()];
|
|
126
|
+
case 5:
|
|
127
|
+
revision = _c.sent();
|
|
128
|
+
return [4 /*yield*/, (0, builder_1.buildDatafile)(projectConfig, datasource, target, locale, revision)];
|
|
129
|
+
case 6:
|
|
130
|
+
datafile = _c.sent();
|
|
131
|
+
messagevisor = (0, sdk_1.createMessagevisor)({
|
|
132
|
+
datafile: datafile,
|
|
133
|
+
context: context,
|
|
134
|
+
modules: projectConfig.modules || [],
|
|
135
|
+
logLevel: "warn",
|
|
136
|
+
});
|
|
137
|
+
if (parsed.message) {
|
|
138
|
+
translation = messagevisor.translate(parsed.message, values, { context: context });
|
|
139
|
+
result = { message: parsed.message, translation: translation };
|
|
140
|
+
console.log(parsed.json ? JSON.stringify(result, null, parsed.pretty ? 2 : 0) : translation);
|
|
141
|
+
return [2 /*return*/];
|
|
142
|
+
}
|
|
143
|
+
if (parsed.rawMessage) {
|
|
144
|
+
translation = messagevisor.formatMessage(parsed.rawMessage, values);
|
|
145
|
+
result = { rawMessage: parsed.rawMessage, translation: translation };
|
|
146
|
+
console.log(parsed.json ? JSON.stringify(result, null, parsed.pretty ? 2 : 0) : translation);
|
|
147
|
+
return [2 /*return*/];
|
|
148
|
+
}
|
|
149
|
+
throw new error_1.MessagevisorCLIError("Pass --message=<key>, --rawMessage=<message>, or --segment=<key>");
|
|
150
|
+
case 7:
|
|
151
|
+
error_2 = _c.sent();
|
|
152
|
+
if ((0, error_1.printMessagevisorCLIError)(error_2)) {
|
|
153
|
+
return [2 /*return*/, false];
|
|
154
|
+
}
|
|
155
|
+
throw error_2;
|
|
156
|
+
case 8: return [2 /*return*/];
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}); },
|
|
160
|
+
examples: [
|
|
161
|
+
{
|
|
162
|
+
command: "evaluate --message=auth.signin --locale=en-US",
|
|
163
|
+
description: "evaluate a message translation",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
command: 'evaluate --message=dashboard.welcome --locale=en-US --values=\'{"name":"Ada"}\'',
|
|
167
|
+
description: "evaluate a message translation with JSON values",
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
command: 'evaluate --rawMessage="Hello {name}" --locale=en-US --values=\'{"name":"Ada"}\'',
|
|
171
|
+
description: "evaluate a raw message string with JSON values",
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
command: 'evaluate --segment=platform-web --context=\'{"platform":"web"}\'',
|
|
175
|
+
description: "evaluate a segment",
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
};
|
|
179
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/evaluate/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Condition, Context, GroupSegment, Segment } from "@messagevisor/types";
|
|
2
|
+
export interface EvaluateConditionOptions {
|
|
3
|
+
context?: Context;
|
|
4
|
+
segments?: Record<string, Segment>;
|
|
5
|
+
resolveFlag?: (featureKey: string, context?: Context) => boolean;
|
|
6
|
+
resolveVariation?: (experimentKey: string, context?: Context) => string;
|
|
7
|
+
}
|
|
8
|
+
export declare function evaluateCondition(condition: Condition | Condition[] | "*" | undefined, options?: EvaluateConditionOptions): boolean;
|
|
9
|
+
export declare function evaluateGroupSegment(groupSegment: GroupSegment | GroupSegment[] | "*" | undefined, options?: EvaluateConditionOptions): boolean;
|
|
10
|
+
export declare function evaluateSegment(segmentKey: string, options?: EvaluateConditionOptions): boolean;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.evaluateCondition = evaluateCondition;
|
|
4
|
+
exports.evaluateGroupSegment = evaluateGroupSegment;
|
|
5
|
+
exports.evaluateSegment = evaluateSegment;
|
|
6
|
+
function getContextValue(context, attribute) {
|
|
7
|
+
if (!context) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
return attribute
|
|
11
|
+
.split(".")
|
|
12
|
+
.reduce(function (value, part) { return (value ? value[part] : undefined); }, context);
|
|
13
|
+
}
|
|
14
|
+
function compareDate(value, expected, operator) {
|
|
15
|
+
var valueTime = new Date(value).getTime();
|
|
16
|
+
var expectedTime = new Date(expected).getTime();
|
|
17
|
+
if (Number.isNaN(valueTime) || Number.isNaN(expectedTime)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return operator === "before" ? valueTime < expectedTime : valueTime > expectedTime;
|
|
21
|
+
}
|
|
22
|
+
function evaluateCondition(condition, options) {
|
|
23
|
+
if (options === void 0) { options = {}; }
|
|
24
|
+
if (!condition || condition === "*") {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(condition)) {
|
|
28
|
+
return condition.every(function (item) { return evaluateCondition(item, options); });
|
|
29
|
+
}
|
|
30
|
+
if (typeof condition === "string") {
|
|
31
|
+
return evaluateSegment(condition, options);
|
|
32
|
+
}
|
|
33
|
+
if ("and" in condition) {
|
|
34
|
+
return condition.and.every(function (item) { return evaluateCondition(item, options); });
|
|
35
|
+
}
|
|
36
|
+
if ("or" in condition) {
|
|
37
|
+
return condition.or.some(function (item) { return evaluateCondition(item, options); });
|
|
38
|
+
}
|
|
39
|
+
if ("not" in condition) {
|
|
40
|
+
return !condition.not.every(function (item) { return evaluateCondition(item, options); });
|
|
41
|
+
}
|
|
42
|
+
if ("feature" in condition) {
|
|
43
|
+
var enabled = options.resolveFlag
|
|
44
|
+
? options.resolveFlag(condition.feature, options.context)
|
|
45
|
+
: false;
|
|
46
|
+
return condition.operator === "isEnabled"
|
|
47
|
+
? enabled
|
|
48
|
+
: condition.operator === "isDisabled"
|
|
49
|
+
? !enabled
|
|
50
|
+
: false;
|
|
51
|
+
}
|
|
52
|
+
if ("experiment" in condition) {
|
|
53
|
+
var variation = options.resolveVariation
|
|
54
|
+
? options.resolveVariation(condition.experiment, options.context)
|
|
55
|
+
: undefined;
|
|
56
|
+
return condition.operator === "hasVariation" ? variation === condition.value : false;
|
|
57
|
+
}
|
|
58
|
+
var value = getContextValue(options.context, condition.attribute);
|
|
59
|
+
var expected = condition.value;
|
|
60
|
+
switch (condition.operator) {
|
|
61
|
+
case "equals":
|
|
62
|
+
return value === expected;
|
|
63
|
+
case "notEquals":
|
|
64
|
+
return value !== expected;
|
|
65
|
+
case "exists":
|
|
66
|
+
return value !== undefined && value !== null;
|
|
67
|
+
case "notExists":
|
|
68
|
+
return value === undefined || value === null;
|
|
69
|
+
case "greaterThan":
|
|
70
|
+
return Number(value) > Number(expected);
|
|
71
|
+
case "greaterThanOrEquals":
|
|
72
|
+
return Number(value) >= Number(expected);
|
|
73
|
+
case "lessThan":
|
|
74
|
+
return Number(value) < Number(expected);
|
|
75
|
+
case "lessThanOrEquals":
|
|
76
|
+
return Number(value) <= Number(expected);
|
|
77
|
+
case "contains":
|
|
78
|
+
return String(value).includes(String(expected));
|
|
79
|
+
case "notContains":
|
|
80
|
+
return !String(value).includes(String(expected));
|
|
81
|
+
case "startsWith":
|
|
82
|
+
return String(value).startsWith(String(expected));
|
|
83
|
+
case "endsWith":
|
|
84
|
+
return String(value).endsWith(String(expected));
|
|
85
|
+
case "before":
|
|
86
|
+
return compareDate(value, expected, "before");
|
|
87
|
+
case "after":
|
|
88
|
+
return compareDate(value, expected, "after");
|
|
89
|
+
case "includes":
|
|
90
|
+
return Array.isArray(value) && value.includes(expected);
|
|
91
|
+
case "notIncludes":
|
|
92
|
+
return !Array.isArray(value) || !value.includes(expected);
|
|
93
|
+
case "in":
|
|
94
|
+
return Array.isArray(expected) && expected.includes(value);
|
|
95
|
+
case "notIn":
|
|
96
|
+
return !Array.isArray(expected) || !expected.includes(value);
|
|
97
|
+
default:
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function evaluateGroupSegment(groupSegment, options) {
|
|
102
|
+
if (options === void 0) { options = {}; }
|
|
103
|
+
if (!groupSegment || groupSegment === "*") {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
if (Array.isArray(groupSegment)) {
|
|
107
|
+
return groupSegment.every(function (item) { return evaluateGroupSegment(item, options); });
|
|
108
|
+
}
|
|
109
|
+
if (typeof groupSegment === "string") {
|
|
110
|
+
return evaluateSegment(groupSegment, options);
|
|
111
|
+
}
|
|
112
|
+
if ("and" in groupSegment) {
|
|
113
|
+
return groupSegment.and.every(function (item) { return evaluateGroupSegment(item, options); });
|
|
114
|
+
}
|
|
115
|
+
if ("or" in groupSegment) {
|
|
116
|
+
return groupSegment.or.some(function (item) { return evaluateGroupSegment(item, options); });
|
|
117
|
+
}
|
|
118
|
+
if ("not" in groupSegment) {
|
|
119
|
+
return !groupSegment.not.every(function (item) { return evaluateGroupSegment(item, options); });
|
|
120
|
+
}
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
function evaluateSegment(segmentKey, options) {
|
|
124
|
+
if (options === void 0) { options = {}; }
|
|
125
|
+
var segment = options.segments ? options.segments[segmentKey] : undefined;
|
|
126
|
+
if (!segment || segment.archived) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
return evaluateCondition(segment.conditions, options);
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/evaluate/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coerce ISO 8601-like strings in example `values` to `Date` for CLI evaluation (ICU date/time formatters).
|
|
3
|
+
*
|
|
4
|
+
* Accepted shapes (non-exhaustive; `Date.parse` must still succeed):
|
|
5
|
+
* - Calendar: `YYYY-MM-DD`
|
|
6
|
+
* - Datetime: `T` or space between date and time; `t` / `z` case-insensitive where applicable
|
|
7
|
+
* - Time: `HH:MM` or `HH:MM:SS`, optional fractional seconds (`.` or `,`), optional `Z` or numeric offset (`±HH`, `±HH:MM`, `±HHMM`)
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Returns a shallow copy with coerced values (nested plain objects and arrays are walked).
|
|
11
|
+
*/
|
|
12
|
+
export declare function coerceExampleValuesIsoDates(values: Record<string, unknown> | undefined): Record<string, unknown> | undefined;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Coerce ISO 8601-like strings in example `values` to `Date` for CLI evaluation (ICU date/time formatters).
|
|
4
|
+
*
|
|
5
|
+
* Accepted shapes (non-exhaustive; `Date.parse` must still succeed):
|
|
6
|
+
* - Calendar: `YYYY-MM-DD`
|
|
7
|
+
* - Datetime: `T` or space between date and time; `t` / `z` case-insensitive where applicable
|
|
8
|
+
* - Time: `HH:MM` or `HH:MM:SS`, optional fractional seconds (`.` or `,`), optional `Z` or numeric offset (`±HH`, `±HH:MM`, `±HHMM`)
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.coerceExampleValuesIsoDates = coerceExampleValuesIsoDates;
|
|
12
|
+
var ISO_8601_LIKE = /^\d{4}-\d{2}-\d{2}(?:[Tt ]\d{2}:\d{2}(?::\d{2})?(?:[.,]\d{1,9})?(?:[Zz]|[+-]\d{2}(?::?\d{2})?)?)?$/;
|
|
13
|
+
function isIso8601TimestampString(value) {
|
|
14
|
+
var trimmed = value.trim();
|
|
15
|
+
if (!ISO_8601_LIKE.test(trimmed)) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return !Number.isNaN(Date.parse(coerceParseableIsoLike(trimmed)));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Normalize a few ISO variants so `Date.parse` behaves consistently (comma decimals, lowercase z).
|
|
22
|
+
*/
|
|
23
|
+
function normalizeIsoLikeForParse(value) {
|
|
24
|
+
var s = value.trim();
|
|
25
|
+
if (s.includes(",") && /\d{2}:\d{2}(?::\d{2})?,/.test(s)) {
|
|
26
|
+
s = s.replace(",", ".");
|
|
27
|
+
}
|
|
28
|
+
return s;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* If `Date.parse` rejects a valid-looking ISO string, apply small normalizations (hour-only offset).
|
|
32
|
+
*/
|
|
33
|
+
function coerceParseableIsoLike(trimmed) {
|
|
34
|
+
var commaNormalized = normalizeIsoLikeForParse(trimmed);
|
|
35
|
+
if (!Number.isNaN(Date.parse(commaNormalized))) {
|
|
36
|
+
return commaNormalized;
|
|
37
|
+
}
|
|
38
|
+
var s = commaNormalized;
|
|
39
|
+
if (/[+-]\d{2}:\d{2}$/.test(s) || /[+-]\d{4}$/.test(s)) {
|
|
40
|
+
return s;
|
|
41
|
+
}
|
|
42
|
+
var hourOnlyOffset = s.match(/^(.+)([+-]\d{2})$/);
|
|
43
|
+
if (hourOnlyOffset) {
|
|
44
|
+
var withMinutes = "".concat(hourOnlyOffset[1]).concat(hourOnlyOffset[2], ":00");
|
|
45
|
+
if (!Number.isNaN(Date.parse(withMinutes))) {
|
|
46
|
+
return withMinutes;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return s;
|
|
50
|
+
}
|
|
51
|
+
function isPlainObject(value) {
|
|
52
|
+
return (typeof value === "object" && value !== null && !Array.isArray(value) && !(value instanceof Date));
|
|
53
|
+
}
|
|
54
|
+
function coerceLeaf(value) {
|
|
55
|
+
if (typeof value === "string" && isIso8601TimestampString(value)) {
|
|
56
|
+
var trimmed = value.trim();
|
|
57
|
+
return new Date(Date.parse(coerceParseableIsoLike(trimmed)));
|
|
58
|
+
}
|
|
59
|
+
if (isPlainObject(value)) {
|
|
60
|
+
return coerceExampleValuesIsoDates(value);
|
|
61
|
+
}
|
|
62
|
+
if (Array.isArray(value)) {
|
|
63
|
+
return value.map(function (entry) { return coerceLeaf(entry); });
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Returns a shallow copy with coerced values (nested plain objects and arrays are walked).
|
|
69
|
+
*/
|
|
70
|
+
function coerceExampleValuesIsoDates(values) {
|
|
71
|
+
if (typeof values === "undefined") {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
var result = {};
|
|
75
|
+
for (var _i = 0, _a = Object.keys(values); _i < _a.length; _i++) {
|
|
76
|
+
var key = _a[_i];
|
|
77
|
+
result[key] = coerceLeaf(values[key]);
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=coerceExampleIsoDates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coerceExampleIsoDates.js","sourceRoot":"","sources":["../../src/examples/coerceExampleIsoDates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { DatafileContent, FormatPresets } from "@messagevisor/types";
|
|
2
|
+
import type { Plugin } from "../cli";
|
|
3
|
+
import type { ProjectConfig } from "../config";
|
|
4
|
+
import type { Datasource } from "../datasource";
|
|
5
|
+
export interface ResolvedLocaleExample {
|
|
6
|
+
set?: string;
|
|
7
|
+
locale: string;
|
|
8
|
+
sourceLocale: string;
|
|
9
|
+
exampleIndex: number;
|
|
10
|
+
matrixIndex?: number;
|
|
11
|
+
description?: string;
|
|
12
|
+
rawMessage?: string;
|
|
13
|
+
message?: string;
|
|
14
|
+
values?: Record<string, unknown>;
|
|
15
|
+
context?: Record<string, unknown>;
|
|
16
|
+
formats?: FormatPresets;
|
|
17
|
+
currency?: string;
|
|
18
|
+
timeZone?: string;
|
|
19
|
+
evaluatedTranslation: unknown;
|
|
20
|
+
evaluationInput?: ExampleEvaluationInput;
|
|
21
|
+
}
|
|
22
|
+
export interface ResolvedMessageExample {
|
|
23
|
+
set?: string;
|
|
24
|
+
message: string;
|
|
25
|
+
locale: string;
|
|
26
|
+
exampleIndex: number;
|
|
27
|
+
matrixIndex?: number;
|
|
28
|
+
description?: string;
|
|
29
|
+
values?: Record<string, unknown>;
|
|
30
|
+
context?: Record<string, unknown>;
|
|
31
|
+
formats?: FormatPresets;
|
|
32
|
+
currency?: string;
|
|
33
|
+
timeZone?: string;
|
|
34
|
+
evaluatedTranslation: unknown;
|
|
35
|
+
evaluationInput?: ExampleEvaluationInput;
|
|
36
|
+
}
|
|
37
|
+
export interface ExampleEvaluationInput {
|
|
38
|
+
datafile?: DatafileContent;
|
|
39
|
+
defaultFormats?: Record<string, FormatPresets>;
|
|
40
|
+
formats?: FormatPresets;
|
|
41
|
+
context?: Record<string, unknown>;
|
|
42
|
+
values?: Record<string, unknown>;
|
|
43
|
+
currency?: string;
|
|
44
|
+
timeZone?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface ExamplesOutput {
|
|
47
|
+
locales: ResolvedLocaleExample[];
|
|
48
|
+
messages: ResolvedMessageExample[];
|
|
49
|
+
}
|
|
50
|
+
export interface ResolveExamplesOptions {
|
|
51
|
+
set?: string;
|
|
52
|
+
locale?: string;
|
|
53
|
+
message?: string;
|
|
54
|
+
exampleIndex?: number | string;
|
|
55
|
+
matrixIndex?: number | string;
|
|
56
|
+
descriptionPattern?: string | RegExp;
|
|
57
|
+
translationPattern?: string | RegExp;
|
|
58
|
+
onlyMessages?: boolean;
|
|
59
|
+
onlyLocales?: boolean;
|
|
60
|
+
includeEvaluationInput?: boolean;
|
|
61
|
+
}
|
|
62
|
+
export declare function resolveExamples(projectConfig: ProjectConfig, datasource: Datasource, options?: ResolveExamplesOptions): Promise<ExamplesOutput>;
|
|
63
|
+
export declare const examplesPlugin: Plugin;
|