@vlian/framework 1.2.54 → 1.2.56

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 (97) hide show
  1. package/dist/analytics.umd.js +1 -1
  2. package/dist/core/initialization/initialization.cjs.map +1 -1
  3. package/dist/core/initialization/initialization.js +3 -3
  4. package/dist/core/initialization/initialization.js.map +1 -1
  5. package/dist/core/router/validation/RouterConfigValidator.d.ts +2 -2
  6. package/dist/core/router/validation/schema.d.ts +3 -3
  7. package/dist/index.umd.js +497 -281
  8. package/dist/index.umd.js.map +1 -1
  9. package/dist/kernel/manager/i18n/I18nManager.cjs +93 -0
  10. package/dist/kernel/manager/i18n/I18nManager.cjs.map +1 -0
  11. package/dist/kernel/manager/i18n/I18nManager.d.ts +15 -0
  12. package/dist/kernel/manager/i18n/I18nManager.js +83 -0
  13. package/dist/kernel/manager/i18n/I18nManager.js.map +1 -0
  14. package/dist/kernel/manager/i18n/i18n.persistence.cjs +59 -0
  15. package/dist/kernel/manager/i18n/i18n.persistence.cjs.map +1 -0
  16. package/dist/kernel/manager/i18n/i18n.persistence.d.ts +5 -0
  17. package/dist/kernel/manager/i18n/i18n.persistence.js +38 -0
  18. package/dist/kernel/manager/i18n/i18n.persistence.js.map +1 -0
  19. package/dist/kernel/manager/i18n/i18n.schema.cjs +88 -0
  20. package/dist/kernel/manager/i18n/i18n.schema.cjs.map +1 -0
  21. package/dist/kernel/manager/i18n/i18n.schema.d.ts +6 -0
  22. package/dist/kernel/manager/i18n/i18n.schema.js +64 -0
  23. package/dist/kernel/manager/i18n/i18n.schema.js.map +1 -0
  24. package/dist/kernel/manager/i18n/index.cjs +13 -0
  25. package/dist/kernel/manager/i18n/index.cjs.map +1 -0
  26. package/dist/kernel/manager/i18n/index.d.ts +1 -0
  27. package/dist/kernel/manager/i18n/index.js +3 -0
  28. package/dist/kernel/manager/i18n/index.js.map +1 -0
  29. package/dist/kernel/manager/i18nManager.cjs +2 -77
  30. package/dist/kernel/manager/i18nManager.cjs.map +1 -1
  31. package/dist/kernel/manager/i18nManager.d.ts +1 -13
  32. package/dist/kernel/manager/i18nManager.js +1 -76
  33. package/dist/kernel/manager/i18nManager.js.map +1 -1
  34. package/dist/kernel/manager/logger/LoggerManager.cjs +109 -0
  35. package/dist/kernel/manager/logger/LoggerManager.cjs.map +1 -0
  36. package/dist/kernel/manager/logger/LoggerManager.d.ts +21 -0
  37. package/dist/kernel/manager/logger/LoggerManager.js +99 -0
  38. package/dist/kernel/manager/logger/LoggerManager.js.map +1 -0
  39. package/dist/kernel/manager/logger/index.cjs +13 -0
  40. package/dist/kernel/manager/logger/index.cjs.map +1 -0
  41. package/dist/kernel/manager/logger/index.d.ts +1 -0
  42. package/dist/kernel/manager/logger/index.js +3 -0
  43. package/dist/kernel/manager/logger/index.js.map +1 -0
  44. package/dist/kernel/manager/logger/logger.persistence.cjs +64 -0
  45. package/dist/kernel/manager/logger/logger.persistence.cjs.map +1 -0
  46. package/dist/kernel/manager/logger/logger.persistence.d.ts +6 -0
  47. package/dist/kernel/manager/logger/logger.persistence.js +43 -0
  48. package/dist/kernel/manager/logger/logger.persistence.js.map +1 -0
  49. package/dist/kernel/manager/logger/logger.schema.cjs +76 -0
  50. package/dist/kernel/manager/logger/logger.schema.cjs.map +1 -0
  51. package/dist/kernel/manager/logger/logger.schema.d.ts +8 -0
  52. package/dist/kernel/manager/logger/logger.schema.js +55 -0
  53. package/dist/kernel/manager/logger/logger.schema.js.map +1 -0
  54. package/dist/kernel/manager/loggerManager.cjs +2 -103
  55. package/dist/kernel/manager/loggerManager.cjs.map +1 -1
  56. package/dist/kernel/manager/loggerManager.d.ts +1 -18
  57. package/dist/kernel/manager/loggerManager.js +1 -102
  58. package/dist/kernel/manager/loggerManager.js.map +1 -1
  59. package/dist/kernel/manager/theme/ThemeManager.cjs +86 -0
  60. package/dist/kernel/manager/theme/ThemeManager.cjs.map +1 -0
  61. package/dist/kernel/manager/theme/ThemeManager.d.ts +16 -0
  62. package/dist/kernel/manager/theme/ThemeManager.js +76 -0
  63. package/dist/kernel/manager/theme/ThemeManager.js.map +1 -0
  64. package/dist/kernel/manager/theme/index.cjs +13 -0
  65. package/dist/kernel/manager/theme/index.cjs.map +1 -0
  66. package/dist/kernel/manager/theme/index.d.ts +1 -0
  67. package/dist/kernel/manager/theme/index.js +3 -0
  68. package/dist/kernel/manager/theme/index.js.map +1 -0
  69. package/dist/kernel/manager/theme/theme.dom.cjs +63 -0
  70. package/dist/kernel/manager/theme/theme.dom.cjs.map +1 -0
  71. package/dist/kernel/manager/theme/theme.dom.d.ts +3 -0
  72. package/dist/kernel/manager/theme/theme.dom.js +45 -0
  73. package/dist/kernel/manager/theme/theme.dom.js.map +1 -0
  74. package/dist/kernel/manager/theme/theme.persistence.cjs +59 -0
  75. package/dist/kernel/manager/theme/theme.persistence.cjs.map +1 -0
  76. package/dist/kernel/manager/theme/theme.persistence.d.ts +5 -0
  77. package/dist/kernel/manager/theme/theme.persistence.js +38 -0
  78. package/dist/kernel/manager/theme/theme.persistence.js.map +1 -0
  79. package/dist/kernel/manager/theme/theme.schema.cjs +124 -0
  80. package/dist/kernel/manager/theme/theme.schema.cjs.map +1 -0
  81. package/dist/kernel/manager/theme/theme.schema.d.ts +7 -0
  82. package/dist/kernel/manager/theme/theme.schema.js +97 -0
  83. package/dist/kernel/manager/theme/theme.schema.js.map +1 -0
  84. package/dist/kernel/manager/themeManager.cjs +2 -95
  85. package/dist/kernel/manager/themeManager.cjs.map +1 -1
  86. package/dist/kernel/manager/themeManager.d.ts +1 -15
  87. package/dist/kernel/manager/themeManager.js +1 -94
  88. package/dist/kernel/manager/themeManager.js.map +1 -1
  89. package/dist/kernel/types.d.ts +3 -3
  90. package/dist/kernel/types.js.map +1 -1
  91. package/dist/library/locale/index.cjs +8 -34
  92. package/dist/library/locale/index.cjs.map +1 -1
  93. package/dist/library/locale/index.d.ts +4 -4
  94. package/dist/library/locale/index.js +5 -34
  95. package/dist/library/locale/index.js.map +1 -1
  96. package/dist/state.umd.js +1 -1
  97. package/package.json +3 -1
