hola-server 1.0.11 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +382 -1
- package/dist/config/index.d.ts +46 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +55 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/array.d.ts +27 -0
- package/dist/core/array.d.ts.map +1 -0
- package/dist/core/array.js +66 -0
- package/dist/core/array.js.map +1 -0
- package/dist/core/bash.d.ts +51 -0
- package/dist/core/bash.d.ts.map +1 -0
- package/dist/core/bash.js +161 -0
- package/dist/core/bash.js.map +1 -0
- package/dist/core/chart.d.ts +11 -0
- package/dist/core/chart.d.ts.map +1 -0
- package/dist/core/chart.js +35 -0
- package/dist/core/chart.js.map +1 -0
- package/dist/core/date.d.ts +11 -0
- package/dist/core/date.d.ts.map +1 -0
- package/dist/core/date.js +18 -0
- package/dist/core/date.js.map +1 -0
- package/dist/core/encrypt.d.ts +18 -0
- package/dist/core/encrypt.d.ts.map +1 -0
- package/dist/core/encrypt.js +50 -0
- package/dist/core/encrypt.js.map +1 -0
- package/dist/core/file.d.ts +22 -0
- package/dist/core/file.d.ts.map +1 -0
- package/dist/core/file.js +21 -0
- package/dist/core/file.js.map +1 -0
- package/dist/core/lhs.d.ts +17 -0
- package/dist/core/lhs.d.ts.map +1 -0
- package/dist/core/lhs.js +30 -0
- package/dist/core/lhs.js.map +1 -0
- package/dist/core/meta.d.ts +200 -0
- package/dist/core/meta.d.ts.map +1 -0
- package/dist/core/meta.js +336 -0
- package/dist/core/meta.js.map +1 -0
- package/dist/core/number.d.ts +37 -0
- package/dist/core/number.d.ts.map +1 -0
- package/dist/core/number.js +99 -0
- package/dist/core/number.js.map +1 -0
- package/dist/core/obj.d.ts +9 -0
- package/dist/core/obj.d.ts.map +1 -0
- package/dist/core/obj.js +15 -0
- package/dist/core/obj.js.map +1 -0
- package/dist/core/random.d.ts +7 -0
- package/dist/core/random.d.ts.map +1 -0
- package/dist/core/random.js +7 -0
- package/dist/core/random.js.map +1 -0
- package/dist/core/role.d.ts +42 -0
- package/dist/core/role.d.ts.map +1 -0
- package/dist/core/role.js +81 -0
- package/dist/core/role.js.map +1 -0
- package/dist/core/thread.d.ts +7 -0
- package/dist/core/thread.d.ts.map +1 -0
- package/dist/core/thread.js +7 -0
- package/dist/core/thread.js.map +1 -0
- package/dist/core/type.d.ts +46 -0
- package/dist/core/type.d.ts.map +1 -0
- package/dist/core/type.js +281 -0
- package/dist/core/type.js.map +1 -0
- package/dist/core/url.d.ts +20 -0
- package/dist/core/url.d.ts.map +1 -0
- package/dist/core/url.js +24 -0
- package/dist/core/url.js.map +1 -0
- package/dist/core/validate.d.ts +11 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +19 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/db/db.d.ts +72 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +225 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/entity.d.ts +77 -0
- package/dist/db/entity.d.ts.map +1 -0
- package/dist/db/entity.js +671 -0
- package/dist/db/entity.js.map +1 -0
- package/dist/db/gridfs.d.ts +29 -0
- package/dist/db/gridfs.d.ts.map +1 -0
- package/dist/db/gridfs.js +125 -0
- package/dist/db/gridfs.js.map +1 -0
- package/dist/db/index.d.ts +8 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +8 -0
- package/dist/db/index.js.map +1 -0
- package/dist/errors/auth.d.ts +15 -0
- package/dist/errors/auth.d.ts.map +1 -0
- package/dist/errors/auth.js +21 -0
- package/dist/errors/auth.js.map +1 -0
- package/dist/errors/http.d.ts +15 -0
- package/dist/errors/http.d.ts.map +1 -0
- package/dist/errors/http.js +21 -0
- package/dist/errors/http.js.map +1 -0
- package/dist/errors/index.d.ts +18 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/validation.d.ts +11 -0
- package/dist/errors/validation.d.ts.map +1 -0
- package/dist/errors/validation.js +15 -0
- package/dist/errors/validation.js.map +1 -0
- package/dist/http/code.d.ts +21 -0
- package/dist/http/code.d.ts.map +1 -0
- package/dist/http/code.js +27 -0
- package/dist/http/code.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/meta/index.d.ts +9 -0
- package/dist/meta/index.d.ts.map +1 -0
- package/dist/meta/index.js +11 -0
- package/dist/meta/index.js.map +1 -0
- package/dist/meta/router.d.ts +26 -0
- package/dist/meta/router.d.ts.map +1 -0
- package/dist/meta/router.js +258 -0
- package/dist/meta/router.js.map +1 -0
- package/dist/meta/schema.d.ts +41 -0
- package/dist/meta/schema.d.ts.map +1 -0
- package/dist/meta/schema.js +69 -0
- package/dist/meta/schema.js.map +1 -0
- package/dist/plugins/auth.d.ts +248 -0
- package/dist/plugins/auth.d.ts.map +1 -0
- package/dist/plugins/auth.js +121 -0
- package/dist/plugins/auth.js.map +1 -0
- package/dist/plugins/body.d.ts +47 -0
- package/dist/plugins/body.d.ts.map +1 -0
- package/dist/plugins/body.js +36 -0
- package/dist/plugins/body.js.map +1 -0
- package/dist/plugins/cors.d.ts +62 -0
- package/dist/plugins/cors.d.ts.map +1 -0
- package/dist/plugins/cors.js +17 -0
- package/dist/plugins/cors.js.map +1 -0
- package/dist/plugins/error.d.ts +51 -0
- package/dist/plugins/error.d.ts.map +1 -0
- package/dist/plugins/error.js +51 -0
- package/dist/plugins/error.js.map +1 -0
- package/dist/plugins/index.d.ts +9 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +9 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/setting.d.ts +66 -0
- package/dist/setting.d.ts.map +1 -0
- package/dist/setting.js +27 -0
- package/dist/setting.js.map +1 -0
- package/dist/tool/gen_i18n.d.ts +10 -0
- package/dist/tool/gen_i18n.d.ts.map +1 -0
- package/dist/tool/gen_i18n.js +51 -0
- package/dist/tool/gen_i18n.js.map +1 -0
- package/dist/tool/vector_store.d.ts +72 -0
- package/dist/tool/vector_store.d.ts.map +1 -0
- package/dist/tool/vector_store.js +203 -0
- package/dist/tool/vector_store.js.map +1 -0
- package/package.json +38 -23
- package/core/array.js +0 -187
- package/core/bash.js +0 -345
- package/core/chart.js +0 -36
- package/core/cron.js +0 -10
- package/core/date.js +0 -55
- package/core/encrypt.js +0 -16
- package/core/file.js +0 -38
- package/core/lhs.js +0 -27
- package/core/meta.js +0 -359
- package/core/msg.js +0 -11
- package/core/number.js +0 -179
- package/core/obj.js +0 -22
- package/core/random.js +0 -9
- package/core/role.js +0 -116
- package/core/thread.js +0 -3
- package/core/type.js +0 -329
- package/core/url.js +0 -22
- package/core/validate.js +0 -32
- package/db/db.js +0 -376
- package/db/entity.js +0 -1252
- package/db/gridfs.js +0 -221
- package/http/code.js +0 -18
- package/http/context.js +0 -17
- package/http/cors.js +0 -15
- package/http/error.js +0 -21
- package/http/express.js +0 -75
- package/http/params.js +0 -57
- package/http/router.js +0 -72
- package/http/session.js +0 -50
- package/index.js +0 -36
- package/router/clone.js +0 -73
- package/router/create.js +0 -59
- package/router/delete.js +0 -53
- package/router/read.js +0 -177
- package/router/update.js +0 -107
- package/setting.js +0 -51
- package/test/core/date.js +0 -37
- package/test/core/encrypt.js +0 -14
- package/test/core/meta.js +0 -594
- package/test/core/number.js +0 -17
- package/test/crud/router.js +0 -99
- package/test/db/db.js +0 -72
- package/test/entity/create.js +0 -442
- package/test/entity/delete.js +0 -480
- package/test/entity/read.js +0 -285
- package/test/entity/update.js +0 -252
- package/test/router/role.js +0 -15
- package/test/router/user.js +0 -17
- package/tool/gen_i18n.js +0 -30
- package/tool/test.json +0 -25
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type conversion and validation system.
|
|
3
|
+
* @module core/type
|
|
4
|
+
*/
|
|
5
|
+
import { has_value, is_undefined } from "./validate.js";
|
|
6
|
+
import { encrypt_pwd, encrypt_secret } from "./encrypt.js";
|
|
7
|
+
const type_manager = {};
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Helper Functions
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/** Create success result. */
|
|
12
|
+
export const ok = (value) => ({ value });
|
|
13
|
+
/** Create error result. */
|
|
14
|
+
export const err = (type, value) => ({ err: `invalid ${type}:${value}` });
|
|
15
|
+
/** Escape HTML to prevent XSS attacks. */
|
|
16
|
+
const escape_html = (str) => str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
17
|
+
/** Check if value contains MongoDB operators (injection attempt). */
|
|
18
|
+
const has_mongo_operator = (value) => {
|
|
19
|
+
if (typeof value !== "object" || value === null)
|
|
20
|
+
return false;
|
|
21
|
+
return Object.keys(value).some((k) => k.startsWith("$"));
|
|
22
|
+
};
|
|
23
|
+
/** Check if value is an integer. */
|
|
24
|
+
export const is_int = (value) => parseInt(String(value)) === parseFloat(String(value));
|
|
25
|
+
/** Create a regex validation type. */
|
|
26
|
+
export const regex_type = (name, pattern) => ({ name, convert: (value) => (pattern.test(String(value)) ? ok(value) : err(name, value)) });
|
|
27
|
+
/** Create an integer enum validation type. */
|
|
28
|
+
export const int_enum_type = (name, valid_values) => ({
|
|
29
|
+
name,
|
|
30
|
+
convert: (value) => {
|
|
31
|
+
if (!is_int(value))
|
|
32
|
+
return err(name, value);
|
|
33
|
+
const int_value = parseInt(String(value));
|
|
34
|
+
return valid_values.includes(int_value) ? ok(int_value) : err(name, value);
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
/** Create an integer range validation type. */
|
|
38
|
+
export const int_range_type = (name, min, max) => ({
|
|
39
|
+
name,
|
|
40
|
+
convert: (value) => {
|
|
41
|
+
if (!is_int(value))
|
|
42
|
+
return err(name, value);
|
|
43
|
+
const int_value = parseInt(String(value));
|
|
44
|
+
return int_value >= min && int_value <= max ? ok(int_value) : err(name, value);
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
/** Create a passthrough string type. */
|
|
48
|
+
export const string_type = (name) => ({ name, convert: (value) => ok(value + "") });
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Type Registration
|
|
51
|
+
// ============================================================================
|
|
52
|
+
/** Register a custom type with conversion function. */
|
|
53
|
+
export const register_type = (type) => {
|
|
54
|
+
type_manager[type.name] = type;
|
|
55
|
+
};
|
|
56
|
+
/** Get registered type by name. */
|
|
57
|
+
export const get_type = (name) => {
|
|
58
|
+
const type = type_manager[name];
|
|
59
|
+
if (!type)
|
|
60
|
+
throw new Error(`no type registered for name [${name}]`);
|
|
61
|
+
return type;
|
|
62
|
+
};
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// Built-in Types: Basic
|
|
65
|
+
// ============================================================================
|
|
66
|
+
register_type({ name: "obj", convert: ok });
|
|
67
|
+
register_type({ name: "string", convert: (value) => ok(value ? escape_html((value + "").trim()) : "") });
|
|
68
|
+
register_type({ name: "password", convert: (value) => ok(encrypt_pwd(String(value))) });
|
|
69
|
+
// Secret type: AES-256 encrypted, can be decrypted later with decrypt_secret()
|
|
70
|
+
register_type({ name: "secret", convert: (value) => ok(encrypt_secret(String(value))) });
|
|
71
|
+
register_type({ name: "secure", convert: (value) => ok(encrypt_secret(String(value))) }); // alias for secret
|
|
72
|
+
register_type({ name: "file", convert: ok });
|
|
73
|
+
// Passthrough string types
|
|
74
|
+
register_type(string_type("lstr"));
|
|
75
|
+
register_type(string_type("text"));
|
|
76
|
+
register_type(string_type("date"));
|
|
77
|
+
register_type(string_type("enum"));
|
|
78
|
+
register_type(string_type("log_category"));
|
|
79
|
+
// ============================================================================
|
|
80
|
+
// Built-in Types: Boolean
|
|
81
|
+
// ============================================================================
|
|
82
|
+
register_type({
|
|
83
|
+
name: "boolean",
|
|
84
|
+
convert: (value) => {
|
|
85
|
+
if (value === true || value === "true")
|
|
86
|
+
return ok(true);
|
|
87
|
+
if (value === false || value === "false")
|
|
88
|
+
return ok(false);
|
|
89
|
+
return err("boolean", value);
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
// ============================================================================
|
|
93
|
+
// Built-in Types: Numeric
|
|
94
|
+
// ============================================================================
|
|
95
|
+
register_type({
|
|
96
|
+
name: "number",
|
|
97
|
+
convert: (value) => {
|
|
98
|
+
const num = Number(value);
|
|
99
|
+
return isNaN(num) ? err("number", value) : ok(num);
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
register_type({ name: "int", convert: (value) => (is_int(value) ? ok(parseInt(String(value))) : err("int", value)) });
|
|
103
|
+
register_type({
|
|
104
|
+
name: "uint",
|
|
105
|
+
convert: (value) => {
|
|
106
|
+
const int_value = parseInt(String(value));
|
|
107
|
+
return is_int(value) && int_value >= 0 ? ok(int_value) : err("uint", value);
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
register_type({
|
|
111
|
+
name: "float",
|
|
112
|
+
convert: (value) => {
|
|
113
|
+
const num = parseFloat(String(value));
|
|
114
|
+
return isNaN(num) ? err("float", value) : ok(parseFloat(num.toFixed(2)));
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
register_type({
|
|
118
|
+
name: "ufloat",
|
|
119
|
+
convert: (value) => {
|
|
120
|
+
const num = parseFloat(String(value));
|
|
121
|
+
return isNaN(num) || num < 0 ? err("ufloat", value) : ok(parseFloat(num.toFixed(2)));
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
register_type({
|
|
125
|
+
name: "decimal",
|
|
126
|
+
convert: (value) => {
|
|
127
|
+
const num = parseFloat(String(value));
|
|
128
|
+
return isNaN(num) ? err("decimal", value) : ok(num);
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
register_type({
|
|
132
|
+
name: "percentage",
|
|
133
|
+
convert: (value) => {
|
|
134
|
+
const num = parseFloat(String(value));
|
|
135
|
+
return isNaN(num) ? err("percentage", value) : ok(parseFloat(num.toFixed(2)));
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
register_type({
|
|
139
|
+
name: "currency",
|
|
140
|
+
convert: (value) => {
|
|
141
|
+
const num = Number(value);
|
|
142
|
+
return isNaN(num) ? err("currency", value) : ok(num);
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
// ============================================================================
|
|
146
|
+
// Built-in Types: Date/Time
|
|
147
|
+
// ============================================================================
|
|
148
|
+
register_type({
|
|
149
|
+
name: "datetime",
|
|
150
|
+
convert: (value) => {
|
|
151
|
+
const date = new Date(value);
|
|
152
|
+
return isNaN(date.getTime()) ? err("datetime", value) : ok(date.toISOString());
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
register_type(regex_type("time", /^([0-1]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$/));
|
|
156
|
+
// ============================================================================
|
|
157
|
+
// Built-in Types: Validation
|
|
158
|
+
// ============================================================================
|
|
159
|
+
register_type({
|
|
160
|
+
name: "email",
|
|
161
|
+
convert: (value) => {
|
|
162
|
+
const pattern = /^(([^<>()[\]\\.,;:\s@"]+(\\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
|
163
|
+
return pattern.test(String(value)) ? ok(value) : err("email", value);
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
register_type({
|
|
167
|
+
name: "url",
|
|
168
|
+
convert: (value) => {
|
|
169
|
+
try {
|
|
170
|
+
new URL(String(value));
|
|
171
|
+
return ok(value);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return err("url", value);
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
register_type({
|
|
179
|
+
name: "phone",
|
|
180
|
+
convert: (value) => {
|
|
181
|
+
const cleaned = String(value).replace(/[\s\-\(\)]/g, "");
|
|
182
|
+
return /^\+?[1-9]\d{1,14}$/.test(cleaned) ? ok(cleaned) : err("phone", value);
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
register_type(regex_type("uuid", /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i));
|
|
186
|
+
register_type(regex_type("color", /^#([0-9A-F]{3}){1,2}$/i));
|
|
187
|
+
register_type({
|
|
188
|
+
name: "ip_address",
|
|
189
|
+
convert: (value) => {
|
|
190
|
+
const str = String(value);
|
|
191
|
+
if (!/^(\d{1,3}\.){3}\d{1,3}$/.test(str))
|
|
192
|
+
return err("ip_address", value);
|
|
193
|
+
const valid = str.split(".").every((part) => parseInt(part) <= 255);
|
|
194
|
+
return valid ? ok(value) : err("ip_address", value);
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
// ============================================================================
|
|
198
|
+
// Built-in Types: Data Structures
|
|
199
|
+
// ============================================================================
|
|
200
|
+
register_type({
|
|
201
|
+
name: "array",
|
|
202
|
+
convert: (value) => {
|
|
203
|
+
if (typeof value === "string")
|
|
204
|
+
return ok(value.split(","));
|
|
205
|
+
if (Array.isArray(value))
|
|
206
|
+
return ok(value);
|
|
207
|
+
return err("array", value);
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
register_type({
|
|
211
|
+
name: "json",
|
|
212
|
+
convert: (value) => {
|
|
213
|
+
if (typeof value === "object")
|
|
214
|
+
return ok(value);
|
|
215
|
+
try {
|
|
216
|
+
return ok(JSON.parse(String(value)));
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
return err("json", value);
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
// ============================================================================
|
|
224
|
+
// Built-in Types: Transformations
|
|
225
|
+
// ============================================================================
|
|
226
|
+
register_type({
|
|
227
|
+
name: "slug",
|
|
228
|
+
convert: (value) => ok(String(value)
|
|
229
|
+
.toLowerCase()
|
|
230
|
+
.trim()
|
|
231
|
+
.replace(/\s+/g, "-")
|
|
232
|
+
.replace(/[^\w\-]+/g, "")
|
|
233
|
+
.replace(/\-\-+/g, "-")),
|
|
234
|
+
});
|
|
235
|
+
// ============================================================================
|
|
236
|
+
// Built-in Types: Domain-Specific
|
|
237
|
+
// ============================================================================
|
|
238
|
+
register_type(int_range_type("age", 0, 200));
|
|
239
|
+
register_type(int_enum_type("gender", [0, 1]));
|
|
240
|
+
register_type(int_enum_type("log_level", [0, 1, 2, 3]));
|
|
241
|
+
// ============================================================================
|
|
242
|
+
// Conversion Functions
|
|
243
|
+
// ============================================================================
|
|
244
|
+
/** Convert a single field value. */
|
|
245
|
+
const convert_field = (field_value, type_name) => {
|
|
246
|
+
const type = get_type(type_name || "string");
|
|
247
|
+
return type.convert(field_value);
|
|
248
|
+
};
|
|
249
|
+
/** Convert object fields to their defined types. */
|
|
250
|
+
const convert_fields = (obj, fields, preserve_empty = false) => {
|
|
251
|
+
const result = {};
|
|
252
|
+
const error_field_names = [];
|
|
253
|
+
for (const field of fields) {
|
|
254
|
+
const field_value = obj[field.name];
|
|
255
|
+
// Check for MongoDB operator injection
|
|
256
|
+
if (has_mongo_operator(field_value)) {
|
|
257
|
+
error_field_names.push(field.name);
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (has_value(field_value)) {
|
|
261
|
+
const { value, err } = convert_field(field_value, field.type);
|
|
262
|
+
if (err)
|
|
263
|
+
error_field_names.push(field.name);
|
|
264
|
+
else
|
|
265
|
+
result[field.name] = value;
|
|
266
|
+
}
|
|
267
|
+
else if (!preserve_empty && field.default !== undefined) {
|
|
268
|
+
// Apply default only for create operations, not for update
|
|
269
|
+
result[field.name] = field.default;
|
|
270
|
+
}
|
|
271
|
+
else if (preserve_empty && !is_undefined(field_value)) {
|
|
272
|
+
result[field.name] = "";
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return { obj: result, error_field_names };
|
|
276
|
+
};
|
|
277
|
+
/** Convert object fields to their defined types. */
|
|
278
|
+
export const convert_type = (obj, fields) => convert_fields(obj, fields, false);
|
|
279
|
+
/** Convert object fields for update operation (preserves empty values). */
|
|
280
|
+
export const convert_update_type = (obj, fields) => convert_fields(obj, fields, true);
|
|
281
|
+
//# sourceMappingURL=type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/core/type.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL and HTTP request utility functions.
|
|
3
|
+
* @module core/url
|
|
4
|
+
*/
|
|
5
|
+
export interface UrlRequestConfig {
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
|
+
body?: string | FormData | Blob | ArrayBuffer | URLSearchParams;
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
}
|
|
10
|
+
export interface UrlResponse<T = unknown> {
|
|
11
|
+
status: number;
|
|
12
|
+
ok: boolean;
|
|
13
|
+
headers: Headers;
|
|
14
|
+
data: T | null;
|
|
15
|
+
text: () => Promise<string>;
|
|
16
|
+
json: <R = T>() => Promise<R>;
|
|
17
|
+
}
|
|
18
|
+
/** Create HTTP request function with preset URL and method using native fetch. */
|
|
19
|
+
export declare const url: (target_url: string, method: string) => (config?: UrlRequestConfig) => Promise<UrlResponse>;
|
|
20
|
+
//# sourceMappingURL=url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/core/url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,GAAG,WAAW,GAAG,eAAe,CAAC;IAChE,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;CACjC;AAED,kFAAkF;AAClF,eAAO,MAAM,GAAG,GAAI,YAAY,MAAM,EAAE,QAAQ,MAAM,KAAG,CAAC,MAAM,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,WAAW,CAkB1G,CAAC"}
|
package/dist/core/url.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL and HTTP request utility functions.
|
|
3
|
+
* @module core/url
|
|
4
|
+
*/
|
|
5
|
+
/** Create HTTP request function with preset URL and method using native fetch. */
|
|
6
|
+
export const url = (target_url, method) => {
|
|
7
|
+
return async (config) => {
|
|
8
|
+
const response = await fetch(target_url, {
|
|
9
|
+
method,
|
|
10
|
+
headers: config?.headers,
|
|
11
|
+
body: config?.body,
|
|
12
|
+
signal: config?.signal,
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
status: response.status,
|
|
16
|
+
ok: response.ok,
|
|
17
|
+
headers: response.headers,
|
|
18
|
+
data: null,
|
|
19
|
+
text: () => response.text(),
|
|
20
|
+
json: () => response.json(),
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/core/url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,kFAAkF;AAClF,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,UAAkB,EAAE,MAAc,EAAuD,EAAE;IAC3G,OAAO,KAAK,EAAE,MAAyB,EAAwB,EAAE;QAC7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;YACrC,MAAM;YACN,OAAO,EAAE,MAAM,EAAE,OAAO;YACxB,IAAI,EAAE,MAAM,EAAE,IAAI;YAClB,MAAM,EAAE,MAAM,EAAE,MAAM;SACzB,CAAC,CAAC;QAEH,OAAO;YACH,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE;YAC3B,IAAI,EAAE,GAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAgB;SAC/C,CAAC;IACN,CAAC,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utility functions for checking values and required fields.
|
|
3
|
+
* @module core/validate
|
|
4
|
+
*/
|
|
5
|
+
/** Check if a value is undefined. */
|
|
6
|
+
export declare const is_undefined: (value: unknown) => value is undefined;
|
|
7
|
+
/** Check if a value exists and is meaningful (not null, undefined, NaN, or empty string). */
|
|
8
|
+
export declare const has_value: (value: unknown) => boolean;
|
|
9
|
+
/** Validate that required fields have values in an object. Returns array of missing field names. */
|
|
10
|
+
export declare const validate_required_fields: (obj: Record<string, unknown>, field_names: string[]) => string[];
|
|
11
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qCAAqC;AACrC,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,SAAyC,CAAC;AAEjG,6FAA6F;AAC7F,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,OAI1C,CAAC;AAEF,oGAAoG;AACpG,eAAO,MAAM,wBAAwB,GAAI,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,MAAM,EAAE,KAAG,MAAM,EAEpG,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utility functions for checking values and required fields.
|
|
3
|
+
* @module core/validate
|
|
4
|
+
*/
|
|
5
|
+
/** Check if a value is undefined. */
|
|
6
|
+
export const is_undefined = (value) => typeof value === 'undefined';
|
|
7
|
+
/** Check if a value exists and is meaningful (not null, undefined, NaN, or empty string). */
|
|
8
|
+
export const has_value = (value) => {
|
|
9
|
+
if (value == null || value !== value)
|
|
10
|
+
return false;
|
|
11
|
+
if (typeof value === 'string' && value.trim().length === 0)
|
|
12
|
+
return false;
|
|
13
|
+
return true;
|
|
14
|
+
};
|
|
15
|
+
/** Validate that required fields have values in an object. Returns array of missing field names. */
|
|
16
|
+
export const validate_required_fields = (obj, field_names) => {
|
|
17
|
+
return field_names.filter((field_name) => !has_value(obj[field_name]));
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qCAAqC;AACrC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAsB,EAAE,CAAC,OAAO,KAAK,KAAK,WAAW,CAAC;AAEjG,6FAA6F;AAC7F,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAc,EAAW,EAAE;IACjD,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,oGAAoG;AACpG,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAA4B,EAAE,WAAqB,EAAY,EAAE;IACtG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC"}
|
package/dist/db/db.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database utilities for MongoDB using native driver.
|
|
3
|
+
* @module db/db
|
|
4
|
+
*/
|
|
5
|
+
import { Collection, ObjectId, Document, Sort, UpdateResult, DeleteResult, BulkWriteResult } from "mongodb";
|
|
6
|
+
import type { LogValue } from "../core/bash.js";
|
|
7
|
+
export declare const LOG_LEVEL_DEBUG = 0;
|
|
8
|
+
export declare const LOG_LEVEL_INFO = 1;
|
|
9
|
+
export declare const LOG_LEVEL_WARN = 2;
|
|
10
|
+
export declare const LOG_LEVEL_ERROR = 3;
|
|
11
|
+
export declare const LOG_DB = "database";
|
|
12
|
+
export declare const LOG_ENTITY = "entity";
|
|
13
|
+
export declare const LOG_SYSTEM = "system";
|
|
14
|
+
export declare const is_log_debug: () => boolean;
|
|
15
|
+
export declare const is_log_info: () => boolean;
|
|
16
|
+
export declare const is_log_warn: () => boolean;
|
|
17
|
+
export declare const is_log_error: () => boolean;
|
|
18
|
+
export declare const log_debug: (category: string, msg: string, extra?: Record<string, LogValue>) => void;
|
|
19
|
+
export declare const log_info: (category: string, msg: string, extra?: Record<string, LogValue>) => void;
|
|
20
|
+
export declare const log_warn: (category: string, msg: string, extra?: Record<string, LogValue>) => void;
|
|
21
|
+
export declare const log_error: (category: string, msg: string, extra?: Record<string, LogValue>) => void;
|
|
22
|
+
/** Construct mongodb ObjectId. */
|
|
23
|
+
export declare const oid: (id: string) => ObjectId;
|
|
24
|
+
/** Construct objectId query object. */
|
|
25
|
+
export declare const oid_query: (id: string) => {
|
|
26
|
+
_id: ObjectId;
|
|
27
|
+
} | null;
|
|
28
|
+
/** Construct $in query of ObjectId array. */
|
|
29
|
+
export declare const oid_queries: (ids: string[]) => {
|
|
30
|
+
_id: {
|
|
31
|
+
$in: ObjectId[];
|
|
32
|
+
};
|
|
33
|
+
} | null;
|
|
34
|
+
/** Execute bulk update using the items. */
|
|
35
|
+
export declare const bulk_update: (col: Collection, items: Document[], attrs: string[]) => Promise<BulkWriteResult | null>;
|
|
36
|
+
export declare class DB {
|
|
37
|
+
private client;
|
|
38
|
+
private db;
|
|
39
|
+
private connected;
|
|
40
|
+
private pending_callbacks;
|
|
41
|
+
closed: boolean;
|
|
42
|
+
constructor(url: string, options?: {
|
|
43
|
+
maxPoolSize?: number;
|
|
44
|
+
});
|
|
45
|
+
connect(callback?: () => void): Promise<void>;
|
|
46
|
+
/** Register a callback to be called when connected. Invokes immediately if already connected. */
|
|
47
|
+
on_connected(callback: () => void): void;
|
|
48
|
+
col(code: string): Collection;
|
|
49
|
+
get_col(code: string): Collection;
|
|
50
|
+
create(code: string, obj: Document): Promise<Document & {
|
|
51
|
+
_id: ObjectId;
|
|
52
|
+
}>;
|
|
53
|
+
update(code: string, query: Document, obj: Document): Promise<UpdateResult>;
|
|
54
|
+
delete(code: string, query: Document): Promise<DeleteResult>;
|
|
55
|
+
find(code: string, query: Document, attr?: Document): Promise<Document[]>;
|
|
56
|
+
find_one(code: string, query: Document, attr?: Document): Promise<Document | null>;
|
|
57
|
+
find_sort(code: string, query: Document, sort: Sort, attr?: Document): Promise<Document[]>;
|
|
58
|
+
find_page(code: string, query: Document, sort: Sort, page: number, limit: number, attr?: Document): Promise<Document[]>;
|
|
59
|
+
count(code: string, query: Document): Promise<number>;
|
|
60
|
+
sum(code: string, query: Document, field: string): Promise<number>;
|
|
61
|
+
pull(code: string, query: Document, ele: Document): Promise<UpdateResult>;
|
|
62
|
+
push(code: string, query: Document, ele: Document): Promise<UpdateResult>;
|
|
63
|
+
add_to_set(code: string, query: Document, ele: Document): Promise<UpdateResult>;
|
|
64
|
+
close(): Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
/** Initialize the database connection. Must be called and awaited before using get_db(). */
|
|
67
|
+
export declare const init_db: () => Promise<DB>;
|
|
68
|
+
/** Get the database instance. Call init_db() first to ensure connection is established. */
|
|
69
|
+
export declare const get_db: (callback?: () => void) => DB;
|
|
70
|
+
/** Close the database connection. */
|
|
71
|
+
export declare const close_db: () => Promise<void>;
|
|
72
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"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"}
|