@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.
Files changed (211) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +21 -0
  3. package/README.md +7 -0
  4. package/jest.config.js +8 -0
  5. package/lib/benchmark/index.d.ts +2 -0
  6. package/lib/benchmark/index.js +417 -0
  7. package/lib/benchmark/index.js.map +1 -0
  8. package/lib/builder/index.d.ts +70 -0
  9. package/lib/builder/index.js +831 -0
  10. package/lib/builder/index.js.map +1 -0
  11. package/lib/cli/index.d.ts +28 -0
  12. package/lib/cli/index.js +182 -0
  13. package/lib/cli/index.js.map +1 -0
  14. package/lib/config/index.d.ts +61 -0
  15. package/lib/config/index.js +255 -0
  16. package/lib/config/index.js.map +1 -0
  17. package/lib/create/index.d.ts +2 -0
  18. package/lib/create/index.js +405 -0
  19. package/lib/create/index.js.map +1 -0
  20. package/lib/datasource/filesystemAdapter.d.ts +44 -0
  21. package/lib/datasource/filesystemAdapter.js +424 -0
  22. package/lib/datasource/filesystemAdapter.js.map +1 -0
  23. package/lib/datasource/index.d.ts +39 -0
  24. package/lib/datasource/index.js +96 -0
  25. package/lib/datasource/index.js.map +1 -0
  26. package/lib/error.d.ts +6 -0
  27. package/lib/error.js +49 -0
  28. package/lib/error.js.map +1 -0
  29. package/lib/evaluate/cli.d.ts +8 -0
  30. package/lib/evaluate/cli.js +179 -0
  31. package/lib/evaluate/cli.js.map +1 -0
  32. package/lib/evaluate/index.d.ts +10 -0
  33. package/lib/evaluate/index.js +131 -0
  34. package/lib/evaluate/index.js.map +1 -0
  35. package/lib/examples/coerceExampleIsoDates.d.ts +12 -0
  36. package/lib/examples/coerceExampleIsoDates.js +81 -0
  37. package/lib/examples/coerceExampleIsoDates.js.map +1 -0
  38. package/lib/examples/index.d.ts +63 -0
  39. package/lib/examples/index.js +713 -0
  40. package/lib/examples/index.js.map +1 -0
  41. package/lib/exporter/index.d.ts +60 -0
  42. package/lib/exporter/index.js +610 -0
  43. package/lib/exporter/index.js.map +1 -0
  44. package/lib/find-duplicates/index.d.ts +41 -0
  45. package/lib/find-duplicates/index.js +297 -0
  46. package/lib/find-duplicates/index.js.map +1 -0
  47. package/lib/generate-code/index.d.ts +11 -0
  48. package/lib/generate-code/index.js +157 -0
  49. package/lib/generate-code/index.js.map +1 -0
  50. package/lib/generate-code/typescript.d.ts +14 -0
  51. package/lib/generate-code/typescript.js +307 -0
  52. package/lib/generate-code/typescript.js.map +1 -0
  53. package/lib/importer/index.d.ts +64 -0
  54. package/lib/importer/index.js +1092 -0
  55. package/lib/importer/index.js.map +1 -0
  56. package/lib/index.d.ts +18 -0
  57. package/lib/index.js +35 -0
  58. package/lib/index.js.map +1 -0
  59. package/lib/info/index.d.ts +17 -0
  60. package/lib/info/index.js +132 -0
  61. package/lib/info/index.js.map +1 -0
  62. package/lib/init/index.d.ts +30 -0
  63. package/lib/init/index.js +348 -0
  64. package/lib/init/index.js.map +1 -0
  65. package/lib/lint/index.d.ts +1 -0
  66. package/lib/lint/index.js +6 -0
  67. package/lib/lint/index.js.map +1 -0
  68. package/lib/linter/attributeSchema.d.ts +7 -0
  69. package/lib/linter/attributeSchema.js +36 -0
  70. package/lib/linter/attributeSchema.js.map +1 -0
  71. package/lib/linter/checkLocaleCircularDependency.d.ts +7 -0
  72. package/lib/linter/checkLocaleCircularDependency.js +42 -0
  73. package/lib/linter/checkLocaleCircularDependency.js.map +1 -0
  74. package/lib/linter/conditionSchema.d.ts +3 -0
  75. package/lib/linter/conditionSchema.js +283 -0
  76. package/lib/linter/conditionSchema.js.map +1 -0
  77. package/lib/linter/formatSchema.d.ts +325 -0
  78. package/lib/linter/formatSchema.js +165 -0
  79. package/lib/linter/formatSchema.js.map +1 -0
  80. package/lib/linter/icuStyleLint.d.ts +6 -0
  81. package/lib/linter/icuStyleLint.js +226 -0
  82. package/lib/linter/icuStyleLint.js.map +1 -0
  83. package/lib/linter/index.d.ts +34 -0
  84. package/lib/linter/index.js +557 -0
  85. package/lib/linter/index.js.map +1 -0
  86. package/lib/linter/localeSchema.d.ts +672 -0
  87. package/lib/linter/localeSchema.js +50 -0
  88. package/lib/linter/localeSchema.js.map +1 -0
  89. package/lib/linter/messageSchema.d.ts +35 -0
  90. package/lib/linter/messageSchema.js +115 -0
  91. package/lib/linter/messageSchema.js.map +1 -0
  92. package/lib/linter/printError.d.ts +8 -0
  93. package/lib/linter/printError.js +41 -0
  94. package/lib/linter/printError.js.map +1 -0
  95. package/lib/linter/schema.d.ts +33 -0
  96. package/lib/linter/schema.js +192 -0
  97. package/lib/linter/schema.js.map +1 -0
  98. package/lib/linter/segmentSchema.d.ts +8 -0
  99. package/lib/linter/segmentSchema.js +18 -0
  100. package/lib/linter/segmentSchema.js.map +1 -0
  101. package/lib/linter/targetSchema.d.ts +337 -0
  102. package/lib/linter/targetSchema.js +39 -0
  103. package/lib/linter/targetSchema.js.map +1 -0
  104. package/lib/linter/testSchema.d.ts +71 -0
  105. package/lib/linter/testSchema.js +165 -0
  106. package/lib/linter/testSchema.js.map +1 -0
  107. package/lib/linter/zodHelpers.d.ts +2 -0
  108. package/lib/linter/zodHelpers.js +15 -0
  109. package/lib/linter/zodHelpers.js.map +1 -0
  110. package/lib/list/index.d.ts +8 -0
  111. package/lib/list/index.js +524 -0
  112. package/lib/list/index.js.map +1 -0
  113. package/lib/matrix.d.ts +4 -0
  114. package/lib/matrix.js +66 -0
  115. package/lib/matrix.js.map +1 -0
  116. package/lib/promoter/index.d.ts +65 -0
  117. package/lib/promoter/index.js +1208 -0
  118. package/lib/promoter/index.js.map +1 -0
  119. package/lib/prune/index.d.ts +37 -0
  120. package/lib/prune/index.js +673 -0
  121. package/lib/prune/index.js.map +1 -0
  122. package/lib/sets.d.ts +10 -0
  123. package/lib/sets.js +120 -0
  124. package/lib/sets.js.map +1 -0
  125. package/lib/tester/cliFormat.d.ts +8 -0
  126. package/lib/tester/cliFormat.js +15 -0
  127. package/lib/tester/cliFormat.js.map +1 -0
  128. package/lib/tester/index.d.ts +35 -0
  129. package/lib/tester/index.js +713 -0
  130. package/lib/tester/index.js.map +1 -0
  131. package/lib/tester/matrix.d.ts +14 -0
  132. package/lib/tester/matrix.js +76 -0
  133. package/lib/tester/matrix.js.map +1 -0
  134. package/lib/tester/prettyDuration.d.ts +1 -0
  135. package/lib/tester/prettyDuration.js +30 -0
  136. package/lib/tester/prettyDuration.js.map +1 -0
  137. package/lib/tester/printTestResult.d.ts +2 -0
  138. package/lib/tester/printTestResult.js +32 -0
  139. package/lib/tester/printTestResult.js.map +1 -0
  140. package/lib/tester/types.d.ts +29 -0
  141. package/lib/tester/types.js +3 -0
  142. package/lib/tester/types.js.map +1 -0
  143. package/package.json +41 -13
  144. package/src/benchmark/index.spec.ts +375 -0
  145. package/src/benchmark/index.ts +433 -0
  146. package/src/builder/index.spec.ts +822 -0
  147. package/src/builder/index.ts +920 -0
  148. package/src/cli/index.spec.ts +54 -0
  149. package/src/cli/index.ts +150 -0
  150. package/src/config/index.spec.ts +70 -0
  151. package/src/config/index.ts +259 -0
  152. package/src/create/index.spec.ts +272 -0
  153. package/src/create/index.ts +295 -0
  154. package/src/datasource/filesystemAdapter.ts +313 -0
  155. package/src/datasource/index.ts +135 -0
  156. package/src/error.ts +33 -0
  157. package/src/evaluate/cli.spec.ts +368 -0
  158. package/src/evaluate/cli.ts +130 -0
  159. package/src/evaluate/index.ts +161 -0
  160. package/src/examples/coerceExampleIsoDates.spec.ts +81 -0
  161. package/src/examples/coerceExampleIsoDates.ts +98 -0
  162. package/src/examples/index.spec.ts +453 -0
  163. package/src/examples/index.ts +854 -0
  164. package/src/exporter/index.spec.ts +443 -0
  165. package/src/exporter/index.ts +643 -0
  166. package/src/find-duplicates/index.spec.ts +289 -0
  167. package/src/find-duplicates/index.ts +314 -0
  168. package/src/generate-code/index.ts +92 -0
  169. package/src/generate-code/typescript.spec.ts +241 -0
  170. package/src/generate-code/typescript.ts +284 -0
  171. package/src/importer/index.spec.ts +1101 -0
  172. package/src/importer/index.ts +1190 -0
  173. package/src/index.ts +18 -0
  174. package/src/info/index.ts +67 -0
  175. package/src/init/index.spec.ts +279 -0
  176. package/src/init/index.ts +292 -0
  177. package/src/lint/index.ts +1 -0
  178. package/src/linter/attributeSchema.ts +38 -0
  179. package/src/linter/checkLocaleCircularDependency.ts +51 -0
  180. package/src/linter/conditionSchema.ts +386 -0
  181. package/src/linter/formatSchema.ts +170 -0
  182. package/src/linter/icuStyleLint.ts +312 -0
  183. package/src/linter/index.spec.ts +824 -0
  184. package/src/linter/index.ts +460 -0
  185. package/src/linter/localeSchema.ts +70 -0
  186. package/src/linter/messageSchema.ts +152 -0
  187. package/src/linter/printError.ts +52 -0
  188. package/src/linter/schema.ts +230 -0
  189. package/src/linter/segmentSchema.ts +15 -0
  190. package/src/linter/targetSchema.ts +50 -0
  191. package/src/linter/testSchema.spec.ts +405 -0
  192. package/src/linter/testSchema.ts +239 -0
  193. package/src/linter/zodHelpers.ts +16 -0
  194. package/src/list/index.spec.ts +431 -0
  195. package/src/list/index.ts +463 -0
  196. package/src/matrix.ts +69 -0
  197. package/src/promoter/index.spec.ts +584 -0
  198. package/src/promoter/index.ts +1267 -0
  199. package/src/prune/index.spec.ts +418 -0
  200. package/src/prune/index.ts +693 -0
  201. package/src/sets.ts +74 -0
  202. package/src/tester/cliFormat.ts +11 -0
  203. package/src/tester/featurevisorIntegration.spec.ts +101 -0
  204. package/src/tester/index.spec.ts +577 -0
  205. package/src/tester/index.ts +679 -0
  206. package/src/tester/matrix.ts +106 -0
  207. package/src/tester/prettyDuration.ts +34 -0
  208. package/src/tester/printTestResult.ts +40 -0
  209. package/src/tester/types.ts +32 -0
  210. package/tsconfig.cjs.json +11 -0
  211. 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;