@@ -0,0 +1,55 @@
1
+ import { LogLevel } from "@vlian/logger";
2
+ export function normalizeLogLevel(value, fallback) {
3
+ if (typeof value === 'number' && Number.isInteger(value)) {
4
+ switch(value){
5
+ case LogLevel.DEBUG:
6
+ case LogLevel.INFO:
7
+ case LogLevel.WARN:
8
+ case LogLevel.ERROR:
9
+ case LogLevel.NONE:
10
+ return value;
11
+ default:
12
+ return fallback;
13
+ }
14
+ }
15
+ if (typeof value !== 'string') {
16
+ return fallback;
17
+ }
18
+ const normalized = value.trim();
19
+ if (!normalized) {
20
+ return fallback;
21
+ }
22
+ if (/^\d+$/.test(normalized)) {
23
+ return normalizeLogLevel(Number(normalized), fallback);
24
+ }
25
+ switch(normalized.toUpperCase()){
26
+ case 'DEBUG':
27
+ return LogLevel.DEBUG;
28
+ case 'INFO':
29
+ return LogLevel.INFO;
30
+ case 'WARN':
31
+ return LogLevel.WARN;
32
+ case 'ERROR':
33
+ return LogLevel.ERROR;
34
+ case 'NONE':
35
+ return LogLevel.NONE;
36
+ default:
37
+ return fallback;
38
+ }
39
+ }
40
+ export function normalizeLoggerSnapshot(value, fallback) {
41
+ if (typeof value === 'number' || typeof value === 'string') {
42
+ return {
43
+ level: normalizeLogLevel(value, fallback.level)
44
+ };
45
+ }
46
+ const source = value && typeof value === 'object' ? value : {};
47
+ return {
48
+ level: normalizeLogLevel(source.level, fallback.level)
49
+ };
50
+ }
51
+ export function isLoggerEqual(left, right) {
52
+ return left.level === right.level;
53
+ }
54
+
55
+ //# sourceMappingURL=logger.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/kernel/manager/logger/logger.schema.ts"],"sourcesContent":["import { LogLevel } from '@vlian/logger';\n\nexport type LoggerSnapshot = {\n level: LogLevel;\n};\n\nexport type LoggerListener = (next: LoggerSnapshot, prev: LoggerSnapshot) => void;\n\nexport function normalizeLogLevel(value: unknown, fallback: LogLevel): LogLevel {\n if (typeof value === 'number' && Number.isInteger(value)) {\n switch (value) {\n case LogLevel.DEBUG:\n case LogLevel.INFO:\n case LogLevel.WARN:\n case LogLevel.ERROR:\n case LogLevel.NONE:\n return value;\n default:\n return fallback;\n }\n }\n\n if (typeof value !== 'string') {\n return fallback;\n }\n\n const normalized = value.trim();\n if (!normalized) {\n return fallback;\n }\n\n if (/^\\d+$/.test(normalized)) {\n return normalizeLogLevel(Number(normalized), fallback);\n }\n\n switch (normalized.toUpperCase()) {\n case 'DEBUG':\n return LogLevel.DEBUG;\n case 'INFO':\n return LogLevel.INFO;\n case 'WARN':\n return LogLevel.WARN;\n case 'ERROR':\n return LogLevel.ERROR;\n case 'NONE':\n return LogLevel.NONE;\n default:\n return fallback;\n }\n}\n\nexport function normalizeLoggerSnapshot(\n value: unknown,\n fallback: LoggerSnapshot\n): LoggerSnapshot {\n if (typeof value === 'number' || typeof value === 'string') {\n return {\n level: normalizeLogLevel(value, fallback.level),\n };\n }\n\n const source = value && typeof value === 'object' ? (value as Partial<LoggerSnapshot>) : {};\n\n return {\n level: normalizeLogLevel(source.level, fallback.level),\n };\n}\n\nexport function isLoggerEqual(left: LoggerSnapshot, right: LoggerSnapshot): boolean {\n return left.level === right.level;\n}\n"],"names":["LogLevel","normalizeLogLevel","value","fallback","Number","isInteger","DEBUG","INFO","WARN","ERROR","NONE","normalized","trim","test","toUpperCase","normalizeLoggerSnapshot","level","source","isLoggerEqual","left","right"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAgB;AAQzC,OAAO,SAASC,kBAAkBC,KAAc,EAAEC,QAAkB;IAClE,IAAI,OAAOD,UAAU,YAAYE,OAAOC,SAAS,CAACH,QAAQ;QACxD,OAAQA;YACN,KAAKF,SAASM,KAAK;YACnB,KAAKN,SAASO,IAAI;YAClB,KAAKP,SAASQ,IAAI;YAClB,KAAKR,SAASS,KAAK;YACnB,KAAKT,SAASU,IAAI;gBAChB,OAAOR;YACT;gBACE,OAAOC;QACX;IACF;IAEA,IAAI,OAAOD,UAAU,UAAU;QAC7B,OAAOC;IACT;IAEA,MAAMQ,aAAaT,MAAMU,IAAI;IAC7B,IAAI,CAACD,YAAY;QACf,OAAOR;IACT;IAEA,IAAI,QAAQU,IAAI,CAACF,aAAa;QAC5B,OAAOV,kBAAkBG,OAAOO,aAAaR;IAC/C;IAEA,OAAQQ,WAAWG,WAAW;QAC5B,KAAK;YACH,OAAOd,SAASM,KAAK;QACvB,KAAK;YACH,OAAON,SAASO,IAAI;QACtB,KAAK;YACH,OAAOP,SAASQ,IAAI;QACtB,KAAK;YACH,OAAOR,SAASS,KAAK;QACvB,KAAK;YACH,OAAOT,SAASU,IAAI;QACtB;YACE,OAAOP;IACX;AACF;AAEA,OAAO,SAASY,wBACdb,KAAc,EACdC,QAAwB;IAExB,IAAI,OAAOD,UAAU,YAAY,OAAOA,UAAU,UAAU;QAC1D,OAAO;YACLc,OAAOf,kBAAkBC,OAAOC,SAASa,KAAK;QAChD;IACF;IAEA,MAAMC,SAASf,SAAS,OAAOA,UAAU,WAAYA,QAAoC,CAAC;IAE1F,OAAO;QACLc,OAAOf,kBAAkBgB,OAAOD,KAAK,EAAEb,SAASa,KAAK;IACvD;AACF;AAEA,OAAO,SAASE,cAAcC,IAAoB,EAAEC,KAAqB;IACvE,OAAOD,KAAKH,KAAK,KAAKI,MAAMJ,KAAK;AACnC"}
@@ -5,110 +5,9 @@ Object.defineProperty(exports, "__esModule", {
5
5
  Object.defineProperty(exports, "LoggerManager", {
6
6
  enumerable: true,
7
7
  get: function() {
8
- return LoggerManager;
8
+ return _logger.LoggerManager;
9
9
  }
10
10
  });
11
- const _logger = require("@vlian/logger");
12
- const _constants = require("../constants");
13
- const _persistence = require("./persistence");
14
- function _define_property(obj, key, value) {
15
- if (key in obj) {
16
- Object.defineProperty(obj, key, {
17
- value: value,
18
- enumerable: true,
19
- configurable: true,
20
- writable: true
21
- });
22
- } else {
23
- obj[key] = value;
24
- }
25
- return obj;
26
- }
27
- function normalizeLogLevel(value, fallback) {
28
- if (typeof value === 'number' && Number.isInteger(value)) {
29
- switch(value){
30
- case _logger.LogLevel.DEBUG:
31
- case _logger.LogLevel.INFO:
32
- case _logger.LogLevel.WARN:
33
- case _logger.LogLevel.ERROR:
34
- case _logger.LogLevel.NONE:
35
- return value;
36
- default:
37
- return fallback;
38
- }
39
- }
40
- if (typeof value !== 'string') {
41
- return fallback;
42
- }
43
- const normalized = value.trim();
44
- if (!normalized) {
45
- return fallback;
46
- }
47
- if (/^\d+$/.test(normalized)) {
48
- return normalizeLogLevel(Number(normalized), fallback);
49
- }
50
- switch(normalized.toUpperCase()){
51
- case 'DEBUG':
52
- return _logger.LogLevel.DEBUG;
53
- case 'INFO':
54
- return _logger.LogLevel.INFO;
55
- case 'WARN':
56
- return _logger.LogLevel.WARN;
57
- case 'ERROR':
58
- return _logger.LogLevel.ERROR;
59
- case 'NONE':
60
- return _logger.LogLevel.NONE;
61
- default:
62
- return fallback;
63
- }
64
- }
65
- let LoggerManager = class LoggerManager {
66
- async initialize(context) {
67
- this.config = context.config.logger;
68
- const hasConfiguredLevel = this.config.level !== undefined && this.config.level !== null;
69
- const configuredLevel = normalizeLogLevel(this.config.level, _logger.LogLevel.INFO);
70
- if (hasConfiguredLevel) {
71
- this.level = configuredLevel;
72
- _logger.logger.setLevel(this.level);
73
- await (0, _persistence.writePersistedValue)(this.config.persistence, String(this.level));
74
- return;
75
- }
76
- const persisted = await (0, _persistence.readPersistedValue)(this.config.persistence);
77
- if (persisted !== null) {
78
- this.level = normalizeLogLevel(persisted, configuredLevel);
79
- _logger.logger.setLevel(this.level);
80
- return;
81
- }
82
- this.level = configuredLevel;
83
- _logger.logger.setLevel(this.level);
84
- await (0, _persistence.writePersistedValue)(this.config.persistence, String(this.level));
85
- }
86
- debug(...args) {
87
- _logger.logger.debug(...args);
88
- }
89
- info(...args) {
90
- _logger.logger.info(...args);
91
- }
92
- warn(...args) {
93
- _logger.logger.warn(...args);
94
- }
95
- error(...args) {
96
- _logger.logger.error(...args);
97
- }
98
- async setLevel(level) {
99
- this.level = level;
100
- _logger.logger.setLevel(level);
101
- await (0, _persistence.writePersistedValue)(this.config.persistence, String(level));
102
- }
103
- getSnapshot() {
104
- return {
105
- level: this.level
106
- };
107
- }
108
- constructor(){
109
- _define_property(this, "level", _logger.LogLevel.INFO);
110
- _define_property(this, "config", _constants.DEFAULT_CONFIG.logger);
111
- }
112
- };
11
+ const _logger = require("./logger");
113
12
 
114
13
  //# sourceMappingURL=loggerManager.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/kernel/manager/loggerManager.ts"],"sourcesContent":["import { logger, LogLevel } from '@vlian/logger';\nimport type { Logger } from '@vlian/logger';\nimport type { KernelConfig, KernelManager, KernelManagerContext } from '../types';\nimport { DEFAULT_CONFIG } from '../constants';\nimport { readPersistedValue, writePersistedValue } from './persistence';\n\nfunction normalizeLogLevel(value: unknown, fallback: LogLevel): LogLevel {\n if (typeof value === 'number' && Number.isInteger(value)) {\n switch (value) {\n case LogLevel.DEBUG:\n case LogLevel.INFO:\n case LogLevel.WARN:\n case LogLevel.ERROR:\n case LogLevel.NONE:\n return value;\n default:\n return fallback;\n }\n }\n\n if (typeof value !== 'string') {\n return fallback;\n }\n\n const normalized = value.trim();\n if (!normalized) {\n return fallback;\n }\n\n if (/^\\d+$/.test(normalized)) {\n return normalizeLogLevel(Number(normalized), fallback);\n }\n\n switch (normalized.toUpperCase()) {\n case 'DEBUG':\n return LogLevel.DEBUG;\n case 'INFO':\n return LogLevel.INFO;\n case 'WARN':\n return LogLevel.WARN;\n case 'ERROR':\n return LogLevel.ERROR;\n case 'NONE':\n return LogLevel.NONE;\n default:\n return fallback;\n }\n}\n\nexport class LoggerManager implements KernelManager<{ level: LogLevel }> {\n private level: LogLevel = LogLevel.INFO;\n private config: KernelConfig['logger'] = DEFAULT_CONFIG.logger;\n\n public async initialize(context: KernelManagerContext): Promise<void> {\n this.config = context.config.logger;\n const hasConfiguredLevel = this.config.level !== undefined && this.config.level !== null;\n const configuredLevel = normalizeLogLevel(this.config.level, LogLevel.INFO);\n\n if (hasConfiguredLevel) {\n this.level = configuredLevel;\n logger.setLevel(this.level);\n await writePersistedValue(this.config.persistence, String(this.level));\n return;\n }\n\n const persisted = await readPersistedValue(this.config.persistence);\n\n if (persisted !== null) {\n this.level = normalizeLogLevel(persisted, configuredLevel);\n logger.setLevel(this.level);\n return;\n }\n\n this.level = configuredLevel;\n logger.setLevel(this.level);\n await writePersistedValue(this.config.persistence, String(this.level));\n }\n\n public debug(...args: Parameters<Logger['debug']>): void {\n logger.debug(...args);\n }\n\n public info(...args: Parameters<Logger['info']>): void {\n logger.info(...args);\n }\n\n public warn(...args: Parameters<Logger['warn']>): void {\n logger.warn(...args);\n }\n\n public error(...args: Parameters<Logger['error']>): void {\n logger.error(...args);\n }\n\n public async setLevel(level: LogLevel): Promise<void> {\n this.level = level;\n logger.setLevel(level);\n await writePersistedValue(this.config.persistence, String(level));\n }\n\n public getSnapshot(): { level: LogLevel } {\n return { level: this.level };\n }\n}\n"],"names":["LoggerManager","normalizeLogLevel","value","fallback","Number","isInteger","LogLevel","DEBUG","INFO","WARN","ERROR","NONE","normalized","trim","test","toUpperCase","initialize","context","config","logger","hasConfiguredLevel","level","undefined","configuredLevel","setLevel","writePersistedValue","persistence","String","persisted","readPersistedValue","debug","args","info","warn","error","getSnapshot","DEFAULT_CONFIG"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/kernel/manager/loggerManager.ts"],"sourcesContent":["export { LoggerManager } from './logger';\n"],"names":["LoggerManager"],"mappings":";;;;+BAASA;;;eAAAA,qBAAa;;;wBAAQ"}
@@ -1,18 +1 @@
1
- import { LogLevel } from '@vlian/logger';
2
- import type { Logger } from '@vlian/logger';
3
- import type { KernelManager, KernelManagerContext } from '../types';
4
- export declare class LoggerManager implements KernelManager<{
5
- level: LogLevel;
6
- }> {
7
- private level;
8
- private config;
9
- initialize(context: KernelManagerContext): Promise<void>;
10
- debug(...args: Parameters<Logger['debug']>): void;
11
- info(...args: Parameters<Logger['info']>): void;
12
- warn(...args: Parameters<Logger['warn']>): void;
13
- error(...args: Parameters<Logger['error']>): void;
14
- setLevel(level: LogLevel): Promise<void>;
15
- getSnapshot(): {
16
- level: LogLevel;
17
- };
18
- }
1
+ export { LoggerManager } from './logger';
@@ -1,104 +1,3 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
13
- }
14
- import { logger, LogLevel } from "@vlian/logger";
15
- import { DEFAULT_CONFIG } from "../constants";
16
- import { readPersistedValue, writePersistedValue } from "./persistence";
17
- function normalizeLogLevel(value, fallback) {
18
- if (typeof value === 'number' && Number.isInteger(value)) {
19
- switch(value){
20
- case LogLevel.DEBUG:
21
- case LogLevel.INFO:
22
- case LogLevel.WARN:
23
- case LogLevel.ERROR:
24
- case LogLevel.NONE:
25
- return value;
26
- default:
27
- return fallback;
28
- }
29
- }
30
- if (typeof value !== 'string') {
31
- return fallback;
32
- }
33
- const normalized = value.trim();
34
- if (!normalized) {
35
- return fallback;
36
- }
37
- if (/^\d+$/.test(normalized)) {
38
- return normalizeLogLevel(Number(normalized), fallback);
39
- }
40
- switch(normalized.toUpperCase()){
41
- case 'DEBUG':
42
- return LogLevel.DEBUG;
43
- case 'INFO':
44
- return LogLevel.INFO;
45
- case 'WARN':
46
- return LogLevel.WARN;
47
- case 'ERROR':
48
- return LogLevel.ERROR;
49
- case 'NONE':
50
- return LogLevel.NONE;
51
- default:
52
- return fallback;
53
- }
54
- }
55
- export class LoggerManager {
56
- async initialize(context) {
57
- this.config = context.config.logger;
58
- const hasConfiguredLevel = this.config.level !== undefined && this.config.level !== null;
59
- const configuredLevel = normalizeLogLevel(this.config.level, LogLevel.INFO);
60
- if (hasConfiguredLevel) {
61
- this.level = configuredLevel;
62
- logger.setLevel(this.level);
63
- await writePersistedValue(this.config.persistence, String(this.level));
64
- return;
65
- }
66
- const persisted = await readPersistedValue(this.config.persistence);
67
- if (persisted !== null) {
68
- this.level = normalizeLogLevel(persisted, configuredLevel);
69
- logger.setLevel(this.level);
70
- return;
71
- }
72
- this.level = configuredLevel;
73
- logger.setLevel(this.level);
74
- await writePersistedValue(this.config.persistence, String(this.level));
75
- }
76
- debug(...args) {
77
- logger.debug(...args);
78
- }
79
- info(...args) {
80
- logger.info(...args);
81
- }
82
- warn(...args) {
83
- logger.warn(...args);
84
- }
85
- error(...args) {
86
- logger.error(...args);
87
- }
88
- async setLevel(level) {
89
- this.level = level;
90
- logger.setLevel(level);
91
- await writePersistedValue(this.config.persistence, String(level));
92
- }
93
- getSnapshot() {
94
- return {
95
- level: this.level
96
- };
97
- }
98
- constructor(){
99
- _define_property(this, "level", LogLevel.INFO);
100
- _define_property(this, "config", DEFAULT_CONFIG.logger);
101
- }
102
- }
1
+ export { LoggerManager } from "./logger";
103
2
 
104
3
  //# sourceMappingURL=loggerManager.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/kernel/manager/loggerManager.ts"],"sourcesContent":["import { logger, LogLevel } from '@vlian/logger';\nimport type { Logger } from '@vlian/logger';\nimport type { KernelConfig, KernelManager, KernelManagerContext } from '../types';\nimport { DEFAULT_CONFIG } from '../constants';\nimport { readPersistedValue, writePersistedValue } from './persistence';\n\nfunction normalizeLogLevel(value: unknown, fallback: LogLevel): LogLevel {\n if (typeof value === 'number' && Number.isInteger(value)) {\n switch (value) {\n case LogLevel.DEBUG:\n case LogLevel.INFO:\n case LogLevel.WARN:\n case LogLevel.ERROR:\n case LogLevel.NONE:\n return value;\n default:\n return fallback;\n }\n }\n\n if (typeof value !== 'string') {\n return fallback;\n }\n\n const normalized = value.trim();\n if (!normalized) {\n return fallback;\n }\n\n if (/^\\d+$/.test(normalized)) {\n return normalizeLogLevel(Number(normalized), fallback);\n }\n\n switch (normalized.toUpperCase()) {\n case 'DEBUG':\n return LogLevel.DEBUG;\n case 'INFO':\n return LogLevel.INFO;\n case 'WARN':\n return LogLevel.WARN;\n case 'ERROR':\n return LogLevel.ERROR;\n case 'NONE':\n return LogLevel.NONE;\n default:\n return fallback;\n }\n}\n\nexport class LoggerManager implements KernelManager<{ level: LogLevel }> {\n private level: LogLevel = LogLevel.INFO;\n private config: KernelConfig['logger'] = DEFAULT_CONFIG.logger;\n\n public async initialize(context: KernelManagerContext): Promise<void> {\n this.config = context.config.logger;\n const hasConfiguredLevel = this.config.level !== undefined && this.config.level !== null;\n const configuredLevel = normalizeLogLevel(this.config.level, LogLevel.INFO);\n\n if (hasConfiguredLevel) {\n this.level = configuredLevel;\n logger.setLevel(this.level);\n await writePersistedValue(this.config.persistence, String(this.level));\n return;\n }\n\n const persisted = await readPersistedValue(this.config.persistence);\n\n if (persisted !== null) {\n this.level = normalizeLogLevel(persisted, configuredLevel);\n logger.setLevel(this.level);\n return;\n }\n\n this.level = configuredLevel;\n logger.setLevel(this.level);\n await writePersistedValue(this.config.persistence, String(this.level));\n }\n\n public debug(...args: Parameters<Logger['debug']>): void {\n logger.debug(...args);\n }\n\n public info(...args: Parameters<Logger['info']>): void {\n logger.info(...args);\n }\n\n public warn(...args: Parameters<Logger['warn']>): void {\n logger.warn(...args);\n }\n\n public error(...args: Parameters<Logger['error']>): void {\n logger.error(...args);\n }\n\n public async setLevel(level: LogLevel): Promise<void> {\n this.level = level;\n logger.setLevel(level);\n await writePersistedValue(this.config.persistence, String(level));\n }\n\n public getSnapshot(): { level: LogLevel } {\n return { level: this.level };\n }\n}\n"],"names":["logger","LogLevel","DEFAULT_CONFIG","readPersistedValue","writePersistedValue","normalizeLogLevel","value","fallback","Number","isInteger","DEBUG","INFO","WARN","ERROR","NONE","normalized","trim","test","toUpperCase","LoggerManager","initialize","context","config","hasConfiguredLevel","level","undefined","configuredLevel","setLevel","persistence","String","persisted","debug","args","info","warn","error","getSnapshot"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/kernel/manager/loggerManager.ts"],"sourcesContent":["export { LoggerManager } from './logger';\n"],"names":["LoggerManager"],"mappings":"AAAA,SAASA,aAAa,QAAQ,WAAW"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "ThemeManager", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return ThemeManager;
9
+ }
10
+ });
11
+ const _constants = require("../../constants");
12
+ const _themedom = require("./theme.dom");
13
+ const _themepersistence = require("./theme.persistence");
14
+ const _themeschema = require("./theme.schema");
15
+ function _define_property(obj, key, value) {
16
+ if (key in obj) {
17
+ Object.defineProperty(obj, key, {
18
+ value: value,
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true
22
+ });
23
+ } else {
24
+ obj[key] = value;
25
+ }
26
+ return obj;
27
+ }
28
+ let ThemeManager = class ThemeManager {
29
+ async initialize(context) {
30
+ this.config = context.config.theme;
31
+ this.cacheManager = context.cacheManager;
32
+ const initialTheme = (0, _themeschema.normalizeTheme)(this.config.initial || {}, _constants.DEFAULT_THEME);
33
+ this.theme = await (0, _themepersistence.loadThemeFromCache)(this.cacheManager, this.config.persistence, initialTheme);
34
+ (0, _themedom.applyThemeToDocument)(this.theme);
35
+ this.initialized = true;
36
+ }
37
+ getTheme() {
38
+ return (0, _themeschema.cloneTheme)(this.theme);
39
+ }
40
+ getSnapshot() {
41
+ return this.getTheme();
42
+ }
43
+ subscribe(listener) {
44
+ this.listeners.add(listener);
45
+ return ()=>{
46
+ this.listeners.delete(listener);
47
+ };
48
+ }
49
+ async setTheme(nextTheme) {
50
+ this.ensureInitialized();
51
+ const prevTheme = this.theme;
52
+ const mergedTheme = (0, _themeschema.mergeTheme)(prevTheme, nextTheme);
53
+ if ((0, _themeschema.isThemeEqual)(prevTheme, mergedTheme)) {
54
+ return;
55
+ }
56
+ this.theme = mergedTheme;
57
+ (0, _themedom.applyThemeToDocument)(this.theme, prevTheme);
58
+ if (this.cacheManager) {
59
+ await (0, _themepersistence.saveThemeToCache)(this.cacheManager, this.config.persistence, this.theme);
60
+ }
61
+ this.emit(this.theme, prevTheme);
62
+ }
63
+ ensureInitialized() {
64
+ if (!this.initialized) {
65
+ throw new Error('ThemeManager must be initialized before use.');
66
+ }
67
+ }
68
+ emit(next, prev) {
69
+ for (const listener of this.listeners){
70
+ try {
71
+ listener((0, _themeschema.cloneTheme)(next), (0, _themeschema.cloneTheme)(prev));
72
+ } catch {
73
+ // Keep notifying remaining listeners even if one fails.
74
+ }
75
+ }
76
+ }
77
+ constructor(){
78
+ _define_property(this, "theme", (0, _themeschema.cloneTheme)(_constants.DEFAULT_THEME));
79
+ _define_property(this, "config", _constants.DEFAULT_CONFIG.theme);
80
+ _define_property(this, "listeners", new Set());
81
+ _define_property(this, "cacheManager", null);
82
+ _define_property(this, "initialized", false);
83
+ }
84
+ };
85
+
86
+ //# sourceMappingURL=ThemeManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/kernel/manager/theme/ThemeManager.ts"],"sourcesContent":["import type { StorageInstance } from '@vlian/utils';\nimport { DEFAULT_CONFIG, DEFAULT_THEME } from '../../constants';\nimport type { KernelConfig, KernelManager, KernelManagerContext, ThemeSnapshot } from '../../types';\nimport { applyThemeToDocument } from './theme.dom';\nimport { loadThemeFromCache, saveThemeToCache } from './theme.persistence';\nimport { cloneTheme, isThemeEqual, mergeTheme, normalizeTheme, type ThemeListener } from './theme.schema';\n\nexport class ThemeManager implements KernelManager<ThemeSnapshot> {\n private theme: ThemeSnapshot = cloneTheme(DEFAULT_THEME);\n private config: KernelConfig['theme'] = DEFAULT_CONFIG.theme;\n private listeners = new Set<ThemeListener>();\n private cacheManager: StorageInstance | null = null;\n private initialized = false;\n\n public async initialize(context: KernelManagerContext): Promise<void> {\n this.config = context.config.theme;\n this.cacheManager = context.cacheManager;\n\n const initialTheme = normalizeTheme(this.config.initial || {}, DEFAULT_THEME);\n this.theme = await loadThemeFromCache(this.cacheManager, this.config.persistence, initialTheme);\n\n applyThemeToDocument(this.theme);\n this.initialized = true;\n }\n\n public getTheme(): ThemeSnapshot {\n return cloneTheme(this.theme);\n }\n\n public getSnapshot(): ThemeSnapshot {\n return this.getTheme();\n }\n\n public subscribe(listener: ThemeListener): () => void {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n public async setTheme(nextTheme: ThemeSnapshot): Promise<void> {\n this.ensureInitialized();\n\n const prevTheme = this.theme;\n const mergedTheme = mergeTheme(prevTheme, nextTheme);\n\n if (isThemeEqual(prevTheme, mergedTheme)) {\n return;\n }\n\n this.theme = mergedTheme;\n applyThemeToDocument(this.theme, prevTheme);\n\n if (this.cacheManager) {\n await saveThemeToCache(this.cacheManager, this.config.persistence, this.theme);\n }\n\n this.emit(this.theme, prevTheme);\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error('ThemeManager must be initialized before use.');\n }\n }\n\n private emit(next: ThemeSnapshot, prev: ThemeSnapshot): void {\n for (const listener of this.listeners) {\n try {\n listener(cloneTheme(next), cloneTheme(prev));\n } catch {\n // Keep notifying remaining listeners even if one fails.\n }\n }\n }\n}\n"],"names":["ThemeManager","initialize","context","config","theme","cacheManager","initialTheme","normalizeTheme","initial","DEFAULT_THEME","loadThemeFromCache","persistence","applyThemeToDocument","initialized","getTheme","cloneTheme","getSnapshot","subscribe","listener","listeners","add","delete","setTheme","nextTheme","ensureInitialized","prevTheme","mergedTheme","mergeTheme","isThemeEqual","saveThemeToCache","emit","Error","next","prev","DEFAULT_CONFIG","Set"],"mappings":";;;;+BAOaA;;;eAAAA;;;2BANiC;0BAET;kCACgB;6BACoC;;;;;;;;;;;;;;AAElF,IAAA,AAAMA,eAAN,MAAMA;IAOX,MAAaC,WAAWC,OAA6B,EAAiB;QACpE,IAAI,CAACC,MAAM,GAAGD,QAAQC,MAAM,CAACC,KAAK;QAClC,IAAI,CAACC,YAAY,GAAGH,QAAQG,YAAY;QAExC,MAAMC,eAAeC,IAAAA,2BAAc,EAAC,IAAI,CAACJ,MAAM,CAACK,OAAO,IAAI,CAAC,GAAGC,wBAAa;QAC5E,IAAI,CAACL,KAAK,GAAG,MAAMM,IAAAA,oCAAkB,EAAC,IAAI,CAACL,YAAY,EAAE,IAAI,CAACF,MAAM,CAACQ,WAAW,EAAEL;QAElFM,IAAAA,8BAAoB,EAAC,IAAI,CAACR,KAAK;QAC/B,IAAI,CAACS,WAAW,GAAG;IACrB;IAEOC,WAA0B;QAC/B,OAAOC,IAAAA,uBAAU,EAAC,IAAI,CAACX,KAAK;IAC9B;IAEOY,cAA6B;QAClC,OAAO,IAAI,CAACF,QAAQ;IACtB;IAEOG,UAAUC,QAAuB,EAAc;QACpD,IAAI,CAACC,SAAS,CAACC,GAAG,CAACF;QAEnB,OAAO;YACL,IAAI,CAACC,SAAS,CAACE,MAAM,CAACH;QACxB;IACF;IAEA,MAAaI,SAASC,SAAwB,EAAiB;QAC7D,IAAI,CAACC,iBAAiB;QAEtB,MAAMC,YAAY,IAAI,CAACrB,KAAK;QAC5B,MAAMsB,cAAcC,IAAAA,uBAAU,EAACF,WAAWF;QAE1C,IAAIK,IAAAA,yBAAY,EAACH,WAAWC,cAAc;YACxC;QACF;QAEA,IAAI,CAACtB,KAAK,GAAGsB;QACbd,IAAAA,8BAAoB,EAAC,IAAI,CAACR,KAAK,EAAEqB;QAEjC,IAAI,IAAI,CAACpB,YAAY,EAAE;YACrB,MAAMwB,IAAAA,kCAAgB,EAAC,IAAI,CAACxB,YAAY,EAAE,IAAI,CAACF,MAAM,CAACQ,WAAW,EAAE,IAAI,CAACP,KAAK;QAC/E;QAEA,IAAI,CAAC0B,IAAI,CAAC,IAAI,CAAC1B,KAAK,EAAEqB;IACxB;IAEQD,oBAA0B;QAChC,IAAI,CAAC,IAAI,CAACX,WAAW,EAAE;YACrB,MAAM,IAAIkB,MAAM;QAClB;IACF;IAEQD,KAAKE,IAAmB,EAAEC,IAAmB,EAAQ;QAC3D,KAAK,MAAMf,YAAY,IAAI,CAACC,SAAS,CAAE;YACrC,IAAI;gBACFD,SAASH,IAAAA,uBAAU,EAACiB,OAAOjB,IAAAA,uBAAU,EAACkB;YACxC,EAAE,OAAM;YACN,wDAAwD;YAC1D;QACF;IACF;;QAnEA,uBAAQ7B,SAAuBW,IAAAA,uBAAU,EAACN,wBAAa;QACvD,uBAAQN,UAAgC+B,yBAAc,CAAC9B,KAAK;QAC5D,uBAAQe,aAAY,IAAIgB;QACxB,uBAAQ9B,gBAAuC;QAC/C,uBAAQQ,eAAc;;AAgExB"}
@@ -0,0 +1,16 @@
1
+ import type { KernelManager, KernelManagerContext, ThemeSnapshot } from '../../types';
2
+ import { type ThemeListener } from './theme.schema';
3
+ export declare class ThemeManager implements KernelManager<ThemeSnapshot> {
4
+ private theme;
5
+ private config;
6
+ private listeners;
7
+ private cacheManager;
8
+ private initialized;
9
+ initialize(context: KernelManagerContext): Promise<void>;
10
+ getTheme(): ThemeSnapshot;
11
+ getSnapshot(): ThemeSnapshot;
12
+ subscribe(listener: ThemeListener): () => void;
13
+ setTheme(nextTheme: ThemeSnapshot): Promise<void>;
14
+ private ensureInitialized;
15
+ private emit;
16
+ }
@@ -0,0 +1,76 @@
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else {
10
+ obj[key] = value;
11
+ }
12
+ return obj;
13
+ }
14
+ import { DEFAULT_CONFIG, DEFAULT_THEME } from "../../constants";
15
+ import { applyThemeToDocument } from "./theme.dom";
16
+ import { loadThemeFromCache, saveThemeToCache } from "./theme.persistence";
17
+ import { cloneTheme, isThemeEqual, mergeTheme, normalizeTheme } from "./theme.schema";
18
+ export class ThemeManager {
19
+ async initialize(context) {
20
+ this.config = context.config.theme;
21
+ this.cacheManager = context.cacheManager;
22
+ const initialTheme = normalizeTheme(this.config.initial || {}, DEFAULT_THEME);
23
+ this.theme = await loadThemeFromCache(this.cacheManager, this.config.persistence, initialTheme);
24
+ applyThemeToDocument(this.theme);
25
+ this.initialized = true;
26
+ }
27
+ getTheme() {
28
+ return cloneTheme(this.theme);
29
+ }
30
+ getSnapshot() {
31
+ return this.getTheme();
32
+ }
33
+ subscribe(listener) {
34
+ this.listeners.add(listener);
35
+ return ()=>{
36
+ this.listeners.delete(listener);
37
+ };
38
+ }
39
+ async setTheme(nextTheme) {
40
+ this.ensureInitialized();
41
+ const prevTheme = this.theme;
42
+ const mergedTheme = mergeTheme(prevTheme, nextTheme);
43
+ if (isThemeEqual(prevTheme, mergedTheme)) {
44
+ return;
45
+ }
46
+ this.theme = mergedTheme;
47
+ applyThemeToDocument(this.theme, prevTheme);
48
+ if (this.cacheManager) {
49
+ await saveThemeToCache(this.cacheManager, this.config.persistence, this.theme);
50
+ }
51
+ this.emit(this.theme, prevTheme);
52
+ }
53
+ ensureInitialized() {
54
+ if (!this.initialized) {
55
+ throw new Error('ThemeManager must be initialized before use.');
56
+ }
57
+ }
58
+ emit(next, prev) {
59
+ for (const listener of this.listeners){
60
+ try {
61
+ listener(cloneTheme(next), cloneTheme(prev));
62
+ } catch {
63
+ // Keep notifying remaining listeners even if one fails.
64
+ }
65
+ }
66
+ }
67
+ constructor(){
68
+ _define_property(this, "theme", cloneTheme(DEFAULT_THEME));
69
+ _define_property(this, "config", DEFAULT_CONFIG.theme);
70
+ _define_property(this, "listeners", new Set());
71
+ _define_property(this, "cacheManager", null);
72
+ _define_property(this, "initialized", false);
73
+ }
74
+ }
75
+
76
+ //# sourceMappingURL=ThemeManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/kernel/manager/theme/ThemeManager.ts"],"sourcesContent":["import type { StorageInstance } from '@vlian/utils';\nimport { DEFAULT_CONFIG, DEFAULT_THEME } from '../../constants';\nimport type { KernelConfig, KernelManager, KernelManagerContext, ThemeSnapshot } from '../../types';\nimport { applyThemeToDocument } from './theme.dom';\nimport { loadThemeFromCache, saveThemeToCache } from './theme.persistence';\nimport { cloneTheme, isThemeEqual, mergeTheme, normalizeTheme, type ThemeListener } from './theme.schema';\n\nexport class ThemeManager implements KernelManager<ThemeSnapshot> {\n private theme: ThemeSnapshot = cloneTheme(DEFAULT_THEME);\n private config: KernelConfig['theme'] = DEFAULT_CONFIG.theme;\n private listeners = new Set<ThemeListener>();\n private cacheManager: StorageInstance | null = null;\n private initialized = false;\n\n public async initialize(context: KernelManagerContext): Promise<void> {\n this.config = context.config.theme;\n this.cacheManager = context.cacheManager;\n\n const initialTheme = normalizeTheme(this.config.initial || {}, DEFAULT_THEME);\n this.theme = await loadThemeFromCache(this.cacheManager, this.config.persistence, initialTheme);\n\n applyThemeToDocument(this.theme);\n this.initialized = true;\n }\n\n public getTheme(): ThemeSnapshot {\n return cloneTheme(this.theme);\n }\n\n public getSnapshot(): ThemeSnapshot {\n return this.getTheme();\n }\n\n public subscribe(listener: ThemeListener): () => void {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n public async setTheme(nextTheme: ThemeSnapshot): Promise<void> {\n this.ensureInitialized();\n\n const prevTheme = this.theme;\n const mergedTheme = mergeTheme(prevTheme, nextTheme);\n\n if (isThemeEqual(prevTheme, mergedTheme)) {\n return;\n }\n\n this.theme = mergedTheme;\n applyThemeToDocument(this.theme, prevTheme);\n\n if (this.cacheManager) {\n await saveThemeToCache(this.cacheManager, this.config.persistence, this.theme);\n }\n\n this.emit(this.theme, prevTheme);\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error('ThemeManager must be initialized before use.');\n }\n }\n\n private emit(next: ThemeSnapshot, prev: ThemeSnapshot): void {\n for (const listener of this.listeners) {\n try {\n listener(cloneTheme(next), cloneTheme(prev));\n } catch {\n // Keep notifying remaining listeners even if one fails.\n }\n }\n }\n}\n"],"names":["DEFAULT_CONFIG","DEFAULT_THEME","applyThemeToDocument","loadThemeFromCache","saveThemeToCache","cloneTheme","isThemeEqual","mergeTheme","normalizeTheme","ThemeManager","initialize","context","config","theme","cacheManager","initialTheme","initial","persistence","initialized","getTheme","getSnapshot","subscribe","listener","listeners","add","delete","setTheme","nextTheme","ensureInitialized","prevTheme","mergedTheme","emit","Error","next","prev","Set"],"mappings":";;;;;;;;;;;;;AACA,SAASA,cAAc,EAAEC,aAAa,QAAQ,kBAAkB;AAEhE,SAASC,oBAAoB,QAAQ,cAAc;AACnD,SAASC,kBAAkB,EAAEC,gBAAgB,QAAQ,sBAAsB;AAC3E,SAASC,UAAU,EAAEC,YAAY,EAAEC,UAAU,EAAEC,cAAc,QAA4B,iBAAiB;AAE1G,OAAO,MAAMC;IAOX,MAAaC,WAAWC,OAA6B,EAAiB;QACpE,IAAI,CAACC,MAAM,GAAGD,QAAQC,MAAM,CAACC,KAAK;QAClC,IAAI,CAACC,YAAY,GAAGH,QAAQG,YAAY;QAExC,MAAMC,eAAeP,eAAe,IAAI,CAACI,MAAM,CAACI,OAAO,IAAI,CAAC,GAAGf;QAC/D,IAAI,CAACY,KAAK,GAAG,MAAMV,mBAAmB,IAAI,CAACW,YAAY,EAAE,IAAI,CAACF,MAAM,CAACK,WAAW,EAAEF;QAElFb,qBAAqB,IAAI,CAACW,KAAK;QAC/B,IAAI,CAACK,WAAW,GAAG;IACrB;IAEOC,WAA0B;QAC/B,OAAOd,WAAW,IAAI,CAACQ,KAAK;IAC9B;IAEOO,cAA6B;QAClC,OAAO,IAAI,CAACD,QAAQ;IACtB;IAEOE,UAAUC,QAAuB,EAAc;QACpD,IAAI,CAACC,SAAS,CAACC,GAAG,CAACF;QAEnB,OAAO;YACL,IAAI,CAACC,SAAS,CAACE,MAAM,CAACH;QACxB;IACF;IAEA,MAAaI,SAASC,SAAwB,EAAiB;QAC7D,IAAI,CAACC,iBAAiB;QAEtB,MAAMC,YAAY,IAAI,CAAChB,KAAK;QAC5B,MAAMiB,cAAcvB,WAAWsB,WAAWF;QAE1C,IAAIrB,aAAauB,WAAWC,cAAc;YACxC;QACF;QAEA,IAAI,CAACjB,KAAK,GAAGiB;QACb5B,qBAAqB,IAAI,CAACW,KAAK,EAAEgB;QAEjC,IAAI,IAAI,CAACf,YAAY,EAAE;YACrB,MAAMV,iBAAiB,IAAI,CAACU,YAAY,EAAE,IAAI,CAACF,MAAM,CAACK,WAAW,EAAE,IAAI,CAACJ,KAAK;QAC/E;QAEA,IAAI,CAACkB,IAAI,CAAC,IAAI,CAAClB,KAAK,EAAEgB;IACxB;IAEQD,oBAA0B;QAChC,IAAI,CAAC,IAAI,CAACV,WAAW,EAAE;YACrB,MAAM,IAAIc,MAAM;QAClB;IACF;IAEQD,KAAKE,IAAmB,EAAEC,IAAmB,EAAQ;QAC3D,KAAK,MAAMZ,YAAY,IAAI,CAACC,SAAS,CAAE;YACrC,IAAI;gBACFD,SAASjB,WAAW4B,OAAO5B,WAAW6B;YACxC,EAAE,OAAM;YACN,wDAAwD;YAC1D;QACF;IACF;;QAnEA,uBAAQrB,SAAuBR,WAAWJ;QAC1C,uBAAQW,UAAgCZ,eAAea,KAAK;QAC5D,uBAAQU,aAAY,IAAIY;QACxB,uBAAQrB,gBAAuC;QAC/C,uBAAQI,eAAc;;AAgExB"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "ThemeManager", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _ThemeManager.ThemeManager;
9
+ }
10
+ });
11
+ const _ThemeManager = require("./ThemeManager");
12
+
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/kernel/manager/theme/index.ts"],"sourcesContent":["export { ThemeManager } from './ThemeManager';\n"],"names":["ThemeManager"],"mappings":";;;;+BAASA;;;eAAAA,0BAAY;;;8BAAQ"}
@@ -0,0 +1 @@
1
+ export { ThemeManager } from './ThemeManager';
@@ -0,0 +1,3 @@
1
+ export { ThemeManager } from "./ThemeManager";
2
+
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/kernel/manager/theme/index.ts"],"sourcesContent":["export { ThemeManager } from './ThemeManager';\n"],"names":["ThemeManager"],"mappings":"AAAA,SAASA,YAAY,QAAQ,iBAAiB"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get applyThemeToDocument () {
13
+ return applyThemeToDocument;
14
+ },
15
+ get resolveThemeMode () {
16
+ return resolveThemeMode;
17
+ }
18
+ });
19
+ function canUseDom() {
20
+ return typeof document !== 'undefined';
21
+ }
22
+ function resolveThemeMode(theme) {
23
+ if (theme.mode !== 'system') {
24
+ return theme.mode;
25
+ }
26
+ if (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) {
27
+ return 'dark';
28
+ }
29
+ return 'light';
30
+ }
31
+ function applyThemeToDocument(nextTheme, prevTheme) {
32
+ if (!canUseDom()) {
33
+ return;
34
+ }
35
+ const root = document.documentElement;
36
+ const nextMode = resolveThemeMode(nextTheme);
37
+ const prevMode = prevTheme ? resolveThemeMode(prevTheme) : undefined;
38
+ if (!prevMode || prevMode !== nextMode) {
39
+ root.classList.remove('light', 'dark');
40
+ root.classList.add(nextMode);
41
+ }
42
+ if (!prevTheme || prevTheme.primaryColor !== nextTheme.primaryColor) {
43
+ if (nextTheme.primaryColor) {
44
+ root.style.setProperty('--app-primary-color', nextTheme.primaryColor);
45
+ } else {
46
+ root.style.removeProperty('--app-primary-color');
47
+ }
48
+ }
49
+ const prevTokens = prevTheme?.tokens || {};
50
+ const nextTokens = nextTheme.tokens || {};
51
+ for (const token of Object.keys(prevTokens)){
52
+ if (!(token in nextTokens)) {
53
+ root.style.removeProperty(`--${token}`);
54
+ }
55
+ }
56
+ for (const [token, value] of Object.entries(nextTokens)){
57
+ if (!prevTheme || prevTokens[token] !== value) {
58
+ root.style.setProperty(`--${token}`, String(value));
59
+ }
60
+ }
61
+ }
62
+
63
+ //# sourceMappingURL=theme.dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/kernel/manager/theme/theme.dom.ts"],"sourcesContent":["import type { ThemeSnapshot } from '../../types';\n\nfunction canUseDom(): boolean {\n return typeof document !== 'undefined';\n}\n\nexport function resolveThemeMode(theme: ThemeSnapshot): 'light' | 'dark' {\n if (theme.mode !== 'system') {\n return theme.mode;\n }\n\n if (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n\n return 'light';\n}\n\nexport function applyThemeToDocument(nextTheme: ThemeSnapshot, prevTheme?: ThemeSnapshot): void {\n if (!canUseDom()) {\n return;\n }\n\n const root = document.documentElement;\n const nextMode = resolveThemeMode(nextTheme);\n const prevMode = prevTheme ? resolveThemeMode(prevTheme) : undefined;\n\n if (!prevMode || prevMode !== nextMode) {\n root.classList.remove('light', 'dark');\n root.classList.add(nextMode);\n }\n\n if (!prevTheme || prevTheme.primaryColor !== nextTheme.primaryColor) {\n if (nextTheme.primaryColor) {\n root.style.setProperty('--app-primary-color', nextTheme.primaryColor);\n } else {\n root.style.removeProperty('--app-primary-color');\n }\n }\n\n const prevTokens = prevTheme?.tokens || {};\n const nextTokens = nextTheme.tokens || {};\n\n for (const token of Object.keys(prevTokens)) {\n if (!(token in nextTokens)) {\n root.style.removeProperty(`--${token}`);\n }\n }\n\n for (const [token, value] of Object.entries(nextTokens)) {\n if (!prevTheme || prevTokens[token] !== value) {\n root.style.setProperty(`--${token}`, String(value));\n }\n }\n}\n"],"names":["applyThemeToDocument","resolveThemeMode","canUseDom","document","theme","mode","window","matchMedia","matches","nextTheme","prevTheme","root","documentElement","nextMode","prevMode","undefined","classList","remove","add","primaryColor","style","setProperty","removeProperty","prevTokens","tokens","nextTokens","token","Object","keys","value","entries","String"],"mappings":";;;;;;;;;;;QAkBgBA;eAAAA;;QAZAC;eAAAA;;;AAJhB,SAASC;IACP,OAAO,OAAOC,aAAa;AAC7B;AAEO,SAASF,iBAAiBG,KAAoB;IACnD,IAAIA,MAAMC,IAAI,KAAK,UAAU;QAC3B,OAAOD,MAAMC,IAAI;IACnB;IAEA,IAAI,OAAOC,WAAW,eAAeA,OAAOC,UAAU,CAAC,gCAAgCC,OAAO,EAAE;QAC9F,OAAO;IACT;IAEA,OAAO;AACT;AAEO,SAASR,qBAAqBS,SAAwB,EAAEC,SAAyB;IACtF,IAAI,CAACR,aAAa;QAChB;IACF;IAEA,MAAMS,OAAOR,SAASS,eAAe;IACrC,MAAMC,WAAWZ,iBAAiBQ;IAClC,MAAMK,WAAWJ,YAAYT,iBAAiBS,aAAaK;IAE3D,IAAI,CAACD,YAAYA,aAAaD,UAAU;QACtCF,KAAKK,SAAS,CAACC,MAAM,CAAC,SAAS;QAC/BN,KAAKK,SAAS,CAACE,GAAG,CAACL;IACrB;IAEA,IAAI,CAACH,aAAaA,UAAUS,YAAY,KAAKV,UAAUU,YAAY,EAAE;QACnE,IAAIV,UAAUU,YAAY,EAAE;YAC1BR,KAAKS,KAAK,CAACC,WAAW,CAAC,uBAAuBZ,UAAUU,YAAY;QACtE,OAAO;YACLR,KAAKS,KAAK,CAACE,cAAc,CAAC;QAC5B;IACF;IAEA,MAAMC,aAAab,WAAWc,UAAU,CAAC;IACzC,MAAMC,aAAahB,UAAUe,MAAM,IAAI,CAAC;IAExC,KAAK,MAAME,SAASC,OAAOC,IAAI,CAACL,YAAa;QAC3C,IAAI,CAAEG,CAAAA,SAASD,UAAS,GAAI;YAC1Bd,KAAKS,KAAK,CAACE,cAAc,CAAC,CAAC,EAAE,EAAEI,OAAO;QACxC;IACF;IAEA,KAAK,MAAM,CAACA,OAAOG,MAAM,IAAIF,OAAOG,OAAO,CAACL,YAAa;QACvD,IAAI,CAACf,aAAaa,UAAU,CAACG,MAAM,KAAKG,OAAO;YAC7ClB,KAAKS,KAAK,CAACC,WAAW,CAAC,CAAC,EAAE,EAAEK,OAAO,EAAEK,OAAOF;QAC9C;IACF;AACF"}
@@ -0,0 +1,3 @@
1
+ import type { ThemeSnapshot } from '../../types';
2
+ export declare function resolveThemeMode(theme: ThemeSnapshot): 'light' | 'dark';
3
+ export declare function applyThemeToDocument(nextTheme: ThemeSnapshot, prevTheme?: ThemeSnapshot): void;