@localeguard/core 0.3.0 → 0.5.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/dist/src/baseline.d.ts +36 -0
- package/dist/src/baseline.d.ts.map +1 -0
- package/dist/src/baseline.js +51 -0
- package/dist/src/baseline.js.map +1 -0
- package/dist/src/check.d.ts.map +1 -1
- package/dist/src/check.js +2 -0
- package/dist/src/check.js.map +1 -1
- package/dist/src/framework.d.ts +2 -1
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +15 -4
- package/dist/src/framework.js.map +1 -1
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +14 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/locale-parser/load.d.ts +5 -1
- package/dist/src/locale-parser/load.d.ts.map +1 -1
- package/dist/src/locale-parser/load.js +168 -13
- package/dist/src/locale-parser/load.js.map +1 -1
- package/dist/src/locale-parser/xliff.d.ts +26 -0
- package/dist/src/locale-parser/xliff.d.ts.map +1 -0
- package/dist/src/locale-parser/xliff.js +94 -0
- package/dist/src/locale-parser/xliff.js.map +1 -0
- package/dist/src/po/parse.d.ts +29 -0
- package/dist/src/po/parse.d.ts.map +1 -0
- package/dist/src/po/parse.js +113 -0
- package/dist/src/po/parse.js.map +1 -0
- package/dist/src/reporters/sarif.js +1 -1
- package/dist/src/types.d.ts +7 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/yaml/parse.d.ts +24 -0
- package/dist/src/yaml/parse.d.ts.map +1 -0
- package/dist/src/yaml/parse.js +152 -0
- package/dist/src/yaml/parse.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline support: record the issues that already exist in a project so that
|
|
3
|
+
* subsequent runs only fail on *new* issues. This lets teams adopt LocaleGuard
|
|
4
|
+
* on an existing codebase without fixing everything up front.
|
|
5
|
+
*
|
|
6
|
+
* Issues are matched by a line-independent signature (type + file + locale +
|
|
7
|
+
* key + message), so edits elsewhere in a file don't invalidate the baseline.
|
|
8
|
+
*/
|
|
9
|
+
import type { Issue } from "./types";
|
|
10
|
+
export interface BaselineEntry {
|
|
11
|
+
type: string;
|
|
12
|
+
file: string;
|
|
13
|
+
locale?: string;
|
|
14
|
+
key?: string;
|
|
15
|
+
message: string;
|
|
16
|
+
}
|
|
17
|
+
export interface Baseline {
|
|
18
|
+
version: number;
|
|
19
|
+
createdAt: string;
|
|
20
|
+
issues: BaselineEntry[];
|
|
21
|
+
}
|
|
22
|
+
export declare const BASELINE_VERSION = 1;
|
|
23
|
+
export declare function issueSignature(issue: {
|
|
24
|
+
type: string;
|
|
25
|
+
file: string;
|
|
26
|
+
locale?: string;
|
|
27
|
+
key?: string;
|
|
28
|
+
message: string;
|
|
29
|
+
}): string;
|
|
30
|
+
export declare function createBaseline(issues: Issue[]): Baseline;
|
|
31
|
+
/** Split issues into those not in the baseline (kept) and a suppressed count. */
|
|
32
|
+
export declare function applyBaseline(issues: Issue[], baseline: Baseline): {
|
|
33
|
+
issues: Issue[];
|
|
34
|
+
suppressed: number;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=baseline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/baseline.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAQT;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAYxD;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,QAAQ,GACjB;IAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CASzC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Baseline support: record the issues that already exist in a project so that
|
|
4
|
+
* subsequent runs only fail on *new* issues. This lets teams adopt LocaleGuard
|
|
5
|
+
* on an existing codebase without fixing everything up front.
|
|
6
|
+
*
|
|
7
|
+
* Issues are matched by a line-independent signature (type + file + locale +
|
|
8
|
+
* key + message), so edits elsewhere in a file don't invalidate the baseline.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.BASELINE_VERSION = void 0;
|
|
12
|
+
exports.issueSignature = issueSignature;
|
|
13
|
+
exports.createBaseline = createBaseline;
|
|
14
|
+
exports.applyBaseline = applyBaseline;
|
|
15
|
+
exports.BASELINE_VERSION = 1;
|
|
16
|
+
function issueSignature(issue) {
|
|
17
|
+
return JSON.stringify([
|
|
18
|
+
issue.type,
|
|
19
|
+
issue.file,
|
|
20
|
+
issue.locale ?? "",
|
|
21
|
+
issue.key ?? "",
|
|
22
|
+
issue.message,
|
|
23
|
+
]);
|
|
24
|
+
}
|
|
25
|
+
function createBaseline(issues) {
|
|
26
|
+
return {
|
|
27
|
+
version: exports.BASELINE_VERSION,
|
|
28
|
+
createdAt: new Date().toISOString(),
|
|
29
|
+
issues: issues.map((i) => ({
|
|
30
|
+
type: i.type,
|
|
31
|
+
file: i.file,
|
|
32
|
+
locale: i.locale,
|
|
33
|
+
key: i.key,
|
|
34
|
+
message: i.message,
|
|
35
|
+
})),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Split issues into those not in the baseline (kept) and a suppressed count. */
|
|
39
|
+
function applyBaseline(issues, baseline) {
|
|
40
|
+
const signatures = new Set(baseline.issues.map(issueSignature));
|
|
41
|
+
const kept = [];
|
|
42
|
+
let suppressed = 0;
|
|
43
|
+
for (const issue of issues) {
|
|
44
|
+
if (signatures.has(issueSignature(issue)))
|
|
45
|
+
suppressed += 1;
|
|
46
|
+
else
|
|
47
|
+
kept.push(issue);
|
|
48
|
+
}
|
|
49
|
+
return { issues: kept, suppressed };
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=baseline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/baseline.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAoBH,wCAcC;AAED,wCAYC;AAGD,sCAYC;AA7CY,QAAA,gBAAgB,GAAG,CAAC,CAAC;AAElC,SAAgB,cAAc,CAAC,KAM9B;IACC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,MAAM,IAAI,EAAE;QAClB,KAAK,CAAC,GAAG,IAAI,EAAE;QACf,KAAK,CAAC,OAAO;KACd,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,cAAc,CAAC,MAAe;IAC5C,OAAO;QACL,OAAO,EAAE,wBAAgB;QACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,SAAgB,aAAa,CAC3B,MAAe,EACf,QAAkB;IAElB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IAChE,MAAM,IAAI,GAAY,EAAE,CAAC;IACzB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAAE,UAAU,IAAI,CAAC,CAAC;;YACtD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACtC,CAAC"}
|
package/dist/src/check.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,KAAK,EACL,SAAS,EACT,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,KAAK,EACL,SAAS,EACT,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe,GAAG,WAAW,CAuGzF;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,GAAG,UAAU,CAuCpF;AAID,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAYhD"}
|
package/dist/src/check.js
CHANGED
|
@@ -33,6 +33,8 @@ function runCheck(rawConfig, opts) {
|
|
|
33
33
|
rootDir: opts.rootDir,
|
|
34
34
|
localesPath: config.localesPath,
|
|
35
35
|
messageFormat: config.messageFormat,
|
|
36
|
+
localeFormat: config.localeFormat,
|
|
37
|
+
sourceLocale: config.sourceLocale,
|
|
36
38
|
};
|
|
37
39
|
const source = (0, load_1.loadLocale)(config.sourceLocale, loadOpts);
|
|
38
40
|
if (!source.found) {
|
package/dist/src/check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/check.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AA2BH,
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/check.ts"],"names":[],"mappings":"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"}
|
package/dist/src/framework.d.ts
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
* defaults for translation functions/components and the locale message format,
|
|
4
4
|
* which a user can still override explicitly.
|
|
5
5
|
*/
|
|
6
|
-
import type { Framework, LocaleGuardConfig, MessageFormat } from "./types";
|
|
6
|
+
import type { Framework, LocaleFormat, LocaleGuardConfig, MessageFormat } from "./types";
|
|
7
7
|
export interface FrameworkPreset {
|
|
8
8
|
translationFunctions: string[];
|
|
9
9
|
translationComponents: string[];
|
|
10
10
|
messageFormat: MessageFormat;
|
|
11
|
+
localeFormat: LocaleFormat;
|
|
11
12
|
}
|
|
12
13
|
export declare const FRAMEWORK_PRESETS: Record<Framework, FrameworkPreset>;
|
|
13
14
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../../src/framework.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../../src/framework.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzF,MAAM,WAAW,eAAe;IAC9B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,eAAe,CAiDhE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAU3E"}
|
package/dist/src/framework.js
CHANGED
|
@@ -12,12 +12,14 @@ exports.FRAMEWORK_PRESETS = {
|
|
|
12
12
|
translationFunctions: ["t", "i18n.t"],
|
|
13
13
|
translationComponents: ["Trans"],
|
|
14
14
|
messageFormat: "plain",
|
|
15
|
+
localeFormat: "json",
|
|
15
16
|
},
|
|
16
17
|
"react-intl": {
|
|
17
18
|
// FormatJS: intl.formatMessage(...) and <FormattedMessage> / <FormattedHTMLMessage>.
|
|
18
19
|
translationFunctions: ["formatMessage", "intl.formatMessage", "$t"],
|
|
19
20
|
translationComponents: ["FormattedMessage", "FormattedHTMLMessage", "Trans"],
|
|
20
21
|
messageFormat: "icu-descriptor",
|
|
22
|
+
localeFormat: "json",
|
|
21
23
|
},
|
|
22
24
|
"next-intl": {
|
|
23
25
|
// App Router next-intl: useTranslations()/getTranslations() -> t(), ICU {var}
|
|
@@ -27,24 +29,32 @@ exports.FRAMEWORK_PRESETS = {
|
|
|
27
29
|
translationFunctions: ["t", "useTranslations", "getTranslations"],
|
|
28
30
|
translationComponents: [],
|
|
29
31
|
messageFormat: "plain",
|
|
32
|
+
localeFormat: "json",
|
|
30
33
|
},
|
|
31
34
|
"vue-i18n": {
|
|
32
35
|
// Vue I18n: t()/$t()/tc(), <i18n-t> component, plain nested JSON messages,
|
|
33
36
|
// single-brace {var} interpolation (and "a | b | c" pluralization, which is
|
|
34
|
-
// plain text to the parity check).
|
|
35
|
-
// <template> blocks is not yet supported — only locale-file checks apply.
|
|
37
|
+
// plain text to the parity check).
|
|
36
38
|
translationFunctions: ["t", "$t", "tc", "$tc"],
|
|
37
39
|
translationComponents: ["i18n-t", "I18nT"],
|
|
38
40
|
messageFormat: "plain",
|
|
41
|
+
localeFormat: "json",
|
|
39
42
|
},
|
|
40
43
|
"ngx-translate": {
|
|
41
44
|
// Angular ngx-translate: TranslateService.instant/get(), `translate` pipe and
|
|
42
45
|
// directive, plain nested JSON (assets/i18n/{lang}.json), {{var}} interpolation.
|
|
43
|
-
// Template hardcoded-text detection is out of scope. (For *native* Angular
|
|
44
|
-
// i18n, which uses XLIFF/XMB files, see the roadmap.)
|
|
45
46
|
translationFunctions: ["instant", "get", "stream", "translate"],
|
|
46
47
|
translationComponents: [],
|
|
47
48
|
messageFormat: "plain",
|
|
49
|
+
localeFormat: "json",
|
|
50
|
+
},
|
|
51
|
+
angular: {
|
|
52
|
+
// Native Angular i18n (@angular/localize): XLIFF message files
|
|
53
|
+
// (messages.xlf + messages.{locale}.xlf), `i18n` template attributes.
|
|
54
|
+
translationFunctions: [],
|
|
55
|
+
translationComponents: [],
|
|
56
|
+
messageFormat: "plain",
|
|
57
|
+
localeFormat: "xliff",
|
|
48
58
|
},
|
|
49
59
|
};
|
|
50
60
|
/**
|
|
@@ -60,6 +70,7 @@ function applyFramework(config) {
|
|
|
60
70
|
translationFunctions: config.translationFunctions ?? preset.translationFunctions,
|
|
61
71
|
translationComponents: config.translationComponents ?? preset.translationComponents,
|
|
62
72
|
messageFormat: config.messageFormat ?? preset.messageFormat,
|
|
73
|
+
localeFormat: config.localeFormat ?? preset.localeFormat,
|
|
63
74
|
};
|
|
64
75
|
}
|
|
65
76
|
//# sourceMappingURL=framework.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"framework.js","sourceRoot":"","sources":["../../src/framework.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;
|
|
1
|
+
{"version":3,"file":"framework.js","sourceRoot":"","sources":["../../src/framework.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAkEH,wCAUC;AAjEY,QAAA,iBAAiB,GAAuC;IACnE,eAAe,EAAE;QACf,oBAAoB,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC;QACrC,qBAAqB,EAAE,CAAC,OAAO,CAAC;QAChC,aAAa,EAAE,OAAO;QACtB,YAAY,EAAE,MAAM;KACrB;IACD,YAAY,EAAE;QACZ,qFAAqF;QACrF,oBAAoB,EAAE,CAAC,eAAe,EAAE,oBAAoB,EAAE,IAAI,CAAC;QACnE,qBAAqB,EAAE,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,OAAO,CAAC;QAC5E,aAAa,EAAE,gBAAgB;QAC/B,YAAY,EAAE,MAAM;KACrB;IACD,WAAW,EAAE;QACX,8EAA8E;QAC9E,8EAA8E;QAC9E,2EAA2E;QAC3E,gEAAgE;QAChE,oBAAoB,EAAE,CAAC,GAAG,EAAE,iBAAiB,EAAE,iBAAiB,CAAC;QACjE,qBAAqB,EAAE,EAAE;QACzB,aAAa,EAAE,OAAO;QACtB,YAAY,EAAE,MAAM;KACrB;IACD,UAAU,EAAE;QACV,2EAA2E;QAC3E,4EAA4E;QAC5E,mCAAmC;QACnC,oBAAoB,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC;QAC9C,qBAAqB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC1C,aAAa,EAAE,OAAO;QACtB,YAAY,EAAE,MAAM;KACrB;IACD,eAAe,EAAE;QACf,8EAA8E;QAC9E,iFAAiF;QACjF,oBAAoB,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC;QAC/D,qBAAqB,EAAE,EAAE;QACzB,aAAa,EAAE,OAAO;QACtB,YAAY,EAAE,MAAM;KACrB;IACD,OAAO,EAAE;QACP,+DAA+D;QAC/D,sEAAsE;QACtE,oBAAoB,EAAE,EAAE;QACxB,qBAAqB,EAAE,EAAE;QACzB,aAAa,EAAE,OAAO;QACtB,YAAY,EAAE,OAAO;KACtB;CACF,CAAC;AAEF;;;GAGG;AACH,SAAgB,cAAc,CAAC,MAAyB;IACtD,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC;IACrC,MAAM,MAAM,GAAG,yBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnD,OAAO;QACL,GAAG,MAAM;QACT,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,IAAI,MAAM,CAAC,oBAAoB;QAChF,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,IAAI,MAAM,CAAC,qBAAqB;QACnF,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa;QAC3D,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY;KACzD,CAAC;AACJ,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -6,6 +6,10 @@ export { FRAMEWORK_PRESETS, applyFramework } from "./framework";
|
|
|
6
6
|
export type { FrameworkPreset } from "./framework";
|
|
7
7
|
export { parseJson, JsonParseError } from "./json/parse";
|
|
8
8
|
export type { ParsedJson } from "./json/parse";
|
|
9
|
+
export { parseYaml, YamlParseError } from "./yaml/parse";
|
|
10
|
+
export type { ParsedYaml } from "./yaml/parse";
|
|
11
|
+
export { parsePo, poKey } from "./po/parse";
|
|
12
|
+
export type { ParsedPo, PoEntry } from "./po/parse";
|
|
9
13
|
export { flatten } from "./flatten";
|
|
10
14
|
export type { FlattenOptions } from "./flatten";
|
|
11
15
|
export { findFiles, globToRegExp } from "./glob";
|
|
@@ -14,10 +18,14 @@ export { compareKeys } from "./key-comparator/compare";
|
|
|
14
18
|
export type { KeyDiff } from "./key-comparator/compare";
|
|
15
19
|
export { checkKeyUsage } from "./key-usage";
|
|
16
20
|
export type { KeyUsageOptions } from "./key-usage";
|
|
21
|
+
export { createBaseline, applyBaseline, issueSignature, BASELINE_VERSION } from "./baseline";
|
|
22
|
+
export type { Baseline, BaselineEntry } from "./baseline";
|
|
17
23
|
export { extractPlaceholders, comparePlaceholders, } from "./placeholder-validator/placeholder";
|
|
18
24
|
export type { PlaceholderDiff } from "./placeholder-validator/placeholder";
|
|
19
25
|
export { loadLocale } from "./locale-parser/load";
|
|
20
26
|
export type { LoadOptions } from "./locale-parser/load";
|
|
27
|
+
export { parseXliff } from "./locale-parser/xliff";
|
|
28
|
+
export type { ParsedXliff, XliffUnit } from "./locale-parser/xliff";
|
|
21
29
|
export { runCheck, summarizeIssues, sortIssues, LocaleGuardError } from "./check";
|
|
22
30
|
export type { RunCheckOptions, SummarizeParams } from "./check";
|
|
23
31
|
export { formatText } from "./reporters/text";
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAClF,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC7F,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAClF,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -17,7 +17,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
17
17
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.formatSarif = exports.formatMarkdown = exports.formatJson = exports.formatText = exports.LocaleGuardError = exports.sortIssues = exports.summarizeIssues = exports.runCheck = exports.loadLocale = exports.comparePlaceholders = exports.extractPlaceholders = exports.checkKeyUsage = exports.compareKeys = exports.globToRegExp = exports.findFiles = exports.flatten = exports.JsonParseError = exports.parseJson = exports.applyFramework = exports.FRAMEWORK_PRESETS = void 0;
|
|
20
|
+
exports.formatSarif = exports.formatMarkdown = exports.formatJson = exports.formatText = exports.LocaleGuardError = exports.sortIssues = exports.summarizeIssues = exports.runCheck = exports.parseXliff = exports.loadLocale = exports.comparePlaceholders = exports.extractPlaceholders = exports.BASELINE_VERSION = exports.issueSignature = exports.applyBaseline = exports.createBaseline = exports.checkKeyUsage = exports.compareKeys = exports.globToRegExp = exports.findFiles = exports.flatten = exports.poKey = exports.parsePo = exports.YamlParseError = exports.parseYaml = exports.JsonParseError = exports.parseJson = exports.applyFramework = exports.FRAMEWORK_PRESETS = void 0;
|
|
21
21
|
__exportStar(require("./types"), exports);
|
|
22
22
|
var framework_1 = require("./framework");
|
|
23
23
|
Object.defineProperty(exports, "FRAMEWORK_PRESETS", { enumerable: true, get: function () { return framework_1.FRAMEWORK_PRESETS; } });
|
|
@@ -25,6 +25,12 @@ Object.defineProperty(exports, "applyFramework", { enumerable: true, get: functi
|
|
|
25
25
|
var parse_1 = require("./json/parse");
|
|
26
26
|
Object.defineProperty(exports, "parseJson", { enumerable: true, get: function () { return parse_1.parseJson; } });
|
|
27
27
|
Object.defineProperty(exports, "JsonParseError", { enumerable: true, get: function () { return parse_1.JsonParseError; } });
|
|
28
|
+
var parse_2 = require("./yaml/parse");
|
|
29
|
+
Object.defineProperty(exports, "parseYaml", { enumerable: true, get: function () { return parse_2.parseYaml; } });
|
|
30
|
+
Object.defineProperty(exports, "YamlParseError", { enumerable: true, get: function () { return parse_2.YamlParseError; } });
|
|
31
|
+
var parse_3 = require("./po/parse");
|
|
32
|
+
Object.defineProperty(exports, "parsePo", { enumerable: true, get: function () { return parse_3.parsePo; } });
|
|
33
|
+
Object.defineProperty(exports, "poKey", { enumerable: true, get: function () { return parse_3.poKey; } });
|
|
28
34
|
var flatten_1 = require("./flatten");
|
|
29
35
|
Object.defineProperty(exports, "flatten", { enumerable: true, get: function () { return flatten_1.flatten; } });
|
|
30
36
|
var glob_1 = require("./glob");
|
|
@@ -34,11 +40,18 @@ var compare_1 = require("./key-comparator/compare");
|
|
|
34
40
|
Object.defineProperty(exports, "compareKeys", { enumerable: true, get: function () { return compare_1.compareKeys; } });
|
|
35
41
|
var key_usage_1 = require("./key-usage");
|
|
36
42
|
Object.defineProperty(exports, "checkKeyUsage", { enumerable: true, get: function () { return key_usage_1.checkKeyUsage; } });
|
|
43
|
+
var baseline_1 = require("./baseline");
|
|
44
|
+
Object.defineProperty(exports, "createBaseline", { enumerable: true, get: function () { return baseline_1.createBaseline; } });
|
|
45
|
+
Object.defineProperty(exports, "applyBaseline", { enumerable: true, get: function () { return baseline_1.applyBaseline; } });
|
|
46
|
+
Object.defineProperty(exports, "issueSignature", { enumerable: true, get: function () { return baseline_1.issueSignature; } });
|
|
47
|
+
Object.defineProperty(exports, "BASELINE_VERSION", { enumerable: true, get: function () { return baseline_1.BASELINE_VERSION; } });
|
|
37
48
|
var placeholder_1 = require("./placeholder-validator/placeholder");
|
|
38
49
|
Object.defineProperty(exports, "extractPlaceholders", { enumerable: true, get: function () { return placeholder_1.extractPlaceholders; } });
|
|
39
50
|
Object.defineProperty(exports, "comparePlaceholders", { enumerable: true, get: function () { return placeholder_1.comparePlaceholders; } });
|
|
40
51
|
var load_1 = require("./locale-parser/load");
|
|
41
52
|
Object.defineProperty(exports, "loadLocale", { enumerable: true, get: function () { return load_1.loadLocale; } });
|
|
53
|
+
var xliff_1 = require("./locale-parser/xliff");
|
|
54
|
+
Object.defineProperty(exports, "parseXliff", { enumerable: true, get: function () { return xliff_1.parseXliff; } });
|
|
42
55
|
var check_1 = require("./check");
|
|
43
56
|
Object.defineProperty(exports, "runCheck", { enumerable: true, get: function () { return check_1.runCheck; } });
|
|
44
57
|
Object.defineProperty(exports, "summarizeIssues", { enumerable: true, get: function () { return check_1.summarizeIssues; } });
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,yCAAgE;AAAvD,8GAAA,iBAAiB,OAAA;AAAE,2GAAA,cAAc,OAAA;AAE1C,sCAAyD;AAAhD,kGAAA,SAAS,OAAA;AAAE,uGAAA,cAAc,OAAA;AAElC,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAEhB,+BAAiD;AAAxC,iGAAA,SAAS,OAAA;AAAE,oGAAA,YAAY,OAAA;AAEhC,oDAAuD;AAA9C,sGAAA,WAAW,OAAA;AAEpB,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAEtB,mEAG6C;AAF3C,kHAAA,mBAAmB,OAAA;AACnB,kHAAA,mBAAmB,OAAA;AAGrB,6CAAkD;AAAzC,kGAAA,UAAU,OAAA;AAEnB,iCAAkF;AAAzE,iGAAA,QAAQ,OAAA;AAAE,wGAAA,eAAe,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAEhE,yCAA8C;AAArC,kGAAA,UAAU,OAAA;AAEnB,yCAA8C;AAArC,kGAAA,UAAU,OAAA;AACnB,iDAAsD;AAA7C,0GAAA,cAAc,OAAA;AAEvB,2CAAgD;AAAvC,oGAAA,WAAW,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,yCAAgE;AAAvD,8GAAA,iBAAiB,OAAA;AAAE,2GAAA,cAAc,OAAA;AAE1C,sCAAyD;AAAhD,kGAAA,SAAS,OAAA;AAAE,uGAAA,cAAc,OAAA;AAElC,sCAAyD;AAAhD,kGAAA,SAAS,OAAA;AAAE,uGAAA,cAAc,OAAA;AAElC,oCAA4C;AAAnC,gGAAA,OAAO,OAAA;AAAE,8FAAA,KAAK,OAAA;AAEvB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAEhB,+BAAiD;AAAxC,iGAAA,SAAS,OAAA;AAAE,oGAAA,YAAY,OAAA;AAEhC,oDAAuD;AAA9C,sGAAA,WAAW,OAAA;AAEpB,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAEtB,uCAA6F;AAApF,0GAAA,cAAc,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAExE,mEAG6C;AAF3C,kHAAA,mBAAmB,OAAA;AACnB,kHAAA,mBAAmB,OAAA;AAGrB,6CAAkD;AAAzC,kGAAA,UAAU,OAAA;AAEnB,+CAAmD;AAA1C,mGAAA,UAAU,OAAA;AAEnB,iCAAkF;AAAzE,iGAAA,QAAQ,OAAA;AAAE,wGAAA,eAAe,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAEhE,yCAA8C;AAArC,kGAAA,UAAU,OAAA;AAEnB,yCAA8C;AAArC,kGAAA,UAAU,OAAA;AACnB,iDAAsD;AAA7C,0GAAA,cAAc,OAAA;AAEvB,2CAAgD;AAAvC,oGAAA,WAAW,OAAA"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* When namespaces are used, keys are qualified as `namespace:key` so they stay
|
|
9
9
|
* distinct across files.
|
|
10
10
|
*/
|
|
11
|
-
import type { LoadedLocale, MessageFormat } from "../types";
|
|
11
|
+
import type { LoadedLocale, LocaleFormat, MessageFormat } from "../types";
|
|
12
12
|
export interface LoadOptions {
|
|
13
13
|
/** Absolute project root; reported file paths are relative to this. */
|
|
14
14
|
rootDir: string;
|
|
@@ -16,6 +16,10 @@ export interface LoadOptions {
|
|
|
16
16
|
localesPath: string;
|
|
17
17
|
/** How locale-file values are interpreted (defaults to "plain"). */
|
|
18
18
|
messageFormat?: MessageFormat;
|
|
19
|
+
/** On-disk locale format (defaults to "json"). */
|
|
20
|
+
localeFormat?: LocaleFormat;
|
|
21
|
+
/** The source locale, so XLIFF loading knows whether to read source or target. */
|
|
22
|
+
sourceLocale?: string;
|
|
19
23
|
}
|
|
20
24
|
export declare function loadLocale(locale: string, opts: LoadOptions): LoadedLocale;
|
|
21
25
|
//# sourceMappingURL=load.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/locale-parser/load.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/locale-parser/load.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,KAAK,EAAS,YAAY,EAAe,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9F,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kDAAkD;IAClD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA6BD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,YAAY,CA4E1E"}
|
|
@@ -48,29 +48,39 @@ const fs = __importStar(require("node:fs"));
|
|
|
48
48
|
const path = __importStar(require("node:path"));
|
|
49
49
|
const flatten_1 = require("../flatten");
|
|
50
50
|
const parse_1 = require("../json/parse");
|
|
51
|
+
const parse_2 = require("../yaml/parse");
|
|
52
|
+
const parse_3 = require("../po/parse");
|
|
51
53
|
const types_1 = require("../types");
|
|
52
|
-
|
|
54
|
+
const xliff_1 = require("./xliff");
|
|
55
|
+
function listLocaleFiles(locale, opts, extensions) {
|
|
53
56
|
const base = path.resolve(opts.rootDir, opts.localesPath);
|
|
54
57
|
const files = [];
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
for (const ext of extensions) {
|
|
59
|
+
const singleFile = path.join(base, `${locale}${ext}`);
|
|
60
|
+
if (isFile(singleFile))
|
|
61
|
+
files.push({ absPath: singleFile, namespace: null });
|
|
58
62
|
}
|
|
59
63
|
const dir = path.join(base, locale);
|
|
60
64
|
if (isDirectory(dir)) {
|
|
61
65
|
for (const entry of fs.readdirSync(dir).sort()) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
namespace: entry.slice(0, -".json".length),
|
|
66
|
-
});
|
|
66
|
+
const ext = extensions.find((e) => entry.endsWith(e));
|
|
67
|
+
if (ext) {
|
|
68
|
+
files.push({ absPath: path.join(dir, entry), namespace: entry.slice(0, -ext.length) });
|
|
67
69
|
}
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
return files;
|
|
71
73
|
}
|
|
72
74
|
function loadLocale(locale, opts) {
|
|
73
|
-
|
|
75
|
+
if (opts.localeFormat === "xliff") {
|
|
76
|
+
return loadXliffLocale(locale, opts);
|
|
77
|
+
}
|
|
78
|
+
if (opts.localeFormat === "po") {
|
|
79
|
+
return loadPoLocale(locale, opts);
|
|
80
|
+
}
|
|
81
|
+
const isYaml = opts.localeFormat === "yaml";
|
|
82
|
+
const formatName = isYaml ? "YAML" : "JSON";
|
|
83
|
+
const files = listLocaleFiles(locale, opts, isYaml ? [".yaml", ".yml"] : [".json"]);
|
|
74
84
|
const entries = new Map();
|
|
75
85
|
const issues = [];
|
|
76
86
|
for (const { absPath, namespace } of files) {
|
|
@@ -92,7 +102,7 @@ function loadLocale(locale, opts) {
|
|
|
92
102
|
}
|
|
93
103
|
let parsed;
|
|
94
104
|
try {
|
|
95
|
-
parsed = (0, parse_1.parseJson)(text);
|
|
105
|
+
parsed = isYaml ? (0, parse_2.parseYaml)(text) : (0, parse_1.parseJson)(text);
|
|
96
106
|
}
|
|
97
107
|
catch (err) {
|
|
98
108
|
const pe = err;
|
|
@@ -103,8 +113,8 @@ function loadLocale(locale, opts) {
|
|
|
103
113
|
namespace: namespace ?? undefined,
|
|
104
114
|
file: relPath,
|
|
105
115
|
line: pe.line,
|
|
106
|
-
message: `Invalid
|
|
107
|
-
suggestion:
|
|
116
|
+
message: `Invalid ${formatName}: ${pe.message}`,
|
|
117
|
+
suggestion: `Fix the ${formatName} syntax so the locale can be parsed.`,
|
|
108
118
|
});
|
|
109
119
|
continue;
|
|
110
120
|
}
|
|
@@ -135,6 +145,151 @@ function loadLocale(locale, opts) {
|
|
|
135
145
|
}
|
|
136
146
|
return { locale, entries, issues, found: files.length > 0 };
|
|
137
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Load an Angular XLIFF locale. The source locale reads `<source>`; target
|
|
150
|
+
* locales read `<target>` (units with an empty/missing target are treated as
|
|
151
|
+
* untranslated, surfacing as missing keys).
|
|
152
|
+
*/
|
|
153
|
+
function loadXliffLocale(locale, opts) {
|
|
154
|
+
const isSource = opts.sourceLocale === locale;
|
|
155
|
+
const base = path.resolve(opts.rootDir, opts.localesPath);
|
|
156
|
+
const names = isSource
|
|
157
|
+
? [
|
|
158
|
+
"messages.xlf",
|
|
159
|
+
"messages.xliff",
|
|
160
|
+
`messages.${locale}.xlf`,
|
|
161
|
+
`messages.${locale}.xliff`,
|
|
162
|
+
`${locale}.xlf`,
|
|
163
|
+
`${locale}.xliff`,
|
|
164
|
+
]
|
|
165
|
+
: [`messages.${locale}.xlf`, `messages.${locale}.xliff`, `${locale}.xlf`, `${locale}.xliff`];
|
|
166
|
+
let absPath;
|
|
167
|
+
for (const name of names) {
|
|
168
|
+
const candidate = path.join(base, name);
|
|
169
|
+
if (isFile(candidate)) {
|
|
170
|
+
absPath = candidate;
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (!absPath)
|
|
175
|
+
return { locale, entries: new Map(), issues: [], found: false };
|
|
176
|
+
const relPath = path.relative(opts.rootDir, absPath) || absPath;
|
|
177
|
+
const entries = new Map();
|
|
178
|
+
const issues = [];
|
|
179
|
+
let text;
|
|
180
|
+
try {
|
|
181
|
+
text = fs.readFileSync(absPath, "utf8");
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
issues.push({
|
|
185
|
+
type: "invalid-json",
|
|
186
|
+
severity: types_1.SEVERITY_BY_TYPE["invalid-json"],
|
|
187
|
+
locale,
|
|
188
|
+
file: relPath,
|
|
189
|
+
message: `Could not read XLIFF file: ${err.message}`,
|
|
190
|
+
});
|
|
191
|
+
return { locale, entries, issues, found: true };
|
|
192
|
+
}
|
|
193
|
+
const parsed = (0, xliff_1.parseXliff)(text);
|
|
194
|
+
if (parsed.version === "unknown" && parsed.units.length === 0) {
|
|
195
|
+
issues.push({
|
|
196
|
+
type: "invalid-json",
|
|
197
|
+
severity: types_1.SEVERITY_BY_TYPE["invalid-json"],
|
|
198
|
+
locale,
|
|
199
|
+
file: relPath,
|
|
200
|
+
line: 1,
|
|
201
|
+
message: "Not a recognized XLIFF file (no <xliff> root or units found).",
|
|
202
|
+
suggestion: "Ensure this is a valid XLIFF 1.2 or 2.0 file.",
|
|
203
|
+
});
|
|
204
|
+
return { locale, entries, issues, found: true };
|
|
205
|
+
}
|
|
206
|
+
for (const dup of parsed.duplicates) {
|
|
207
|
+
issues.push({
|
|
208
|
+
type: "duplicate-key",
|
|
209
|
+
severity: types_1.SEVERITY_BY_TYPE["duplicate-key"],
|
|
210
|
+
locale,
|
|
211
|
+
key: dup.id,
|
|
212
|
+
file: relPath,
|
|
213
|
+
line: dup.line,
|
|
214
|
+
message: `Duplicate unit id "${dup.id}"`,
|
|
215
|
+
suggestion: "Remove the duplicate trans-unit/unit.",
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
for (const unit of parsed.units) {
|
|
219
|
+
if (isSource) {
|
|
220
|
+
entries.set(unit.id, { value: unit.source, file: relPath, line: unit.line });
|
|
221
|
+
}
|
|
222
|
+
else if (unit.target && unit.target.trim().length > 0) {
|
|
223
|
+
entries.set(unit.id, { value: unit.target, file: relPath, line: unit.line });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return { locale, entries, issues, found: true };
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Load a gettext PO locale. The source locale uses `msgid` as the value; target
|
|
230
|
+
* locales use `msgstr` (entries with an empty `msgstr` are untranslated and
|
|
231
|
+
* surface as missing keys). The key is the msgid (prefixed by msgctxt context).
|
|
232
|
+
*/
|
|
233
|
+
function loadPoLocale(locale, opts) {
|
|
234
|
+
const isSource = opts.sourceLocale === locale;
|
|
235
|
+
const base = path.resolve(opts.rootDir, opts.localesPath);
|
|
236
|
+
const names = isSource
|
|
237
|
+
? [`${locale}.po`, `${locale}.pot`, "messages.pot", "messages.po"]
|
|
238
|
+
: [`${locale}.po`];
|
|
239
|
+
let absPath;
|
|
240
|
+
for (const name of names) {
|
|
241
|
+
const candidate = path.join(base, name);
|
|
242
|
+
if (isFile(candidate)) {
|
|
243
|
+
absPath = candidate;
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (!absPath)
|
|
248
|
+
return { locale, entries: new Map(), issues: [], found: false };
|
|
249
|
+
const relPath = path.relative(opts.rootDir, absPath) || absPath;
|
|
250
|
+
const entries = new Map();
|
|
251
|
+
const issues = [];
|
|
252
|
+
let text;
|
|
253
|
+
try {
|
|
254
|
+
text = fs.readFileSync(absPath, "utf8");
|
|
255
|
+
}
|
|
256
|
+
catch (err) {
|
|
257
|
+
issues.push({
|
|
258
|
+
type: "invalid-json",
|
|
259
|
+
severity: types_1.SEVERITY_BY_TYPE["invalid-json"],
|
|
260
|
+
locale,
|
|
261
|
+
file: relPath,
|
|
262
|
+
message: `Could not read PO file: ${err.message}`,
|
|
263
|
+
});
|
|
264
|
+
return { locale, entries, issues, found: true };
|
|
265
|
+
}
|
|
266
|
+
const parsed = (0, parse_3.parsePo)(text);
|
|
267
|
+
for (const dup of parsed.duplicates) {
|
|
268
|
+
issues.push({
|
|
269
|
+
type: "duplicate-key",
|
|
270
|
+
severity: types_1.SEVERITY_BY_TYPE["duplicate-key"],
|
|
271
|
+
locale,
|
|
272
|
+
key: dup.key,
|
|
273
|
+
file: relPath,
|
|
274
|
+
line: dup.line,
|
|
275
|
+
message: `Duplicate msgid "${dup.key}"`,
|
|
276
|
+
suggestion: "Remove the duplicate entry.",
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
for (const entry of parsed.entries) {
|
|
280
|
+
const key = (0, parse_3.poKey)(entry);
|
|
281
|
+
if (isSource) {
|
|
282
|
+
// Classic gettext puts the source text in msgid; symbolic-id projects put
|
|
283
|
+
// it in the source file's msgstr. Prefer msgstr when present.
|
|
284
|
+
const value = entry.msgstr.trim().length > 0 ? entry.msgstr : entry.msgid;
|
|
285
|
+
entries.set(key, { value, file: relPath, line: entry.line });
|
|
286
|
+
}
|
|
287
|
+
else if (entry.msgstr.trim().length > 0) {
|
|
288
|
+
entries.set(key, { value: entry.msgstr, file: relPath, line: entry.line });
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return { locale, entries, issues, found: true };
|
|
292
|
+
}
|
|
138
293
|
function qualify(namespace, key) {
|
|
139
294
|
return namespace ? `${namespace}:${key}` : key;
|
|
140
295
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/locale-parser/load.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/locale-parser/load.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A pragmatic, dependency-free parser for Angular's XLIFF translation files
|
|
3
|
+
* (`@angular/localize` output), supporting XLIFF 1.2 (`<trans-unit>`) and
|
|
4
|
+
* 2.0 (`<unit>`).
|
|
5
|
+
*
|
|
6
|
+
* Each unit is reduced to an `id` plus a normalized text in which placeholder
|
|
7
|
+
* elements (`<x>`, `<ph>`) become `{id}` tokens. That lets the same
|
|
8
|
+
* interpolation comparison used for JSON locales work on XLIFF too.
|
|
9
|
+
*/
|
|
10
|
+
export interface XliffUnit {
|
|
11
|
+
id: string;
|
|
12
|
+
source: string;
|
|
13
|
+
target?: string;
|
|
14
|
+
/** 1-based line of the unit's opening tag. */
|
|
15
|
+
line: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ParsedXliff {
|
|
18
|
+
version: "1.2" | "2.0" | "unknown";
|
|
19
|
+
units: XliffUnit[];
|
|
20
|
+
duplicates: {
|
|
21
|
+
id: string;
|
|
22
|
+
line: number;
|
|
23
|
+
}[];
|
|
24
|
+
}
|
|
25
|
+
export declare function parseXliff(text: string): ParsedXliff;
|
|
26
|
+
//# sourceMappingURL=xliff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xliff.d.ts","sourceRoot":"","sources":["../../../src/locale-parser/xliff.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;IACnC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAgDpD"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A pragmatic, dependency-free parser for Angular's XLIFF translation files
|
|
4
|
+
* (`@angular/localize` output), supporting XLIFF 1.2 (`<trans-unit>`) and
|
|
5
|
+
* 2.0 (`<unit>`).
|
|
6
|
+
*
|
|
7
|
+
* Each unit is reduced to an `id` plus a normalized text in which placeholder
|
|
8
|
+
* elements (`<x>`, `<ph>`) become `{id}` tokens. That lets the same
|
|
9
|
+
* interpolation comparison used for JSON locales work on XLIFF too.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.parseXliff = parseXliff;
|
|
13
|
+
function parseXliff(text) {
|
|
14
|
+
const versionMatch = /<xliff\b[^>]*\bversion="([^"]+)"/.exec(text);
|
|
15
|
+
const version = versionMatch
|
|
16
|
+
? versionMatch[1].startsWith("2")
|
|
17
|
+
? "2.0"
|
|
18
|
+
: "1.2"
|
|
19
|
+
: "unknown";
|
|
20
|
+
const unitTag = version === "2.0" ? "unit" : "trans-unit";
|
|
21
|
+
const units = [];
|
|
22
|
+
const duplicates = [];
|
|
23
|
+
const seen = new Set();
|
|
24
|
+
const openRe = new RegExp(`<${unitTag}\\b[^>]*?>`, "g");
|
|
25
|
+
const closeStr = `</${unitTag}>`;
|
|
26
|
+
let match;
|
|
27
|
+
while ((match = openRe.exec(text)) !== null) {
|
|
28
|
+
const openTag = match[0];
|
|
29
|
+
if (openTag.endsWith("/>"))
|
|
30
|
+
continue; // empty unit
|
|
31
|
+
const idMatch = /\bid="([^"]*)"/.exec(openTag);
|
|
32
|
+
if (!idMatch)
|
|
33
|
+
continue;
|
|
34
|
+
const id = decodeEntities(idMatch[1]);
|
|
35
|
+
const contentStart = openRe.lastIndex;
|
|
36
|
+
// trans-unit / unit elements do not nest, so the next close tag ends it.
|
|
37
|
+
const closeIdx = text.indexOf(closeStr, contentStart);
|
|
38
|
+
const end = closeIdx === -1 ? text.length : closeIdx;
|
|
39
|
+
const inner = text.slice(contentStart, end);
|
|
40
|
+
const source = extractTag(inner, "source");
|
|
41
|
+
const target = extractTag(inner, "target");
|
|
42
|
+
const line = lineAt(text, match.index);
|
|
43
|
+
if (seen.has(id))
|
|
44
|
+
duplicates.push({ id, line });
|
|
45
|
+
else
|
|
46
|
+
seen.add(id);
|
|
47
|
+
units.push({
|
|
48
|
+
id,
|
|
49
|
+
source: source === undefined ? "" : normalize(source),
|
|
50
|
+
target: target === undefined ? undefined : normalize(target),
|
|
51
|
+
line,
|
|
52
|
+
});
|
|
53
|
+
openRe.lastIndex = closeIdx === -1 ? text.length : end + closeStr.length;
|
|
54
|
+
}
|
|
55
|
+
return { version, units, duplicates };
|
|
56
|
+
}
|
|
57
|
+
function extractTag(inner, tag) {
|
|
58
|
+
const re = new RegExp(`<${tag}\\b[^>]*>([\\s\\S]*?)</${tag}>`, "i");
|
|
59
|
+
const m = re.exec(inner);
|
|
60
|
+
if (m)
|
|
61
|
+
return m[1];
|
|
62
|
+
// Self-closing (e.g. empty <target/>).
|
|
63
|
+
if (new RegExp(`<${tag}\\b[^>]*/>`, "i").test(inner))
|
|
64
|
+
return "";
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
function normalize(content) {
|
|
68
|
+
return decodeEntities(content
|
|
69
|
+
// Placeholder elements -> {id}.
|
|
70
|
+
.replace(/<x\b[^>]*\bid="([^"]*)"[^>]*\/?>/gi, (_m, id) => `{${id}}`)
|
|
71
|
+
.replace(/<ph\b[^>]*\bid="([^"]*)"[^>]*>[\s\S]*?<\/ph>/gi, (_m, id) => `{${id}}`)
|
|
72
|
+
.replace(/<ph\b[^>]*\bid="([^"]*)"[^>]*\/>/gi, (_m, id) => `{${id}}`)
|
|
73
|
+
// Strip remaining inline structural tags (pc, g, mrk, ...), keep their text.
|
|
74
|
+
.replace(/<[^>]+>/g, "")).trim();
|
|
75
|
+
}
|
|
76
|
+
function decodeEntities(text) {
|
|
77
|
+
return text
|
|
78
|
+
.replace(/</g, "<")
|
|
79
|
+
.replace(/>/g, ">")
|
|
80
|
+
.replace(/"/g, '"')
|
|
81
|
+
.replace(/'/g, "'")
|
|
82
|
+
.replace(/&#x([0-9a-fA-F]+);/g, (_m, h) => String.fromCodePoint(parseInt(h, 16)))
|
|
83
|
+
.replace(/&#(\d+);/g, (_m, d) => String.fromCodePoint(parseInt(d, 10)))
|
|
84
|
+
.replace(/&/g, "&");
|
|
85
|
+
}
|
|
86
|
+
function lineAt(text, index) {
|
|
87
|
+
let line = 1;
|
|
88
|
+
for (let i = 0; i < index && i < text.length; i++) {
|
|
89
|
+
if (text[i] === "\n")
|
|
90
|
+
line += 1;
|
|
91
|
+
}
|
|
92
|
+
return line;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=xliff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xliff.js","sourceRoot":"","sources":["../../../src/locale-parser/xliff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small parser for gettext PO files. Each entry has a `msgid` (the source
|
|
3
|
+
* string, used as the key) and a `msgstr` (the translation). `msgctxt` adds a
|
|
4
|
+
* context that disambiguates the key. Multi-line strings (continuation lines)
|
|
5
|
+
* and the standard escapes are supported.
|
|
6
|
+
*
|
|
7
|
+
* Interpolation in PO varies by project; LocaleGuard recognizes `{name}` /
|
|
8
|
+
* `{{name}}` style placeholders (not printf `%s` / `%(name)s`).
|
|
9
|
+
*/
|
|
10
|
+
export interface PoEntry {
|
|
11
|
+
context?: string;
|
|
12
|
+
msgid: string;
|
|
13
|
+
msgstr: string;
|
|
14
|
+
/** 1-based line of the entry's msgid. */
|
|
15
|
+
line: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ParsedPo {
|
|
18
|
+
entries: PoEntry[];
|
|
19
|
+
duplicates: {
|
|
20
|
+
key: string;
|
|
21
|
+
line: number;
|
|
22
|
+
}[];
|
|
23
|
+
}
|
|
24
|
+
export declare function poKey(entry: {
|
|
25
|
+
context?: string;
|
|
26
|
+
msgid: string;
|
|
27
|
+
}): string;
|
|
28
|
+
export declare function parsePo(text: string): ParsedPo;
|
|
29
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/po/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,UAAU,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAExE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CA2E9C"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A small parser for gettext PO files. Each entry has a `msgid` (the source
|
|
4
|
+
* string, used as the key) and a `msgstr` (the translation). `msgctxt` adds a
|
|
5
|
+
* context that disambiguates the key. Multi-line strings (continuation lines)
|
|
6
|
+
* and the standard escapes are supported.
|
|
7
|
+
*
|
|
8
|
+
* Interpolation in PO varies by project; LocaleGuard recognizes `{name}` /
|
|
9
|
+
* `{{name}}` style placeholders (not printf `%s` / `%(name)s`).
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.poKey = poKey;
|
|
13
|
+
exports.parsePo = parsePo;
|
|
14
|
+
function poKey(entry) {
|
|
15
|
+
return entry.context ? `${entry.context}|${entry.msgid}` : entry.msgid;
|
|
16
|
+
}
|
|
17
|
+
function parsePo(text) {
|
|
18
|
+
const entries = [];
|
|
19
|
+
const lines = text.split("\n");
|
|
20
|
+
let current = { line: 0 };
|
|
21
|
+
let started = false;
|
|
22
|
+
let field = null;
|
|
23
|
+
const flush = () => {
|
|
24
|
+
if (started && current.msgid !== undefined) {
|
|
25
|
+
entries.push({
|
|
26
|
+
context: current.context,
|
|
27
|
+
msgid: current.msgid,
|
|
28
|
+
msgstr: current.msgstr ?? "",
|
|
29
|
+
line: current.line,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
current = { line: 0 };
|
|
33
|
+
started = false;
|
|
34
|
+
field = null;
|
|
35
|
+
};
|
|
36
|
+
for (let i = 0; i < lines.length; i++) {
|
|
37
|
+
const lineNo = i + 1;
|
|
38
|
+
const trimmed = (lines[i] ?? "").trim();
|
|
39
|
+
if (trimmed === "") {
|
|
40
|
+
flush();
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (trimmed.startsWith("#"))
|
|
44
|
+
continue;
|
|
45
|
+
if (trimmed.startsWith('"')) {
|
|
46
|
+
const piece = unescape(quoted(trimmed));
|
|
47
|
+
if (field === "msgid")
|
|
48
|
+
current.msgid = (current.msgid ?? "") + piece;
|
|
49
|
+
else if (field === "msgstr")
|
|
50
|
+
current.msgstr = (current.msgstr ?? "") + piece;
|
|
51
|
+
else if (field === "msgctxt")
|
|
52
|
+
current.context = (current.context ?? "") + piece;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const match = /^(msgctxt|msgid_plural|msgid|msgstr(?:\[\d+\])?)\s+(.*)$/.exec(trimmed);
|
|
56
|
+
if (!match)
|
|
57
|
+
continue;
|
|
58
|
+
const keyword = match[1];
|
|
59
|
+
const value = unescape(quoted(match[2]));
|
|
60
|
+
started = true;
|
|
61
|
+
if (keyword === "msgctxt") {
|
|
62
|
+
current.context = value;
|
|
63
|
+
field = "msgctxt";
|
|
64
|
+
}
|
|
65
|
+
else if (keyword === "msgid") {
|
|
66
|
+
current.msgid = value;
|
|
67
|
+
current.line = lineNo;
|
|
68
|
+
field = "msgid";
|
|
69
|
+
}
|
|
70
|
+
else if (keyword === "msgid_plural") {
|
|
71
|
+
field = "other";
|
|
72
|
+
}
|
|
73
|
+
else if (keyword === "msgstr" || keyword === "msgstr[0]") {
|
|
74
|
+
current.msgstr = value;
|
|
75
|
+
field = "msgstr";
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
field = "other"; // msgstr[1], msgstr[2], ...
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
flush();
|
|
82
|
+
// Drop the header entry (msgid "").
|
|
83
|
+
const real = entries.filter((e) => e.msgid !== "");
|
|
84
|
+
const duplicates = [];
|
|
85
|
+
const seen = new Set();
|
|
86
|
+
for (const entry of real) {
|
|
87
|
+
const key = poKey(entry);
|
|
88
|
+
if (seen.has(key))
|
|
89
|
+
duplicates.push({ key, line: entry.line });
|
|
90
|
+
else
|
|
91
|
+
seen.add(key);
|
|
92
|
+
}
|
|
93
|
+
return { entries: real, duplicates };
|
|
94
|
+
}
|
|
95
|
+
function quoted(text) {
|
|
96
|
+
const m = /^"((?:[^"\\]|\\.)*)"/.exec(text);
|
|
97
|
+
return m ? m[1] : "";
|
|
98
|
+
}
|
|
99
|
+
function unescape(text) {
|
|
100
|
+
return text.replace(/\\(.)/g, (_m, ch) => {
|
|
101
|
+
switch (ch) {
|
|
102
|
+
case "n":
|
|
103
|
+
return "\n";
|
|
104
|
+
case "t":
|
|
105
|
+
return "\t";
|
|
106
|
+
case "r":
|
|
107
|
+
return "\r";
|
|
108
|
+
default:
|
|
109
|
+
return ch; // \" \\ etc.
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/po/parse.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -33,7 +33,7 @@ export interface Issue {
|
|
|
33
33
|
suggestion?: string;
|
|
34
34
|
}
|
|
35
35
|
/** Supported framework presets (fill in sensible defaults for other fields). */
|
|
36
|
-
export type Framework = "react-i18next" | "react-intl" | "next-intl" | "vue-i18n" | "ngx-translate";
|
|
36
|
+
export type Framework = "react-i18next" | "react-intl" | "next-intl" | "vue-i18n" | "ngx-translate" | "angular";
|
|
37
37
|
/**
|
|
38
38
|
* How values in a locale file are interpreted.
|
|
39
39
|
* - "plain": leaf strings are messages; nested objects are namespaces.
|
|
@@ -41,11 +41,15 @@ export type Framework = "react-i18next" | "react-intl" | "next-intl" | "vue-i18n
|
|
|
41
41
|
* are messages (the key is the message id; `defaultMessage` is the string).
|
|
42
42
|
*/
|
|
43
43
|
export type MessageFormat = "plain" | "icu-descriptor";
|
|
44
|
+
/** On-disk locale file format. */
|
|
45
|
+
export type LocaleFormat = "json" | "xliff" | "yaml" | "po";
|
|
44
46
|
export interface LocaleGuardConfig {
|
|
45
47
|
/** Optional framework preset; fills defaults for the fields below. */
|
|
46
48
|
framework?: Framework;
|
|
47
49
|
/** How locale-file values are interpreted (defaults to "plain"). */
|
|
48
50
|
messageFormat?: MessageFormat;
|
|
51
|
+
/** On-disk locale file format (defaults to "json"). */
|
|
52
|
+
localeFormat?: LocaleFormat;
|
|
49
53
|
/** Reference locale every other locale is compared against. */
|
|
50
54
|
sourceLocale: string;
|
|
51
55
|
/** Target locales to validate. */
|
|
@@ -64,6 +68,8 @@ export interface LocaleGuardConfig {
|
|
|
64
68
|
blockOn?: IssueType[];
|
|
65
69
|
/** Opt in to reporting locale keys never referenced in code (default false). */
|
|
66
70
|
unusedKeys?: boolean;
|
|
71
|
+
/** Path to a baseline file of pre-existing issues to suppress (default localeguard-baseline.json). */
|
|
72
|
+
baseline?: string;
|
|
67
73
|
}
|
|
68
74
|
/** A literal translation-key reference found in source code. */
|
|
69
75
|
export interface KeyReference {
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC7D,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,SAAS,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEnF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GACjB,cAAc,GACd,aAAa,GACb,WAAW,GACX,eAAe,GACf,sBAAsB,GACtB,eAAe,GACf,YAAY,GACZ,kBAAkB,GAClB,qBAAqB,CAAC;AAE1B,0CAA0C;AAC1C,eAAO,MAAM,WAAW,EAAE,SAAS,EAUlC,CAAC;AAEF,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,gFAAgF;AAChF,MAAM,MAAM,SAAS,GACjB,eAAe,GACf,YAAY,GACZ,WAAW,GACX,UAAU,GACV,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAwBH,0CAA0C;AAC7B,QAAA,WAAW,GAAgB;IACtC,cAAc;IACd,eAAe;IACf,aAAa;IACb,WAAW;IACX,sBAAsB;IACtB,eAAe;IACf,YAAY;IACZ,kBAAkB;IAClB,qBAAqB;CACtB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAwBH,0CAA0C;AAC7B,QAAA,WAAW,GAAgB;IACtC,cAAc;IACd,eAAe;IACf,aAAa;IACb,WAAW;IACX,sBAAsB;IACtB,eAAe;IACf,YAAY;IACZ,kBAAkB;IAClB,qBAAqB;CACtB,CAAC;AAoHW,QAAA,gBAAgB,GAAgB;IAC3C,cAAc;IACd,aAAa;IACb,eAAe;IACf,sBAAsB;IACtB,eAAe;CAChB,CAAC;AAEF,sDAAsD;AACzC,QAAA,gBAAgB,GAAqC;IAChE,cAAc,EAAE,OAAO;IACvB,aAAa,EAAE,OAAO;IACtB,WAAW,EAAE,SAAS;IACtB,eAAe,EAAE,OAAO;IACxB,sBAAsB,EAAE,OAAO;IAC/B,0EAA0E;IAC1E,+CAA+C;IAC/C,eAAe,EAAE,OAAO;IACxB,sEAAsE;IACtE,YAAY,EAAE,SAAS;IACvB,qEAAqE;IACrE,2DAA2D;IAC3D,kBAAkB,EAAE,SAAS;IAC7B,qBAAqB,EAAE,SAAS;CACjC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A minimal YAML parser for the subset used by locale files: indentation-based
|
|
3
|
+
* nested mappings, scalar values, comments, and simple scalar lists. It returns
|
|
4
|
+
* the same shape as the JSON parser (value + key lines + duplicates) so the
|
|
5
|
+
* locale loader can treat YAML and JSON the same way.
|
|
6
|
+
*
|
|
7
|
+
* Not supported (uncommon in locale files): anchors/aliases, block scalars
|
|
8
|
+
* (`|`, `>`), flow style (`{}`, `[]`), and multi-document streams.
|
|
9
|
+
*/
|
|
10
|
+
import type { JsonValue } from "../types";
|
|
11
|
+
export declare class YamlParseError extends Error {
|
|
12
|
+
readonly line: number;
|
|
13
|
+
constructor(message: string, line: number);
|
|
14
|
+
}
|
|
15
|
+
export interface ParsedYaml {
|
|
16
|
+
value: JsonValue;
|
|
17
|
+
keyLines: Map<string, number>;
|
|
18
|
+
duplicates: {
|
|
19
|
+
path: string;
|
|
20
|
+
line: number;
|
|
21
|
+
}[];
|
|
22
|
+
}
|
|
23
|
+
export declare function parseYaml(text: string): ParsedYaml;
|
|
24
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/yaml/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,qBAAa,cAAe,SAAQ,KAAK;aAGrB,IAAI,EAAE,MAAM;gBAD5B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM;CAK/B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9C;AAYD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAqElD"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A minimal YAML parser for the subset used by locale files: indentation-based
|
|
4
|
+
* nested mappings, scalar values, comments, and simple scalar lists. It returns
|
|
5
|
+
* the same shape as the JSON parser (value + key lines + duplicates) so the
|
|
6
|
+
* locale loader can treat YAML and JSON the same way.
|
|
7
|
+
*
|
|
8
|
+
* Not supported (uncommon in locale files): anchors/aliases, block scalars
|
|
9
|
+
* (`|`, `>`), flow style (`{}`, `[]`), and multi-document streams.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.YamlParseError = void 0;
|
|
13
|
+
exports.parseYaml = parseYaml;
|
|
14
|
+
class YamlParseError extends Error {
|
|
15
|
+
line;
|
|
16
|
+
constructor(message, line) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.line = line;
|
|
19
|
+
this.name = "YamlParseError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.YamlParseError = YamlParseError;
|
|
23
|
+
function parseYaml(text) {
|
|
24
|
+
const keyLines = new Map();
|
|
25
|
+
const duplicates = [];
|
|
26
|
+
const root = {};
|
|
27
|
+
const stack = [
|
|
28
|
+
{ indent: -1, node: root, parent: null, attach: null, path: "", seen: new Set(), nextIndex: 0 },
|
|
29
|
+
];
|
|
30
|
+
const lines = text.split("\n");
|
|
31
|
+
for (let i = 0; i < lines.length; i++) {
|
|
32
|
+
const lineNo = i + 1;
|
|
33
|
+
const rawLine = stripComment(lines[i] ?? "");
|
|
34
|
+
if (rawLine.trim() === "")
|
|
35
|
+
continue;
|
|
36
|
+
if (rawLine.startsWith("\t"))
|
|
37
|
+
throw new YamlParseError("Tabs are not allowed in indentation", lineNo);
|
|
38
|
+
const indent = rawLine.length - rawLine.trimStart().length;
|
|
39
|
+
const content = rawLine.trim();
|
|
40
|
+
while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {
|
|
41
|
+
const popped = stack.pop();
|
|
42
|
+
if (popped.node === null && popped.parent !== null && popped.attach !== null) {
|
|
43
|
+
popped.parent[popped.attach] = null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const frame = stack[stack.length - 1];
|
|
47
|
+
if (content.startsWith("- ")) {
|
|
48
|
+
const arr = materialize(frame, true);
|
|
49
|
+
const index = frame.nextIndex++;
|
|
50
|
+
arr.push(parseScalar(content.slice(2).trim()));
|
|
51
|
+
keyLines.set(frame.path ? `${frame.path}.${index}` : String(index), lineNo);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const match = /^("(?:[^"]|\\.)*"|'[^']*'|[^:]+?)\s*:(?:\s+(.*))?$/.exec(content);
|
|
55
|
+
if (!match)
|
|
56
|
+
throw new YamlParseError("Invalid YAML line", lineNo);
|
|
57
|
+
const key = unquote(match[1].trim());
|
|
58
|
+
const rest = match[2]?.trim() ?? "";
|
|
59
|
+
const map = materialize(frame, false);
|
|
60
|
+
const fullPath = frame.path ? `${frame.path}.${key}` : key;
|
|
61
|
+
if (frame.seen.has(key))
|
|
62
|
+
duplicates.push({ path: fullPath, line: lineNo });
|
|
63
|
+
else
|
|
64
|
+
frame.seen.add(key);
|
|
65
|
+
keyLines.set(fullPath, lineNo);
|
|
66
|
+
if (rest === "") {
|
|
67
|
+
stack.push({
|
|
68
|
+
indent,
|
|
69
|
+
node: null,
|
|
70
|
+
parent: map,
|
|
71
|
+
attach: key,
|
|
72
|
+
path: fullPath,
|
|
73
|
+
seen: new Set(),
|
|
74
|
+
nextIndex: 0,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
map[key] = parseScalar(rest);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Materialize any trailing deferred frames as null.
|
|
82
|
+
for (let i = 1; i < stack.length; i++) {
|
|
83
|
+
const f = stack[i];
|
|
84
|
+
if (f.node === null && f.parent !== null && f.attach !== null) {
|
|
85
|
+
f.parent[f.attach] = null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { value: root, keyLines, duplicates };
|
|
89
|
+
}
|
|
90
|
+
function materialize(frame, asArray) {
|
|
91
|
+
if (frame.node === null) {
|
|
92
|
+
frame.node = asArray ? [] : {};
|
|
93
|
+
if (frame.parent !== null && frame.attach !== null) {
|
|
94
|
+
frame.parent[frame.attach] = frame.node;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return frame.node;
|
|
98
|
+
}
|
|
99
|
+
function parseScalar(text) {
|
|
100
|
+
if (text.length >= 2 && text.startsWith('"') && text.endsWith('"')) {
|
|
101
|
+
try {
|
|
102
|
+
return JSON.parse(text);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return text.slice(1, -1);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (text.length >= 2 && text.startsWith("'") && text.endsWith("'")) {
|
|
109
|
+
return text.slice(1, -1).replace(/''/g, "'");
|
|
110
|
+
}
|
|
111
|
+
if (text === "true")
|
|
112
|
+
return true;
|
|
113
|
+
if (text === "false")
|
|
114
|
+
return false;
|
|
115
|
+
if (text === "null" || text === "~")
|
|
116
|
+
return null;
|
|
117
|
+
if (/^-?\d+$/.test(text))
|
|
118
|
+
return Number(text);
|
|
119
|
+
if (/^-?\d*\.\d+$/.test(text))
|
|
120
|
+
return Number(text);
|
|
121
|
+
return text;
|
|
122
|
+
}
|
|
123
|
+
function unquote(text) {
|
|
124
|
+
if (text.length >= 2 && text.startsWith('"') && text.endsWith('"')) {
|
|
125
|
+
try {
|
|
126
|
+
return JSON.parse(text);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return text.slice(1, -1);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (text.length >= 2 && text.startsWith("'") && text.endsWith("'")) {
|
|
133
|
+
return text.slice(1, -1).replace(/''/g, "'");
|
|
134
|
+
}
|
|
135
|
+
return text;
|
|
136
|
+
}
|
|
137
|
+
function stripComment(line) {
|
|
138
|
+
let inSingle = false;
|
|
139
|
+
let inDouble = false;
|
|
140
|
+
for (let i = 0; i < line.length; i++) {
|
|
141
|
+
const ch = line[i];
|
|
142
|
+
if (ch === "'" && !inDouble)
|
|
143
|
+
inSingle = !inSingle;
|
|
144
|
+
else if (ch === '"' && !inSingle)
|
|
145
|
+
inDouble = !inDouble;
|
|
146
|
+
else if (ch === "#" && !inSingle && !inDouble && (i === 0 || line[i - 1] === " " || line[i - 1] === "\t")) {
|
|
147
|
+
return line.slice(0, i);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return line;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/yaml/parse.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED