@o3r/localization 9.4.0-alpha.49 → 9.4.0-alpha.50

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.
@@ -1,5 +1,6 @@
1
1
  import { logging } from '@angular-devkit/core';
2
2
  import type { JSONLocalization, LocalizationMetadata } from '@o3r/localization';
3
+ import type { LocalizationExtractorBuilderSchema } from '../localization-extractor/schema';
3
4
  /** Map of Localization Metadata base on localization key */
4
5
  export interface LocalizationMetadataAsMap {
5
6
  [key: string]: JSONLocalization;
@@ -38,10 +39,11 @@ export interface LibraryMetadataMap {
38
39
  * Localization extractor
39
40
  */
40
41
  export declare class LocalizationExtractor {
42
+ private options?;
41
43
  /** TsConfig of the file to base on */
42
44
  private tsconfigPath;
43
45
  private logger;
44
- constructor(tsconfigPath: string, logger: logging.LoggerApi);
46
+ constructor(tsconfigPath: string, logger: logging.LoggerApi, options?: Partial<LocalizationExtractorBuilderSchema> | undefined);
45
47
  /** Get the list of file from tsconfig.json */
46
48
  private getFilesFromTsConfig;
47
49
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"localization.generator.d.ts","sourceRoot":"","sources":["../../../builders/helpers/localization.generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAUhF,4DAA4D;AAC5D,MAAM,WAAW,yBAAyB;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC;CACjC;AAED,6BAA6B;AAC7B,MAAM,WAAW,qBAAqB;IACpC,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,kCAAkC;AAClC,MAAM,WAAW,oBAAoB;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAAC;CACtC;AAED,gCAAgC;AAChC,MAAM,WAAW,mBAAmB;IAClC,CAAC,IAAI,EAAE,MAAM,GAAG;QACd,IAAI,EAAE,oBAAoB,CAAC;QAC3B,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;CACH;AAED,4BAA4B;AAC5B,MAAM,WAAW,kBAAkB;IACjC,CAAC,mBAAmB,EAAE,MAAM,GAAG,oBAAoB,CAAC;CACrD;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAEhC,sCAAsC;IACtC,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,MAAM,CAAoB;gBAEtB,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS;IAK3D,8CAA8C;IAC9C,OAAO,CAAC,oBAAoB;IAK5B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;;;;OAKG;IACH,OAAO,CAAC,oCAAoC;IA4B5C;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAYnB,kDAAkD;IAC3C,uBAAuB;;;;;IAc9B;;;;;;OAMG;IACU,kBAAkB,CAAC,iBAAiB,EAAE,MAAM,EAAE,EAAE,kBAAkB,GAAE,MAAM,EAAO,EAAE,YAAY,UAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA2BnJ;;;;OAIG;IACU,+BAA+B,CAAC,sBAAsB,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA8BjH;;;;OAIG;IACU,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE;IAQzD;;;;OAIG;IACU,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE;IASzD;;;;;;;;;OASG;IACI,gBAAgB,CAAC,eAAe,EAAE,mBAAmB,EAAE,OAAO,EAAE;QACrE,mBAAmB,EAAE,OAAO,CAAC;QAC7B,eAAe,EAAE,kBAAkB,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,OAAO,CAAC;KACnB,GAAG,oBAAoB;CAkCzB"}
1
+ {"version":3,"file":"localization.generator.d.ts","sourceRoot":"","sources":["../../../builders/helpers/localization.generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAMhF,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,kCAAkC,CAAC;AAK3F,4DAA4D;AAC5D,MAAM,WAAW,yBAAyB;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC;CACjC;AAED,6BAA6B;AAC7B,MAAM,WAAW,qBAAqB;IACpC,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,kCAAkC;AAClC,MAAM,WAAW,oBAAoB;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAAC;CACtC;AAED,gCAAgC;AAChC,MAAM,WAAW,mBAAmB;IAClC,CAAC,IAAI,EAAE,MAAM,GAAG;QACd,IAAI,EAAE,oBAAoB,CAAC;QAC3B,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;CACH;AAED,4BAA4B;AAC5B,MAAM,WAAW,kBAAkB;IACjC,CAAC,mBAAmB,EAAE,MAAM,GAAG,oBAAoB,CAAC;CACrD;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAO6B,OAAO,CAAC,OAAO,CAAC;IAL7E,sCAAsC;IACtC,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,MAAM,CAAoB;gBAEtB,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,EAAU,OAAO,CAAC,yDAA6C;IAK1H,8CAA8C;IAC9C,OAAO,CAAC,oBAAoB;IAK5B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;;;;OAKG;IACH,OAAO,CAAC,oCAAoC;IAiC5C;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAYnB,kDAAkD;IAC3C,uBAAuB;;;;;IAc9B;;;;;;OAMG;IACU,kBAAkB,CAAC,iBAAiB,EAAE,MAAM,EAAE,EAAE,kBAAkB,GAAE,MAAM,EAAO,EAAE,YAAY,UAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA2BnJ;;;;OAIG;IACU,+BAA+B,CAAC,sBAAsB,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA8BjH;;;;OAIG;IACU,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE;IAQzD;;;;OAIG;IACU,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE;IASzD;;;;;;;;;OASG;IACI,gBAAgB,CAAC,eAAe,EAAE,mBAAmB,EAAE,OAAO,EAAE;QACrE,mBAAmB,EAAE,OAAO,CAAC;QAC7B,eAAe,EAAE,kBAAkB,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,OAAO,CAAC;KACnB,GAAG,oBAAoB;CAsDzB"}
@@ -13,7 +13,8 @@ const ANGULAR_ANNOTATION = ['Component', 'Injectable', 'Pipe'];
13
13
  * Localization extractor
14
14
  */
15
15
  class LocalizationExtractor {
16
- constructor(tsconfigPath, logger) {
16
+ constructor(tsconfigPath, logger, options) {
17
+ this.options = options;
17
18
  this.tsconfigPath = tsconfigPath;
18
19
  this.logger = logger;
19
20
  }
@@ -71,15 +72,19 @@ class LocalizationExtractor {
71
72
  })
72
73
  .map(({ ref }) => {
73
74
  if (!ref.startsWith('.')) {
74
- try {
75
- return require.resolve(ref);
76
- }
77
- catch {
78
- // Should be a local file
75
+ if (this.options?.libraries?.length && this.options.libraries.every((lib) => !ref.startsWith(lib))) {
76
+ try {
77
+ return require.resolve(ref);
78
+ }
79
+ catch {
80
+ // Should be a local file
81
+ }
79
82
  }
83
+ return undefined;
80
84
  }
81
85
  return folder ? path.resolve(folder, ref) : ref;
82
- });
86
+ })
87
+ .filter((ref) => !!ref);
83
88
  return referencedFiles.length ? referencedFiles : undefined;
84
89
  }
85
90
  /**
@@ -118,7 +123,13 @@ class LocalizationExtractor {
118
123
  res.tags = loc.tags;
119
124
  }
120
125
  if (loc.$ref) {
121
- res.ref = loc.$ref.split('#/')[1];
126
+ const [refPath, refKey] = loc.$ref.split('#/', 2);
127
+ if (this.options?.libraries?.some((lib) => refPath.startsWith(lib))) {
128
+ res.ref = refKey;
129
+ }
130
+ else {
131
+ res.ref = loc.$ref;
132
+ }
122
133
  }
123
134
  if (typeof loc.defaultValue === 'undefined' && typeof loc.$ref === 'undefined' && !loc.dictionary) {
124
135
  this.logger.error(`${key} has no default value or $ref defined`);
@@ -250,24 +261,41 @@ class LocalizationExtractor {
250
261
  */
251
262
  generateMetadata(localizationMap, options) {
252
263
  const metadata = {};
253
- const addMetadata = (data, origin) => {
264
+ let hasDuplicateKey = false;
265
+ const addMetadata = (data, origin, libraries = []) => {
254
266
  if (metadata[data.key]) {
267
+ hasDuplicateKey = true;
255
268
  if (options.ignoreDuplicateKeys) {
256
269
  this.logger.warn(`The key ${data.key} from ${origin} will override the previous value (${metadata[data.key].value || 'ref ' + metadata[data.key].ref} -> ${data.value || 'ref ' + data.ref})`);
257
270
  }
258
271
  else {
259
272
  this.logger.error(`The key ${data.key} from ${origin} try to override the previous value (${metadata[data.key].value || 'ref ' + metadata[data.key].ref} -> ${data.value || 'ref ' + data.ref})`);
260
- throw new schematics_1.O3rCliError('Duplicate key');
261
273
  }
262
274
  }
263
- metadata[data.key] = data;
275
+ metadata[data.key] = data.ref && data.ref.includes('#/') && libraries.some((lib) => data.ref.startsWith(lib)) ? {
276
+ ...data,
277
+ ref: data.ref.split('#/')[1]
278
+ } : data;
264
279
  };
265
280
  Object.keys(options.libraryMetadata)
266
- .forEach((lib) => options.libraryMetadata[lib].forEach((dataLoc) => addMetadata(dataLoc, lib)));
281
+ .forEach((lib) => options.libraryMetadata[lib].forEach((dataLoc) => addMetadata(dataLoc, lib, this.options?.libraries)));
267
282
  Object.keys(localizationMap)
268
283
  .forEach((locFile) => Object.keys(localizationMap[locFile].data)
269
284
  .forEach((locKey) => addMetadata(this.generateMetadataItemFromLocalization(localizationMap[locFile].data[locKey], locKey), locFile)));
270
- const localizationMetadata = Object.keys(metadata).map((k) => metadata[k]);
285
+ if (hasDuplicateKey && !options.ignoreDuplicateKeys) {
286
+ throw new schematics_1.O3rCliError('Duplicate key');
287
+ }
288
+ const localizationMetadata = Object.values(metadata);
289
+ let hasUnknownRef = false;
290
+ localizationMetadata.forEach((data) => {
291
+ if (data.ref && !data.ref.includes('#/') && !metadata[data.ref]) {
292
+ hasUnknownRef = true;
293
+ this.logger.error(`The key ${data.ref} is unknown but referenced by ${data.key}.`);
294
+ }
295
+ });
296
+ if (hasUnknownRef) {
297
+ throw new schematics_1.O3rCliError('Unknown referenced key');
298
+ }
271
299
  return options.sortKeys ? localizationMetadata.sort((a, b) => this.compareKeys(a, b)) : localizationMetadata;
272
300
  }
273
301
  }
@@ -12,7 +12,7 @@ const validations_1 = require("./validations");
12
12
  tslib_1.__exportStar(require("./schema"), exports);
13
13
  exports.default = (0, architect_1.createBuilder)(async (options, context) => {
14
14
  context.reportRunning();
15
- const localizationExtractor = new localization_generator_1.LocalizationExtractor(path.resolve(context.workspaceRoot, options.tsConfig), context.logger);
15
+ const localizationExtractor = new localization_generator_1.LocalizationExtractor(path.resolve(context.workspaceRoot, options.tsConfig), context.logger, options);
16
16
  const cache = { libs: {}, locs: {} };
17
17
  const execute = async (isFirstLoad = true, files) => {
18
18
  /** Maximum number of steps */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@o3r/localization",
3
- "version": "9.4.0-alpha.49",
3
+ "version": "9.4.0-alpha.50",
4
4
  "description": "This module provides a runtime dynamic language/translation support and debug tools.",
5
5
  "keywords": [
6
6
  "localization",
@@ -20,11 +20,11 @@
20
20
  "@formatjs/intl-numberformat": "^8.0.2",
21
21
  "@ngrx/store": "~16.3.0",
22
22
  "@ngx-translate/core": "~15.0.0",
23
- "@o3r/core": "^9.4.0-alpha.49",
24
- "@o3r/dynamic-content": "^9.4.0-alpha.49",
25
- "@o3r/extractors": "^9.4.0-alpha.49",
26
- "@o3r/logger": "^9.4.0-alpha.49",
27
- "@o3r/schematics": "^9.4.0-alpha.49",
23
+ "@o3r/core": "^9.4.0-alpha.50",
24
+ "@o3r/dynamic-content": "^9.4.0-alpha.50",
25
+ "@o3r/extractors": "^9.4.0-alpha.50",
26
+ "@o3r/logger": "^9.4.0-alpha.50",
27
+ "@o3r/schematics": "^9.4.0-alpha.50",
28
28
  "@schematics/angular": "~16.2.0",
29
29
  "chokidar": "^3.5.2",
30
30
  "intl-messageformat": "~10.5.0",