@worldware/msg-cli 0.0.5 → 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 (39) hide show
  1. package/dist/chunk-4Q2252JQ.mjs +50 -0
  2. package/dist/chunk-DBC2Y6VQ.mjs +167 -0
  3. package/dist/chunk-KKYCVD5M.mjs +136 -0
  4. package/dist/commands/create/project.cjs +293 -0
  5. package/dist/commands/create/project.d.mts +22 -0
  6. package/dist/commands/create/project.d.ts +22 -0
  7. package/dist/commands/create/project.mjs +151 -0
  8. package/dist/commands/create/resource.cjs +355 -0
  9. package/dist/commands/create/resource.d.mts +22 -0
  10. package/dist/commands/create/resource.d.ts +22 -0
  11. package/dist/commands/create/resource.mjs +143 -0
  12. package/dist/commands/init.cjs +259 -0
  13. package/dist/commands/init.d.mts +20 -0
  14. package/dist/commands/init.d.ts +20 -0
  15. package/dist/commands/init.mjs +133 -0
  16. package/dist/lib/create-project-helpers.cjs +163 -0
  17. package/dist/lib/create-project-helpers.d.mts +50 -0
  18. package/dist/lib/create-project-helpers.d.ts +50 -0
  19. package/dist/lib/create-project-helpers.mjs +14 -0
  20. package/dist/lib/create-resource-helpers.cjs +225 -0
  21. package/dist/lib/create-resource-helpers.d.mts +55 -0
  22. package/dist/lib/create-resource-helpers.d.ts +55 -0
  23. package/dist/lib/create-resource-helpers.mjs +15 -0
  24. package/dist/lib/init-helpers.cjs +203 -0
  25. package/dist/lib/init-helpers.d.mts +100 -0
  26. package/dist/lib/init-helpers.d.ts +100 -0
  27. package/dist/lib/init-helpers.mjs +30 -0
  28. package/dist/lib/utilities.cjs +203 -0
  29. package/dist/lib/utilities.d.mts +59 -0
  30. package/dist/lib/utilities.d.ts +59 -0
  31. package/dist/lib/utilities.mjs +172 -0
  32. package/package.json +7 -4
  33. package/dist/commands/create/project.js +0 -160
  34. package/dist/commands/create/resource.js +0 -169
  35. package/dist/commands/init.js +0 -131
  36. package/dist/lib/create-project-helpers.js +0 -112
  37. package/dist/lib/create-resource-helpers.js +0 -196
  38. package/dist/lib/init-helpers.js +0 -219
  39. package/dist/lib/utilities.js +0 -286
