aprog 2.1.8 → 2.2.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/README.md CHANGED
@@ -22,6 +22,16 @@ or
22
22
  npm i aprog -D
23
23
  ```
24
24
 
25
+ Завантаження `Constructs`
26
+ ```shell
27
+ node node_modules/aprog/publish.js
28
+ ```
29
+
30
+ Завантаження `Constructs` з перезаписом
31
+ ```shell
32
+ node node_modules/aprog/publish.js --force
33
+ ```
34
+
25
35
  ### Basic Usage
26
36
 
27
37
  Підключення router:
@@ -139,16 +149,6 @@ onInput: (event) => {
139
149
  <input value="4">
140
150
  ```
141
151
 
142
- Завантаження `Constructs`
143
- ```shell
144
- node node_modules/aprog/publish.js
145
- ```
146
-
147
- Завантаження `Constructs` з перезаписом
148
- ```shell
149
- node node_modules/aprog/publish.js --force
150
- ```
151
-
152
152
  ########## ########## ########## ########## ##########
153
153
 
154
154
  Загальний список методів:
@@ -175,6 +175,9 @@ node node_modules/aprog/publish.js --force
175
175
 
176
176
  - *uniquePage({key: "default", callbackTrue: () => {"empty"}, callbackFalse: () => {"empty"}, timer: "default")*
177
177
 
178
+ - *const wrap = (value) => new SmartWrapper(value);*
179
+ - *wrap(data).get("key").val*
180
+
178
181
  ### Info
179
182
 
180
183
  - Додано безплатний чат із `Gemini`
package/index.js CHANGED
@@ -23,3 +23,4 @@ export {
23
23
  export { prism } from "./src/prism.js";
24
24
  export { uniquePage } from "./src/pages.js";
25
25
  export { default as AprogClass } from './src/classes/AprogClass.js';
26
+ export { default as SmartWrapper } from './src/classes/SmartWrapper.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aprog",
3
- "version": "2.1.8",
3
+ "version": "2.2.0",
4
4
  "description": "Допоміжна JavaScript-бібліотека для проєктів",
5
5
  "main": "index.js",
6
6
  "exports": {
@@ -0,0 +1,157 @@
1
+ class SmartWrapper {
2
+ constructor(value) {
3
+ this._value = value;
4
+ }
5
+
6
+ /**
7
+ * Отримати значення по ключу
8
+ * @param {string|number} key
9
+ * @param {*} def
10
+ * @returns {SmartWrapper}
11
+ */
12
+ get(key, def = null) {
13
+ if (this._value === null || this._value === undefined) {
14
+ return new SmartWrapper(def);
15
+ }
16
+
17
+ if (typeof this._value === 'object') {
18
+ if (Array.isArray(this._value)) {
19
+ return new SmartWrapper(this._value[key] ?? def);
20
+ }
21
+
22
+ if (Object.prototype.hasOwnProperty.call(this._value, key)) {
23
+ return new SmartWrapper(this._value[key]);
24
+ }
25
+ }
26
+
27
+ return new SmartWrapper(def);
28
+ }
29
+
30
+ /**
31
+ * Отримати вкладене значення за шляхом 'a.b.c'
32
+ * @param {string} path
33
+ * @param {*} def
34
+ * @returns {SmartWrapper}
35
+ */
36
+ path(path, def = null) {
37
+ const keys = path.split('.');
38
+ let current = new SmartWrapper(this._value);
39
+ for (const key of keys) {
40
+ current = current.get(key);
41
+ }
42
+ return current.isNull ? new SmartWrapper(def) : current;
43
+ }
44
+
45
+ /**
46
+ * Перевірити чи існує ключ
47
+ * @param {string|number} key
48
+ * @returns {boolean}
49
+ */
50
+ has(key) {
51
+ if (this._value === null || this._value === undefined) return false;
52
+ if (Array.isArray(this._value)) return key in this._value;
53
+ if (typeof this._value === 'object') return Object.prototype.hasOwnProperty.call(this._value, key);
54
+ return false;
55
+ }
56
+
57
+ /**
58
+ * Повернути тільки вказані ключі
59
+ * @param {string[]} keys
60
+ * @returns {SmartWrapper}
61
+ */
62
+ only(keys = []) {
63
+ if (typeof this._value !== 'object' || this._value === null) {
64
+ return new SmartWrapper({});
65
+ }
66
+
67
+ const result = {};
68
+ for (const key of keys) {
69
+ if (Object.prototype.hasOwnProperty.call(this._value, key)) {
70
+ result[key] = this._value[key];
71
+ }
72
+ }
73
+
74
+ return new SmartWrapper(result);
75
+ }
76
+
77
+ /**
78
+ * Встановити нове значення по ключу
79
+ * @param {string|number} key
80
+ * @param {*} val
81
+ * @returns {SmartWrapper}
82
+ */
83
+ set(key, val) {
84
+ if (typeof this._value === 'object' && this._value !== null) {
85
+ return new SmartWrapper({ ...this._value, [key]: val });
86
+ }
87
+ return new SmartWrapper({ [key]: val });
88
+ }
89
+
90
+ /**
91
+ * Пройтись по значеннях як по масиву або об'єкту
92
+ * @param {function(*, string|number): *} callback
93
+ * @returns {SmartWrapper}
94
+ */
95
+ map(callback) {
96
+ if (Array.isArray(this._value)) {
97
+ return new SmartWrapper(this._value.map(callback));
98
+ }
99
+
100
+ if (typeof this._value === 'object' && this._value !== null) {
101
+ return new SmartWrapper(
102
+ Object.entries(this._value).map(([key, val]) => callback(val, key))
103
+ );
104
+ }
105
+
106
+ return new SmartWrapper([]);
107
+ }
108
+
109
+ /**
110
+ * Отримати реальне значення
111
+ * @returns {*}
112
+ */
113
+ get val() {
114
+ return this._value;
115
+ }
116
+
117
+ /**
118
+ * Чи є значення null або undefined
119
+ * @returns {boolean}
120
+ */
121
+ get isNull() {
122
+ return this._value === null || this._value === undefined;
123
+ }
124
+
125
+ /**
126
+ * Привести до масиву (рекурсивно)
127
+ * @returns {Array}
128
+ */
129
+ get toArray() {
130
+ if (Array.isArray(this._value)) return this._value;
131
+ if (typeof this._value === 'object' && this._value !== null) return Object.values(this._value);
132
+ return [];
133
+ }
134
+
135
+ /**
136
+ * Привести до об'єкта (рекурсивно)
137
+ * @returns {Object}
138
+ */
139
+ get toObject() {
140
+ if (typeof this._value === 'object' && this._value !== null) return this._value;
141
+ return {};
142
+ }
143
+
144
+ /**
145
+ * Привести до рядка
146
+ * @returns {string}
147
+ */
148
+ get toString() {
149
+ if (typeof this._value === 'string') return this._value;
150
+ if (typeof this._value === 'number' || typeof this._value === 'boolean') {
151
+ return String(this._value);
152
+ }
153
+ return '';
154
+ }
155
+ }
156
+
157
+ export default SmartWrapper;