@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,673 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
47
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
48
+ return new (P || (P = Promise))(function (resolve, reject) {
49
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
50
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
51
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
52
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
53
+ });
54
+ };
55
+ var __generator = (this && this.__generator) || function (thisArg, body) {
56
+ 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);
57
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
58
+ function verb(n) { return function (v) { return step([n, v]); }; }
59
+ function step(op) {
60
+ if (f) throw new TypeError("Generator is already executing.");
61
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
62
+ 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;
63
+ if (y = 0, t) op = [op[0] & 2, t.value];
64
+ switch (op[0]) {
65
+ case 0: case 1: t = op; break;
66
+ case 4: _.label++; return { value: op[1], done: false };
67
+ case 5: _.label++; y = op[1]; op = [0]; continue;
68
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
69
+ default:
70
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
71
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
72
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
73
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
74
+ if (t[2]) _.ops.pop();
75
+ _.trys.pop(); continue;
76
+ }
77
+ op = body.call(thisArg, _);
78
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
79
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
80
+ }
81
+ };
82
+ var __rest = (this && this.__rest) || function (s, e) {
83
+ var t = {};
84
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
85
+ t[p] = s[p];
86
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
87
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
88
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
89
+ t[p[i]] = s[p[i]];
90
+ }
91
+ return t;
92
+ };
93
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
94
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
95
+ if (ar || !(i in from)) {
96
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
97
+ ar[i] = from[i];
98
+ }
99
+ }
100
+ return to.concat(ar || Array.prototype.slice.call(from));
101
+ };
102
+ Object.defineProperty(exports, "__esModule", { value: true });
103
+ exports.prunePlugin = void 0;
104
+ exports.pruneProject = pruneProject;
105
+ var path = __importStar(require("path"));
106
+ var sets_1 = require("../sets");
107
+ var cliFormat_1 = require("../tester/cliFormat");
108
+ function toArray(value) {
109
+ if (typeof value === "undefined") {
110
+ return [];
111
+ }
112
+ return Array.isArray(value) ? value : [value];
113
+ }
114
+ function isPlainObject(value) {
115
+ return typeof value === "object" && value !== null && !Array.isArray(value);
116
+ }
117
+ function deepEqual(left, right) {
118
+ return JSON.stringify(left) === JSON.stringify(right);
119
+ }
120
+ function withoutKey(entity) {
121
+ var _key = entity.key, rest = __rest(entity, ["key"]); // eslint-disable-line @typescript-eslint/no-unused-vars
122
+ return rest;
123
+ }
124
+ function cloneWithoutKey(entity) {
125
+ return JSON.parse(JSON.stringify(withoutKey(entity)));
126
+ }
127
+ function matchesPattern(key, patterns) {
128
+ if (!patterns || patterns.length === 0) {
129
+ return false;
130
+ }
131
+ return patterns.some(function (pattern) {
132
+ var escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
133
+ return new RegExp("^".concat(escaped, "$")).test(key);
134
+ });
135
+ }
136
+ function assertKnownValues(label, requested, available) {
137
+ for (var _i = 0, requested_1 = requested; _i < requested_1.length; _i++) {
138
+ var value = requested_1[_i];
139
+ if (!available.includes(value)) {
140
+ throw new Error("Unknown ".concat(label, " \"").concat(value, "\". Available ").concat(label, "s: ").concat(available.join(", ") || "none", "."));
141
+ }
142
+ }
143
+ }
144
+ function getEntityFilePath(directoryPath, key, projectConfig, suffix) {
145
+ if (suffix === void 0) { suffix = ""; }
146
+ var parser = projectConfig.parser;
147
+ return path.relative(process.cwd(), path.join.apply(path, __spreadArray([directoryPath], key.split(projectConfig.namespaceCharacter), false)) +
148
+ "".concat(suffix, ".").concat(parser.extension));
149
+ }
150
+ function readAll(keys, read) {
151
+ return __awaiter(this, void 0, void 0, function () {
152
+ var entries;
153
+ var _this = this;
154
+ return __generator(this, function (_a) {
155
+ switch (_a.label) {
156
+ case 0: return [4 /*yield*/, Promise.all(keys.map(function (key) { return __awaiter(_this, void 0, void 0, function () { var _a; return __generator(this, function (_b) {
157
+ switch (_b.label) {
158
+ case 0:
159
+ _a = [key];
160
+ return [4 /*yield*/, read(key)];
161
+ case 1: return [2 /*return*/, _a.concat([_b.sent()])];
162
+ }
163
+ }); }); }))];
164
+ case 1:
165
+ entries = _a.sent();
166
+ return [2 /*return*/, Object.fromEntries(entries)];
167
+ }
168
+ });
169
+ });
170
+ }
171
+ function resolveLocaleChain(localeKey, locales, field) {
172
+ var _a;
173
+ var chain = [];
174
+ var seen = new Set();
175
+ var currentKey = localeKey;
176
+ while (currentKey && !seen.has(currentKey)) {
177
+ seen.add(currentKey);
178
+ chain.unshift(currentKey);
179
+ currentKey = (_a = locales[currentKey]) === null || _a === void 0 ? void 0 : _a[field];
180
+ }
181
+ return chain;
182
+ }
183
+ function resolveInheritedTranslationValue(translations, localeKey, locales) {
184
+ var _a, _b;
185
+ var currentKey = (_a = locales[localeKey]) === null || _a === void 0 ? void 0 : _a.inheritTranslationsFrom;
186
+ while (currentKey) {
187
+ if (translations && typeof translations[currentKey] !== "undefined") {
188
+ return {
189
+ value: translations[currentKey],
190
+ inheritedFrom: currentKey,
191
+ };
192
+ }
193
+ currentKey = (_b = locales[currentKey]) === null || _b === void 0 ? void 0 : _b.inheritTranslationsFrom;
194
+ }
195
+ }
196
+ function mergeFormats(parent, child) {
197
+ if (typeof parent === "undefined") {
198
+ return child;
199
+ }
200
+ if (typeof child === "undefined") {
201
+ return parent;
202
+ }
203
+ if (!isPlainObject(parent) || !isPlainObject(child)) {
204
+ return child;
205
+ }
206
+ var result = __assign({}, parent);
207
+ for (var _i = 0, _a = Object.keys(child); _i < _a.length; _i++) {
208
+ var key = _a[_i];
209
+ result[key] = mergeFormats(result[key], child[key]);
210
+ }
211
+ return result;
212
+ }
213
+ function resolveInheritedFormats(localeKey, locales, cache) {
214
+ var _a;
215
+ var cacheKey = "inherited:".concat(localeKey);
216
+ if (cache.has(cacheKey)) {
217
+ return cache.get(cacheKey);
218
+ }
219
+ var chain = resolveLocaleChain(localeKey, locales, "inheritFormatsFrom").slice(0, -1);
220
+ var formats;
221
+ for (var _i = 0, chain_1 = chain; _i < chain_1.length; _i++) {
222
+ var key = chain_1[_i];
223
+ formats = mergeFormats(formats, (_a = locales[key]) === null || _a === void 0 ? void 0 : _a.formats);
224
+ }
225
+ cache.set(cacheKey, formats);
226
+ return formats;
227
+ }
228
+ function resolveEffectiveFormatsForLocale(localeKey, locales, cache) {
229
+ var _a;
230
+ var cacheKey = "effective:".concat(localeKey);
231
+ if (cache.has(cacheKey)) {
232
+ return cache.get(cacheKey);
233
+ }
234
+ var effective = mergeFormats(resolveInheritedFormats(localeKey, locales, cache), (_a = locales[localeKey]) === null || _a === void 0 ? void 0 : _a.formats);
235
+ cache.set(cacheKey, effective);
236
+ return effective;
237
+ }
238
+ function getPathValue(value, pathSegments) {
239
+ var current = value;
240
+ for (var _i = 0, pathSegments_1 = pathSegments; _i < pathSegments_1.length; _i++) {
241
+ var segment = pathSegments_1[_i];
242
+ if (!isPlainObject(current) || !(segment in current)) {
243
+ return undefined;
244
+ }
245
+ current = current[segment];
246
+ }
247
+ return current;
248
+ }
249
+ function findInheritedFormatSource(localeKey, pathSegments, value, locales, cache) {
250
+ var _a, _b;
251
+ var currentKey = (_a = locales[localeKey]) === null || _a === void 0 ? void 0 : _a.inheritFormatsFrom;
252
+ while (currentKey) {
253
+ var effectiveFormats = resolveEffectiveFormatsForLocale(currentKey, locales, cache);
254
+ if (deepEqual(getPathValue(effectiveFormats, pathSegments), value)) {
255
+ return currentKey;
256
+ }
257
+ currentKey = (_b = locales[currentKey]) === null || _b === void 0 ? void 0 : _b.inheritFormatsFrom;
258
+ }
259
+ }
260
+ function getSelectedLocales(datasource, options) {
261
+ return __awaiter(this, void 0, void 0, function () {
262
+ var requestedLocales, requestedTargets, _a, localeKeys, targetKeys, targets, selected, _i, requestedTargets_1, targetKey, targetLocales, _b, targetLocales_1, locale;
263
+ var _c;
264
+ return __generator(this, function (_d) {
265
+ switch (_d.label) {
266
+ case 0:
267
+ requestedLocales = toArray(options.locale);
268
+ requestedTargets = toArray(options.target);
269
+ return [4 /*yield*/, Promise.all([
270
+ datasource.listLocales(),
271
+ datasource.listTargets(),
272
+ ])];
273
+ case 1:
274
+ _a = _d.sent(), localeKeys = _a[0], targetKeys = _a[1];
275
+ assertKnownValues("locale", requestedLocales, localeKeys);
276
+ assertKnownValues("target", requestedTargets, targetKeys);
277
+ if (requestedTargets.length === 0) {
278
+ return [2 /*return*/, requestedLocales.length > 0 ? requestedLocales.sort() : localeKeys];
279
+ }
280
+ return [4 /*yield*/, readAll(requestedTargets, function (key) { return datasource.readTarget(key); })];
281
+ case 2:
282
+ targets = _d.sent();
283
+ selected = new Set();
284
+ for (_i = 0, requestedTargets_1 = requestedTargets; _i < requestedTargets_1.length; _i++) {
285
+ targetKey = requestedTargets_1[_i];
286
+ targetLocales = ((_c = targets[targetKey].locales) === null || _c === void 0 ? void 0 : _c.length)
287
+ ? targets[targetKey].locales || []
288
+ : localeKeys;
289
+ for (_b = 0, targetLocales_1 = targetLocales; _b < targetLocales_1.length; _b++) {
290
+ locale = targetLocales_1[_b];
291
+ if (requestedLocales.length === 0 || requestedLocales.includes(locale)) {
292
+ selected.add(locale);
293
+ }
294
+ }
295
+ }
296
+ return [2 /*return*/, Array.from(selected).sort()];
297
+ }
298
+ });
299
+ });
300
+ }
301
+ function getSelectedMessageKeys(datasource, options) {
302
+ return __awaiter(this, void 0, void 0, function () {
303
+ var requestedTargets, includeMessages, excludeMessages, messageKeys, targets, selected, _i, requestedTargets_2, targetKey, includePatterns, excludePatterns, _a, messageKeys_1, messageKey;
304
+ var _b;
305
+ return __generator(this, function (_c) {
306
+ switch (_c.label) {
307
+ case 0:
308
+ requestedTargets = toArray(options.target);
309
+ includeMessages = toArray(options.includeMessages);
310
+ excludeMessages = toArray(options.excludeMessages);
311
+ return [4 /*yield*/, datasource.listMessages()];
312
+ case 1:
313
+ messageKeys = _c.sent();
314
+ if (requestedTargets.length === 0) {
315
+ return [2 /*return*/, messageKeys
316
+ .filter(function (messageKey) {
317
+ return includeMessages.length > 0 ? matchesPattern(messageKey, includeMessages) : true;
318
+ })
319
+ .filter(function (messageKey) { return !matchesPattern(messageKey, excludeMessages); })
320
+ .sort()];
321
+ }
322
+ return [4 /*yield*/, readAll(requestedTargets, function (key) { return datasource.readTarget(key); })];
323
+ case 2:
324
+ targets = _c.sent();
325
+ selected = new Set();
326
+ for (_i = 0, requestedTargets_2 = requestedTargets; _i < requestedTargets_2.length; _i++) {
327
+ targetKey = requestedTargets_2[_i];
328
+ includePatterns = ((_b = targets[targetKey].includeMessages) === null || _b === void 0 ? void 0 : _b.length)
329
+ ? targets[targetKey].includeMessages
330
+ : ["*"];
331
+ excludePatterns = targets[targetKey].excludeMessages || [];
332
+ for (_a = 0, messageKeys_1 = messageKeys; _a < messageKeys_1.length; _a++) {
333
+ messageKey = messageKeys_1[_a];
334
+ if (matchesPattern(messageKey, includePatterns) &&
335
+ !matchesPattern(messageKey, excludePatterns)) {
336
+ selected.add(messageKey);
337
+ }
338
+ }
339
+ }
340
+ return [2 /*return*/, Array.from(selected)
341
+ .filter(function (messageKey) {
342
+ return includeMessages.length > 0 ? matchesPattern(messageKey, includeMessages) : true;
343
+ })
344
+ .filter(function (messageKey) { return !matchesPattern(messageKey, excludeMessages); })
345
+ .sort()];
346
+ }
347
+ });
348
+ });
349
+ }
350
+ function pruneTranslations(projectConfig, datasource, options) {
351
+ return __awaiter(this, void 0, void 0, function () {
352
+ var _a, selectedLocales, messageKeys, localeKeys, locales, entries, changedFiles, _i, messageKeys_2, messageKey, message, updatedMessage, changed, filePath, _b, _c, locale, explicitValue, inherited, index, override, _d, _e, locale, explicitValue, inherited;
353
+ return __generator(this, function (_f) {
354
+ switch (_f.label) {
355
+ case 0: return [4 /*yield*/, Promise.all([
356
+ getSelectedLocales(datasource, options),
357
+ getSelectedMessageKeys(datasource, options),
358
+ datasource.listLocales(),
359
+ ])];
360
+ case 1:
361
+ _a = _f.sent(), selectedLocales = _a[0], messageKeys = _a[1], localeKeys = _a[2];
362
+ return [4 /*yield*/, readAll(localeKeys, function (key) { return datasource.readLocale(key); })];
363
+ case 2:
364
+ locales = _f.sent();
365
+ entries = [];
366
+ changedFiles = [];
367
+ _i = 0, messageKeys_2 = messageKeys;
368
+ _f.label = 3;
369
+ case 3:
370
+ if (!(_i < messageKeys_2.length)) return [3 /*break*/, 7];
371
+ messageKey = messageKeys_2[_i];
372
+ return [4 /*yield*/, datasource.readMessage(messageKey)];
373
+ case 4:
374
+ message = _f.sent();
375
+ updatedMessage = void 0;
376
+ changed = false;
377
+ filePath = getEntityFilePath(projectConfig.messagesDirectoryPath, messageKey, projectConfig);
378
+ for (_b = 0, _c = Object.keys(message.translations || {}).sort(); _b < _c.length; _b++) {
379
+ locale = _c[_b];
380
+ if (!selectedLocales.includes(locale)) {
381
+ continue;
382
+ }
383
+ explicitValue = message.translations[locale];
384
+ inherited = resolveInheritedTranslationValue(message.translations, locale, locales);
385
+ if (typeof (inherited === null || inherited === void 0 ? void 0 : inherited.value) !== "undefined" && inherited.value === explicitValue) {
386
+ entries.push({
387
+ kind: "message",
388
+ key: messageKey,
389
+ filePath: filePath,
390
+ locale: locale,
391
+ inheritedFrom: inherited.inheritedFrom,
392
+ });
393
+ if (options.apply) {
394
+ updatedMessage =
395
+ updatedMessage ||
396
+ cloneWithoutKey(message);
397
+ delete updatedMessage.translations[locale];
398
+ changed = true;
399
+ }
400
+ }
401
+ }
402
+ for (index = 0; index < (message.overrides || []).length; index++) {
403
+ override = (message.overrides || [])[index];
404
+ for (_d = 0, _e = Object.keys(override.translations || {}).sort(); _d < _e.length; _d++) {
405
+ locale = _e[_d];
406
+ if (!selectedLocales.includes(locale)) {
407
+ continue;
408
+ }
409
+ explicitValue = override.translations[locale];
410
+ inherited = resolveInheritedTranslationValue(override.translations, locale, locales);
411
+ if (typeof (inherited === null || inherited === void 0 ? void 0 : inherited.value) !== "undefined" && inherited.value === explicitValue) {
412
+ entries.push({
413
+ kind: "override",
414
+ key: messageKey,
415
+ overrideKey: override.key,
416
+ filePath: filePath,
417
+ locale: locale,
418
+ inheritedFrom: inherited.inheritedFrom,
419
+ });
420
+ if (options.apply) {
421
+ updatedMessage =
422
+ updatedMessage ||
423
+ cloneWithoutKey(message);
424
+ delete (updatedMessage.overrides || [])[index].translations[locale];
425
+ changed = true;
426
+ }
427
+ }
428
+ }
429
+ }
430
+ if (!(options.apply && changed && updatedMessage)) return [3 /*break*/, 6];
431
+ return [4 /*yield*/, datasource.writeMessage(messageKey, updatedMessage)];
432
+ case 5:
433
+ _f.sent();
434
+ changedFiles.push(filePath);
435
+ _f.label = 6;
436
+ case 6:
437
+ _i++;
438
+ return [3 /*break*/, 3];
439
+ case 7: return [2 /*return*/, {
440
+ pruneMode: "translations",
441
+ apply: options.apply === true,
442
+ entries: entries,
443
+ changedFiles: changedFiles,
444
+ }];
445
+ }
446
+ });
447
+ });
448
+ }
449
+ function pruneFormatDuplicates(currentValue, inheritedValue, pathSegments, localeKey, filePath, locales, cache, entries) {
450
+ var _a;
451
+ var changed = false;
452
+ for (var _i = 0, _b = Object.keys(currentValue); _i < _b.length; _i++) {
453
+ var key = _b[_i];
454
+ var nextPath = __spreadArray(__spreadArray([], pathSegments, true), [key], false);
455
+ var localChild = currentValue[key];
456
+ var inheritedChild = isPlainObject(inheritedValue) ? inheritedValue[key] : undefined;
457
+ if (isPlainObject(localChild) && isPlainObject(inheritedChild)) {
458
+ changed =
459
+ pruneFormatDuplicates(localChild, inheritedChild, nextPath, localeKey, filePath, locales, cache, entries) || changed;
460
+ if (Object.keys(localChild).length === 0) {
461
+ delete currentValue[key];
462
+ changed = true;
463
+ }
464
+ continue;
465
+ }
466
+ if (deepEqual(localChild, inheritedChild)) {
467
+ var inheritedFrom = findInheritedFormatSource(localeKey, nextPath, localChild, locales, cache) ||
468
+ ((_a = locales[localeKey]) === null || _a === void 0 ? void 0 : _a.inheritFormatsFrom) ||
469
+ "unknown";
470
+ entries.push({
471
+ kind: "locale",
472
+ key: localeKey,
473
+ filePath: filePath,
474
+ formatPath: nextPath.join("."),
475
+ inheritedFrom: inheritedFrom,
476
+ });
477
+ delete currentValue[key];
478
+ changed = true;
479
+ }
480
+ }
481
+ return changed;
482
+ }
483
+ function pruneFormats(projectConfig, datasource, options) {
484
+ return __awaiter(this, void 0, void 0, function () {
485
+ var selectedLocales, localeKeys, locales, cache, entries, changedFiles, _i, selectedLocales_1, localeKey, locale, inheritedFormats, filePath, updatedLocale, localeEntriesStart, changed;
486
+ return __generator(this, function (_a) {
487
+ switch (_a.label) {
488
+ case 0: return [4 /*yield*/, getSelectedLocales(datasource, options)];
489
+ case 1:
490
+ selectedLocales = _a.sent();
491
+ return [4 /*yield*/, datasource.listLocales()];
492
+ case 2:
493
+ localeKeys = _a.sent();
494
+ return [4 /*yield*/, readAll(localeKeys, function (key) { return datasource.readLocale(key); })];
495
+ case 3:
496
+ locales = _a.sent();
497
+ cache = new Map();
498
+ entries = [];
499
+ changedFiles = [];
500
+ _i = 0, selectedLocales_1 = selectedLocales;
501
+ _a.label = 4;
502
+ case 4:
503
+ if (!(_i < selectedLocales_1.length)) return [3 /*break*/, 7];
504
+ localeKey = selectedLocales_1[_i];
505
+ locale = locales[localeKey];
506
+ if (!(locale === null || locale === void 0 ? void 0 : locale.formats) || !isPlainObject(locale.formats)) {
507
+ return [3 /*break*/, 6];
508
+ }
509
+ inheritedFormats = resolveInheritedFormats(localeKey, locales, cache);
510
+ if (!isPlainObject(inheritedFormats)) {
511
+ return [3 /*break*/, 6];
512
+ }
513
+ filePath = getEntityFilePath(projectConfig.localesDirectoryPath, localeKey, projectConfig);
514
+ updatedLocale = cloneWithoutKey(locale);
515
+ localeEntriesStart = entries.length;
516
+ changed = pruneFormatDuplicates(updatedLocale.formats, inheritedFormats, [], localeKey, filePath, locales, cache, entries);
517
+ if (!changed) {
518
+ entries.splice(localeEntriesStart);
519
+ return [3 /*break*/, 6];
520
+ }
521
+ if (isPlainObject(updatedLocale.formats) && Object.keys(updatedLocale.formats).length === 0) {
522
+ delete updatedLocale.formats;
523
+ }
524
+ if (!options.apply) return [3 /*break*/, 6];
525
+ return [4 /*yield*/, datasource.writeLocale(localeKey, updatedLocale)];
526
+ case 5:
527
+ _a.sent();
528
+ changedFiles.push(filePath);
529
+ _a.label = 6;
530
+ case 6:
531
+ _i++;
532
+ return [3 /*break*/, 4];
533
+ case 7: return [2 /*return*/, {
534
+ pruneMode: "formats",
535
+ apply: options.apply === true,
536
+ entries: entries,
537
+ changedFiles: changedFiles,
538
+ }];
539
+ }
540
+ });
541
+ });
542
+ }
543
+ function pruneProject(projectConfig, datasource, options) {
544
+ return __awaiter(this, void 0, void 0, function () {
545
+ return __generator(this, function (_a) {
546
+ if (options.pruneMode === "translations") {
547
+ return [2 /*return*/, pruneTranslations(projectConfig, datasource, options)];
548
+ }
549
+ return [2 /*return*/, pruneFormats(projectConfig, datasource, options)];
550
+ });
551
+ });
552
+ }
553
+ function printPruneResult(result, set) {
554
+ console.log("");
555
+ if (set) {
556
+ console.log("Set \"".concat(set, "\":"));
557
+ }
558
+ console.log(cliFormat_1.CLI_FORMAT_BOLD, "Prune Messagevisor project");
559
+ console.log(" Target: ".concat(result.pruneMode));
560
+ console.log(" Mode: ".concat(result.apply ? "apply" : "preview"));
561
+ console.log(" Entries: ".concat(result.entries.length));
562
+ console.log(" Files: ".concat(new Set(result.entries.map(function (entry) { return entry.filePath; })).size));
563
+ if (result.apply) {
564
+ console.log(" Updated: ".concat(result.changedFiles.length));
565
+ }
566
+ console.log("");
567
+ if (result.entries.length === 0) {
568
+ console.log(cliFormat_1.CLI_FORMAT_GREEN, "No prune-able ".concat(result.pruneMode, " found."));
569
+ return;
570
+ }
571
+ var grouped = new Map();
572
+ for (var _i = 0, _a = result.entries; _i < _a.length; _i++) {
573
+ var entry = _a[_i];
574
+ var label = entry.kind === "override" ? "".concat(entry.key, " (override ").concat(entry.overrideKey, ")") : entry.key;
575
+ var groupKey = "".concat(entry.filePath, ":::").concat(label);
576
+ var existing = grouped.get(groupKey) || [];
577
+ existing.push(entry);
578
+ grouped.set(groupKey, existing);
579
+ }
580
+ for (var _b = 0, _c = Array.from(grouped.entries()); _b < _c.length; _b++) {
581
+ var _d = _c[_b], groupKey = _d[0], entries = _d[1];
582
+ var _e = groupKey.split(":::"), filePath = _e[0], label = _e[1];
583
+ console.log(cliFormat_1.CLI_FORMAT_BOLD, "".concat(label));
584
+ console.log(" ".concat(filePath));
585
+ for (var _f = 0, entries_1 = entries; _f < entries_1.length; _f++) {
586
+ var entry = entries_1[_f];
587
+ if (result.pruneMode === "translations") {
588
+ console.log(" - locale ".concat(entry.locale, " duplicates inherited value from ").concat(entry.inheritedFrom));
589
+ }
590
+ else {
591
+ console.log(" - formats.".concat(entry.formatPath, " duplicates inherited value from ").concat(entry.inheritedFrom));
592
+ }
593
+ }
594
+ console.log("");
595
+ }
596
+ console.log(cliFormat_1.CLI_FORMAT_GREEN, result.apply
597
+ ? "Prune applied: ".concat(result.entries.length, " entries across ").concat(result.changedFiles.length, " files")
598
+ : "Prune preview complete: ".concat(result.entries.length, " entries across ").concat(new Set(result.entries.map(function (entry) { return entry.filePath; })).size, " files"));
599
+ }
600
+ function getTarget(parsed) {
601
+ var selected = ["translations", "formats"].filter(function (key) {
602
+ return Boolean(parsed[key]);
603
+ });
604
+ if (selected.length === 0) {
605
+ throw new Error("Pass exactly one of --translations or --formats.");
606
+ }
607
+ if (selected.length > 1) {
608
+ throw new Error("Pass exactly one of --translations or --formats.");
609
+ }
610
+ return selected[0];
611
+ }
612
+ exports.prunePlugin = {
613
+ command: "prune",
614
+ handler: function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
615
+ var pruneMode, executions, options, _i, executions_1, execution, result, error_1;
616
+ var projectConfig = _b.projectConfig, datasource = _b.datasource, parsed = _b.parsed;
617
+ return __generator(this, function (_c) {
618
+ switch (_c.label) {
619
+ case 0:
620
+ _c.trys.push([0, 6, , 7]);
621
+ pruneMode = getTarget(parsed);
622
+ return [4 /*yield*/, (0, sets_1.getProjectSetExecutions)(projectConfig, datasource, parsed.set)];
623
+ case 1:
624
+ executions = _c.sent();
625
+ options = {
626
+ pruneMode: pruneMode,
627
+ locale: parsed.locale,
628
+ target: parsed.target,
629
+ includeMessages: parsed.includeMessages,
630
+ excludeMessages: parsed.excludeMessages,
631
+ apply: parsed.apply === true || parsed.apply === "true",
632
+ };
633
+ _i = 0, executions_1 = executions;
634
+ _c.label = 2;
635
+ case 2:
636
+ if (!(_i < executions_1.length)) return [3 /*break*/, 5];
637
+ execution = executions_1[_i];
638
+ return [4 /*yield*/, pruneProject(execution.projectConfig, execution.datasource, options)];
639
+ case 3:
640
+ result = _c.sent();
641
+ printPruneResult(result, projectConfig.sets ? execution.set : undefined);
642
+ _c.label = 4;
643
+ case 4:
644
+ _i++;
645
+ return [3 /*break*/, 2];
646
+ case 5: return [3 /*break*/, 7];
647
+ case 6:
648
+ error_1 = _c.sent();
649
+ if (error_1 instanceof Error) {
650
+ console.error(error_1.message);
651
+ return [2 /*return*/, false];
652
+ }
653
+ throw error_1;
654
+ case 7: return [2 /*return*/];
655
+ }
656
+ });
657
+ }); },
658
+ examples: [
659
+ {
660
+ command: "prune --translations",
661
+ description: "preview prune-able inherited message translations",
662
+ },
663
+ {
664
+ command: "prune --translations --target=web --apply",
665
+ description: "apply pruning for inherited translations affecting a target",
666
+ },
667
+ {
668
+ command: "prune --formats --locale=en-US",
669
+ description: "preview prune-able inherited locale formats",
670
+ },
671
+ ],
672
+ };
673
+ //# sourceMappingURL=index.js.map