@ygracs/chn-alias-list 0.0.8 → 0.0.9

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.
@@ -0,0 +1,146 @@
1
+ /**
2
+ * An array of two elements that represents a `<lang>`-`<text>` pair
3
+ */
4
+ export type ILangTextPair = string[];
5
+ export const ILangTextPair: ILangTextPair;
6
+ /**
7
+ * A settings for the list load ops
8
+ */
9
+ export type ILoadListItemsOptions = {
10
+ /**
11
+ * - indicates whether to clear the list
12
+ * before load
13
+ */
14
+ useClear?: boolean;
15
+ };
16
+ export const ILoadListItemsOptions: ILoadListItemsOptions;
17
+ /**
18
+ * A user defined procedure to process an array elements
19
+ */
20
+ export type forEachProcEx = (item: any, index?: number, arr?: any[]) => void;
21
+ /**
22
+ * A user defined procedure to process an array elements
23
+ */
24
+ export type cbArrECheck = (item: any, index?: number, arr?: any[]) => any;
25
+
26
+ /**
27
+ * @classdesc This class implements an interface of the name record
28
+ */
29
+ export class TChnNameRecord {
30
+ /**
31
+ * Contains a language
32
+ */
33
+ get lang(): string;
34
+ /**
35
+ * Contains a value of the record
36
+ */
37
+ get text(): string;
38
+ /**
39
+ * Contains a value of the record
40
+ */
41
+ get value(): ILangTextPair;
42
+ set value(data: ILangTextPair);
43
+ /**
44
+ * Sets the record value
45
+ */
46
+ setValue(data: any): boolean;
47
+ /**
48
+ * Returns value as a formated string
49
+ */
50
+ toFormatString(opt: any): string;
51
+ /**
52
+ * Clears the record
53
+ */
54
+ reset(): void;
55
+ #private;
56
+ }
57
+
58
+ /**
59
+ * @classdesc This class implements an interface of the name records list
60
+ */
61
+ export class TChnNamesList {
62
+ /**
63
+ * Contains a quantity of a name records
64
+ */
65
+ get count(): number;
66
+ /**
67
+ * Contains a list of a name entries
68
+ */
69
+ get value(): ILangTextPair[];
70
+ /**
71
+ * Returns a flag whether a list is empty or not
72
+ */
73
+ isEmpty(): boolean;
74
+ /**
75
+ * Returns a flag whether a list has any members
76
+ */
77
+ isNotEmpty(): boolean;
78
+ /**
79
+ * Checks whether a given value is an index and fits an index range
80
+ * within the instance
81
+ * @deprecated
82
+ * @todo \[since v0.0.9] deprecated. Use {@link checkIndex} instead.
83
+ */
84
+ chkIndex(value: any): boolean;
85
+ /**
86
+ * Checks whether a given value is an index and fits an index range
87
+ * within the instance
88
+ * @since 0.0.9
89
+ */
90
+ checkIndex(value: any): boolean;
91
+ /**
92
+ * Returns an index in case a given value is a valid index value and not exceeds
93
+ * an index range within the instance. If failed a `-1` returned
94
+ * @since 0.0.9
95
+ */
96
+ tryIndex(value: any): number;
97
+ /**
98
+ * Searches an index of a given name
99
+ */
100
+ getIndex(value: string): number;
101
+ /**
102
+ * Returns a name record
103
+ * @since 0.0.5
104
+ */
105
+ getItem(value: number): TChnNameRecord | null;
106
+ /**
107
+ * Adds a new name record to a list members
108
+ * @since 0.0.5
109
+ */
110
+ addItem(data: any): boolean;
111
+ /**
112
+ * Tries to delete a name record addressed by a given index
113
+ * @since 0.0.5
114
+ */
115
+ delItem(value: number): boolean;
116
+ /**
117
+ * Loads a new name records
118
+ * @since 0.0.5
119
+ */
120
+ loadItems(list: any, opt?: boolean | ILoadListItemsOptions): number;
121
+ /**
122
+ * Removes all of the instance members
123
+ */
124
+ clear(): void;
125
+ /**
126
+ * Calls given function for each name record
127
+ */
128
+ forEach(cb: forEachProcEx): void;
129
+ /**
130
+ * Returns an array of a name records picked up by a given function
131
+ */
132
+ filter(cb: cbArrECheck): TChnNameRecord[];
133
+ [Symbol.iterator](): {
134
+ next: () => {
135
+ done: boolean;
136
+ value: TChnNameRecord | null;
137
+ } | {
138
+ done: boolean;
139
+ value?: undefined;
140
+ };
141
+ return(): {
142
+ done: boolean;
143
+ };
144
+ };
145
+ #private;
146
+ }
@@ -0,0 +1,392 @@
1
+ // [v0.1.059-20260628]
2
+
3
+ // === module init block ===
4
+
5
+ const {
6
+ isArray, isPlainObject,
7
+ valueToArray, valueToIndex, valueToIDString,
8
+ readAsString,
9
+ } = require('@ygracs/bsfoc-lib-js');
10
+
11
+ // === module inner block ===
12
+
13
+ /**
14
+ * An array of two elements that represents a `<lang>`-`<text>` pair
15
+ * @typedef {string[]} ILangTextPair
16
+ */
17
+ /**
18
+ * A virtual constant meant for support jsdoc notation:
19
+ * @type {ILangTextPair}
20
+ */
21
+ module.exports.ILangTextPair = [];
22
+
23
+ /**
24
+ * Converts a <Lang, Text> key-pair to a string
25
+ * @function convertLangTextValueToString
26
+ * @param {ILangTextPair} data - contains a data to be printed
27
+ * @param {object} [opt]
28
+ * @returns {string}
29
+ * @inner
30
+ */
31
+ function convertLangTextValueToString(data, opt) {
32
+ let name = [ '', '' ];
33
+ let result = '';
34
+ if (isArray(data)) name = data;
35
+ let [ lang, text ] = name;
36
+ if (lang === '') {
37
+ result = text;
38
+ } else if (text !== '') {
39
+ result = `(${lang}): ${text}`;
40
+ };
41
+ return result;
42
+ };
43
+
44
+ // === module main block ===
45
+
46
+ /**
47
+ * @classdesc This class implements an interface of the name record
48
+ */
49
+ class TChnNameRecord {
50
+ /** @type {string} */
51
+ #_lang;
52
+ /** @type {string} */
53
+ #_value;
54
+
55
+ /**
56
+ * Creates an instance of the name record
57
+ */
58
+ constructor() {
59
+ this.reset();
60
+ }
61
+
62
+ /**
63
+ * Contains a language
64
+ * @type {string}
65
+ * @readonly
66
+ */
67
+ get lang() {
68
+ return this.#_lang;
69
+ }
70
+
71
+ /**
72
+ * Contains a value of the record
73
+ * @type {string}
74
+ * @readonly
75
+ */
76
+ get text() {
77
+ return this.#_value;
78
+ }
79
+
80
+ /**
81
+ * Contains a value of the record
82
+ * @type {ILangTextPair}
83
+ */
84
+ get value() {
85
+ return [ this.#_lang, this.#_value ];
86
+ }
87
+
88
+ set value(data) {
89
+ this.setValue(data);
90
+ }
91
+
92
+ /**
93
+ * Sets the record value
94
+ * @param {any} data - a value of the record
95
+ * @returns {boolean}
96
+ */
97
+ setValue(data) {
98
+ let _data = data;
99
+ let isSucceed = false;
100
+ if (_data !== undefined) {
101
+ if (isPlainObject(_data)) {
102
+ let { lang, text } = _data;
103
+ _data = [ lang, text ];
104
+ } else {
105
+ _data = valueToArray(_data);
106
+ };
107
+ switch (_data.length) {
108
+ case 0: {
109
+ break;
110
+ }
111
+ case 1: {
112
+ _data = [ '', _data[0] ];
113
+ }
114
+ default: {
115
+ let [ lang, value = null ] = _data;
116
+ if (value !== null && typeof value !== 'boolean') {
117
+ value = readAsString(value, { numberToString: true });
118
+ lang = value !== '' ? valueToIDString(lang) : null;
119
+ if (lang === null) lang = '';
120
+ this.#_lang = lang;
121
+ this.#_value = value;
122
+ isSucceed = true;
123
+ };
124
+ }
125
+ };
126
+ };
127
+ return isSucceed;
128
+ }
129
+
130
+ /**
131
+ * Returns value as a formated string
132
+ * @param {any} opt - <reserved>
133
+ * @returns {string}
134
+ */
135
+ toFormatString(opt) {
136
+ return convertLangTextValueToString(this.value, opt);
137
+ }
138
+
139
+ /**
140
+ * Clears the record
141
+ * @returns {void}
142
+ */
143
+ reset() {
144
+ this.#_lang = '';
145
+ this.#_value = '';
146
+ }
147
+
148
+ };
149
+ module.exports.TChnNameRecord = TChnNameRecord;
150
+
151
+ /**
152
+ * A settings for the list load ops
153
+ * @typedef {Object} ILoadListItemsOptions
154
+ * @property {boolean} [useClear=true] - indicates whether to clear the list
155
+ * before load
156
+ */
157
+ /**
158
+ * A virtual constant meant for support jsdoc notation:
159
+ * @type {ILoadListItemsOptions}
160
+ */
161
+ module.exports.ILoadListItemsOptions = {};
162
+
163
+ /**
164
+ * A user defined procedure to process an array elements
165
+ * @callback forEachProcEx
166
+ * @param {any} item - some element
167
+ * @param {number} [index] - element index
168
+ * @param {any[]} [arr]
169
+ * @returns {void}
170
+ */
171
+
172
+ /**
173
+ * A user defined procedure to process an array elements
174
+ * @callback cbArrECheck
175
+ * @param {any} item - some element
176
+ * @param {number} [index] - element index
177
+ * @param {any[]} [arr] - array a callback was called upon
178
+ * @returns {any}
179
+ */
180
+
181
+ /**
182
+ * @classdesc This class implements an interface of the name records list
183
+ */
184
+ class TChnNamesList {
185
+ /** @type {TChnNameRecord[]} */
186
+ #_items;
187
+
188
+ /**
189
+ * Creates an instance of the name records list
190
+ */
191
+ constructor() {
192
+ this.#_items = [];
193
+ }
194
+
195
+ [Symbol.iterator]() {
196
+ let index = 0;
197
+ return {
198
+ next: () => {
199
+ if (index < this.count) {
200
+ return { done: false, value: this.getItem(index++) };
201
+ } else {
202
+ return { done: true };
203
+ };
204
+ },
205
+ return() {
206
+ return { done: true };
207
+ },
208
+ };
209
+ }
210
+
211
+ /**
212
+ * Contains a quantity of a name records
213
+ * @type {number}
214
+ * @readonly
215
+ */
216
+ get count() {
217
+ return this.#_items.length;
218
+ }
219
+
220
+ /**
221
+ * Contains a list of a name entries
222
+ * @type {ILangTextPair[]}
223
+ * @readonly
224
+ */
225
+ get value() {
226
+ /** @type {ILangTextPair[]} */
227
+ const result = [];
228
+ this.#_items.forEach((item, i) => {
229
+ result.push(item.value);
230
+ });
231
+ return result;
232
+ }
233
+
234
+ /**
235
+ * Returns a flag whether a list is empty or not
236
+ * @returns {boolean}
237
+ */
238
+ isEmpty() {
239
+ return this.count === 0;
240
+ }
241
+
242
+ /**
243
+ * Returns a flag whether a list has any members
244
+ * @returns {boolean}
245
+ */
246
+ isNotEmpty() {
247
+ return this.count > 0;
248
+ }
249
+
250
+ /**
251
+ * Checks whether a given value is an index and fits an index range
252
+ * within the instance
253
+ * @param {any} value - a value to be verified
254
+ * @returns {boolean}
255
+ * @deprecated
256
+ * @todo \[since v0.0.9] deprecated. Use {@link checkIndex} instead.
257
+ */
258
+ chkIndex(value) {
259
+ const index = valueToIndex(value);
260
+ return index !== -1 && index < this.count;
261
+ }
262
+
263
+ /**
264
+ * Checks whether a given value is an index and fits an index range
265
+ * within the instance
266
+ * @since 0.0.9
267
+ * @param {any} value - a value to be verified
268
+ * @returns {boolean}
269
+ */
270
+ checkIndex(value) {
271
+ const index = valueToIndex(value);
272
+ return index !== -1 && index < this.count;
273
+ }
274
+
275
+ /**
276
+ * Returns an index in case a given value is a valid index value and not exceeds
277
+ * an index range within the instance. If failed a `-1` returned
278
+ * @param {any} value - value to evaluate
279
+ * @returns {number}
280
+ * @since 0.0.9
281
+ */
282
+ tryIndex(value) {
283
+ const index = valueToIndex(value);
284
+ return index !== -1 && index < this.count ? index : -1;
285
+ }
286
+
287
+ /**
288
+ * Searches an index of a given name
289
+ * @param {string} value - a name
290
+ * @returns {number}
291
+ */
292
+ getIndex(value) {
293
+ const opt = { numberToString: true };
294
+ const name = readAsString(value, opt);
295
+ let index = -1;
296
+ if (name !== '') {
297
+ index = this.#_items.findIndex((item) => name === item.text);
298
+ };
299
+ return index;
300
+ }
301
+
302
+ /**
303
+ * Returns a name record
304
+ * @since 0.0.5
305
+ * @param {number} value - an element index
306
+ * @returns {?TChnNameRecord}
307
+ */
308
+ getItem(value) {
309
+ const i = this.tryIndex(value);
310
+ return i === -1 ? null: this.#_items[i];
311
+ }
312
+
313
+ /**
314
+ * Adds a new name record to a list members
315
+ * @since 0.0.5
316
+ * @param {any} data - a value of a name record
317
+ * @returns {boolean}
318
+ */
319
+ addItem(data) {
320
+ const _data = data instanceof TChnNameRecord ? data.value : data;
321
+ const item = new TChnNameRecord();
322
+ const isSucceed = item.setValue(_data) && item.text !== '';
323
+ if (isSucceed) this.#_items.push(item);
324
+ return isSucceed;
325
+ }
326
+
327
+ /**
328
+ * Tries to delete a name record addressed by a given index
329
+ * @since 0.0.5
330
+ * @param {number} value - an element index
331
+ * @returns {boolean}
332
+ */
333
+ delItem(value) {
334
+ const i = this.tryIndex(value);
335
+ let isSucceed = i !== -1;
336
+ if (isSucceed) this.#_items.splice(i, 1);
337
+ return isSucceed;
338
+ }
339
+
340
+ /**
341
+ * Defines whether to clear the list before load
342
+ * @typedef {boolean} loadListItemsOption
343
+ */
344
+ /**
345
+ * Loads a new name records
346
+ * @since 0.0.5
347
+ * @param {any} list - an element or a list of an elements
348
+ * @param {loadListItemsOption|ILoadListItemsOptions} [opt] - load options
349
+ * @returns {number}
350
+ */
351
+ loadItems(list, opt) {
352
+ let {
353
+ useClear = true,
354
+ } = isPlainObject(opt) ? opt : { useClear: opt };
355
+ if (typeof useClear !== 'boolean') useClear = true;
356
+ const items = valueToArray(list);
357
+ let count = 0;
358
+ if (items.length) {
359
+ if (useClear) this.clear();
360
+ items.forEach((item) => { if (this.addItem(item)) count++; });
361
+ };
362
+ return count;
363
+ };
364
+
365
+ /**
366
+ * Removes all of the instance members
367
+ * @returns {void}
368
+ */
369
+ clear() {
370
+ this.#_items.length = 0;
371
+ }
372
+
373
+ /**
374
+ * Calls given function for each name record
375
+ * @param {forEachProcEx} cb - a callback function
376
+ * @returns {void}
377
+ */
378
+ forEach(cb) {
379
+ if (typeof cb === 'function') this.#_items.forEach(cb);
380
+ }
381
+
382
+ /**
383
+ * Returns an array of a name records picked up by a given function
384
+ * @param {cbArrECheck} cb - a callback function
385
+ * @returns {TChnNameRecord[]}
386
+ */
387
+ filter(cb) {
388
+ return typeof cb === 'function' ? this.#_items.filter(cb) : [];
389
+ }
390
+
391
+ };
392
+ module.exports.TChnNamesList = TChnNamesList;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ygracs/chn-alias-list",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "description": "A small library which provides some helper classes for EPG-tools",
5
5
  "author": "ygracs <cs70th-om@rambler.ru>",
6
6
  "license": "MIT",
@@ -12,6 +12,7 @@
12
12
  "types": "./index.d.ts",
13
13
  "files": [
14
14
  "doc/*.md",
15
+ "lib/chn-names.js",
15
16
  "lib/chn-alias-list.js",
16
17
  "lib/file-helper-ext.js",
17
18
  "lib/*.d.ts",
@@ -30,12 +31,12 @@
30
31
  "#test-dir/*": "./__test__/*"
31
32
  },
32
33
  "dependencies": {
33
- "@cntwg/file-helper": "^0.0.3",
34
- "@ygracs/bsfoc-lib-js": "~0.3.4"
34
+ "@cntwg/file-helper": "~0.0.4",
35
+ "@ygracs/bsfoc-lib-js": "~0.4.0"
35
36
  },
36
37
  "devDependencies": {
37
38
  "@ygracs/test-helper": "~0.0.2-b",
38
- "jest": "^30.2.0",
39
+ "jest": "^30.4.2",
39
40
  "jsdoc-to-markdown": "^9.1.3",
40
41
  "minimist": "^1.2.8",
41
42
  "typescript": "~5.9.3"