@breadstone-tools/localizator-core 0.0.85 → 0.0.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/Index.d.ts +11 -7
  3. package/Index.d.ts.map +1 -1
  4. package/Index.js +17 -13
  5. package/Index.js.map +1 -1
  6. package/Resources/Analyzers/ResourceAnalyzer.d.ts +33 -24
  7. package/Resources/Analyzers/ResourceAnalyzer.d.ts.map +1 -1
  8. package/Resources/Analyzers/ResourceAnalyzer.js +60 -57
  9. package/Resources/Analyzers/ResourceAnalyzer.js.map +1 -1
  10. package/Resources/Analyzers/Tasks/DuplicateKeysRule.d.ts +31 -0
  11. package/Resources/Analyzers/Tasks/{DuplicateKeysTask.d.ts.map → DuplicateKeysRule.d.ts.map} +1 -1
  12. package/Resources/Analyzers/Tasks/{DuplicateKeysTask.js → DuplicateKeysRule.js} +6 -6
  13. package/Resources/Analyzers/Tasks/{DuplicateKeysTask.js.map → DuplicateKeysRule.js.map} +1 -1
  14. package/Resources/Analyzers/Tasks/DuplicateValuesRule.d.ts +40 -0
  15. package/Resources/Analyzers/Tasks/DuplicateValuesRule.d.ts.map +1 -0
  16. package/Resources/Analyzers/Tasks/DuplicateValuesRule.js +49 -0
  17. package/Resources/Analyzers/Tasks/DuplicateValuesRule.js.map +1 -0
  18. package/Resources/Analyzers/Tasks/EmptyValuesRule.d.ts +31 -0
  19. package/Resources/Analyzers/Tasks/{EmptyValuesTask.d.ts.map → EmptyValuesRule.d.ts.map} +1 -1
  20. package/Resources/Analyzers/Tasks/{EmptyValuesTask.js → EmptyValuesRule.js} +6 -6
  21. package/Resources/Analyzers/Tasks/{EmptyValuesTask.js.map → EmptyValuesRule.js.map} +1 -1
  22. package/Resources/Analyzers/Tasks/Interfaces/{IAnalyzerTask.d.ts → IAnalyzerRule.d.ts} +9 -9
  23. package/Resources/Analyzers/Tasks/Interfaces/{IAnalyzerTask.d.ts.map → IAnalyzerRule.d.ts.map} +1 -1
  24. package/Resources/Analyzers/Tasks/Interfaces/{IAnalyzerTask.js → IAnalyzerRule.js} +1 -1
  25. package/Resources/Analyzers/Tasks/Interfaces/IAnalyzerRule.js.map +1 -0
  26. package/Resources/Analyzers/Tasks/KeyConsistencyRule.d.ts +35 -0
  27. package/Resources/Analyzers/Tasks/{KeyConsistencyTask.d.ts.map → KeyConsistencyRule.d.ts.map} +1 -1
  28. package/Resources/Analyzers/Tasks/{KeyConsistencyTask.js → KeyConsistencyRule.js} +6 -6
  29. package/Resources/Analyzers/Tasks/{KeyConsistencyTask.js.map → KeyConsistencyRule.js.map} +1 -1
  30. package/Resources/Analyzers/Tasks/MissingTranslationsRule.d.ts +31 -0
  31. package/Resources/Analyzers/Tasks/{MissingTranslationsTask.d.ts.map → MissingTranslationsRule.d.ts.map} +1 -1
  32. package/Resources/Analyzers/Tasks/{MissingTranslationsTask.js → MissingTranslationsRule.js} +6 -6
  33. package/Resources/Analyzers/Tasks/{MissingTranslationsTask.js.map → MissingTranslationsRule.js.map} +1 -1
  34. package/Resources/Analyzers/Tasks/MultipleKeyUsageRule.d.ts +31 -0
  35. package/Resources/Analyzers/Tasks/{MultipleKeyUsageTask.d.ts.map → MultipleKeyUsageRule.d.ts.map} +1 -1
  36. package/Resources/Analyzers/Tasks/{MultipleKeyUsageTask.js → MultipleKeyUsageRule.js} +6 -6
  37. package/Resources/Analyzers/Tasks/{MultipleKeyUsageTask.js.map → MultipleKeyUsageRule.js.map} +1 -1
  38. package/Resources/Analyzers/Tasks/UnusedKeysRule.d.ts +31 -0
  39. package/Resources/Analyzers/Tasks/{UnusedKeysTask.d.ts.map → UnusedKeysRule.d.ts.map} +1 -1
  40. package/Resources/Analyzers/Tasks/{UnusedKeysTask.js → UnusedKeysRule.js} +6 -6
  41. package/Resources/Analyzers/Tasks/{UnusedKeysTask.js.map → UnusedKeysRule.js.map} +1 -1
  42. package/Resources/Models/Interfaces/IPoResourceInfo.d.ts +12 -0
  43. package/Resources/Models/Interfaces/IPoResourceInfo.d.ts.map +1 -0
  44. package/Resources/Models/Interfaces/IPoResourceInfo.js +4 -0
  45. package/Resources/Models/Interfaces/IPoResourceInfo.js.map +1 -0
  46. package/Resources/Models/Interfaces/ResourceType.d.ts +4 -0
  47. package/Resources/Models/Interfaces/ResourceType.d.ts.map +1 -1
  48. package/Resources/Models/Interfaces/ResourceType.js +8 -1
  49. package/Resources/Models/Interfaces/ResourceType.js.map +1 -1
  50. package/Resources/Models/PoResourceInfo.d.ts +110 -0
  51. package/Resources/Models/PoResourceInfo.d.ts.map +1 -0
  52. package/Resources/Models/PoResourceInfo.js +190 -0
  53. package/Resources/Models/PoResourceInfo.js.map +1 -0
  54. package/Resources/PoFileParser.d.ts +48 -0
  55. package/Resources/PoFileParser.d.ts.map +1 -0
  56. package/Resources/PoFileParser.js +111 -0
  57. package/Resources/PoFileParser.js.map +1 -0
  58. package/Resources/PoFileReader.d.ts +25 -0
  59. package/Resources/PoFileReader.d.ts.map +1 -0
  60. package/Resources/PoFileReader.js +43 -0
  61. package/Resources/PoFileReader.js.map +1 -0
  62. package/Resources/Readers/Adapter/PoResourceReaderAdapter.d.ts +44 -0
  63. package/Resources/Readers/Adapter/PoResourceReaderAdapter.d.ts.map +1 -0
  64. package/Resources/Readers/Adapter/PoResourceReaderAdapter.js +118 -0
  65. package/Resources/Readers/Adapter/PoResourceReaderAdapter.js.map +1 -0
  66. package/Resources/Readers/Adapter/ResxResourceReaderAdapter.d.ts +2 -2
  67. package/Resources/Readers/Adapter/ResxResourceReaderAdapter.js +2 -2
  68. package/Resources/Readers/ResourceReader.d.ts.map +1 -1
  69. package/Resources/Readers/ResourceReader.js +3 -1
  70. package/Resources/Readers/ResourceReader.js.map +1 -1
  71. package/Resources/ResourceMode.d.ts +4 -0
  72. package/Resources/ResourceMode.d.ts.map +1 -1
  73. package/Resources/ResourceMode.js +5 -1
  74. package/Resources/ResourceMode.js.map +1 -1
  75. package/Resources/ResourceProcessor.d.ts +3 -3
  76. package/Resources/ResourceProcessor.js +2 -2
  77. package/Resources/Transformers/Adapters/JsonResourceTransformerAdapter.d.ts +1 -8
  78. package/Resources/Transformers/Adapters/JsonResourceTransformerAdapter.d.ts.map +1 -1
  79. package/Resources/Transformers/Adapters/JsonResourceTransformerAdapter.js +1 -22
  80. package/Resources/Transformers/Adapters/JsonResourceTransformerAdapter.js.map +1 -1
  81. package/Resources/Transformers/Adapters/PoResourceTransformerAdapter.d.ts +19 -0
  82. package/Resources/Transformers/Adapters/PoResourceTransformerAdapter.d.ts.map +1 -0
  83. package/Resources/Transformers/Adapters/PoResourceTransformerAdapter.js +30 -0
  84. package/Resources/Transformers/Adapters/PoResourceTransformerAdapter.js.map +1 -0
  85. package/Resources/Transformers/Adapters/ResxResourceTransformerAdapter.d.ts +1 -1
  86. package/Resources/Transformers/Adapters/ResxResourceTransformerAdapter.js +1 -1
  87. package/Resources/Transformers/ResourceTransformer.d.ts.map +1 -1
  88. package/Resources/Transformers/ResourceTransformer.js +14 -5
  89. package/Resources/Transformers/ResourceTransformer.js.map +1 -1
  90. package/Resources/Transformers/Serializers/JsonResourceSerializer.d.ts.map +1 -1
  91. package/Resources/Transformers/Serializers/JsonResourceSerializer.js +13 -6
  92. package/Resources/Transformers/Serializers/JsonResourceSerializer.js.map +1 -1
  93. package/Resources/Transformers/Serializers/PoResourceSerializer.d.ts +20 -0
  94. package/Resources/Transformers/Serializers/PoResourceSerializer.d.ts.map +1 -0
  95. package/Resources/Transformers/Serializers/PoResourceSerializer.js +40 -0
  96. package/Resources/Transformers/Serializers/PoResourceSerializer.js.map +1 -0
  97. package/package.json +2 -2
  98. package/Resources/Analyzers/Tasks/DuplicateKeysTask.d.ts +0 -31
  99. package/Resources/Analyzers/Tasks/EmptyValuesTask.d.ts +0 -31
  100. package/Resources/Analyzers/Tasks/Interfaces/IAnalyzerTask.js.map +0 -1
  101. package/Resources/Analyzers/Tasks/KeyConsistencyTask.d.ts +0 -35
  102. package/Resources/Analyzers/Tasks/MissingTranslationsTask.d.ts +0 -31
  103. package/Resources/Analyzers/Tasks/MultipleKeyUsageTask.d.ts +0 -31
  104. package/Resources/Analyzers/Tasks/UnusedKeysTask.d.ts +0 -31
