@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,405 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __generator = (this && this.__generator) || function (thisArg, body) {
45
+ 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);
46
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
47
+ function verb(n) { return function (v) { return step([n, v]); }; }
48
+ function step(op) {
49
+ if (f) throw new TypeError("Generator is already executing.");
50
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
51
+ 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;
52
+ if (y = 0, t) op = [op[0] & 2, t.value];
53
+ switch (op[0]) {
54
+ case 0: case 1: t = op; break;
55
+ case 4: _.label++; return { value: op[1], done: false };
56
+ case 5: _.label++; y = op[1]; op = [0]; continue;
57
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
58
+ default:
59
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
60
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
61
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
62
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
63
+ if (t[2]) _.ops.pop();
64
+ _.trys.pop(); continue;
65
+ }
66
+ op = body.call(thisArg, _);
67
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
68
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
69
+ }
70
+ };
71
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
72
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
73
+ var m = o[Symbol.asyncIterator], i;
74
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
75
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
76
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
77
+ };
78
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
79
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
80
+ if (ar || !(i in from)) {
81
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
82
+ ar[i] = from[i];
83
+ }
84
+ }
85
+ return to.concat(ar || Array.prototype.slice.call(from));
86
+ };
87
+ Object.defineProperty(exports, "__esModule", { value: true });
88
+ exports.createPlugin = void 0;
89
+ var path = __importStar(require("path"));
90
+ var error_1 = require("../error");
91
+ var sets_1 = require("../sets");
92
+ function getSelectedEntityType(parsed) {
93
+ var selected = ["messages", "locales", "targets", "attributes", "segments"].filter(function (entityType) { return Boolean(parsed[entityType]); });
94
+ if (selected.length === 0) {
95
+ throw new error_1.MessagevisorCLIError("Nothing to create. Pass exactly one of --messages, --locales, --targets, --attributes, or --segments.");
96
+ }
97
+ if (selected.length > 1) {
98
+ throw new error_1.MessagevisorCLIError("Pass exactly one of --messages, --locales, --targets, --attributes, or --segments.");
99
+ }
100
+ return selected[0];
101
+ }
102
+ function readInputKeys(parsed) {
103
+ return __awaiter(this, void 0, void 0, function () {
104
+ var chunks, _a, _b, _c, chunk, e_1_1;
105
+ var _d, e_1, _e, _f;
106
+ return __generator(this, function (_g) {
107
+ switch (_g.label) {
108
+ case 0:
109
+ if (typeof parsed.keys === "string") {
110
+ return [2 /*return*/, parsed.keys];
111
+ }
112
+ if (process.stdin.isTTY) {
113
+ throw new error_1.MessagevisorCLIError("Pass --keys=<multiline string> or provide newline-separated keys via stdin.");
114
+ }
115
+ chunks = [];
116
+ _g.label = 1;
117
+ case 1:
118
+ _g.trys.push([1, 6, 7, 12]);
119
+ _a = true, _b = __asyncValues(process.stdin);
120
+ _g.label = 2;
121
+ case 2: return [4 /*yield*/, _b.next()];
122
+ case 3:
123
+ if (!(_c = _g.sent(), _d = _c.done, !_d)) return [3 /*break*/, 5];
124
+ _f = _c.value;
125
+ _a = false;
126
+ chunk = _f;
127
+ chunks.push(String(chunk));
128
+ _g.label = 4;
129
+ case 4:
130
+ _a = true;
131
+ return [3 /*break*/, 2];
132
+ case 5: return [3 /*break*/, 12];
133
+ case 6:
134
+ e_1_1 = _g.sent();
135
+ e_1 = { error: e_1_1 };
136
+ return [3 /*break*/, 12];
137
+ case 7:
138
+ _g.trys.push([7, , 10, 11]);
139
+ if (!(!_a && !_d && (_e = _b.return))) return [3 /*break*/, 9];
140
+ return [4 /*yield*/, _e.call(_b)];
141
+ case 8:
142
+ _g.sent();
143
+ _g.label = 9;
144
+ case 9: return [3 /*break*/, 11];
145
+ case 10:
146
+ if (e_1) throw e_1.error;
147
+ return [7 /*endfinally*/];
148
+ case 11: return [7 /*endfinally*/];
149
+ case 12: return [2 /*return*/, chunks.join("")];
150
+ }
151
+ });
152
+ });
153
+ }
154
+ function parseKeys(input) {
155
+ var seen = new Set();
156
+ var keys = [];
157
+ for (var _i = 0, _a = input.split(/\r?\n/g); _i < _a.length; _i++) {
158
+ var rawLine = _a[_i];
159
+ var key = rawLine.trim();
160
+ if (!key || seen.has(key)) {
161
+ continue;
162
+ }
163
+ seen.add(key);
164
+ keys.push(key);
165
+ }
166
+ if (keys.length === 0) {
167
+ throw new error_1.MessagevisorCLIError("No keys found. Pass at least one newline-separated key.");
168
+ }
169
+ return keys;
170
+ }
171
+ function getParserExtension(projectConfig) {
172
+ return projectConfig.parser.extension || "yml";
173
+ }
174
+ function getEntityDirectoryPath(projectConfig, entityType) {
175
+ if (entityType === "messages") {
176
+ return projectConfig.messagesDirectoryPath;
177
+ }
178
+ if (entityType === "locales") {
179
+ return projectConfig.localesDirectoryPath;
180
+ }
181
+ if (entityType === "targets") {
182
+ return projectConfig.targetsDirectoryPath;
183
+ }
184
+ if (entityType === "attributes") {
185
+ return projectConfig.attributesDirectoryPath;
186
+ }
187
+ return projectConfig.segmentsDirectoryPath;
188
+ }
189
+ function getEntityFilePath(projectConfig, entityType, key) {
190
+ return (path.join.apply(path, __spreadArray([getEntityDirectoryPath(projectConfig, entityType)], key.split(projectConfig.namespaceCharacter), false)) + ".".concat(getParserExtension(projectConfig)));
191
+ }
192
+ function createEntityShell(datasource, entityType) {
193
+ return __awaiter(this, void 0, void 0, function () {
194
+ var localeKeys;
195
+ var _a;
196
+ return __generator(this, function (_b) {
197
+ switch (_b.label) {
198
+ case 0:
199
+ if (!(entityType === "messages")) return [3 /*break*/, 2];
200
+ return [4 /*yield*/, datasource.listLocales()];
201
+ case 1:
202
+ localeKeys = _b.sent();
203
+ if (localeKeys.length === 0) {
204
+ throw new error_1.MessagevisorCLIError("Cannot create messages without at least one locale. Create a locale first.");
205
+ }
206
+ return [2 /*return*/, {
207
+ description: "",
208
+ translations: (_a = {},
209
+ _a[localeKeys[0]] = "",
210
+ _a),
211
+ }];
212
+ case 2:
213
+ if (entityType === "locales") {
214
+ return [2 /*return*/, {
215
+ description: "",
216
+ }];
217
+ }
218
+ if (entityType === "targets") {
219
+ return [2 /*return*/, {
220
+ description: "",
221
+ includeMessages: ["*"],
222
+ }];
223
+ }
224
+ if (entityType === "attributes") {
225
+ return [2 /*return*/, {
226
+ description: "",
227
+ type: "string",
228
+ }];
229
+ }
230
+ return [2 /*return*/, {
231
+ description: "",
232
+ conditions: "*",
233
+ }];
234
+ }
235
+ });
236
+ });
237
+ }
238
+ function listExistingKeys(datasource, entityType) {
239
+ return __awaiter(this, void 0, void 0, function () {
240
+ return __generator(this, function (_a) {
241
+ if (entityType === "messages") {
242
+ return [2 /*return*/, datasource.listMessages()];
243
+ }
244
+ if (entityType === "locales") {
245
+ return [2 /*return*/, datasource.listLocales()];
246
+ }
247
+ if (entityType === "targets") {
248
+ return [2 /*return*/, datasource.listTargets()];
249
+ }
250
+ if (entityType === "attributes") {
251
+ return [2 /*return*/, datasource.listAttributes()];
252
+ }
253
+ return [2 /*return*/, datasource.listSegments()];
254
+ });
255
+ });
256
+ }
257
+ function writeEntity(datasource, entityType, key) {
258
+ return __awaiter(this, void 0, void 0, function () {
259
+ var entity;
260
+ return __generator(this, function (_a) {
261
+ switch (_a.label) {
262
+ case 0: return [4 /*yield*/, createEntityShell(datasource, entityType)];
263
+ case 1:
264
+ entity = _a.sent();
265
+ if (!(entityType === "messages")) return [3 /*break*/, 3];
266
+ return [4 /*yield*/, datasource.writeMessage(key, entity)];
267
+ case 2:
268
+ _a.sent();
269
+ return [2 /*return*/];
270
+ case 3:
271
+ if (!(entityType === "locales")) return [3 /*break*/, 5];
272
+ return [4 /*yield*/, datasource.writeLocale(key, entity)];
273
+ case 4:
274
+ _a.sent();
275
+ return [2 /*return*/];
276
+ case 5:
277
+ if (!(entityType === "targets")) return [3 /*break*/, 7];
278
+ return [4 /*yield*/, datasource.writeTarget(key, entity)];
279
+ case 6:
280
+ _a.sent();
281
+ return [2 /*return*/];
282
+ case 7:
283
+ if (!(entityType === "attributes")) return [3 /*break*/, 9];
284
+ return [4 /*yield*/, datasource.writeAttribute(key, entity)];
285
+ case 8:
286
+ _a.sent();
287
+ return [2 /*return*/];
288
+ case 9: return [4 /*yield*/, datasource.writeSegment(key, entity)];
289
+ case 10:
290
+ _a.sent();
291
+ return [2 /*return*/];
292
+ }
293
+ });
294
+ });
295
+ }
296
+ function createDefinitions(projectConfig, datasource, entityType, requestedKeys) {
297
+ return __awaiter(this, void 0, void 0, function () {
298
+ var existingKeys, _a, createdKeys, skippedKeys, createdFilePaths, _i, requestedKeys_1, key;
299
+ return __generator(this, function (_b) {
300
+ switch (_b.label) {
301
+ case 0:
302
+ _a = Set.bind;
303
+ return [4 /*yield*/, listExistingKeys(datasource, entityType)];
304
+ case 1:
305
+ existingKeys = new (_a.apply(Set, [void 0, _b.sent()]))();
306
+ createdKeys = [];
307
+ skippedKeys = [];
308
+ createdFilePaths = [];
309
+ _i = 0, requestedKeys_1 = requestedKeys;
310
+ _b.label = 2;
311
+ case 2:
312
+ if (!(_i < requestedKeys_1.length)) return [3 /*break*/, 5];
313
+ key = requestedKeys_1[_i];
314
+ if (existingKeys.has(key)) {
315
+ skippedKeys.push(key);
316
+ return [3 /*break*/, 4];
317
+ }
318
+ return [4 /*yield*/, writeEntity(datasource, entityType, key)];
319
+ case 3:
320
+ _b.sent();
321
+ createdKeys.push(key);
322
+ createdFilePaths.push(path.relative(process.cwd(), getEntityFilePath(projectConfig, entityType, key)));
323
+ existingKeys.add(key);
324
+ _b.label = 4;
325
+ case 4:
326
+ _i++;
327
+ return [3 /*break*/, 2];
328
+ case 5: return [2 /*return*/, {
329
+ entityType: entityType,
330
+ requestedKeys: requestedKeys,
331
+ createdKeys: createdKeys,
332
+ skippedKeys: skippedKeys,
333
+ createdFilePaths: createdFilePaths,
334
+ }];
335
+ }
336
+ });
337
+ });
338
+ }
339
+ function printSummary(summary) {
340
+ console.log("");
341
+ console.log("Entity type : ".concat(summary.entityType));
342
+ console.log("Requested : ".concat(summary.requestedKeys.length));
343
+ console.log("Created : ".concat(summary.createdKeys.length));
344
+ console.log("Skipped existing : ".concat(summary.skippedKeys.length));
345
+ }
346
+ exports.createPlugin = {
347
+ command: "create",
348
+ handler: function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
349
+ var execution, entityType, requestedKeys, _c, summary, error_2;
350
+ var projectConfig = _b.projectConfig, datasource = _b.datasource, parsed = _b.parsed;
351
+ return __generator(this, function (_d) {
352
+ switch (_d.label) {
353
+ case 0:
354
+ _d.trys.push([0, 5, , 6]);
355
+ if (projectConfig.sets && !parsed.set) {
356
+ throw new error_1.MessagevisorCLIError("Pass --set=<set>");
357
+ }
358
+ if (!projectConfig.sets) return [3 /*break*/, 2];
359
+ return [4 /*yield*/, (0, sets_1.getProjectSetExecutions)(projectConfig, datasource, parsed.set)];
360
+ case 1:
361
+ execution = (_d.sent())[0];
362
+ projectConfig = execution.projectConfig;
363
+ datasource = execution.datasource;
364
+ _d.label = 2;
365
+ case 2:
366
+ entityType = getSelectedEntityType(parsed);
367
+ _c = parseKeys;
368
+ return [4 /*yield*/, readInputKeys(parsed)];
369
+ case 3:
370
+ requestedKeys = _c.apply(void 0, [_d.sent()]);
371
+ return [4 /*yield*/, createDefinitions(projectConfig, datasource, entityType, requestedKeys)];
372
+ case 4:
373
+ summary = _d.sent();
374
+ if (parsed.json) {
375
+ console.log(parsed.pretty ? JSON.stringify(summary, null, 2) : JSON.stringify(summary));
376
+ return [2 /*return*/];
377
+ }
378
+ printSummary(summary);
379
+ return [3 /*break*/, 6];
380
+ case 5:
381
+ error_2 = _d.sent();
382
+ if ((0, error_1.printMessagevisorCLIError)(error_2)) {
383
+ return [2 /*return*/, false];
384
+ }
385
+ throw error_2;
386
+ case 6: return [2 /*return*/];
387
+ }
388
+ });
389
+ }); },
390
+ examples: [
391
+ {
392
+ command: "create --messages --keys=$'auth.signin\\nauth.signout'",
393
+ description: "create missing message definitions from newline-separated keys",
394
+ },
395
+ {
396
+ command: "create --locales --keys=$'en\\nnl'",
397
+ description: "create missing locale definitions",
398
+ },
399
+ {
400
+ command: "create --attributes --keys=$'plan\\nplatform'",
401
+ description: "create missing attribute definitions",
402
+ },
403
+ ],
404
+ };
405
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/create/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { Attribute, DatafileContent, Locale, Message, Target, Segment, Test } from "@messagevisor/types";
2
+ import { type ProjectConfig } from "../config";
3
+ import type { WriteDatafileOptions } from "./index";
4
+ export type EntityType = "locale" | "message" | "segment" | "attribute" | "target" | "test";
5
+ export declare class FilesystemAdapter {
6
+ private config;
7
+ private rootDirectoryPath?;
8
+ constructor(config: ProjectConfig, rootDirectoryPath?: string);
9
+ private get parser();
10
+ private getEntityDirectory;
11
+ listSets(): Promise<string[]>;
12
+ private getEntityPath;
13
+ private getEntityWritePath;
14
+ private getKeyFromEntityPath;
15
+ private assertReservedCharactersNotInPathName;
16
+ private readFile;
17
+ private writeFile;
18
+ listEntities(type: EntityType): Promise<string[]>;
19
+ entityExists(type: EntityType, key: string): boolean;
20
+ readEntity<T>(type: EntityType, key: string): Promise<T>;
21
+ writeEntity<T>(type: EntityType, key: string, entity: T): Promise<void>;
22
+ readRevision(): Promise<string>;
23
+ writeRevision(revision: string): Promise<void>;
24
+ writeDatafile(datafileContent: DatafileContent, options?: WriteDatafileOptions): Promise<void>;
25
+ readDatafile(target: string, locale: string): Promise<DatafileContent>;
26
+ listLocales(): Promise<string[]>;
27
+ readLocale(key: string): Promise<Locale>;
28
+ writeLocale(key: string, locale: Locale): Promise<void>;
29
+ listMessages(): Promise<string[]>;
30
+ readMessage(key: string): Promise<Message>;
31
+ writeMessage(key: string, message: Message): Promise<void>;
32
+ listSegments(): Promise<string[]>;
33
+ readSegment(key: string): Promise<Segment>;
34
+ writeSegment(key: string, segment: Segment): Promise<void>;
35
+ listAttributes(): Promise<string[]>;
36
+ readAttribute(key: string): Promise<Attribute>;
37
+ writeAttribute(key: string, attribute: Attribute): Promise<void>;
38
+ listTargets(): Promise<string[]>;
39
+ readTarget(key: string): Promise<Target>;
40
+ writeTarget(key: string, target: Target): Promise<void>;
41
+ listTests(): Promise<string[]>;
42
+ readTest(key: string): Promise<Test>;
43
+ writeTest(key: string, test: Test): Promise<void>;
44
+ }