slicejs-web-framework 3.4.3 → 3.5.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/.opencode/opencode.json +14 -14
- package/Slice/Components/Structural/ContextManager/ContextManager.js +422 -422
- package/Slice/Components/Structural/ContextManager/ContextManagerDebugger.js +468 -468
- package/Slice/Components/Structural/Controller/Controller.js +1406 -1198
- package/Slice/Components/Structural/Debugger/Debugger.js +1503 -1503
- package/Slice/Components/Structural/EventManager/EventManager.js +651 -366
- package/Slice/Components/Structural/EventManager/EventManagerDebugger.js +368 -30
- package/Slice/Components/Structural/LeakInspector/LeakInspector.js +296 -0
- package/Slice/Components/Structural/Logger/Logger.js +225 -225
- package/Slice/Components/Structural/Router/Router.js +775 -775
- package/Slice/Components/Structural/StylesManager/StylesManager.js +82 -82
- package/Slice/Components/Structural/StylesManager/ThemeManager/ThemeManager.js +106 -106
- package/Slice/Slice.js +663 -627
- package/Slice/tests/build-singleton.test.js +244 -244
- package/Slice/tests/bundle-v2-runtime-contract.test.js +738 -738
- package/Slice/tests/context-patch-use.test.js +95 -95
- package/Slice/tests/event-emitters.test.js +79 -0
- package/Slice/tests/event-registry.test.js +141 -0
- package/Slice/tests/fixtures/real-runtime-loader.mjs +21 -21
- package/Slice/tests/leak-orphans.test.js +131 -0
- package/Slice/tests/public-env-typed-accessors.test.js +66 -66
- package/api/index.js +308 -281
- package/api/utils/publicEnvResolver.js +123 -123
- package/package.json +44 -44
- package/sliceConfig.schema.json +10 -1
- package/src/sliceConfig.json +5 -1
- package/types/index.d.ts +12 -0
|
@@ -1,225 +1,225 @@
|
|
|
1
|
-
import Log from './Log.js';
|
|
2
|
-
|
|
3
|
-
const logTypes = {
|
|
4
|
-
ERROR: 'error',
|
|
5
|
-
WARN: 'warn',
|
|
6
|
-
INFO: 'info',
|
|
7
|
-
DEBUG: 'debug',
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export default class Logger {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.logs = [];
|
|
13
|
-
this._logListeners = new Set();
|
|
14
|
-
this.logEnabled = slice.loggerConfig.enabled;
|
|
15
|
-
this.showLogsConfig = slice.loggerConfig.showLogs;
|
|
16
|
-
|
|
17
|
-
this.showLog = function showLog(log) {
|
|
18
|
-
if (!this.showLogsConfig) return;
|
|
19
|
-
|
|
20
|
-
const logType = log.logType;
|
|
21
|
-
|
|
22
|
-
Object.keys(this.showLogsConfig).forEach((logConfig) => {
|
|
23
|
-
if (this.showLogsConfig[logConfig][logType] === true) {
|
|
24
|
-
switch (logConfig) {
|
|
25
|
-
case 'console':
|
|
26
|
-
switch (logType) {
|
|
27
|
-
case logTypes.ERROR:
|
|
28
|
-
console.error(
|
|
29
|
-
`\x1b[31mERROR\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`,
|
|
30
|
-
log.error
|
|
31
|
-
);
|
|
32
|
-
break;
|
|
33
|
-
case logTypes.WARN:
|
|
34
|
-
if (log.error) {
|
|
35
|
-
console.warn(
|
|
36
|
-
`\x1b[33m⚠ WARN\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`,
|
|
37
|
-
log.error
|
|
38
|
-
);
|
|
39
|
-
} else {
|
|
40
|
-
console.warn(
|
|
41
|
-
`\x1b[33m⚠ WARN\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
break;
|
|
45
|
-
case logTypes.INFO:
|
|
46
|
-
if (log.error) {
|
|
47
|
-
console.log(
|
|
48
|
-
`\x1b[32m✔ INFO\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`,
|
|
49
|
-
log.error
|
|
50
|
-
);
|
|
51
|
-
} else {
|
|
52
|
-
console.log(
|
|
53
|
-
`\x1b[32m✔ INFO\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
break;
|
|
57
|
-
case logTypes.DEBUG:
|
|
58
|
-
if (log.error) {
|
|
59
|
-
console.debug(
|
|
60
|
-
`\x1b[36m🔍 DEBUG\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`,
|
|
61
|
-
log.error
|
|
62
|
-
);
|
|
63
|
-
} else {
|
|
64
|
-
console.debug(
|
|
65
|
-
`\x1b[36m🔍 DEBUG\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
break;
|
|
69
|
-
default:
|
|
70
|
-
console.log(
|
|
71
|
-
`\x1b[37mUNKNOWN\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
break;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
createLog(logType, componentSliceId, message, error = null) {
|
|
82
|
-
if (!this.logEnabled) return;
|
|
83
|
-
let componentName;
|
|
84
|
-
|
|
85
|
-
try {
|
|
86
|
-
componentName = slice.controller.activeComponents.get(componentSliceId).constructor.name;
|
|
87
|
-
} catch (_err) {
|
|
88
|
-
componentName = componentSliceId;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
let componentCategory = slice.controller.getComponentCategory(componentName);
|
|
92
|
-
if (componentSliceId === 'Slice' || componentSliceId === 'ThemeManager') componentCategory = 'Structural';
|
|
93
|
-
const log = new Log(logType, componentCategory, componentSliceId, message, error);
|
|
94
|
-
this.logs.push(log);
|
|
95
|
-
this.showLog(log);
|
|
96
|
-
for (const listener of this._logListeners) {
|
|
97
|
-
try { listener(log); } catch (_) { }
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Log an error message.
|
|
103
|
-
* @param {string} componentSliceId
|
|
104
|
-
* @param {string} message
|
|
105
|
-
* @param {any} [error]
|
|
106
|
-
* @returns {void}
|
|
107
|
-
*/
|
|
108
|
-
error(componentSliceId, message, error) {
|
|
109
|
-
this.createLog(logTypes.ERROR, componentSliceId, message, error);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Log a warning message.
|
|
114
|
-
* @param {string} componentSliceId
|
|
115
|
-
* @param {string} message
|
|
116
|
-
* @param {any} [error]
|
|
117
|
-
* @returns {void}
|
|
118
|
-
*/
|
|
119
|
-
warn(componentSliceId, message, error) {
|
|
120
|
-
this.createLog(logTypes.WARN, componentSliceId, message, error);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Log an info message.
|
|
125
|
-
* @param {string} componentSliceId
|
|
126
|
-
* @param {string} message
|
|
127
|
-
* @param {any} [error]
|
|
128
|
-
* @returns {void}
|
|
129
|
-
*/
|
|
130
|
-
info(componentSliceId, message, error) {
|
|
131
|
-
this.createLog(logTypes.INFO, componentSliceId, message, error);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Log a debug message.
|
|
136
|
-
* @param {string} componentSliceId
|
|
137
|
-
* @param {string} message
|
|
138
|
-
* @param {any} [error]
|
|
139
|
-
* @returns {void}
|
|
140
|
-
*/
|
|
141
|
-
debug(componentSliceId, message, error) {
|
|
142
|
-
this.createLog(logTypes.DEBUG, componentSliceId, message, error);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// ── Retrocompatibilidad: métodos antiguos redirigen a los nuevos ──
|
|
146
|
-
|
|
147
|
-
/** @deprecated Use .error() instead */
|
|
148
|
-
logError(componentSliceId, message, error) {
|
|
149
|
-
this.error(componentSliceId, message, error);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/** @deprecated Use .warn() instead */
|
|
153
|
-
logWarning(componentSliceId, message, error) {
|
|
154
|
-
this.warn(componentSliceId, message, error);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/** @deprecated Use .info() instead */
|
|
158
|
-
logInfo(componentSliceId, message, error) {
|
|
159
|
-
this.info(componentSliceId, message, error);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Subscribe to new log entries in real time.
|
|
164
|
-
* @param {Function} callback — receives the Log instance
|
|
165
|
-
* @returns {Function} the same callback (for passing to offLog)
|
|
166
|
-
*/
|
|
167
|
-
onLog(callback) {
|
|
168
|
-
if (typeof callback === 'function') {
|
|
169
|
-
this._logListeners.add(callback);
|
|
170
|
-
}
|
|
171
|
-
return callback;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* Unsubscribe a previously registered listener.
|
|
176
|
-
* @param {Function} callback
|
|
177
|
-
* @returns {void}
|
|
178
|
-
*/
|
|
179
|
-
offLog(callback) {
|
|
180
|
-
this._logListeners.delete(callback);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Get all logs.
|
|
185
|
-
* @returns {Array}
|
|
186
|
-
*/
|
|
187
|
-
getLogs() {
|
|
188
|
-
return this.logs;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Clear all logs.
|
|
193
|
-
* @returns {void}
|
|
194
|
-
*/
|
|
195
|
-
clearLogs() {
|
|
196
|
-
this.logs = [];
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Filter logs by type.
|
|
201
|
-
* @param {string} type
|
|
202
|
-
* @returns {Array}
|
|
203
|
-
*/
|
|
204
|
-
getLogsByLogType(type) {
|
|
205
|
-
return this.logs.filter((log) => log.logType === type);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Filter logs by component category.
|
|
210
|
-
* @param {string} componentCategory
|
|
211
|
-
* @returns {Array}
|
|
212
|
-
*/
|
|
213
|
-
getLogsByComponentCategory(componentCategory) {
|
|
214
|
-
return this.logs.filter((log) => log.componentCategory === componentCategory);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Filter logs by component sliceId.
|
|
219
|
-
* @param {string} componentSliceId
|
|
220
|
-
* @returns {Array}
|
|
221
|
-
*/
|
|
222
|
-
getLogsByComponent(componentSliceId) {
|
|
223
|
-
return this.logs.filter((log) => log.componentSliceId === componentSliceId);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
1
|
+
import Log from './Log.js';
|
|
2
|
+
|
|
3
|
+
const logTypes = {
|
|
4
|
+
ERROR: 'error',
|
|
5
|
+
WARN: 'warn',
|
|
6
|
+
INFO: 'info',
|
|
7
|
+
DEBUG: 'debug',
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export default class Logger {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.logs = [];
|
|
13
|
+
this._logListeners = new Set();
|
|
14
|
+
this.logEnabled = slice.loggerConfig.enabled;
|
|
15
|
+
this.showLogsConfig = slice.loggerConfig.showLogs;
|
|
16
|
+
|
|
17
|
+
this.showLog = function showLog(log) {
|
|
18
|
+
if (!this.showLogsConfig) return;
|
|
19
|
+
|
|
20
|
+
const logType = log.logType;
|
|
21
|
+
|
|
22
|
+
Object.keys(this.showLogsConfig).forEach((logConfig) => {
|
|
23
|
+
if (this.showLogsConfig[logConfig][logType] === true) {
|
|
24
|
+
switch (logConfig) {
|
|
25
|
+
case 'console':
|
|
26
|
+
switch (logType) {
|
|
27
|
+
case logTypes.ERROR:
|
|
28
|
+
console.error(
|
|
29
|
+
`\x1b[31mERROR\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`,
|
|
30
|
+
log.error
|
|
31
|
+
);
|
|
32
|
+
break;
|
|
33
|
+
case logTypes.WARN:
|
|
34
|
+
if (log.error) {
|
|
35
|
+
console.warn(
|
|
36
|
+
`\x1b[33m⚠ WARN\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`,
|
|
37
|
+
log.error
|
|
38
|
+
);
|
|
39
|
+
} else {
|
|
40
|
+
console.warn(
|
|
41
|
+
`\x1b[33m⚠ WARN\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
case logTypes.INFO:
|
|
46
|
+
if (log.error) {
|
|
47
|
+
console.log(
|
|
48
|
+
`\x1b[32m✔ INFO\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`,
|
|
49
|
+
log.error
|
|
50
|
+
);
|
|
51
|
+
} else {
|
|
52
|
+
console.log(
|
|
53
|
+
`\x1b[32m✔ INFO\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
break;
|
|
57
|
+
case logTypes.DEBUG:
|
|
58
|
+
if (log.error) {
|
|
59
|
+
console.debug(
|
|
60
|
+
`\x1b[36m🔍 DEBUG\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`,
|
|
61
|
+
log.error
|
|
62
|
+
);
|
|
63
|
+
} else {
|
|
64
|
+
console.debug(
|
|
65
|
+
`\x1b[36m🔍 DEBUG\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
default:
|
|
70
|
+
console.log(
|
|
71
|
+
`\x1b[37mUNKNOWN\x1b[0m - ${log.componentCategory} - ${log.componentSliceId} - ${log.message}`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
createLog(logType, componentSliceId, message, error = null) {
|
|
82
|
+
if (!this.logEnabled) return;
|
|
83
|
+
let componentName;
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
componentName = slice.controller.activeComponents.get(componentSliceId).constructor.name;
|
|
87
|
+
} catch (_err) {
|
|
88
|
+
componentName = componentSliceId;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
let componentCategory = slice.controller.getComponentCategory(componentName);
|
|
92
|
+
if (componentSliceId === 'Slice' || componentSliceId === 'ThemeManager') componentCategory = 'Structural';
|
|
93
|
+
const log = new Log(logType, componentCategory, componentSliceId, message, error);
|
|
94
|
+
this.logs.push(log);
|
|
95
|
+
this.showLog(log);
|
|
96
|
+
for (const listener of this._logListeners) {
|
|
97
|
+
try { listener(log); } catch (_) { }
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Log an error message.
|
|
103
|
+
* @param {string} componentSliceId
|
|
104
|
+
* @param {string} message
|
|
105
|
+
* @param {any} [error]
|
|
106
|
+
* @returns {void}
|
|
107
|
+
*/
|
|
108
|
+
error(componentSliceId, message, error) {
|
|
109
|
+
this.createLog(logTypes.ERROR, componentSliceId, message, error);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Log a warning message.
|
|
114
|
+
* @param {string} componentSliceId
|
|
115
|
+
* @param {string} message
|
|
116
|
+
* @param {any} [error]
|
|
117
|
+
* @returns {void}
|
|
118
|
+
*/
|
|
119
|
+
warn(componentSliceId, message, error) {
|
|
120
|
+
this.createLog(logTypes.WARN, componentSliceId, message, error);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Log an info message.
|
|
125
|
+
* @param {string} componentSliceId
|
|
126
|
+
* @param {string} message
|
|
127
|
+
* @param {any} [error]
|
|
128
|
+
* @returns {void}
|
|
129
|
+
*/
|
|
130
|
+
info(componentSliceId, message, error) {
|
|
131
|
+
this.createLog(logTypes.INFO, componentSliceId, message, error);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Log a debug message.
|
|
136
|
+
* @param {string} componentSliceId
|
|
137
|
+
* @param {string} message
|
|
138
|
+
* @param {any} [error]
|
|
139
|
+
* @returns {void}
|
|
140
|
+
*/
|
|
141
|
+
debug(componentSliceId, message, error) {
|
|
142
|
+
this.createLog(logTypes.DEBUG, componentSliceId, message, error);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// ── Retrocompatibilidad: métodos antiguos redirigen a los nuevos ──
|
|
146
|
+
|
|
147
|
+
/** @deprecated Use .error() instead */
|
|
148
|
+
logError(componentSliceId, message, error) {
|
|
149
|
+
this.error(componentSliceId, message, error);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** @deprecated Use .warn() instead */
|
|
153
|
+
logWarning(componentSliceId, message, error) {
|
|
154
|
+
this.warn(componentSliceId, message, error);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** @deprecated Use .info() instead */
|
|
158
|
+
logInfo(componentSliceId, message, error) {
|
|
159
|
+
this.info(componentSliceId, message, error);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Subscribe to new log entries in real time.
|
|
164
|
+
* @param {Function} callback — receives the Log instance
|
|
165
|
+
* @returns {Function} the same callback (for passing to offLog)
|
|
166
|
+
*/
|
|
167
|
+
onLog(callback) {
|
|
168
|
+
if (typeof callback === 'function') {
|
|
169
|
+
this._logListeners.add(callback);
|
|
170
|
+
}
|
|
171
|
+
return callback;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Unsubscribe a previously registered listener.
|
|
176
|
+
* @param {Function} callback
|
|
177
|
+
* @returns {void}
|
|
178
|
+
*/
|
|
179
|
+
offLog(callback) {
|
|
180
|
+
this._logListeners.delete(callback);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Get all logs.
|
|
185
|
+
* @returns {Array}
|
|
186
|
+
*/
|
|
187
|
+
getLogs() {
|
|
188
|
+
return this.logs;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Clear all logs.
|
|
193
|
+
* @returns {void}
|
|
194
|
+
*/
|
|
195
|
+
clearLogs() {
|
|
196
|
+
this.logs = [];
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Filter logs by type.
|
|
201
|
+
* @param {string} type
|
|
202
|
+
* @returns {Array}
|
|
203
|
+
*/
|
|
204
|
+
getLogsByLogType(type) {
|
|
205
|
+
return this.logs.filter((log) => log.logType === type);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Filter logs by component category.
|
|
210
|
+
* @param {string} componentCategory
|
|
211
|
+
* @returns {Array}
|
|
212
|
+
*/
|
|
213
|
+
getLogsByComponentCategory(componentCategory) {
|
|
214
|
+
return this.logs.filter((log) => log.componentCategory === componentCategory);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Filter logs by component sliceId.
|
|
219
|
+
* @param {string} componentSliceId
|
|
220
|
+
* @returns {Array}
|
|
221
|
+
*/
|
|
222
|
+
getLogsByComponent(componentSliceId) {
|
|
223
|
+
return this.logs.filter((log) => log.componentSliceId === componentSliceId);
|
|
224
|
+
}
|
|
225
|
+
}
|