@@ -0,0 +1,110 @@
1
+ import type { IPoResourceInfo } from './Interfaces/IPoResourceInfo';
2
+ import { ResourceType } from './Interfaces/ResourceType';
3
+ import type { ResourceContentFn } from './Interfaces/IResourceInfo';
4
+ import type { IPoEntry } from '@breadstone-infrastructure/utilities';
5
+ /**
6
+ * Represents a po resource.
7
+ *
8
+ * @public
9
+ */
10
+ export declare class PoResourceInfo implements IPoResourceInfo {
11
+ private readonly _name;
12
+ private readonly _path;
13
+ private readonly _language;
14
+ private readonly _type;
15
+ private readonly _content;
16
+ private _cacheContent;
17
+ /**
18
+ * Constructs a new instance of the `PoResourceInfo` class.
19
+ *
20
+ * @param resource - The resource information.
21
+ * @public
22
+ */
23
+ constructor(resource?: Partial<IPoResourceInfo>);
24
+ /**
25
+ * Gets the `data` property.
26
+ *
27
+ * @public
28
+ * @readonly
29
+ */
30
+ get name(): string;
31
+ /**
32
+ * Gets the `data` property.
33
+ *
34
+ * @public
35
+ * @readonly
36
+ */
37
+ get path(): string;
38
+ /**
39
+ * Gets the `data` property.
40
+ *
41
+ * @public
42
+ * @readonly
43
+ */
44
+ get locale(): string;
45
+ /**
46
+ * Gets the `type` property.
47
+ *
48
+ * @public
49
+ * @readonly
50
+ */
51
+ get type(): typeof ResourceType.Po;
52
+ /**
53
+ * Gets the `content` property.
54
+ *
55
+ * @public
56
+ * @readonly
57
+ */
58
+ get content(): ResourceContentFn<Array<IPoEntry>>;
59
+ /**
60
+ * Gets the `isVirtual` property.
61
+ *
62
+ * @public
63
+ * @readonly
64
+ */
65
+ get isVirtual(): boolean;
66
+ /**
67
+ * Gets the keys of the resource data.
68
+ *
69
+ * @public
70
+ */
71
+ keys(): Array<string>;
72
+ /**
73
+ * Gets the values of the resource data.
74
+ *
75
+ * @public
76
+ */
77
+ values(): Array<string>;
78
+ /**
79
+ * Gets the entries of the resource data.
80
+ *
81
+ * @public
82
+ */
83
+ entries(): Array<[string, string]>;
84
+ /**
85
+ * Clones the current instance.
86
+ *
87
+ * @public
88
+ */
89
+ clone(): this;
90
+ /**
91
+ * Copies the current instance.
92
+ *
93
+ * @public
94
+ */
95
+ copy(resource: Pick<IPoResourceInfo, 'name' | 'path' | 'locale' | 'type' | 'content' | 'isVirtual'>): this;
96
+ /**
97
+ * Sorts the resource data.
98
+ *
99
+ * @public
100
+ * @param order - The order to sort the data.
101
+ */
102
+ sort(order: 'asc' | 'desc'): this;
103
+ /**
104
+ * Converts the resource to a string.
105
+ *
106
+ * @public
107
+ */
108
+ toString(): string;
109
+ }
110
+ //# sourceMappingURL=PoResourceInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PoResourceInfo.d.ts","sourceRoot":"","sources":["../../../src/Resources/Models/PoResourceInfo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAIrE;;;;GAIG;AACH,qBAAa,cAAe,YAAW,eAAe;IAIlD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,aAAa,CAAyB;IAM9C;;;;;OAKG;gBACgB,QAAQ,GAAE,OAAO,CAAC,eAAe,CAAM;IAoB1D;;;;;OAKG;IACH,IAAW,IAAI,IAAI,MAAM,CAExB;IAED;;;;;OAKG;IACH,IAAW,IAAI,IAAI,MAAM,CAExB;IAED;;;;;OAKG;IACH,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED;;;;;OAKG;IACH,IAAW,IAAI,IAAI,OAAO,YAAY,CAAC,EAAE,CAExC;IAED;;;;;OAKG;IACH,IAAW,OAAO,IAAI,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAEvD;IAED;;;;;OAKG;IACH,IAAW,SAAS,IAAI,OAAO,CAE9B;IAMD;;;;OAIG;IACI,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;IAM5B;;;;OAIG;IACI,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;IAM9B;;;;OAIG;IACI,OAAO,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAOzC;;;;OAIG;IACI,KAAK,IAAI,IAAI;IAIpB;;;;OAIG;IACI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,GAAG,IAAI;IAIjH;;;;;OAKG;IACI,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI;IAYxC;;;;OAIG;IACI,QAAQ,IAAI,MAAM;CAkC5B"}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ // #region Imports
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.PoResourceInfo = void 0;
5
+ const ResourceType_1 = require("./Interfaces/ResourceType");
6
+ // #endregion
7
+ /**
8
+ * Represents a po resource.
9
+ *
10
+ * @public
11
+ */
12
+ class PoResourceInfo {
13
+ // #region Fields
14
+ _name;
15
+ _path;
16
+ _language;
17
+ _type;
18
+ _content;
19
+ _cacheContent;
20
+ // #endregion
21
+ // #region Ctor
22
+ /**
23
+ * Constructs a new instance of the `PoResourceInfo` class.
24
+ *
25
+ * @param resource - The resource information.
26
+ * @public
27
+ */
28
+ constructor(resource = {}) {
29
+ this._name = resource.name ?? '';
30
+ this._path = resource.path ?? '';
31
+ this._language = resource.locale ?? '';
32
+ this._type = ResourceType_1.ResourceType.Po;
33
+ this._cacheContent = null;
34
+ this._content = () => {
35
+ if (!this._cacheContent) {
36
+ const c = resource.content ?? (() => []);
37
+ return this._cacheContent = c();
38
+ }
39
+ return this._cacheContent;
40
+ };
41
+ }
42
+ // #endregion
43
+ // #region Properties
44
+ /**
45
+ * Gets the `data` property.
46
+ *
47
+ * @public
48
+ * @readonly
49
+ */
50
+ get name() {
51
+ return this._name;
52
+ }
53
+ /**
54
+ * Gets the `data` property.
55
+ *
56
+ * @public
57
+ * @readonly
58
+ */
59
+ get path() {
60
+ return this._path;
61
+ }
62
+ /**
63
+ * Gets the `data` property.
64
+ *
65
+ * @public
66
+ * @readonly
67
+ */
68
+ get locale() {
69
+ return this._language;
70
+ }
71
+ /**
72
+ * Gets the `type` property.
73
+ *
74
+ * @public
75
+ * @readonly
76
+ */
77
+ get type() {
78
+ return this._type;
79
+ }
80
+ /**
81
+ * Gets the `content` property.
82
+ *
83
+ * @public
84
+ * @readonly
85
+ */
86
+ get content() {
87
+ return this._content;
88
+ }
89
+ /**
90
+ * Gets the `isVirtual` property.
91
+ *
92
+ * @public
93
+ * @readonly
94
+ */
95
+ get isVirtual() {
96
+ return this._path === '' || this._name === '';
97
+ }
98
+ // #endregion
99
+ // #region Methods
100
+ /**
101
+ * Gets the keys of the resource data.
102
+ *
103
+ * @public
104
+ */
105
+ keys() {
106
+ const content = this._content();
107
+ return content.map((entry) => entry.msgid);
108
+ }
109
+ /**
110
+ * Gets the values of the resource data.
111
+ *
112
+ * @public
113
+ */
114
+ values() {
115
+ const content = this._content();
116
+ return content.map((entry) => entry.msgstr);
117
+ }
118
+ /**
119
+ * Gets the entries of the resource data.
120
+ *
121
+ * @public
122
+ */
123
+ entries() {
124
+ const content = this._content();
125
+ return content
126
+ .map((entry) => [entry.msgid, entry.msgstr]);
127
+ }
128
+ /**
129
+ * Clones the current instance.
130
+ *
131
+ * @public
132
+ */
133
+ clone() {
134
+ return this.copy(this);
135
+ }
136
+ /**
137
+ * Copies the current instance.
138
+ *
139
+ * @public
140
+ */
141
+ copy(resource) {
142
+ return new PoResourceInfo(resource);
143
+ }
144
+ /**
145
+ * Sorts the resource data.
146
+ *
147
+ * @public
148
+ * @param order - The order to sort the data.
149
+ */
150
+ sort(order) {
151
+ const content = this._content();
152
+ const sortedContent = content.sort((a, b) => {
153
+ const comparison = a.msgid.localeCompare(b.msgid);
154
+ return order === 'asc' ? comparison : -comparison;
155
+ });
156
+ this._cacheContent = sortedContent;
157
+ return this;
158
+ }
159
+ /**
160
+ * Converts the resource to a string.
161
+ *
162
+ * @public
163
+ */
164
+ toString() {
165
+ const content = this._content();
166
+ return content.map((entry) => {
167
+ let str = '';
168
+ if (entry.msgid) {
169
+ str += `msgid "${entry.msgid}"\n`;
170
+ }
171
+ if (entry.msgstr) {
172
+ str += `msgstr "${entry.msgstr}"\n`;
173
+ }
174
+ if (entry.comments) {
175
+ str += `# ${entry.comments.trim()}\n`;
176
+ }
177
+ if (entry.context) {
178
+ str += `msgctxt "${entry.context}"\n`;
179
+ }
180
+ if (entry.references) {
181
+ entry.references.forEach((ref) => {
182
+ str += `#: ${ref}\n`;
183
+ });
184
+ }
185
+ return str;
186
+ }).join('\n');
187
+ }
188
+ }
189
+ exports.PoResourceInfo = PoResourceInfo;
190
+ //# sourceMappingURL=PoResourceInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PoResourceInfo.js","sourceRoot":"","sources":["../../../src/Resources/Models/PoResourceInfo.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;AAGlB,4DAAyD;AAIzD,aAAa;AAEb;;;;GAIG;AACH,MAAa,cAAc;IAEvB,iBAAiB;IAEA,KAAK,CAAS;IACd,KAAK,CAAS;IACd,SAAS,CAAS;IAClB,KAAK,CAAyB;IAC9B,QAAQ,CAAqC;IACtD,aAAa,CAAyB;IAE9C,aAAa;IAEb,eAAe;IAEf;;;;;OAKG;IACH,YAAmB,WAAqC,EAAE;QACtD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,GAAG,2BAAY,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,GAAoB,EAAE;YAClC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBACzC,OAAO,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YACpC,CAAC;YAED,OAAO,IAAI,CAAC,aAAa,CAAC;QAC9B,CAAC,CAAC;IACN,CAAC;IAED,aAAa;IAEb,qBAAqB;IAErB;;;;;OAKG;IACH,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACH,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACH,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;IAClD,CAAC;IAED,aAAa;IAEb,kBAAkB;IAElB;;;;OAIG;IACI,IAAI;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACI,MAAM;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACI,OAAO;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhC,OAAO,OAAO;aACT,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAsB,CAAC,CAAC;IAC3E,CAAC;IAED;;;;OAIG;IACI,KAAK;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACI,IAAI,CAAC,QAA8F;QACtG,OAAO,IAAI,cAAc,CAAC,QAAQ,CAAS,CAAC;IAChD,CAAC;IAED;;;;;OAKG;IACI,IAAI,CAAC,KAAqB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACxC,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAClD,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QAEnC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,QAAQ;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACzB,IAAI,GAAG,GAAG,EAAE,CAAC;YAEb,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,GAAG,IAAI,UAAU,KAAK,CAAC,KAAK,KAAK,CAAC;YACtC,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACf,GAAG,IAAI,WAAW,KAAK,CAAC,MAAM,KAAK,CAAC;YACxC,CAAC;YAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjB,GAAG,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;YAC1C,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChB,GAAG,IAAI,YAAY,KAAK,CAAC,OAAO,KAAK,CAAC;YAC1C,CAAC;YAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnB,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC7B,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC;gBACzB,CAAC,CAAC,CAAC;YACP,CAAC;YAED,OAAO,GAAG,CAAC;QACf,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;CAIJ;AAtND,wCAsNC"}
@@ -0,0 +1,48 @@
1
+ import type { PoFileReader } from './PoFileReader';
2
+ /**
3
+ * Represents an entry in a PO file.
4
+ *
5
+ * @public
6
+ */
7
+ export interface IPoEntry {
8
+ msgid: string;
9
+ msgstr: string;
10
+ comments?: string;
11
+ context?: string;
12
+ references?: Array<string>;
13
+ }
14
+ /**
15
+ * A class to parse and handle PO files.
16
+ *
17
+ * @public
18
+ */
19
+ export declare class PoFileParser {
20
+ private _entries;
21
+ /**
22
+ * Parses a PO file from the given content.
23
+ *
24
+ * @param content - The content of the PO file as a string.
25
+ */
26
+ parse(content: string): void;
27
+ /**
28
+ * Returns all parsed entries.
29
+ *
30
+ * @returns The array of PO entries.
31
+ */
32
+ getEntries(): Array<IPoEntry>;
33
+ /**
34
+ * Reads and parses a PO file using the provided reader.
35
+ *
36
+ * @param reader - The `PoFileReader` instance.
37
+ * @returns A promise resolving when the file is fully parsed.
38
+ */
39
+ parseFromFile(reader: PoFileReader): Promise<void>;
40
+ /**
41
+ * Extracts the value from a line in the PO file.
42
+ *
43
+ * @param line - The line to extract the value from.
44
+ * @returns The extracted value.
45
+ */
46
+ private extractValue;
47
+ }
48
+ //# sourceMappingURL=PoFileParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PoFileParser.d.ts","sourceRoot":"","sources":["../../src/Resources/PoFileParser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInD;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED;;;;GAIG;AACH,qBAAa,YAAY;IAIrB,OAAO,CAAC,QAAQ,CAAuB;IAMvC;;;;OAIG;IACI,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAwDnC;;;;OAIG;IACI,UAAU,IAAI,KAAK,CAAC,QAAQ,CAAC;IAIpC;;;;;OAKG;IACU,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/D;;;;;OAKG;IACH,OAAO,CAAC,YAAY;CAOvB"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
3
+ // #region Imports
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.PoFileParser = void 0;
6
+ /**
7
+ * A class to parse and handle PO files.
8
+ *
9
+ * @public
10
+ */
11
+ class PoFileParser {
12
+ // #region Fields
13
+ _entries = [];
14
+ // #endregion
15
+ // #region Methods
16
+ /**
17
+ * Parses a PO file from the given content.
18
+ *
19
+ * @param content - The content of the PO file as a string.
20
+ */
21
+ parse(content) {
22
+ this._entries = [];
23
+ const lines = content.split('\n');
24
+ let currentEntry = {};
25
+ let isMultiline = false;
26
+ let multilineKey = null;
27
+ for (const line of lines) {
28
+ const trimmed = line.trim();
29
+ if (trimmed.startsWith('#')) {
30
+ // Handle comments
31
+ currentEntry.comments = `${(currentEntry.comments ?? '') + trimmed}\n`;
32
+ }
33
+ else if (trimmed.startsWith('#:')) {
34
+ // Handle references
35
+ currentEntry.references ??= [];
36
+ currentEntry.references.push(trimmed.substring(2).trim());
37
+ }
38
+ else if (trimmed.startsWith('msgctxt')) {
39
+ // Handle context
40
+ currentEntry.context = this.extractValue(trimmed);
41
+ }
42
+ else if (trimmed.startsWith('msgid')) {
43
+ // Handle msgid
44
+ if (isMultiline) {
45
+ // @ts-ignore
46
+ currentEntry[multilineKey] += this.extractValue(trimmed);
47
+ }
48
+ else {
49
+ currentEntry.msgid = this.extractValue(trimmed);
50
+ isMultiline = !trimmed.endsWith('"');
51
+ multilineKey = 'msgid';
52
+ }
53
+ }
54
+ else if (trimmed.startsWith('msgstr')) {
55
+ // Handle msgstr
56
+ if (isMultiline) {
57
+ // @ts-ignore
58
+ currentEntry[multilineKey] += this.extractValue(trimmed);
59
+ }
60
+ else {
61
+ currentEntry.msgstr = this.extractValue(trimmed);
62
+ isMultiline = !trimmed.endsWith('"');
63
+ multilineKey = 'msgstr';
64
+ }
65
+ }
66
+ else if (!trimmed && currentEntry.msgid) {
67
+ // End of entry
68
+ this._entries.push({
69
+ msgid: currentEntry.msgid ?? '',
70
+ msgstr: currentEntry.msgstr ?? '',
71
+ comments: currentEntry.comments?.trim(),
72
+ context: currentEntry.context,
73
+ references: currentEntry.references
74
+ });
75
+ currentEntry = {};
76
+ isMultiline = false;
77
+ multilineKey = null;
78
+ }
79
+ }
80
+ }
81
+ /**
82
+ * Returns all parsed entries.
83
+ *
84
+ * @returns The array of PO entries.
85
+ */
86
+ getEntries() {
87
+ return this._entries;
88
+ }
89
+ /**
90
+ * Reads and parses a PO file using the provided reader.
91
+ *
92
+ * @param reader - The `PoFileReader` instance.
93
+ * @returns A promise resolving when the file is fully parsed.
94
+ */
95
+ async parseFromFile(reader) {
96
+ const content = await reader.readFileContent();
97
+ this.parse(content);
98
+ }
99
+ /**
100
+ * Extracts the value from a line in the PO file.
101
+ *
102
+ * @param line - The line to extract the value from.
103
+ * @returns The extracted value.
104
+ */
105
+ extractValue(line) {
106
+ const match = (/"(.*)"/).exec(line);
107
+ return match ? match[1] : '';
108
+ }
109
+ }
110
+ exports.PoFileParser = PoFileParser;
111
+ //# sourceMappingURL=PoFileParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PoFileParser.js","sourceRoot":"","sources":["../../src/Resources/PoFileParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Class for reading `.po` files.
3
+ *
4
+ * @public
5
+ */
6
+ export declare class PoFileReader {
7
+ private readonly _fileReader;
8
+ /**
9
+ * Constructs a new instance of the `PoFileReader` class.
10
+ *
11
+ * @param filePath - The path to the `.po` file.
12
+ */
13
+ constructor(filePath: string);
14
+ /**
15
+ * Reads the entire content of the `.po` file.
16
+ *
17
+ * @returns A promise resolving to the file content as a string.
18
+ */
19
+ readFileContent(): Promise<string>;
20
+ /**
21
+ * Disposes the underlying file reader.
22
+ */
23
+ dispose(): void;
24
+ }
25
+ //# sourceMappingURL=PoFileReader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PoFileReader.d.ts","sourceRoot":"","sources":["../../src/Resources/PoFileReader.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,qBAAa,YAAY;IAIrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAM1C;;;;OAIG;gBACgB,QAAQ,EAAE,MAAM;IAQnC;;;;OAIG;IACU,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/C;;OAEG;IACI,OAAO,IAAI,IAAI;CAMzB"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ // #region Imports
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.PoFileReader = void 0;
5
+ const utilities_1 = require("@breadstone-infrastructure/utilities");
6
+ // #endregion
7
+ /**
8
+ * Class for reading `.po` files.
9
+ *
10
+ * @public
11
+ */
12
+ class PoFileReader {
13
+ // #region Fields
14
+ _fileReader;
15
+ // #endregion
16
+ // #region Ctor
17
+ /**
18
+ * Constructs a new instance of the `PoFileReader` class.
19
+ *
20
+ * @param filePath - The path to the `.po` file.
21
+ */
22
+ constructor(filePath) {
23
+ this._fileReader = new utilities_1.TextFileReader(filePath);
24
+ }
25
+ // #endregion
26
+ // #region Methods
27
+ /**
28
+ * Reads the entire content of the `.po` file.
29
+ *
30
+ * @returns A promise resolving to the file content as a string.
31
+ */
32
+ async readFileContent() {
33
+ return this._fileReader.readToEnd();
34
+ }
35
+ /**
36
+ * Disposes the underlying file reader.
37
+ */
38
+ dispose() {
39
+ this._fileReader.dispose();
40
+ }
41
+ }
42
+ exports.PoFileReader = PoFileReader;
43
+ //# sourceMappingURL=PoFileReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PoFileReader.js","sourceRoot":"","sources":["../../src/Resources/PoFileReader.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;AAElB,oEAAwF;AAExF,aAAa;AAEb;;;;GAIG;AACH,MAAa,YAAY;IAErB,iBAAiB;IAEA,WAAW,CAAc;IAE1C,aAAa;IAEb,eAAe;IAEf;;;;OAIG;IACH,YAAmB,QAAgB;QAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,0BAAc,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,aAAa;IAEb,kBAAkB;IAElB;;;;OAIG;IACI,KAAK,CAAC,eAAe;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;CAIJ;AAzCD,oCAyCC"}
@@ -0,0 +1,44 @@
1
+ import type { IResourceReaderAdapter } from './Interfaces/IResourceReaderAdapter';
2
+ import { type IFileSystem, type ILogger } from '@breadstone-infrastructure/utilities';
3
+ import type { IPoResourceInfo } from '../../Models/Interfaces/IPoResourceInfo';
4
+ /**
5
+ * A resource reader adapter that scans directories for po files.
6
+ *
7
+ * @public
8
+ */
9
+ export declare class PoResourceReaderAdapter implements IResourceReaderAdapter {
10
+ private readonly _fileSystem;
11
+ private readonly _logger;
12
+ private readonly _glob;
13
+ /**
14
+ * Constructs a new instance of the `PoResourceReaderAdapter` class.
15
+ *
16
+ * @public
17
+ */
18
+ constructor(fileSystem: IFileSystem, logger: ILogger);
19
+ /**
20
+ * Scans the specified directory for .po files.
21
+ *
22
+ * @public
23
+ * @param path - The path or paths to scan.
24
+ * @returns The resource information.
25
+ */
26
+ scanDirectory(path: string | Array<string>): Array<IPoResourceInfo>;
27
+ /**
28
+ * Scans a specific file for resource information.
29
+ *
30
+ * @public
31
+ * @param path - The path to the file to scan.
32
+ * @returns The resource information or null if the file is not a valid resource.
33
+ */
34
+ scanFile(path: string): IPoResourceInfo | null;
35
+ /**
36
+ * @private
37
+ */
38
+ private invalidateDirectory;
39
+ /**
40
+ * @private
41
+ */
42
+ private invalidateFile;
43
+ }
44
+ //# sourceMappingURL=PoResourceReaderAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PoResourceReaderAdapter.d.ts","sourceRoot":"","sources":["../../../../src/Resources/Readers/Adapter/PoResourceReaderAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAoB,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAExG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAK/E;;;;GAIG;AACH,qBAAa,uBAAwB,YAAW,sBAAsB;IAIlE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAM/B;;;;OAIG;gBACgB,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO;IAU3D;;;;;;OAMG;IACI,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC;IAuB1E;;;;;;OAMG;IACI,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAqBrD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,cAAc;CAoBzB"}