@localeguard/template-analyzer 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/dist/src/angular.d.ts +1 -1
- package/dist/src/angular.d.ts.map +1 -1
- package/dist/src/angular.js +2 -2
- package/dist/src/angular.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/key-references.d.ts +32 -0
- package/dist/src/key-references.d.ts.map +1 -0
- package/dist/src/key-references.js +120 -0
- package/dist/src/key-references.js.map +1 -0
- package/dist/src/vue-i18n-block.d.ts +24 -0
- package/dist/src/vue-i18n-block.d.ts.map +1 -0
- package/dist/src/vue-i18n-block.js +139 -0
- package/dist/src/vue-i18n-block.js.map +1 -0
- package/package.json +2 -2
package/dist/src/angular.d.ts
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Angular component templates (external `.html` files).
|
|
3
3
|
*/
|
|
4
4
|
import type { Issue } from "@localeguard/core";
|
|
5
|
-
export declare function scanAngularTemplate(source: string, fileName: string, translationComponents?: string[]): Issue[];
|
|
5
|
+
export declare function scanAngularTemplate(source: string, fileName: string, translationComponents?: string[], startLine?: number): Issue[];
|
|
6
6
|
//# sourceMappingURL=angular.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular.d.ts","sourceRoot":"","sources":["../../src/angular.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI/C,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,qBAAqB,CAAC,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"angular.d.ts","sourceRoot":"","sources":["../../src/angular.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI/C,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,qBAAqB,CAAC,EAAE,MAAM,EAAE,EAChC,SAAS,SAAI,GACZ,KAAK,EAAE,CAOT"}
|
package/dist/src/angular.js
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.scanAngularTemplate = scanAngularTemplate;
|
|
7
7
|
const scanner_1 = require("./scanner");
|
|
8
|
-
function scanAngularTemplate(source, fileName, translationComponents) {
|
|
8
|
+
function scanAngularTemplate(source, fileName, translationComponents, startLine = 1) {
|
|
9
9
|
return (0, scanner_1.scanTemplate)(source, {
|
|
10
10
|
mode: "angular",
|
|
11
11
|
fileName,
|
|
12
|
-
startLine
|
|
12
|
+
startLine,
|
|
13
13
|
translationComponents,
|
|
14
14
|
});
|
|
15
15
|
}
|
package/dist/src/angular.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular.js","sourceRoot":"","sources":["../../src/angular.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAMH,
|
|
1
|
+
{"version":3,"file":"angular.js","sourceRoot":"","sources":["../../src/angular.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAMH,kDAYC;AAdD,uCAAyC;AAEzC,SAAgB,mBAAmB,CACjC,MAAc,EACd,QAAgB,EAChB,qBAAgC,EAChC,SAAS,GAAG,CAAC;IAEb,OAAO,IAAA,sBAAY,EAAC,MAAM,EAAE;QAC1B,IAAI,EAAE,SAAS;QACf,QAAQ;QACR,SAAS;QACT,qBAAqB;KACtB,CAAC,CAAC;AACL,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -18,4 +18,8 @@ export { scanTemplate } from "./scanner";
|
|
|
18
18
|
export type { ScanOptions, TemplateMode } from "./scanner";
|
|
19
19
|
export { scanVueSfc } from "./vue";
|
|
20
20
|
export { scanAngularTemplate } from "./angular";
|
|
21
|
+
export { extractTemplateKeyReferences, scanTemplateString } from "./key-references";
|
|
22
|
+
export type { TemplateKeyConfig, TemplateKeyResult } from "./key-references";
|
|
23
|
+
export { analyzeVueI18nBlocks } from "./vue-i18n-block";
|
|
24
|
+
export type { VueI18nBlockConfig } from "./vue-i18n-block";
|
|
21
25
|
//# sourceMappingURL=index.d.ts.map
|
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;;;GAGG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAK1D,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAK1D,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;CACjB;AAaD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,cAAc,GAAG,KAAK,EAAE,CA6B9F;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACpF,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -37,7 +37,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
37
37
|
};
|
|
38
38
|
})();
|
|
39
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.scanAngularTemplate = exports.scanVueSfc = exports.scanTemplate = void 0;
|
|
40
|
+
exports.analyzeVueI18nBlocks = exports.scanTemplateString = exports.extractTemplateKeyReferences = exports.scanAngularTemplate = exports.scanVueSfc = exports.scanTemplate = void 0;
|
|
41
41
|
exports.analyzeTemplates = analyzeTemplates;
|
|
42
42
|
const fs = __importStar(require("node:fs"));
|
|
43
43
|
const path = __importStar(require("node:path"));
|
|
@@ -48,16 +48,19 @@ const vue_1 = require("./vue");
|
|
|
48
48
|
function defaultInclude(framework) {
|
|
49
49
|
if (framework === "vue-i18n")
|
|
50
50
|
return ["src/**/*.vue"];
|
|
51
|
-
if (framework === "ngx-translate")
|
|
51
|
+
if (framework === "ngx-translate" || framework === "angular")
|
|
52
52
|
return ["src/**/*.html"];
|
|
53
53
|
return [];
|
|
54
54
|
}
|
|
55
|
+
function isAngular(framework) {
|
|
56
|
+
return framework === "ngx-translate" || framework === "angular";
|
|
57
|
+
}
|
|
55
58
|
function analyzeTemplates(config, opts) {
|
|
56
59
|
const include = config.include ?? defaultInclude(config.framework);
|
|
57
60
|
if (include.length === 0)
|
|
58
61
|
return [];
|
|
59
62
|
const files = (0, core_1.findFiles)({ rootDir: opts.rootDir, include, ignore: config.ignore });
|
|
60
|
-
const angular = config.framework
|
|
63
|
+
const angular = isAngular(config.framework);
|
|
61
64
|
const issues = [];
|
|
62
65
|
for (const absFile of files) {
|
|
63
66
|
const ext = path.extname(absFile).toLowerCase();
|
|
@@ -88,4 +91,9 @@ var vue_2 = require("./vue");
|
|
|
88
91
|
Object.defineProperty(exports, "scanVueSfc", { enumerable: true, get: function () { return vue_2.scanVueSfc; } });
|
|
89
92
|
var angular_2 = require("./angular");
|
|
90
93
|
Object.defineProperty(exports, "scanAngularTemplate", { enumerable: true, get: function () { return angular_2.scanAngularTemplate; } });
|
|
94
|
+
var key_references_1 = require("./key-references");
|
|
95
|
+
Object.defineProperty(exports, "extractTemplateKeyReferences", { enumerable: true, get: function () { return key_references_1.extractTemplateKeyReferences; } });
|
|
96
|
+
Object.defineProperty(exports, "scanTemplateString", { enumerable: true, get: function () { return key_references_1.scanTemplateString; } });
|
|
97
|
+
var vue_i18n_block_1 = require("./vue-i18n-block");
|
|
98
|
+
Object.defineProperty(exports, "analyzeVueI18nBlocks", { enumerable: true, get: function () { return vue_i18n_block_1.analyzeVueI18nBlocks; } });
|
|
91
99
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCH,4CA6BC;AA7DD,4CAA8B;AAC9B,gDAAkC;AAElC,4CAA8C;AAG9C,uCAAgD;AAChD,+BAAmC;AAcnC,4DAA4D;AAC5D,SAAS,cAAc,CAAC,SAAqB;IAC3C,IAAI,SAAS,KAAK,UAAU;QAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACtD,IAAI,SAAS,KAAK,eAAe,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACvF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,SAAS,CAAC,SAAqB;IACtC,OAAO,SAAS,KAAK,eAAe,IAAI,SAAS,KAAK,SAAS,CAAC;AAClE,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAA8B,EAAE,IAAoB;IACnF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,KAAK,GAAG,IAAA,gBAAS,EAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,6EAA6E;QAC7E,qDAAqD;QACrD,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,OAAO,CAAC;YAAE,SAAS;QAE9D,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,OAAO,CAAC;QAE5D,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAA,gBAAU,EAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,IAAA,6BAAmB,EAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qCAAyC;AAAhC,uGAAA,YAAY,OAAA;AAErB,6BAAmC;AAA1B,iGAAA,UAAU,OAAA;AACnB,qCAAgD;AAAvC,8GAAA,mBAAmB,OAAA;AAC5B,mDAAoF;AAA3E,8HAAA,4BAA4B,OAAA;AAAE,oHAAA,kBAAkB,OAAA;AAEzD,mDAAwD;AAA/C,sHAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract literal translation-key references from Vue/Angular templates so the
|
|
3
|
+
* key-usage checks (undefined-key / unused-key) cover them too.
|
|
4
|
+
*
|
|
5
|
+
* Recognizes:
|
|
6
|
+
* - `{{ t('key') }}` / `{{ $t('key') }}` (Vue / vue-i18n)
|
|
7
|
+
* - `v-t="'key'"`, `<i18n-t keypath="key">` (Vue)
|
|
8
|
+
* - `{{ 'KEY' | translate }}`, `[translate]="'KEY'"` (Angular ngx-translate)
|
|
9
|
+
*
|
|
10
|
+
* Templates rarely carry a resolvable namespace, so references are emitted
|
|
11
|
+
* without one (matched exactly or by namespaced-key suffix downstream).
|
|
12
|
+
*/
|
|
13
|
+
import type { Framework, KeyReference } from "@localeguard/core";
|
|
14
|
+
export interface TemplateKeyConfig {
|
|
15
|
+
include?: string[];
|
|
16
|
+
ignore?: string[];
|
|
17
|
+
framework?: Framework;
|
|
18
|
+
}
|
|
19
|
+
export interface AnalyzeOptions {
|
|
20
|
+
rootDir: string;
|
|
21
|
+
}
|
|
22
|
+
export interface TemplateKeyResult {
|
|
23
|
+
references: KeyReference[];
|
|
24
|
+
hasDynamicKeys: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function extractTemplateKeyReferences(config: TemplateKeyConfig, opts: AnalyzeOptions): TemplateKeyResult;
|
|
27
|
+
/**
|
|
28
|
+
* Extract key references from a template string (used for inline Angular
|
|
29
|
+
* templates, where `startLine` offsets line numbers back into the .ts file).
|
|
30
|
+
*/
|
|
31
|
+
export declare function scanTemplateString(text: string, file: string, startLine?: number): TemplateKeyResult;
|
|
32
|
+
//# sourceMappingURL=key-references.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-references.d.ts","sourceRoot":"","sources":["../../src/key-references.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AASjE,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;CACzB;AAQD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,cAAc,GACnB,iBAAiB,CAwBnB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,SAAI,GACZ,iBAAiB,CAInB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Extract literal translation-key references from Vue/Angular templates so the
|
|
4
|
+
* key-usage checks (undefined-key / unused-key) cover them too.
|
|
5
|
+
*
|
|
6
|
+
* Recognizes:
|
|
7
|
+
* - `{{ t('key') }}` / `{{ $t('key') }}` (Vue / vue-i18n)
|
|
8
|
+
* - `v-t="'key'"`, `<i18n-t keypath="key">` (Vue)
|
|
9
|
+
* - `{{ 'KEY' | translate }}`, `[translate]="'KEY'"` (Angular ngx-translate)
|
|
10
|
+
*
|
|
11
|
+
* Templates rarely carry a resolvable namespace, so references are emitted
|
|
12
|
+
* without one (matched exactly or by namespaced-key suffix downstream).
|
|
13
|
+
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.extractTemplateKeyReferences = extractTemplateKeyReferences;
|
|
49
|
+
exports.scanTemplateString = scanTemplateString;
|
|
50
|
+
const fs = __importStar(require("node:fs"));
|
|
51
|
+
const path = __importStar(require("node:path"));
|
|
52
|
+
const core_1 = require("@localeguard/core");
|
|
53
|
+
const T_CALL = /(?:\b|\$)t\(\s*(['"])([^'"]+)\1/g;
|
|
54
|
+
const T_DYNAMIC = /(?:\b|\$)t\(\s*[^'"\s)]/;
|
|
55
|
+
const TRANSLATE_PIPE = /(['"])([^'"]+)\1\s*\|\s*translate\b/g;
|
|
56
|
+
const V_T = /\bv-t\s*=\s*(?:"\s*'([^']+)'\s*"|'\s*"([^"]+)"\s*')/g;
|
|
57
|
+
const KEYPATH = /\bkeypath\s*=\s*(?:"([^"]+)"|'([^']+)')/g;
|
|
58
|
+
const TRANSLATE_ATTR = /\[translate\]\s*=\s*(?:"\s*'([^']+)'\s*"|'\s*"([^"]+)"\s*')/g;
|
|
59
|
+
function defaultInclude(framework) {
|
|
60
|
+
if (framework === "vue-i18n")
|
|
61
|
+
return ["src/**/*.vue"];
|
|
62
|
+
if (framework === "ngx-translate" || framework === "angular")
|
|
63
|
+
return ["src/**/*.html"];
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
function extractTemplateKeyReferences(config, opts) {
|
|
67
|
+
const include = config.include ?? defaultInclude(config.framework);
|
|
68
|
+
if (include.length === 0)
|
|
69
|
+
return { references: [], hasDynamicKeys: false };
|
|
70
|
+
const files = (0, core_1.findFiles)({ rootDir: opts.rootDir, include, ignore: config.ignore });
|
|
71
|
+
const references = [];
|
|
72
|
+
let hasDynamicKeys = false;
|
|
73
|
+
for (const absFile of files) {
|
|
74
|
+
const ext = path.extname(absFile).toLowerCase();
|
|
75
|
+
if (ext !== ".vue" && ext !== ".html")
|
|
76
|
+
continue;
|
|
77
|
+
let text;
|
|
78
|
+
try {
|
|
79
|
+
text = fs.readFileSync(absFile, "utf8");
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const relPath = path.relative(opts.rootDir, absFile) || absFile;
|
|
85
|
+
const result = scanTemplateString(text, relPath);
|
|
86
|
+
references.push(...result.references);
|
|
87
|
+
if (result.hasDynamicKeys)
|
|
88
|
+
hasDynamicKeys = true;
|
|
89
|
+
}
|
|
90
|
+
return { references, hasDynamicKeys };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Extract key references from a template string (used for inline Angular
|
|
94
|
+
* templates, where `startLine` offsets line numbers back into the .ts file).
|
|
95
|
+
*/
|
|
96
|
+
function scanTemplateString(text, file, startLine = 1) {
|
|
97
|
+
const references = [];
|
|
98
|
+
collect(text, file, references, startLine);
|
|
99
|
+
return { references, hasDynamicKeys: T_DYNAMIC.test(text) };
|
|
100
|
+
}
|
|
101
|
+
function collect(text, file, refs, startLine) {
|
|
102
|
+
const add = (key, index) => {
|
|
103
|
+
if (key)
|
|
104
|
+
refs.push({ key, file, line: startLine - 1 + lineAt(text, index) });
|
|
105
|
+
};
|
|
106
|
+
for (const m of text.matchAll(T_CALL))
|
|
107
|
+
add(m[2], m.index ?? 0);
|
|
108
|
+
for (const m of text.matchAll(TRANSLATE_PIPE))
|
|
109
|
+
add(m[2], m.index ?? 0);
|
|
110
|
+
for (const m of text.matchAll(V_T))
|
|
111
|
+
add(m[1] ?? m[2], m.index ?? 0);
|
|
112
|
+
for (const m of text.matchAll(KEYPATH))
|
|
113
|
+
add(m[1] ?? m[2], m.index ?? 0);
|
|
114
|
+
for (const m of text.matchAll(TRANSLATE_ATTR))
|
|
115
|
+
add(m[1] ?? m[2], m.index ?? 0);
|
|
116
|
+
}
|
|
117
|
+
function lineAt(text, index) {
|
|
118
|
+
return text.slice(0, index).split("\n").length;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=key-references.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-references.js","sourceRoot":"","sources":["../../src/key-references.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vue I18n single-file-component `<i18n>` custom blocks. These hold per-component
|
|
3
|
+
* messages, typically as a JSON object keyed by locale:
|
|
4
|
+
*
|
|
5
|
+
* <i18n>
|
|
6
|
+
* { "en": { "hello": "Hello {name}" }, "fr": { "hello": "Bonjour {name}" } }
|
|
7
|
+
* </i18n>
|
|
8
|
+
*
|
|
9
|
+
* We check parity between the locales declared *within each block* (missing /
|
|
10
|
+
* extra keys and interpolation), scoped to the `.vue` file.
|
|
11
|
+
*/
|
|
12
|
+
import type { Framework, Issue } from "@localeguard/core";
|
|
13
|
+
export interface VueI18nBlockConfig {
|
|
14
|
+
sourceLocale: string;
|
|
15
|
+
locales: string[];
|
|
16
|
+
framework?: Framework;
|
|
17
|
+
include?: string[];
|
|
18
|
+
ignore?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface AnalyzeOptions {
|
|
21
|
+
rootDir: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function analyzeVueI18nBlocks(config: VueI18nBlockConfig, opts: AnalyzeOptions): Issue[];
|
|
24
|
+
//# sourceMappingURL=vue-i18n-block.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue-i18n-block.d.ts","sourceRoot":"","sources":["../../src/vue-i18n-block.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAa,MAAM,mBAAmB,CAAC;AAErE,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,cAAc,GAAG,KAAK,EAAE,CAiB9F"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Vue I18n single-file-component `<i18n>` custom blocks. These hold per-component
|
|
4
|
+
* messages, typically as a JSON object keyed by locale:
|
|
5
|
+
*
|
|
6
|
+
* <i18n>
|
|
7
|
+
* { "en": { "hello": "Hello {name}" }, "fr": { "hello": "Bonjour {name}" } }
|
|
8
|
+
* </i18n>
|
|
9
|
+
*
|
|
10
|
+
* We check parity between the locales declared *within each block* (missing /
|
|
11
|
+
* extra keys and interpolation), scoped to the `.vue` file.
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.analyzeVueI18nBlocks = analyzeVueI18nBlocks;
|
|
48
|
+
const fs = __importStar(require("node:fs"));
|
|
49
|
+
const path = __importStar(require("node:path"));
|
|
50
|
+
const core_1 = require("@localeguard/core");
|
|
51
|
+
const BLOCK_RE = /<i18n\b([^>]*)>([\s\S]*?)<\/i18n>/gi;
|
|
52
|
+
const LANG_RE = /\blang\s*=\s*["']([^"']+)["']/i;
|
|
53
|
+
const LOCALE_ATTR_RE = /\blocale\s*=\s*["']([^"']+)["']/i;
|
|
54
|
+
function analyzeVueI18nBlocks(config, opts) {
|
|
55
|
+
const include = config.include ?? ["src/**/*.vue"];
|
|
56
|
+
const files = (0, core_1.findFiles)({ rootDir: opts.rootDir, include, ignore: config.ignore });
|
|
57
|
+
const issues = [];
|
|
58
|
+
for (const absFile of files) {
|
|
59
|
+
if (path.extname(absFile).toLowerCase() !== ".vue")
|
|
60
|
+
continue;
|
|
61
|
+
let text;
|
|
62
|
+
try {
|
|
63
|
+
text = fs.readFileSync(absFile, "utf8");
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const relPath = path.relative(opts.rootDir, absFile) || absFile;
|
|
69
|
+
analyzeBlocks(text, relPath, config, issues);
|
|
70
|
+
}
|
|
71
|
+
return issues;
|
|
72
|
+
}
|
|
73
|
+
function analyzeBlocks(text, file, config, issues) {
|
|
74
|
+
for (const match of text.matchAll(BLOCK_RE)) {
|
|
75
|
+
const attrs = match[1] ?? "";
|
|
76
|
+
const body = match[2] ?? "";
|
|
77
|
+
// Only JSON blocks; `locale="x"` single-locale blocks can't be compared alone.
|
|
78
|
+
const lang = LANG_RE.exec(attrs)?.[1]?.toLowerCase();
|
|
79
|
+
if ((lang && lang !== "json") || LOCALE_ATTR_RE.test(attrs))
|
|
80
|
+
continue;
|
|
81
|
+
const blockLine = lineAt(text, match.index ?? 0);
|
|
82
|
+
let value;
|
|
83
|
+
try {
|
|
84
|
+
value = (0, core_1.parseJson)(body).value;
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
const pe = err;
|
|
88
|
+
issues.push({
|
|
89
|
+
type: "invalid-json",
|
|
90
|
+
severity: core_1.SEVERITY_BY_TYPE["invalid-json"],
|
|
91
|
+
file,
|
|
92
|
+
line: blockLine + (pe.line - 1),
|
|
93
|
+
message: `Invalid JSON in <i18n> block: ${pe.message}`,
|
|
94
|
+
suggestion: "Fix the JSON inside the <i18n> block.",
|
|
95
|
+
});
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
99
|
+
continue;
|
|
100
|
+
const messages = value;
|
|
101
|
+
const sourceMessages = messages[config.sourceLocale];
|
|
102
|
+
if (sourceMessages === undefined)
|
|
103
|
+
continue;
|
|
104
|
+
const sourceFlat = (0, core_1.flatten)(sourceMessages);
|
|
105
|
+
for (const locale of config.locales) {
|
|
106
|
+
if (locale === config.sourceLocale)
|
|
107
|
+
continue;
|
|
108
|
+
const targetMessages = messages[locale];
|
|
109
|
+
if (targetMessages === undefined)
|
|
110
|
+
continue; // locale not declared in this block
|
|
111
|
+
const targetFlat = (0, core_1.flatten)(targetMessages);
|
|
112
|
+
const diff = (0, core_1.compareKeys)(sourceFlat.keys(), targetFlat.keys());
|
|
113
|
+
for (const key of diff.missing) {
|
|
114
|
+
issues.push(blockIssue("missing-key", locale, key, file, blockLine, `Key "${key}" is missing in "${locale}" (<i18n> block).`));
|
|
115
|
+
}
|
|
116
|
+
for (const key of diff.extra) {
|
|
117
|
+
issues.push(blockIssue("extra-key", locale, key, file, blockLine, `Key "${key}" in "${locale}" is not in source "${config.sourceLocale}" (<i18n> block).`));
|
|
118
|
+
}
|
|
119
|
+
for (const key of diff.shared) {
|
|
120
|
+
const pdiff = (0, core_1.comparePlaceholders)(sourceFlat.get(key), targetFlat.get(key));
|
|
121
|
+
if (pdiff) {
|
|
122
|
+
const parts = [];
|
|
123
|
+
if (pdiff.missing.length)
|
|
124
|
+
parts.push(`missing ${pdiff.missing.map((v) => `{${v}}`).join(", ")}`);
|
|
125
|
+
if (pdiff.extra.length)
|
|
126
|
+
parts.push(`unexpected ${pdiff.extra.map((v) => `{${v}}`).join(", ")}`);
|
|
127
|
+
issues.push(blockIssue("placeholder-mismatch", locale, key, file, blockLine, `Interpolation mismatch in "${key}" (${locale}, <i18n> block): ${parts.join("; ")}.`));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function blockIssue(type, locale, key, file, line, message) {
|
|
134
|
+
return { type, severity: core_1.SEVERITY_BY_TYPE[type], locale, key, file, line, message };
|
|
135
|
+
}
|
|
136
|
+
function lineAt(text, index) {
|
|
137
|
+
return text.slice(0, index).split("\n").length;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=vue-i18n-block.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue-i18n-block.js","sourceRoot":"","sources":["../../src/vue-i18n-block.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@localeguard/template-analyzer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Detect hardcoded text in Vue (.vue) and Angular (.html) templates for LocaleGuard.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "isamrish",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"prepublishOnly": "tsc -b"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@localeguard/core": "0.
|
|
28
|
+
"@localeguard/core": "0.4.0"
|
|
29
29
|
},
|
|
30
30
|
"publishConfig": {
|
|
31
31
|
"access": "public"
|