@saykit/config 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -5
- package/dist/commands/index.cjs +8 -5
- package/dist/commands/index.mjs +8 -5
- package/dist/features/catalogue/index.cjs +8 -3
- package/dist/features/catalogue/index.d.cts +11 -2
- package/dist/features/catalogue/index.d.mts +11 -2
- package/dist/features/catalogue/index.mjs +7 -3
- package/dist/{storage-3BTY8yws.cjs → storage-C4rOvLGi.cjs} +27 -21
- package/dist/{storage-C9nzxPtZ.mjs → storage-CqKPYfCR.mjs} +19 -19
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -43,7 +43,7 @@ export default defineConfig({
|
|
|
43
43
|
```sh
|
|
44
44
|
saykit extract # extract messages once
|
|
45
45
|
saykit extract --watch # extract and watch for changes
|
|
46
|
-
saykit clean #
|
|
46
|
+
saykit clean # prune dead entries from other locales
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
Extraction only writes the **source** locale (the first entry in `locales`). Locales that don't
|
|
@@ -54,10 +54,9 @@ At load time (via the unplugin or Babel plugin), each locale module is filled fr
|
|
|
54
54
|
chain, so an untranslated key resolves to a fallback locale and ultimately the source string — the
|
|
55
55
|
runtime still loads a single locale.
|
|
56
56
|
|
|
57
|
-
`saykit clean`
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
rather than leaving it to your TMS.
|
|
57
|
+
`saykit clean` only ever subtracts from non-source locales: it drops entries that no longer exist in
|
|
58
|
+
the source catalogue and entries with an empty translation, and leaves everything else exactly as it
|
|
59
|
+
is. It never adds source keys to a locale file, that stays your TMS's job.
|
|
61
60
|
|
|
62
61
|
## Documentation
|
|
63
62
|
|
package/dist/commands/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
require("../index.cjs");
|
|
3
|
-
const require_storage = require("../storage-
|
|
3
|
+
const require_storage = require("../storage-C4rOvLGi.cjs");
|
|
4
4
|
const require_loader = require("../loader-B25O-vF6.cjs");
|
|
5
5
|
let _commander_js_extra_typings = require("@commander-js/extra-typings");
|
|
6
6
|
let node_fs_promises = require("node:fs/promises");
|
|
@@ -46,17 +46,20 @@ var Logger = class {
|
|
|
46
46
|
new node_async_hooks.AsyncLocalStorage({ defaultValue: new Logger() });
|
|
47
47
|
//#endregion
|
|
48
48
|
//#region src/commands/clean.ts
|
|
49
|
-
var clean_default = new _commander_js_extra_typings.Command("clean").description("
|
|
49
|
+
var clean_default = new _commander_js_extra_typings.Command("clean").description("Remove orphaned and untranslated entries from non-source locale files").option("-v, --verbose", "enable verbose logging", false).option("-q, --quiet", "suppress all logging", false).action(async (options) => {
|
|
50
50
|
const config = require_loader.resolveConfig();
|
|
51
51
|
const logger = new Logger(options);
|
|
52
52
|
logger.header("🧹 Cleaning Locales");
|
|
53
53
|
const [sourceLocale, ...otherLocales] = config.locales;
|
|
54
54
|
for (const bucket of config.buckets) {
|
|
55
55
|
const sourceMessages = await require_storage.readCatalogueMessages(bucket, sourceLocale);
|
|
56
|
-
logger.info(`
|
|
56
|
+
logger.info(`Cleaning ${otherLocales.length} locale(s) against ${sourceLocale}`);
|
|
57
57
|
for (const locale of otherLocales) {
|
|
58
|
-
logger.step(`
|
|
59
|
-
|
|
58
|
+
logger.step(`Cleaning ${locale}`);
|
|
59
|
+
const existingMessages = await require_storage.readCatalogueMessages(bucket, locale);
|
|
60
|
+
const prunedMessages = require_storage.pruneLocaleMessages(existingMessages, sourceMessages);
|
|
61
|
+
logger.step(`Removed ${existingMessages.length - prunedMessages.length} entries from ${locale}`);
|
|
62
|
+
await require_storage.writeCatalogueMessages(bucket, locale, prunedMessages);
|
|
60
63
|
}
|
|
61
64
|
}
|
|
62
65
|
logger.success("Locales cleaned");
|
package/dist/commands/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { a as
|
|
2
|
+
import { a as mergeExtractedMessages, i as expandBucketOutputPath, n as writeCatalogueMessages, o as pruneLocaleMessages, t as readCatalogueMessages } from "../storage-CqKPYfCR.mjs";
|
|
3
3
|
import { t as resolveConfig } from "../loader-C2eolE_1.mjs";
|
|
4
4
|
import { Command, program } from "@commander-js/extra-typings";
|
|
5
5
|
import { access, glob, readFile, watch } from "node:fs/promises";
|
|
@@ -45,17 +45,20 @@ var Logger = class {
|
|
|
45
45
|
new AsyncLocalStorage({ defaultValue: new Logger() });
|
|
46
46
|
//#endregion
|
|
47
47
|
//#region src/commands/clean.ts
|
|
48
|
-
var clean_default = new Command("clean").description("
|
|
48
|
+
var clean_default = new Command("clean").description("Remove orphaned and untranslated entries from non-source locale files").option("-v, --verbose", "enable verbose logging", false).option("-q, --quiet", "suppress all logging", false).action(async (options) => {
|
|
49
49
|
const config = resolveConfig();
|
|
50
50
|
const logger = new Logger(options);
|
|
51
51
|
logger.header("🧹 Cleaning Locales");
|
|
52
52
|
const [sourceLocale, ...otherLocales] = config.locales;
|
|
53
53
|
for (const bucket of config.buckets) {
|
|
54
54
|
const sourceMessages = await readCatalogueMessages(bucket, sourceLocale);
|
|
55
|
-
logger.info(`
|
|
55
|
+
logger.info(`Cleaning ${otherLocales.length} locale(s) against ${sourceLocale}`);
|
|
56
56
|
for (const locale of otherLocales) {
|
|
57
|
-
logger.step(`
|
|
58
|
-
|
|
57
|
+
logger.step(`Cleaning ${locale}`);
|
|
58
|
+
const existingMessages = await readCatalogueMessages(bucket, locale);
|
|
59
|
+
const prunedMessages = pruneLocaleMessages(existingMessages, sourceMessages);
|
|
60
|
+
logger.step(`Removed ${existingMessages.length - prunedMessages.length} entries from ${locale}`);
|
|
61
|
+
await writeCatalogueMessages(bucket, locale, prunedMessages);
|
|
59
62
|
}
|
|
60
63
|
}
|
|
61
64
|
logger.success("Locales cleaned");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../index.cjs");
|
|
3
3
|
const require_hash = require("../../hash-8It7TJpB.cjs");
|
|
4
|
-
const require_storage = require("../../storage-
|
|
4
|
+
const require_storage = require("../../storage-C4rOvLGi.cjs");
|
|
5
5
|
let node_path = require("node:path");
|
|
6
6
|
//#region src/features/catalogue/record.ts
|
|
7
7
|
/**
|
|
@@ -44,17 +44,22 @@ function assembleCatalogueRecord(bucket, contents) {
|
|
|
44
44
|
if (!content) continue;
|
|
45
45
|
for (const message of bucket.formatter.parse(content)) {
|
|
46
46
|
const key = message.id || require_hash.generateHash(message.message, message.context);
|
|
47
|
-
|
|
47
|
+
if (message.translation) {
|
|
48
|
+
record[key] = message.translation;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (!record[key] && message.message) record[key] = message.message;
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
return record;
|
|
51
55
|
}
|
|
52
56
|
//#endregion
|
|
53
57
|
exports.assembleCatalogueRecord = assembleCatalogueRecord;
|
|
58
|
+
exports.declarationPathFor = require_storage.declarationPathFor;
|
|
54
59
|
exports.expandBucketOutputPath = require_storage.expandBucketOutputPath;
|
|
55
60
|
exports.mergeExtractedMessages = require_storage.mergeExtractedMessages;
|
|
61
|
+
exports.pruneLocaleMessages = require_storage.pruneLocaleMessages;
|
|
56
62
|
exports.readCatalogueMessages = require_storage.readCatalogueMessages;
|
|
57
|
-
exports.reconcileLocaleMessages = require_storage.reconcileLocaleMessages;
|
|
58
63
|
exports.resolveCatalogueSources = resolveCatalogueSources;
|
|
59
64
|
exports.resolveFallbackChain = resolveFallbackChain;
|
|
60
65
|
exports.writeCatalogueMessages = require_storage.writeCatalogueMessages;
|
|
@@ -9,7 +9,7 @@ declare function mergeExtractedMessages(messages: Message[]): {
|
|
|
9
9
|
id?: string | undefined;
|
|
10
10
|
context?: string | undefined;
|
|
11
11
|
}[];
|
|
12
|
-
declare function
|
|
12
|
+
declare function pruneLocaleMessages(existingMessages: Message[], sourceMessages: Message[]): {
|
|
13
13
|
message: string;
|
|
14
14
|
comments: string[];
|
|
15
15
|
references: string[];
|
|
@@ -20,6 +20,15 @@ declare function reconcileLocaleMessages(existingMessages: Message[], nextMessag
|
|
|
20
20
|
//#endregion
|
|
21
21
|
//#region src/features/catalogue/path.d.ts
|
|
22
22
|
declare function expandBucketOutputPath(bucket: Bucket, locale: string, extension?: `.${string}`): string;
|
|
23
|
+
/**
|
|
24
|
+
* The declaration file that types a catalogue, e.g. `en.json` -> `en.d.json.ts`.
|
|
25
|
+
*
|
|
26
|
+
* TypeScript resolves `./en.json` by stripping the extension and looking for
|
|
27
|
+
* `en.d.json.ts`; the `en.json.d.ts` form is only consulted for extensions the
|
|
28
|
+
* resolver does not recognise. Non-JS extensions additionally require
|
|
29
|
+
* `allowArbitraryExtensions` in the consumer's tsconfig.
|
|
30
|
+
*/
|
|
31
|
+
declare function declarationPathFor(cataloguePath: string): string;
|
|
23
32
|
//#endregion
|
|
24
33
|
//#region src/features/catalogue/record.d.ts
|
|
25
34
|
/**
|
|
@@ -56,4 +65,4 @@ declare function readCatalogueMessages(bucket: Bucket, locale: string, path?: st
|
|
|
56
65
|
}[]>;
|
|
57
66
|
declare function writeCatalogueMessages(bucket: Bucket, locale: string, messages: Message[], path?: string): Promise<void>;
|
|
58
67
|
//#endregion
|
|
59
|
-
export { assembleCatalogueRecord, expandBucketOutputPath, mergeExtractedMessages,
|
|
68
|
+
export { assembleCatalogueRecord, declarationPathFor, expandBucketOutputPath, mergeExtractedMessages, pruneLocaleMessages, readCatalogueMessages, resolveCatalogueSources, resolveFallbackChain, writeCatalogueMessages };
|
|
@@ -9,7 +9,7 @@ declare function mergeExtractedMessages(messages: Message[]): {
|
|
|
9
9
|
id?: string | undefined;
|
|
10
10
|
context?: string | undefined;
|
|
11
11
|
}[];
|
|
12
|
-
declare function
|
|
12
|
+
declare function pruneLocaleMessages(existingMessages: Message[], sourceMessages: Message[]): {
|
|
13
13
|
message: string;
|
|
14
14
|
comments: string[];
|
|
15
15
|
references: string[];
|
|
@@ -20,6 +20,15 @@ declare function reconcileLocaleMessages(existingMessages: Message[], nextMessag
|
|
|
20
20
|
//#endregion
|
|
21
21
|
//#region src/features/catalogue/path.d.ts
|
|
22
22
|
declare function expandBucketOutputPath(bucket: Bucket, locale: string, extension?: `.${string}`): string;
|
|
23
|
+
/**
|
|
24
|
+
* The declaration file that types a catalogue, e.g. `en.json` -> `en.d.json.ts`.
|
|
25
|
+
*
|
|
26
|
+
* TypeScript resolves `./en.json` by stripping the extension and looking for
|
|
27
|
+
* `en.d.json.ts`; the `en.json.d.ts` form is only consulted for extensions the
|
|
28
|
+
* resolver does not recognise. Non-JS extensions additionally require
|
|
29
|
+
* `allowArbitraryExtensions` in the consumer's tsconfig.
|
|
30
|
+
*/
|
|
31
|
+
declare function declarationPathFor(cataloguePath: string): string;
|
|
23
32
|
//#endregion
|
|
24
33
|
//#region src/features/catalogue/record.d.ts
|
|
25
34
|
/**
|
|
@@ -56,4 +65,4 @@ declare function readCatalogueMessages(bucket: Bucket, locale: string, path?: st
|
|
|
56
65
|
}[]>;
|
|
57
66
|
declare function writeCatalogueMessages(bucket: Bucket, locale: string, messages: Message[], path?: string): Promise<void>;
|
|
58
67
|
//#endregion
|
|
59
|
-
export { assembleCatalogueRecord, expandBucketOutputPath, mergeExtractedMessages,
|
|
68
|
+
export { assembleCatalogueRecord, declarationPathFor, expandBucketOutputPath, mergeExtractedMessages, pruneLocaleMessages, readCatalogueMessages, resolveCatalogueSources, resolveFallbackChain, writeCatalogueMessages };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as generateHash } from "../../hash-DyC8GzMa.mjs";
|
|
2
|
-
import { a as
|
|
2
|
+
import { a as mergeExtractedMessages, i as expandBucketOutputPath, n as writeCatalogueMessages, o as pruneLocaleMessages, r as declarationPathFor, t as readCatalogueMessages } from "../../storage-CqKPYfCR.mjs";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
//#region src/features/catalogue/record.ts
|
|
5
5
|
/**
|
|
@@ -42,10 +42,14 @@ function assembleCatalogueRecord(bucket, contents) {
|
|
|
42
42
|
if (!content) continue;
|
|
43
43
|
for (const message of bucket.formatter.parse(content)) {
|
|
44
44
|
const key = message.id || generateHash(message.message, message.context);
|
|
45
|
-
|
|
45
|
+
if (message.translation) {
|
|
46
|
+
record[key] = message.translation;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (!record[key] && message.message) record[key] = message.message;
|
|
46
50
|
}
|
|
47
51
|
}
|
|
48
52
|
return record;
|
|
49
53
|
}
|
|
50
54
|
//#endregion
|
|
51
|
-
export { assembleCatalogueRecord, expandBucketOutputPath, mergeExtractedMessages,
|
|
55
|
+
export { assembleCatalogueRecord, declarationPathFor, expandBucketOutputPath, mergeExtractedMessages, pruneLocaleMessages, readCatalogueMessages, resolveCatalogueSources, resolveFallbackChain, writeCatalogueMessages };
|
|
@@ -22,33 +22,33 @@ function mergeExtractedMessages(messages) {
|
|
|
22
22
|
}, /* @__PURE__ */ new Map());
|
|
23
23
|
return Array.from(mergedMessages.values());
|
|
24
24
|
}
|
|
25
|
-
function
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
return map;
|
|
29
|
-
}, /* @__PURE__ */ new Map());
|
|
30
|
-
const reconciledMessages = nextMessages.reduce((map, message) => {
|
|
31
|
-
const key = getMessageKey(message);
|
|
32
|
-
const existingMessage = existingMessagesByKey.get(key);
|
|
33
|
-
map.set(key, {
|
|
34
|
-
...message,
|
|
35
|
-
translation: existingMessage?.translation
|
|
36
|
-
});
|
|
37
|
-
return map;
|
|
38
|
-
}, /* @__PURE__ */ new Map());
|
|
39
|
-
return Array.from(reconciledMessages.values());
|
|
25
|
+
function pruneLocaleMessages(existingMessages, sourceMessages) {
|
|
26
|
+
const sourceKeys = new Set(sourceMessages.map(getMessageKey));
|
|
27
|
+
return existingMessages.filter((message) => sourceKeys.has(getMessageKey(message)) && Boolean(message.translation));
|
|
40
28
|
}
|
|
41
29
|
//#endregion
|
|
42
30
|
//#region src/features/catalogue/path.ts
|
|
43
31
|
function expandBucketOutputPath(bucket, locale, extension = bucket.formatter.extension) {
|
|
44
32
|
return (0, node_path.resolve)(bucket.output.replaceAll("{locale}", locale).replaceAll("{extension}", extension.slice(1)));
|
|
45
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* The declaration file that types a catalogue, e.g. `en.json` -> `en.d.json.ts`.
|
|
36
|
+
*
|
|
37
|
+
* TypeScript resolves `./en.json` by stripping the extension and looking for
|
|
38
|
+
* `en.d.json.ts`; the `en.json.d.ts` form is only consulted for extensions the
|
|
39
|
+
* resolver does not recognise. Non-JS extensions additionally require
|
|
40
|
+
* `allowArbitraryExtensions` in the consumer's tsconfig.
|
|
41
|
+
*/
|
|
42
|
+
function declarationPathFor(cataloguePath) {
|
|
43
|
+
const { dir, name, ext } = (0, node_path.parse)(cataloguePath);
|
|
44
|
+
return (0, node_path.resolve)(dir, `${name}.d${ext}.ts`);
|
|
45
|
+
}
|
|
46
46
|
//#endregion
|
|
47
47
|
//#region src/features/catalogue/storage.ts
|
|
48
48
|
const DECLARATION_CONTENT = `
|
|
49
49
|
declare const messages: Record<string, string>;
|
|
50
50
|
export default messages;
|
|
51
|
-
`.
|
|
51
|
+
`.trimStart();
|
|
52
52
|
async function readCatalogueMessages(bucket, locale, path = expandBucketOutputPath(bucket, locale)) {
|
|
53
53
|
const content = await (0, node_fs_promises.readFile)(path, "utf8").catch(() => "");
|
|
54
54
|
if (!content) return [];
|
|
@@ -60,11 +60,17 @@ async function writeCatalogueMessages(bucket, locale, messages, path = expandBuc
|
|
|
60
60
|
locale,
|
|
61
61
|
existingContent
|
|
62
62
|
});
|
|
63
|
-
const declarationPath =
|
|
63
|
+
const declarationPath = declarationPathFor(path);
|
|
64
64
|
await (0, node_fs_promises.mkdir)((0, node_path.dirname)(path), { recursive: true });
|
|
65
65
|
await Promise.all([(0, node_fs_promises.writeFile)(path, catalogueContent), (0, node_fs_promises.writeFile)(declarationPath, DECLARATION_CONTENT)]);
|
|
66
66
|
}
|
|
67
67
|
//#endregion
|
|
68
|
+
Object.defineProperty(exports, "declarationPathFor", {
|
|
69
|
+
enumerable: true,
|
|
70
|
+
get: function() {
|
|
71
|
+
return declarationPathFor;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
68
74
|
Object.defineProperty(exports, "expandBucketOutputPath", {
|
|
69
75
|
enumerable: true,
|
|
70
76
|
get: function() {
|
|
@@ -77,16 +83,16 @@ Object.defineProperty(exports, "mergeExtractedMessages", {
|
|
|
77
83
|
return mergeExtractedMessages;
|
|
78
84
|
}
|
|
79
85
|
});
|
|
80
|
-
Object.defineProperty(exports, "
|
|
86
|
+
Object.defineProperty(exports, "pruneLocaleMessages", {
|
|
81
87
|
enumerable: true,
|
|
82
88
|
get: function() {
|
|
83
|
-
return
|
|
89
|
+
return pruneLocaleMessages;
|
|
84
90
|
}
|
|
85
91
|
});
|
|
86
|
-
Object.defineProperty(exports, "
|
|
92
|
+
Object.defineProperty(exports, "readCatalogueMessages", {
|
|
87
93
|
enumerable: true,
|
|
88
94
|
get: function() {
|
|
89
|
-
return
|
|
95
|
+
return readCatalogueMessages;
|
|
90
96
|
}
|
|
91
97
|
});
|
|
92
98
|
Object.defineProperty(exports, "writeCatalogueMessages", {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as generateHash } from "./hash-DyC8GzMa.mjs";
|
|
2
2
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
-
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { dirname, parse, resolve } from "node:path";
|
|
4
4
|
//#region src/features/catalogue/merge.ts
|
|
5
5
|
function mergeUnique(...items) {
|
|
6
6
|
return Array.from(new Set(items.flat()));
|
|
@@ -21,33 +21,33 @@ function mergeExtractedMessages(messages) {
|
|
|
21
21
|
}, /* @__PURE__ */ new Map());
|
|
22
22
|
return Array.from(mergedMessages.values());
|
|
23
23
|
}
|
|
24
|
-
function
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
return map;
|
|
28
|
-
}, /* @__PURE__ */ new Map());
|
|
29
|
-
const reconciledMessages = nextMessages.reduce((map, message) => {
|
|
30
|
-
const key = getMessageKey(message);
|
|
31
|
-
const existingMessage = existingMessagesByKey.get(key);
|
|
32
|
-
map.set(key, {
|
|
33
|
-
...message,
|
|
34
|
-
translation: existingMessage?.translation
|
|
35
|
-
});
|
|
36
|
-
return map;
|
|
37
|
-
}, /* @__PURE__ */ new Map());
|
|
38
|
-
return Array.from(reconciledMessages.values());
|
|
24
|
+
function pruneLocaleMessages(existingMessages, sourceMessages) {
|
|
25
|
+
const sourceKeys = new Set(sourceMessages.map(getMessageKey));
|
|
26
|
+
return existingMessages.filter((message) => sourceKeys.has(getMessageKey(message)) && Boolean(message.translation));
|
|
39
27
|
}
|
|
40
28
|
//#endregion
|
|
41
29
|
//#region src/features/catalogue/path.ts
|
|
42
30
|
function expandBucketOutputPath(bucket, locale, extension = bucket.formatter.extension) {
|
|
43
31
|
return resolve(bucket.output.replaceAll("{locale}", locale).replaceAll("{extension}", extension.slice(1)));
|
|
44
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* The declaration file that types a catalogue, e.g. `en.json` -> `en.d.json.ts`.
|
|
35
|
+
*
|
|
36
|
+
* TypeScript resolves `./en.json` by stripping the extension and looking for
|
|
37
|
+
* `en.d.json.ts`; the `en.json.d.ts` form is only consulted for extensions the
|
|
38
|
+
* resolver does not recognise. Non-JS extensions additionally require
|
|
39
|
+
* `allowArbitraryExtensions` in the consumer's tsconfig.
|
|
40
|
+
*/
|
|
41
|
+
function declarationPathFor(cataloguePath) {
|
|
42
|
+
const { dir, name, ext } = parse(cataloguePath);
|
|
43
|
+
return resolve(dir, `${name}.d${ext}.ts`);
|
|
44
|
+
}
|
|
45
45
|
//#endregion
|
|
46
46
|
//#region src/features/catalogue/storage.ts
|
|
47
47
|
const DECLARATION_CONTENT = `
|
|
48
48
|
declare const messages: Record<string, string>;
|
|
49
49
|
export default messages;
|
|
50
|
-
`.
|
|
50
|
+
`.trimStart();
|
|
51
51
|
async function readCatalogueMessages(bucket, locale, path = expandBucketOutputPath(bucket, locale)) {
|
|
52
52
|
const content = await readFile(path, "utf8").catch(() => "");
|
|
53
53
|
if (!content) return [];
|
|
@@ -59,9 +59,9 @@ async function writeCatalogueMessages(bucket, locale, messages, path = expandBuc
|
|
|
59
59
|
locale,
|
|
60
60
|
existingContent
|
|
61
61
|
});
|
|
62
|
-
const declarationPath =
|
|
62
|
+
const declarationPath = declarationPathFor(path);
|
|
63
63
|
await mkdir(dirname(path), { recursive: true });
|
|
64
64
|
await Promise.all([writeFile(path, catalogueContent), writeFile(declarationPath, DECLARATION_CONTENT)]);
|
|
65
65
|
}
|
|
66
66
|
//#endregion
|
|
67
|
-
export {
|
|
67
|
+
export { mergeExtractedMessages as a, expandBucketOutputPath as i, writeCatalogueMessages as n, pruneLocaleMessages as o, declarationPathFor as r, readCatalogueMessages as t };
|