@@ -1,286 +0,0 @@
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
- Object.defineProperty(exports, "__esModule", { value: true });
45
- exports.findMsgResourceFiles = findMsgResourceFiles;
46
- exports.importMsgResources = importMsgResources;
47
- exports.resourcesToXliffString = resourcesToXliffString;
48
- exports.writeXliff = writeXliff;
49
- exports.readXliff = readXliff;
50
- exports.parseXliff = parseXliff;
51
- exports.xliffDataToResourceTranslationData = xliffDataToResourceTranslationData;
52
- exports.xliffToTranslationData = xliffToTranslationData;
53
- exports.writeTranslationData = writeTranslationData;
54
- const msg_1 = require("@worldware/msg");
55
- const promises_1 = require("fs/promises");
56
- const path_1 = require("path");
57
- const url_1 = require("url");
58
- const fast_xml_parser_1 = require("fast-xml-parser");
59
- const MSG_PATTERN = /\.msg\.(ts|js)$/i;
60
- /**
61
- * Recursively finds all javascript and typescript files in a directory that have
62
- * an `.msg.` substring in their filename just before the file extension.
63
- * @param directory - The directory path to search
64
- * @returns Promise resolving to array of file paths
65
- */
66
- function findMsgResourceFiles(directory) {
67
- return __awaiter(this, void 0, void 0, function* () {
68
- const result = [];
69
- const entries = yield (0, promises_1.readdir)(directory, { withFileTypes: true });
70
- for (const entry of entries) {
71
- const fullPath = (0, path_1.join)(directory, entry.name);
72
- if (entry.isFile() && MSG_PATTERN.test(entry.name)) {
73
- result.push(fullPath);
74
- }
75
- else if (entry.isDirectory()) {
76
- result.push(...(yield findMsgResourceFiles(fullPath)));
77
- }
78
- }
79
- return result;
80
- });
81
- }
82
- /**
83
- * Dynamically imports MsgResource objects from .msg. files and groups them by project.
84
- * @param filePaths - Array of paths to .msg. files
85
- * @returns Promise resolving to Map of MsgProject keys and MsgResource array values
86
- */
87
- function importMsgResources(filePaths) {
88
- return __awaiter(this, void 0, void 0, function* () {
89
- var _a, _b;
90
- const byProjectName = new Map();
91
- for (const filePath of filePaths) {
92
- if (!MSG_PATTERN.test(filePath)) {
93
- throw new Error(`File does not have .msg. in filename: ${filePath}`);
94
- }
95
- const url = (0, url_1.pathToFileURL)(filePath).href;
96
- const mod = yield Promise.resolve(`${url}`).then(s => __importStar(require(s)));
97
- const resource = (_b = (_a = mod.default) !== null && _a !== void 0 ? _a : mod.resource) !== null && _b !== void 0 ? _b : mod.MsgResource;
98
- if (!resource || !(resource instanceof msg_1.MsgResource)) {
99
- throw new Error(`Failed to import MsgResource from ${filePath}: no valid export found`);
100
- }
101
- const project = resource.getProject();
102
- const projectName = project.project.name;
103
- let group = byProjectName.get(projectName);
104
- if (!group) {
105
- group = { project, resources: [] };
106
- byProjectName.set(projectName, group);
107
- }
108
- group.resources.push(resource);
109
- }
110
- const result = new Map();
111
- for (const { project, resources } of byProjectName.values()) {
112
- result.set(project, resources);
113
- }
114
- return result;
115
- });
116
- }
117
- /**
118
- * Serializes MsgResource arrays into monolingual XLIFF 1.2 strings per project.
119
- * @param resources - Array of MsgResource objects
120
- * @returns Promise resolving to Map of MsgProject keys and xliff string values
121
- */
122
- function resourcesToXliffString(resources) {
123
- return __awaiter(this, void 0, void 0, function* () {
124
- const byProject = new Map();
125
- for (const resource of resources) {
126
- const project = resource.getProject();
127
- let arr = byProject.get(project);
128
- if (!arr) {
129
- arr = [];
130
- byProject.set(project, arr);
131
- }
132
- arr.push(resource);
133
- }
134
- const result = new Map();
135
- for (const [project, arr] of byProject) {
136
- const xliff = serializeResourcesToXliff(arr);
137
- result.set(project, xliff);
138
- }
139
- return result;
140
- });
141
- }
142
- function serializeResourcesToXliff(resources) {
143
- const xmlns = "urn:oasis:names:tc:xliff:document:1.2";
144
- const parts = [
145
- '<?xml version="1.0" encoding="UTF-8"?>',
146
- `<xliff version="1.2" xmlns="${xmlns}">`,
147
- ];
148
- for (const resource of resources) {
149
- const orig = `${resource.title}.json`;
150
- const sourceLang = resource.attributes.lang || "en";
151
- const data = resource.getData(false);
152
- parts.push(` <file original="${escapeXml(orig)}" source-language="${escapeXml(sourceLang)}" datatype="plaintext">`);
153
- parts.push(" <body>");
154
- for (const msg of data.messages || []) {
155
- const key = msg.key;
156
- const value = msg.value;
157
- const attrs = [`id="${escapeXml(key)}"`, `resname="${escapeXml(key)}"`];
158
- parts.push(` <trans-unit ${attrs.join(" ")}>`);
159
- parts.push(` <source>${escapeXml(value)}</source>`);
160
- parts.push(` </trans-unit>`);
161
- }
162
- parts.push(" </body>");
163
- parts.push(" </file>");
164
- }
165
- parts.push("</xliff>");
166
- return parts.join("\n");
167
- }
168
- function escapeXml(s) {
169
- return s
170
- .replace(/&/g, "&amp;")
171
- .replace(/</g, "&lt;")
172
- .replace(/>/g, "&gt;")
173
- .replace(/"/g, "&quot;")
174
- .replace(/'/g, "&apos;");
175
- }
176
- /**
177
- * Writes an XLIFF 1.2 string to a file with appropriate indentation.
178
- * @param filePath - The destination file path
179
- * @param xliff - The serialized XLIFF 1.2 string
180
- */
181
- function writeXliff(filePath, xliff) {
182
- return __awaiter(this, void 0, void 0, function* () {
183
- yield (0, promises_1.writeFile)(filePath, xliff, "utf-8");
184
- });
185
- }
186
- /**
187
- * Reads XLIFF 1.2 content from a file.
188
- * @param filePath - The path to the XLIFF file
189
- * @returns Promise resolving to the XLIFF string content
190
- */
191
- function readXliff(filePath) {
192
- return __awaiter(this, void 0, void 0, function* () {
193
- return (0, promises_1.readFile)(filePath, "utf-8");
194
- });
195
- }
196
- const xmlParser = new fast_xml_parser_1.XMLParser({
197
- ignoreAttributes: false,
198
- attributeNamePrefix: "@_",
199
- });
200
- /**
201
- * Parses an XLIFF 1.2 string into a javascript object, preserving notes and attributes.
202
- * @param xliff - Valid XLIFF 1.2 string
203
- * @returns Promise resolving to parsed object
204
- */
205
- function parseXliff(xliff) {
206
- return __awaiter(this, void 0, void 0, function* () {
207
- try {
208
- const parsed = xmlParser.parse(xliff);
209
- if (!parsed || typeof parsed !== "object") {
210
- throw new Error("Invalid XLIFF: failed to parse");
211
- }
212
- return parsed;
213
- }
214
- catch (err) {
215
- const message = err instanceof Error ? err.message : "Failed to parse XLIFF";
216
- throw new Error(`Invalid XLIFF 1.2: ${message}`);
217
- }
218
- });
219
- }
220
- /**
221
- * Extracts MsgResourceData from parsed XLIFF 1.2 object.
222
- * @param parsedXliff - Parsed XLIFF 1.2 javascript object
223
- * @returns Promise resolving to array of MsgResourceData objects
224
- */
225
- function xliffDataToResourceTranslationData(parsedXliff) {
226
- return __awaiter(this, void 0, void 0, function* () {
227
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
228
- const result = [];
229
- const xliff = parsedXliff;
230
- const fileEl = (_a = xliff === null || xliff === void 0 ? void 0 : xliff.xliff) === null || _a === void 0 ? void 0 : _a.file;
231
- if (!fileEl)
232
- return result;
233
- const files = Array.isArray(fileEl) ? fileEl : [fileEl];
234
- for (const file of files) {
235
- const f = file;
236
- const orig = (_b = f["@_original"]) !== null && _b !== void 0 ? _b : "unknown";
237
- const title = (0, path_1.basename)(orig, (0, path_1.extname)(orig)) || orig;
238
- const targetLang = (_d = (_c = f["@_target-language"]) !== null && _c !== void 0 ? _c : f["@_source-language"]) !== null && _d !== void 0 ? _d : "";
239
- const transUnits = (_e = f.body) === null || _e === void 0 ? void 0 : _e["trans-unit"];
240
- const units = Array.isArray(transUnits) ? transUnits : transUnits ? [transUnits] : [];
241
- const messages = [];
242
- for (const tu of units) {
243
- const t = tu;
244
- const translate = ((_f = t["@_translate"]) !== null && _f !== void 0 ? _f : "yes").toLowerCase();
245
- if (translate === "no" || translate === "false")
246
- continue;
247
- const key = (_h = (_g = t["@_resname"]) !== null && _g !== void 0 ? _g : t["@_id"]) !== null && _h !== void 0 ? _h : "";
248
- const targetEl = t.target;
249
- const value = (_j = (typeof targetEl === "object" && targetEl && "#text" in targetEl
250
- ? targetEl["#text"]
251
- : typeof targetEl === "string"
252
- ? targetEl
253
- : "")) !== null && _j !== void 0 ? _j : "";
254
- messages.push({ key, value });
255
- }
256
- result.push({
257
- title,
258
- attributes: { lang: targetLang, dir: "", dnt: false },
259
- messages,
260
- });
261
- }
262
- return result;
263
- });
264
- }
265
- /**
266
- * Parses XLIFF 1.2 string and extracts translation data to MsgResourceData objects.
267
- * @param xliff - Valid XLIFF 1.2 string
268
- * @returns Promise resolving to array of MsgResourceData objects
269
- */
270
- function xliffToTranslationData(xliff) {
271
- return __awaiter(this, void 0, void 0, function* () {
272
- const parsed = yield parseXliff(xliff);
273
- return xliffDataToResourceTranslationData(parsed);
274
- });
275
- }
276
- /**
277
- * Serializes MsgResourceData to JSON and writes it to a file.
278
- * @param filePath - The destination file path
279
- * @param data - MsgResourceData object to serialize
280
- */
281
- function writeTranslationData(filePath, data) {
282
- return __awaiter(this, void 0, void 0, function* () {
283
- const json = JSON.stringify(data, null, 2);
284
- yield (0, promises_1.writeFile)(filePath, json, "utf-8");
285
- });
286
- }