@superdangerous/app-framework 4.9.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/LICENSE +21 -0
- package/README.md +652 -0
- package/dist/api/logsRouter.d.ts +20 -0
- package/dist/api/logsRouter.d.ts.map +1 -0
- package/dist/api/logsRouter.js +515 -0
- package/dist/api/logsRouter.js.map +1 -0
- package/dist/cli/dev-server.d.ts +7 -0
- package/dist/cli/dev-server.d.ts.map +1 -0
- package/dist/cli/dev-server.js +640 -0
- package/dist/cli/dev-server.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/StandardServer.d.ts +129 -0
- package/dist/core/StandardServer.d.ts.map +1 -0
- package/dist/core/StandardServer.js +453 -0
- package/dist/core/StandardServer.js.map +1 -0
- package/dist/core/apiResponse.d.ts +69 -0
- package/dist/core/apiResponse.d.ts.map +1 -0
- package/dist/core/apiResponse.js +127 -0
- package/dist/core/apiResponse.js.map +1 -0
- package/dist/core/healthCheck.d.ts +160 -0
- package/dist/core/healthCheck.d.ts.map +1 -0
- package/dist/core/healthCheck.js +398 -0
- package/dist/core/healthCheck.js.map +1 -0
- package/dist/core/index.d.ts +40 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +40 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +117 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +826 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/portUtils.d.ts +71 -0
- package/dist/core/portUtils.d.ts.map +1 -0
- package/dist/core/portUtils.js +240 -0
- package/dist/core/portUtils.js.map +1 -0
- package/dist/core/storageService.d.ts +119 -0
- package/dist/core/storageService.d.ts.map +1 -0
- package/dist/core/storageService.js +405 -0
- package/dist/core/storageService.js.map +1 -0
- package/dist/desktop/bundler.d.ts +40 -0
- package/dist/desktop/bundler.d.ts.map +1 -0
- package/dist/desktop/bundler.js +176 -0
- package/dist/desktop/bundler.js.map +1 -0
- package/dist/desktop/index.d.ts +25 -0
- package/dist/desktop/index.d.ts.map +1 -0
- package/dist/desktop/index.js +15 -0
- package/dist/desktop/index.js.map +1 -0
- package/dist/desktop/native-modules.d.ts +66 -0
- package/dist/desktop/native-modules.d.ts.map +1 -0
- package/dist/desktop/native-modules.js +200 -0
- package/dist/desktop/native-modules.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/LogCategories.d.ts +87 -0
- package/dist/logging/LogCategories.d.ts.map +1 -0
- package/dist/logging/LogCategories.js +205 -0
- package/dist/logging/LogCategories.js.map +1 -0
- package/dist/middleware/aiErrorHandler.d.ts +31 -0
- package/dist/middleware/aiErrorHandler.d.ts.map +1 -0
- package/dist/middleware/aiErrorHandler.js +181 -0
- package/dist/middleware/aiErrorHandler.js.map +1 -0
- package/dist/middleware/auth.d.ts +101 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +230 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/cors.d.ts +56 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +123 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/errorHandler.d.ts +13 -0
- package/dist/middleware/errorHandler.d.ts.map +1 -0
- package/dist/middleware/errorHandler.js +85 -0
- package/dist/middleware/errorHandler.js.map +1 -0
- package/dist/middleware/fileUpload.d.ts +62 -0
- package/dist/middleware/fileUpload.d.ts.map +1 -0
- package/dist/middleware/fileUpload.js +175 -0
- package/dist/middleware/fileUpload.js.map +1 -0
- package/dist/middleware/health.d.ts +48 -0
- package/dist/middleware/health.d.ts.map +1 -0
- package/dist/middleware/health.js +143 -0
- package/dist/middleware/health.js.map +1 -0
- package/dist/middleware/index.d.ts +20 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +18 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/openapi.d.ts +64 -0
- package/dist/middleware/openapi.d.ts.map +1 -0
- package/dist/middleware/openapi.js +258 -0
- package/dist/middleware/openapi.js.map +1 -0
- package/dist/middleware/requestLogging.d.ts +22 -0
- package/dist/middleware/requestLogging.d.ts.map +1 -0
- package/dist/middleware/requestLogging.js +61 -0
- package/dist/middleware/requestLogging.js.map +1 -0
- package/dist/middleware/session.d.ts +84 -0
- package/dist/middleware/session.d.ts.map +1 -0
- package/dist/middleware/session.js +189 -0
- package/dist/middleware/session.js.map +1 -0
- package/dist/middleware/validation.d.ts +1337 -0
- package/dist/middleware/validation.d.ts.map +1 -0
- package/dist/middleware/validation.js +483 -0
- package/dist/middleware/validation.js.map +1 -0
- package/dist/services/aiService.d.ts +180 -0
- package/dist/services/aiService.d.ts.map +1 -0
- package/dist/services/aiService.js +547 -0
- package/dist/services/aiService.js.map +1 -0
- package/dist/services/conversationStorage.d.ts +38 -0
- package/dist/services/conversationStorage.d.ts.map +1 -0
- package/dist/services/conversationStorage.js +158 -0
- package/dist/services/conversationStorage.js.map +1 -0
- package/dist/services/crossPlatformBuffer.d.ts +84 -0
- package/dist/services/crossPlatformBuffer.d.ts.map +1 -0
- package/dist/services/crossPlatformBuffer.js +246 -0
- package/dist/services/crossPlatformBuffer.js.map +1 -0
- package/dist/services/index.d.ts +17 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/networkService.d.ts +81 -0
- package/dist/services/networkService.d.ts.map +1 -0
- package/dist/services/networkService.js +268 -0
- package/dist/services/networkService.js.map +1 -0
- package/dist/services/queueService.d.ts +112 -0
- package/dist/services/queueService.d.ts.map +1 -0
- package/dist/services/queueService.js +338 -0
- package/dist/services/queueService.js.map +1 -0
- package/dist/services/settingsService.d.ts +135 -0
- package/dist/services/settingsService.d.ts.map +1 -0
- package/dist/services/settingsService.js +425 -0
- package/dist/services/settingsService.js.map +1 -0
- package/dist/services/systemMonitor.d.ts +208 -0
- package/dist/services/systemMonitor.d.ts.map +1 -0
- package/dist/services/systemMonitor.js +693 -0
- package/dist/services/systemMonitor.js.map +1 -0
- package/dist/services/updateService.d.ts +78 -0
- package/dist/services/updateService.d.ts.map +1 -0
- package/dist/services/updateService.js +252 -0
- package/dist/services/updateService.js.map +1 -0
- package/dist/services/websocketEvents.d.ts +372 -0
- package/dist/services/websocketEvents.d.ts.map +1 -0
- package/dist/services/websocketEvents.js +338 -0
- package/dist/services/websocketEvents.js.map +1 -0
- package/dist/services/websocketServer.d.ts +80 -0
- package/dist/services/websocketServer.d.ts.map +1 -0
- package/dist/services/websocketServer.js +299 -0
- package/dist/services/websocketServer.js.map +1 -0
- package/dist/settings/SettingsSchema.d.ts +151 -0
- package/dist/settings/SettingsSchema.d.ts.map +1 -0
- package/dist/settings/SettingsSchema.js +424 -0
- package/dist/settings/SettingsSchema.js.map +1 -0
- package/dist/testing/TestServer.d.ts +69 -0
- package/dist/testing/TestServer.d.ts.map +1 -0
- package/dist/testing/TestServer.js +250 -0
- package/dist/testing/TestServer.js.map +1 -0
- package/dist/types/index.d.ts +137 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/appPaths.d.ts +74 -0
- package/dist/utils/appPaths.d.ts.map +1 -0
- package/dist/utils/appPaths.js +162 -0
- package/dist/utils/appPaths.js.map +1 -0
- package/dist/utils/fs-utils.d.ts +50 -0
- package/dist/utils/fs-utils.d.ts.map +1 -0
- package/dist/utils/fs-utils.js +114 -0
- package/dist/utils/fs-utils.js.map +1 -0
- package/dist/utils/index.d.ts +12 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/standardConfig.d.ts +61 -0
- package/dist/utils/standardConfig.d.ts.map +1 -0
- package/dist/utils/standardConfig.js +109 -0
- package/dist/utils/standardConfig.js.map +1 -0
- package/dist/utils/startupBanner.d.ts +34 -0
- package/dist/utils/startupBanner.d.ts.map +1 -0
- package/dist/utils/startupBanner.js +169 -0
- package/dist/utils/startupBanner.js.map +1 -0
- package/dist/utils/startupLogger.d.ts +45 -0
- package/dist/utils/startupLogger.d.ts.map +1 -0
- package/dist/utils/startupLogger.js +200 -0
- package/dist/utils/startupLogger.js.map +1 -0
- package/package.json +151 -0
- package/src/api/logsRouter.ts +600 -0
- package/src/cli/dev-server.ts +803 -0
- package/src/cli/index.ts +31 -0
- package/src/core/StandardServer.ts +587 -0
- package/src/core/apiResponse.ts +202 -0
- package/src/core/healthCheck.ts +565 -0
- package/src/core/index.ts +80 -0
- package/src/core/logger.ts +1092 -0
- package/src/core/portUtils.ts +319 -0
- package/src/core/storageService.ts +595 -0
- package/src/desktop/bundler.ts +271 -0
- package/src/desktop/index.ts +18 -0
- package/src/desktop/native-modules.ts +289 -0
- package/src/index.ts +142 -0
- package/src/logging/LogCategories.ts +302 -0
- package/src/middleware/aiErrorHandler.ts +278 -0
- package/src/middleware/auth.ts +329 -0
- package/src/middleware/cors.ts +187 -0
- package/src/middleware/errorHandler.ts +103 -0
- package/src/middleware/fileUpload.ts +252 -0
- package/src/middleware/health.ts +206 -0
- package/src/middleware/index.ts +71 -0
- package/src/middleware/openapi.ts +305 -0
- package/src/middleware/requestLogging.ts +92 -0
- package/src/middleware/session.ts +238 -0
- package/src/middleware/validation.ts +603 -0
- package/src/services/aiService.ts +789 -0
- package/src/services/conversationStorage.ts +232 -0
- package/src/services/crossPlatformBuffer.ts +341 -0
- package/src/services/index.ts +47 -0
- package/src/services/networkService.ts +351 -0
- package/src/services/queueService.ts +446 -0
- package/src/services/settingsService.ts +549 -0
- package/src/services/systemMonitor.ts +936 -0
- package/src/services/updateService.ts +334 -0
- package/src/services/websocketEvents.ts +409 -0
- package/src/services/websocketServer.ts +394 -0
- package/src/settings/SettingsSchema.ts +664 -0
- package/src/testing/TestServer.ts +312 -0
- package/src/types/index.ts +154 -0
- package/src/utils/appPaths.ts +196 -0
- package/src/utils/fs-utils.ts +130 -0
- package/src/utils/index.ts +15 -0
- package/src/utils/standardConfig.ts +178 -0
- package/src/utils/startupBanner.ts +287 -0
- package/src/utils/startupLogger.ts +268 -0
- package/ui/dist/index.d.mts +1221 -0
- package/ui/dist/index.d.ts +1221 -0
- package/ui/dist/index.js +73 -0
- package/ui/dist/index.js.map +1 -0
- package/ui/dist/index.mjs +73 -0
- package/ui/dist/index.mjs.map +1 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings Schema System
|
|
3
|
+
* Consolidated settings system with all features from both implementations
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Built-in validation functions
|
|
7
|
+
*/
|
|
8
|
+
export const Validators = {
|
|
9
|
+
required: (message = "This field is required") => (value) => {
|
|
10
|
+
if (!value || (typeof value === "string" && !value.trim())) {
|
|
11
|
+
return message;
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
},
|
|
15
|
+
email: (message = "Invalid email address") => (value) => {
|
|
16
|
+
if (value && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
|
|
17
|
+
return message;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
},
|
|
21
|
+
url: (message = "Invalid URL") => (value) => {
|
|
22
|
+
if (value) {
|
|
23
|
+
try {
|
|
24
|
+
new URL(value);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return message;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
},
|
|
32
|
+
ipAddress: (message = "Invalid IP address") => (value) => {
|
|
33
|
+
if (value) {
|
|
34
|
+
const parts = value.split(".");
|
|
35
|
+
if (parts.length !== 4)
|
|
36
|
+
return message;
|
|
37
|
+
for (const part of parts) {
|
|
38
|
+
const num = parseInt(part, 10);
|
|
39
|
+
if (isNaN(num) || num < 0 || num > 255)
|
|
40
|
+
return message;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
},
|
|
45
|
+
port: (message = "Invalid port number") => (value) => {
|
|
46
|
+
if (value < 1 || value > 65535) {
|
|
47
|
+
return message;
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
},
|
|
51
|
+
range: (min, max, message) => (value) => {
|
|
52
|
+
if (value < min || value > max) {
|
|
53
|
+
return message || `Value must be between ${min} and ${max}`;
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
},
|
|
57
|
+
pattern: (pattern, message = "Invalid format") => (value) => {
|
|
58
|
+
if (value && !pattern.test(value)) {
|
|
59
|
+
return message;
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
},
|
|
63
|
+
minLength: (min, message) => (value) => {
|
|
64
|
+
if (value && value.length < min) {
|
|
65
|
+
return message || `Must be at least ${min} characters`;
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
},
|
|
69
|
+
maxLength: (max, message) => (value) => {
|
|
70
|
+
if (value && value.length > max) {
|
|
71
|
+
return message || `Must be at most ${max} characters`;
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Helper to create a settings schema
|
|
78
|
+
*/
|
|
79
|
+
export function createSettingsSchema(schema) {
|
|
80
|
+
// Sort categories by order
|
|
81
|
+
schema.categories.sort((a, b) => (a.order || 0) - (b.order || 0));
|
|
82
|
+
return schema;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get setting by key from categories
|
|
86
|
+
*/
|
|
87
|
+
export function getSettingByKey(categories, key) {
|
|
88
|
+
for (const category of categories) {
|
|
89
|
+
const setting = category.settings.find((s) => s.key === key);
|
|
90
|
+
if (setting)
|
|
91
|
+
return setting;
|
|
92
|
+
}
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Validate a single setting
|
|
97
|
+
*/
|
|
98
|
+
export function validateSetting(setting, value) {
|
|
99
|
+
// Check required
|
|
100
|
+
if (setting.required &&
|
|
101
|
+
(!value || (typeof value === "string" && !value.trim()))) {
|
|
102
|
+
return setting.validationMessage || "This field is required";
|
|
103
|
+
}
|
|
104
|
+
// Type-specific validation
|
|
105
|
+
switch (setting.type) {
|
|
106
|
+
case "string":
|
|
107
|
+
case "password":
|
|
108
|
+
case "textarea":
|
|
109
|
+
if (value && typeof value !== "string") {
|
|
110
|
+
return setting.validationMessage || "Must be a string";
|
|
111
|
+
}
|
|
112
|
+
if (setting.validation) {
|
|
113
|
+
if (setting.validation.minLength !== undefined &&
|
|
114
|
+
value.length < setting.validation.minLength) {
|
|
115
|
+
return (setting.validationMessage ||
|
|
116
|
+
`Must be at least ${setting.validation.minLength} characters`);
|
|
117
|
+
}
|
|
118
|
+
if (setting.validation.maxLength !== undefined &&
|
|
119
|
+
value.length > setting.validation.maxLength) {
|
|
120
|
+
return (setting.validationMessage ||
|
|
121
|
+
`Must be at most ${setting.validation.maxLength} characters`);
|
|
122
|
+
}
|
|
123
|
+
if (setting.validation.pattern &&
|
|
124
|
+
!new RegExp(setting.validation.pattern).test(value)) {
|
|
125
|
+
return setting.validationMessage || "Invalid format";
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
break;
|
|
129
|
+
case "email":
|
|
130
|
+
if (value && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
|
|
131
|
+
return setting.validationMessage || "Invalid email address";
|
|
132
|
+
}
|
|
133
|
+
break;
|
|
134
|
+
case "url":
|
|
135
|
+
try {
|
|
136
|
+
if (value)
|
|
137
|
+
new URL(value);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return setting.validationMessage || "Invalid URL";
|
|
141
|
+
}
|
|
142
|
+
break;
|
|
143
|
+
case "ipaddress":
|
|
144
|
+
if (value) {
|
|
145
|
+
const parts = value.split(".");
|
|
146
|
+
if (parts.length !== 4) {
|
|
147
|
+
return setting.validationMessage || "Invalid IP address";
|
|
148
|
+
}
|
|
149
|
+
for (const part of parts) {
|
|
150
|
+
const num = parseInt(part, 10);
|
|
151
|
+
if (isNaN(num) || num < 0 || num > 255) {
|
|
152
|
+
return setting.validationMessage || "Invalid IP address";
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
break;
|
|
157
|
+
case "number":
|
|
158
|
+
if (typeof value !== "number" || isNaN(value)) {
|
|
159
|
+
return setting.validationMessage || "Must be a valid number";
|
|
160
|
+
}
|
|
161
|
+
if (setting.validation) {
|
|
162
|
+
if (setting.validation.min !== undefined &&
|
|
163
|
+
value < setting.validation.min) {
|
|
164
|
+
return (setting.validationMessage ||
|
|
165
|
+
`Must be at least ${setting.validation.min}`);
|
|
166
|
+
}
|
|
167
|
+
if (setting.validation.max !== undefined &&
|
|
168
|
+
value > setting.validation.max) {
|
|
169
|
+
return (setting.validationMessage ||
|
|
170
|
+
`Must be at most ${setting.validation.max}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Also check min/max at root level for backward compatibility
|
|
174
|
+
if (setting.min !== undefined && value < setting.min) {
|
|
175
|
+
return setting.validationMessage || `Must be at least ${setting.min}`;
|
|
176
|
+
}
|
|
177
|
+
if (setting.max !== undefined && value > setting.max) {
|
|
178
|
+
return setting.validationMessage || `Must be at most ${setting.max}`;
|
|
179
|
+
}
|
|
180
|
+
break;
|
|
181
|
+
case "boolean":
|
|
182
|
+
if (typeof value !== "boolean") {
|
|
183
|
+
return setting.validationMessage || "Must be true or false";
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
case "select":
|
|
187
|
+
case "multiselect":
|
|
188
|
+
if (setting.options) {
|
|
189
|
+
if (setting.type === "select" &&
|
|
190
|
+
!setting.options.some((opt) => opt.value === value)) {
|
|
191
|
+
return setting.validationMessage || "Must select a valid option";
|
|
192
|
+
}
|
|
193
|
+
if (setting.type === "multiselect" && Array.isArray(value)) {
|
|
194
|
+
const validValues = setting.options.map((opt) => opt.value);
|
|
195
|
+
if (!value.every((v) => validValues.includes(v))) {
|
|
196
|
+
return setting.validationMessage || "Invalid selection";
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
break;
|
|
201
|
+
case "date":
|
|
202
|
+
case "time":
|
|
203
|
+
case "datetime":
|
|
204
|
+
if (value && !Date.parse(value)) {
|
|
205
|
+
return setting.validationMessage || "Invalid date/time";
|
|
206
|
+
}
|
|
207
|
+
break;
|
|
208
|
+
case "color":
|
|
209
|
+
if (value && !/^#[0-9A-Fa-f]{6}$/.test(value)) {
|
|
210
|
+
return (setting.validationMessage || "Invalid color (must be hex format)");
|
|
211
|
+
}
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
// Custom validation
|
|
215
|
+
if (setting.validation?.custom) {
|
|
216
|
+
const error = setting.validation.custom(value);
|
|
217
|
+
if (error)
|
|
218
|
+
return error;
|
|
219
|
+
}
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Validate all settings against schema
|
|
224
|
+
*/
|
|
225
|
+
export function validateSettings(schema, settings) {
|
|
226
|
+
const errors = {};
|
|
227
|
+
for (const category of schema.categories) {
|
|
228
|
+
for (const setting of category.settings) {
|
|
229
|
+
if (setting.hidden)
|
|
230
|
+
continue;
|
|
231
|
+
const value = settings[setting.key];
|
|
232
|
+
const error = validateSetting(setting, value);
|
|
233
|
+
if (error) {
|
|
234
|
+
errors[setting.key] = error;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Run custom validation
|
|
239
|
+
if (schema.onValidate) {
|
|
240
|
+
const customErrors = schema.onValidate(settings);
|
|
241
|
+
if (customErrors) {
|
|
242
|
+
Object.assign(errors, customErrors);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return errors;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Validate all settings (returns result object)
|
|
249
|
+
*/
|
|
250
|
+
export function validateAllSettings(categories, values) {
|
|
251
|
+
const errors = {};
|
|
252
|
+
for (const category of categories) {
|
|
253
|
+
for (const setting of category.settings) {
|
|
254
|
+
if (setting.hidden)
|
|
255
|
+
continue;
|
|
256
|
+
const value = values[setting.key];
|
|
257
|
+
const error = validateSetting(setting, value);
|
|
258
|
+
if (error) {
|
|
259
|
+
errors[setting.key] = error;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
isValid: Object.keys(errors).length === 0,
|
|
265
|
+
errors,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Helper to flatten nested settings for storage
|
|
270
|
+
*/
|
|
271
|
+
export function flattenSettings(settings, prefix = "") {
|
|
272
|
+
const flattened = {};
|
|
273
|
+
for (const [key, value] of Object.entries(settings)) {
|
|
274
|
+
const fullKey = prefix ? `${prefix}.${key}` : key;
|
|
275
|
+
if (value &&
|
|
276
|
+
typeof value === "object" &&
|
|
277
|
+
!Array.isArray(value) &&
|
|
278
|
+
!(value instanceof Date)) {
|
|
279
|
+
Object.assign(flattened, flattenSettings(value, fullKey));
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
flattened[fullKey] = value;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return flattened;
|
|
286
|
+
}
|
|
287
|
+
// Alias for consistency
|
|
288
|
+
export const flattenSettingsValues = flattenSettings;
|
|
289
|
+
/**
|
|
290
|
+
* Helper to unflatten settings from storage
|
|
291
|
+
*/
|
|
292
|
+
export function unflattenSettings(flattened) {
|
|
293
|
+
const settings = {};
|
|
294
|
+
for (const [key, value] of Object.entries(flattened)) {
|
|
295
|
+
const parts = key.split(".");
|
|
296
|
+
let current = settings;
|
|
297
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
298
|
+
const part = parts[i];
|
|
299
|
+
if (!part)
|
|
300
|
+
continue;
|
|
301
|
+
if (!current[part]) {
|
|
302
|
+
current[part] = {};
|
|
303
|
+
}
|
|
304
|
+
current = current[part];
|
|
305
|
+
}
|
|
306
|
+
const lastPart = parts[parts.length - 1];
|
|
307
|
+
if (lastPart) {
|
|
308
|
+
current[lastPart] = value;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return settings;
|
|
312
|
+
}
|
|
313
|
+
// Alias for consistency
|
|
314
|
+
export const unflattenSettingsValues = unflattenSettings;
|
|
315
|
+
/**
|
|
316
|
+
* Get all settings that require restart
|
|
317
|
+
*/
|
|
318
|
+
export function getRestartRequiredSettings(schema, changedSettings) {
|
|
319
|
+
const restartRequired = [];
|
|
320
|
+
// Handle both schema and categories array
|
|
321
|
+
const categories = Array.isArray(schema) ? schema : schema.categories;
|
|
322
|
+
// Handle both changed settings object and array of keys
|
|
323
|
+
const changedKeys = Array.isArray(changedSettings)
|
|
324
|
+
? changedSettings
|
|
325
|
+
: Object.keys(changedSettings);
|
|
326
|
+
for (const category of categories) {
|
|
327
|
+
for (const setting of category.settings) {
|
|
328
|
+
if (setting.requiresRestart && changedKeys.includes(setting.key)) {
|
|
329
|
+
restartRequired.push(setting.key);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return restartRequired;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Get default values from settings
|
|
337
|
+
*/
|
|
338
|
+
export function getDefaultSettingsValues(categories) {
|
|
339
|
+
const defaults = {};
|
|
340
|
+
for (const category of categories) {
|
|
341
|
+
for (const setting of category.settings) {
|
|
342
|
+
if (!setting.hidden && setting.defaultValue !== undefined) {
|
|
343
|
+
defaults[setting.key] = setting.defaultValue;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return defaults;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Evaluate conditional visibility for a field
|
|
351
|
+
*/
|
|
352
|
+
export function evaluateFieldVisibility(field, currentValues) {
|
|
353
|
+
if (!field.showIf) {
|
|
354
|
+
return true;
|
|
355
|
+
}
|
|
356
|
+
try {
|
|
357
|
+
return field.showIf(currentValues);
|
|
358
|
+
}
|
|
359
|
+
catch (_error) {
|
|
360
|
+
console.error(`Error evaluating showIf for field ${field.key}:`, _error);
|
|
361
|
+
return true; // Show field if evaluation fails
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Group fields by their group property
|
|
366
|
+
*/
|
|
367
|
+
export function groupFields(fields) {
|
|
368
|
+
const groups = new Map();
|
|
369
|
+
// First, add ungrouped fields
|
|
370
|
+
const ungrouped = fields.filter((f) => !f.group);
|
|
371
|
+
if (ungrouped.length > 0) {
|
|
372
|
+
groups.set("_default", ungrouped);
|
|
373
|
+
}
|
|
374
|
+
// Then, group the rest
|
|
375
|
+
fields
|
|
376
|
+
.filter((f) => f.group)
|
|
377
|
+
.forEach((field) => {
|
|
378
|
+
const group = field.group;
|
|
379
|
+
if (!groups.has(group)) {
|
|
380
|
+
groups.set(group, []);
|
|
381
|
+
}
|
|
382
|
+
groups.get(group).push(field);
|
|
383
|
+
});
|
|
384
|
+
// Sort fields within each group by order
|
|
385
|
+
groups.forEach((groupFields) => {
|
|
386
|
+
groupFields.sort((a, b) => (a.order || 999) - (b.order || 999));
|
|
387
|
+
});
|
|
388
|
+
return groups;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Apply toStorage transform
|
|
392
|
+
*/
|
|
393
|
+
export function applyToStorageTransform(field, value) {
|
|
394
|
+
if (field.transform?.toStorage) {
|
|
395
|
+
return field.transform.toStorage(value);
|
|
396
|
+
}
|
|
397
|
+
return value;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Apply fromStorage transform
|
|
401
|
+
*/
|
|
402
|
+
export function applyFromStorageTransform(field, value) {
|
|
403
|
+
if (field.transform?.fromStorage) {
|
|
404
|
+
return field.transform.fromStorage(value);
|
|
405
|
+
}
|
|
406
|
+
return value;
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Create settings form state
|
|
410
|
+
*/
|
|
411
|
+
export function createSettingsFormState(categories, initialValues) {
|
|
412
|
+
const defaults = getDefaultSettingsValues(categories);
|
|
413
|
+
const values = { ...defaults, ...initialValues };
|
|
414
|
+
const validation = validateAllSettings(categories, values);
|
|
415
|
+
return {
|
|
416
|
+
values,
|
|
417
|
+
errors: validation.errors,
|
|
418
|
+
touched: {},
|
|
419
|
+
dirty: {},
|
|
420
|
+
isValid: validation.isValid,
|
|
421
|
+
isSubmitting: false,
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
//# sourceMappingURL=SettingsSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsSchema.js","sourceRoot":"","sources":["../../src/settings/SettingsSchema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Server Utility
|
|
3
|
+
* Provides standardized test server management for all SuperDangerous applications
|
|
4
|
+
*/
|
|
5
|
+
export interface TestServerConfig {
|
|
6
|
+
/** Path to the application entry point */
|
|
7
|
+
entryPoint: string;
|
|
8
|
+
/** Port to run the server on */
|
|
9
|
+
port: number;
|
|
10
|
+
/** API base URL */
|
|
11
|
+
apiBase?: string;
|
|
12
|
+
/** Environment variables */
|
|
13
|
+
env?: Record<string, string>;
|
|
14
|
+
/** Timeout for server startup (ms) */
|
|
15
|
+
startupTimeout?: number;
|
|
16
|
+
/** Health check endpoint */
|
|
17
|
+
healthEndpoint?: string;
|
|
18
|
+
/** Whether to suppress server output */
|
|
19
|
+
silent?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare class TestServer {
|
|
22
|
+
private process;
|
|
23
|
+
private config;
|
|
24
|
+
private startPromise;
|
|
25
|
+
port: number;
|
|
26
|
+
constructor(config: TestServerConfig);
|
|
27
|
+
/**
|
|
28
|
+
* Clean up any existing processes on the port
|
|
29
|
+
*/
|
|
30
|
+
private cleanupPort;
|
|
31
|
+
/**
|
|
32
|
+
* Wait for the server to be ready
|
|
33
|
+
*/
|
|
34
|
+
private waitForServer;
|
|
35
|
+
/**
|
|
36
|
+
* Start the test server
|
|
37
|
+
*/
|
|
38
|
+
start(): Promise<void>;
|
|
39
|
+
private _start;
|
|
40
|
+
/**
|
|
41
|
+
* Stop the test server
|
|
42
|
+
*/
|
|
43
|
+
stop(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Get the API base URL
|
|
46
|
+
*/
|
|
47
|
+
getApiBase(): string;
|
|
48
|
+
/**
|
|
49
|
+
* Make a request to the test server
|
|
50
|
+
*/
|
|
51
|
+
request(endpoint: string, options?: any): Promise<any>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Create a test server instance
|
|
55
|
+
*/
|
|
56
|
+
export declare function createTestServer(config: TestServerConfig): TestServer;
|
|
57
|
+
/**
|
|
58
|
+
* Setup function for Jest beforeAll
|
|
59
|
+
*/
|
|
60
|
+
export declare function setupTestServer(config: TestServerConfig): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Teardown function for Jest afterAll
|
|
63
|
+
*/
|
|
64
|
+
export declare function teardownTestServer(): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Get the global test server instance
|
|
67
|
+
*/
|
|
68
|
+
export declare function getTestServer(): TestServer | null;
|
|
69
|
+
//# sourceMappingURL=TestServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestServer.d.ts","sourceRoot":"","sources":["../../src/testing/TestServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4BAA4B;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,YAAY,CAA8B;IAC3C,IAAI,EAAE,MAAM,CAAC;gBAER,MAAM,EAAE,gBAAgB;IAYpC;;OAEG;IACH,OAAO,CAAC,WAAW;IA+BnB;;OAEG;YACW,aAAa;IA2C3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAed,MAAM;IAkDpB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC3B;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,GAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;CAyBjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAErE;AAOD;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKxD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD"}
|