elit 3.1.8 → 3.1.9
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/dist/cli.js +291 -2
- package/dist/database.d.mts +10 -1
- package/dist/database.d.ts +9 -0
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +293 -2
- package/dist/database.mjs +291 -1
- package/dist/server.js +290 -1
- package/dist/server.mjs +290 -1
- package/package.json +1 -1
- package/src/database.ts +364 -2
package/dist/cli.js
CHANGED
|
@@ -1435,7 +1435,7 @@ var require_package = __commonJS({
|
|
|
1435
1435
|
"package.json"(exports2, module2) {
|
|
1436
1436
|
module2.exports = {
|
|
1437
1437
|
name: "elit",
|
|
1438
|
-
version: "3.1.
|
|
1438
|
+
version: "3.1.9",
|
|
1439
1439
|
description: "Optimized lightweight library for creating DOM elements with reactive state",
|
|
1440
1440
|
main: "dist/index.js",
|
|
1441
1441
|
module: "dist/index.mjs",
|
|
@@ -3120,8 +3120,16 @@ var Database = class {
|
|
|
3120
3120
|
acc[type] = (...args) => logs.push({ type, args });
|
|
3121
3121
|
return acc;
|
|
3122
3122
|
}, {});
|
|
3123
|
+
const systemBase = {
|
|
3124
|
+
update,
|
|
3125
|
+
remove,
|
|
3126
|
+
rename: rename2,
|
|
3127
|
+
read,
|
|
3128
|
+
create,
|
|
3129
|
+
save
|
|
3130
|
+
};
|
|
3123
3131
|
this.register({
|
|
3124
|
-
|
|
3132
|
+
dbConsole: { ...customConsole, ...systemBase }
|
|
3125
3133
|
});
|
|
3126
3134
|
let stringCode;
|
|
3127
3135
|
if (typeof code === "function") {
|
|
@@ -3216,6 +3224,287 @@ var Database = class {
|
|
|
3216
3224
|
return await this.vmRun(code, options);
|
|
3217
3225
|
}
|
|
3218
3226
|
};
|
|
3227
|
+
function create(dbName, code) {
|
|
3228
|
+
const DIR = "databases";
|
|
3229
|
+
const basePath = process.cwd();
|
|
3230
|
+
const baseDir = import_node_path.default.resolve(basePath, DIR);
|
|
3231
|
+
const dbPath = import_node_path.default.join(baseDir, `${dbName}.ts`);
|
|
3232
|
+
import_node_fs.default.appendFileSync(dbPath, code.toString(), "utf8");
|
|
3233
|
+
}
|
|
3234
|
+
function read(dbName) {
|
|
3235
|
+
const DIR = "databases";
|
|
3236
|
+
const basePath = process.cwd();
|
|
3237
|
+
const baseDir = import_node_path.default.resolve(basePath, DIR);
|
|
3238
|
+
const dbPath = import_node_path.default.join(baseDir, `${dbName}.ts`);
|
|
3239
|
+
if (!import_node_fs.default.existsSync(dbPath)) {
|
|
3240
|
+
throw new Error(`Database '${dbName}' not found`);
|
|
3241
|
+
}
|
|
3242
|
+
return import_node_fs.default.readFileSync(dbPath, "utf8");
|
|
3243
|
+
}
|
|
3244
|
+
function remove(dbName, fnName) {
|
|
3245
|
+
const DIR = "databases";
|
|
3246
|
+
const basePath = process.cwd();
|
|
3247
|
+
const baseDir = import_node_path.default.resolve(basePath, DIR);
|
|
3248
|
+
const dbPath = import_node_path.default.join(baseDir, `${dbName}.ts`);
|
|
3249
|
+
if (!import_node_fs.default.existsSync(dbPath)) return false;
|
|
3250
|
+
if (!fnName) {
|
|
3251
|
+
const bak2 = `${dbPath}.bak`;
|
|
3252
|
+
try {
|
|
3253
|
+
import_node_fs.default.copyFileSync(dbPath, bak2);
|
|
3254
|
+
} catch (e) {
|
|
3255
|
+
}
|
|
3256
|
+
try {
|
|
3257
|
+
import_node_fs.default.unlinkSync(dbPath);
|
|
3258
|
+
return "Removed successfully";
|
|
3259
|
+
} catch (e) {
|
|
3260
|
+
return "Removed failed";
|
|
3261
|
+
}
|
|
3262
|
+
}
|
|
3263
|
+
const bak = `${dbPath}.bak`;
|
|
3264
|
+
try {
|
|
3265
|
+
import_node_fs.default.copyFileSync(dbPath, bak);
|
|
3266
|
+
} catch (e) {
|
|
3267
|
+
}
|
|
3268
|
+
let src = import_node_fs.default.readFileSync(dbPath, "utf8");
|
|
3269
|
+
const escaped = fnName.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
3270
|
+
const startRe = new RegExp(
|
|
3271
|
+
`function\\s+${escaped}\\s*\\(|\\bclass\\s+${escaped}\\b|\\b(?:const|let|var)\\s+${escaped}\\s*=\\s*(?:function\\b|class\\b|\\(|\\{|\\[)`,
|
|
3272
|
+
"m"
|
|
3273
|
+
);
|
|
3274
|
+
const startMatch = src.match(startRe);
|
|
3275
|
+
if (startMatch) {
|
|
3276
|
+
const startIdx = startMatch.index;
|
|
3277
|
+
const len = src.length;
|
|
3278
|
+
const idxCurly = src.indexOf("{", startIdx);
|
|
3279
|
+
const idxBracket = src.indexOf("[", startIdx);
|
|
3280
|
+
let braceOpen = -1;
|
|
3281
|
+
if (idxCurly === -1) braceOpen = idxBracket;
|
|
3282
|
+
else if (idxBracket === -1) braceOpen = idxCurly;
|
|
3283
|
+
else braceOpen = Math.min(idxCurly, idxBracket);
|
|
3284
|
+
if (braceOpen !== -1) {
|
|
3285
|
+
const openingChar = src[braceOpen];
|
|
3286
|
+
const closingChar = openingChar === "[" ? "]" : "}";
|
|
3287
|
+
let i = braceOpen + 1;
|
|
3288
|
+
let depth = 1;
|
|
3289
|
+
while (i < len && depth > 0) {
|
|
3290
|
+
const ch = src[i];
|
|
3291
|
+
if (ch === openingChar) depth++;
|
|
3292
|
+
else if (ch === closingChar) depth--;
|
|
3293
|
+
i++;
|
|
3294
|
+
}
|
|
3295
|
+
let braceClose = i;
|
|
3296
|
+
let endIdx = braceClose;
|
|
3297
|
+
if (src.slice(braceClose, braceClose + 1) === ";")
|
|
3298
|
+
endIdx = braceClose + 1;
|
|
3299
|
+
const before = src.slice(0, startIdx);
|
|
3300
|
+
const after = src.slice(endIdx);
|
|
3301
|
+
src = before + after;
|
|
3302
|
+
} else {
|
|
3303
|
+
const semi = src.indexOf(";", startIdx);
|
|
3304
|
+
let endIdx = semi !== -1 ? semi + 1 : src.indexOf("\n\n", startIdx);
|
|
3305
|
+
if (endIdx === -1) endIdx = len;
|
|
3306
|
+
src = src.slice(0, startIdx) + src.slice(endIdx);
|
|
3307
|
+
}
|
|
3308
|
+
}
|
|
3309
|
+
const exportRe = new RegExp(
|
|
3310
|
+
`export\\s+const\\s+${escaped}\\s*:\\s*any\\s*=\\s*${escaped}\\s*;?`,
|
|
3311
|
+
"g"
|
|
3312
|
+
);
|
|
3313
|
+
src = src.replace(exportRe, "");
|
|
3314
|
+
src = src.replace(/\n{3,}/g, "\n\n");
|
|
3315
|
+
import_node_fs.default.writeFileSync(dbPath, src, "utf8");
|
|
3316
|
+
return `Removed ${fnName} from database ${dbName}.`;
|
|
3317
|
+
}
|
|
3318
|
+
function rename2(oldName, newName) {
|
|
3319
|
+
const DIR = "databases";
|
|
3320
|
+
const basePath = process.cwd();
|
|
3321
|
+
const baseDir = import_node_path.default.resolve(basePath, DIR);
|
|
3322
|
+
const oldPath = import_node_path.default.join(baseDir, `${oldName}.ts`);
|
|
3323
|
+
const newPath = import_node_path.default.join(baseDir, `${newName}.ts`);
|
|
3324
|
+
if (!import_node_fs.default.existsSync(oldPath)) {
|
|
3325
|
+
return `Error: File '${oldName}.ts' does not exist in the database`;
|
|
3326
|
+
}
|
|
3327
|
+
if (import_node_fs.default.existsSync(newPath)) {
|
|
3328
|
+
return `Error: File '${newName}.ts' already exists in the database`;
|
|
3329
|
+
}
|
|
3330
|
+
try {
|
|
3331
|
+
import_node_fs.default.renameSync(oldPath, newPath);
|
|
3332
|
+
return `Successfully renamed '${oldName}.ts' to '${newName}.ts'`;
|
|
3333
|
+
} catch (error) {
|
|
3334
|
+
return `Error renaming file: ${error instanceof Error ? error.message : String(error)}`;
|
|
3335
|
+
}
|
|
3336
|
+
}
|
|
3337
|
+
function save(dbName, code) {
|
|
3338
|
+
const DIR = "databases";
|
|
3339
|
+
const basePath = process.cwd();
|
|
3340
|
+
const baseDir = import_node_path.default.resolve(basePath, DIR);
|
|
3341
|
+
const dbPath = import_node_path.default.join(baseDir, `${dbName}.ts`);
|
|
3342
|
+
let fileContent = typeof code === "function" ? code.toString() : code;
|
|
3343
|
+
import_node_fs.default.writeFileSync(dbPath, fileContent, "utf8");
|
|
3344
|
+
}
|
|
3345
|
+
function update(dbName, fnName, code) {
|
|
3346
|
+
const DIR = "databases";
|
|
3347
|
+
const basePath = process.cwd();
|
|
3348
|
+
const baseDir = import_node_path.default.resolve(basePath, DIR);
|
|
3349
|
+
const dbPath = import_node_path.default.join(baseDir, `${dbName}.ts`);
|
|
3350
|
+
let src;
|
|
3351
|
+
if (!import_node_fs.default.existsSync(dbPath)) {
|
|
3352
|
+
try {
|
|
3353
|
+
import_node_fs.default.writeFileSync(dbPath, "", "utf8");
|
|
3354
|
+
return `Created new database file: ${dbPath}`;
|
|
3355
|
+
} catch (e) {
|
|
3356
|
+
return `Failed to create dbPath file: ${dbPath}`;
|
|
3357
|
+
}
|
|
3358
|
+
}
|
|
3359
|
+
src = import_node_fs.default.readFileSync(dbPath, "utf8");
|
|
3360
|
+
const originalSrc = src;
|
|
3361
|
+
const escaped = fnName.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
3362
|
+
const startRe = new RegExp(
|
|
3363
|
+
`function\\s+${escaped}\\s*\\(|\\bclass\\s+${escaped}\\b|\\b(?:const|let|var)\\s+${escaped}\\s*=\\s*(?:function\\b|class\\b|\\(|\\{|\\[)`,
|
|
3364
|
+
"m"
|
|
3365
|
+
);
|
|
3366
|
+
const startMatch = src.match(startRe);
|
|
3367
|
+
let declKind = null;
|
|
3368
|
+
if (startMatch) {
|
|
3369
|
+
let startIdx = startMatch.index;
|
|
3370
|
+
const snippet = src.slice(startIdx, startIdx + 80);
|
|
3371
|
+
if (/^function\b/.test(snippet)) declKind = "functionDecl";
|
|
3372
|
+
else if (/^class\b/.test(snippet)) declKind = "classDecl";
|
|
3373
|
+
else if (/^\b(?:const|let|var)\b/.test(snippet)) declKind = "varAssign";
|
|
3374
|
+
}
|
|
3375
|
+
let newCode;
|
|
3376
|
+
if (typeof code === "function") {
|
|
3377
|
+
const fnStr = code.toString();
|
|
3378
|
+
if (declKind === "functionDecl") {
|
|
3379
|
+
if (/^function\s+\w+/.test(fnStr)) newCode = fnStr;
|
|
3380
|
+
else
|
|
3381
|
+
newCode = `function ${fnName}${fnStr.replace(
|
|
3382
|
+
/^function\s*\(/,
|
|
3383
|
+
"("
|
|
3384
|
+
)}`;
|
|
3385
|
+
} else if (declKind === "classDecl") {
|
|
3386
|
+
if (/^class\s+\w+/.test(fnStr)) newCode = fnStr;
|
|
3387
|
+
else if (/^class\s*\{/.test(fnStr))
|
|
3388
|
+
newCode = fnStr.replace(/^class\s*\{/, `class ${fnName} {`);
|
|
3389
|
+
else newCode = `const ${fnName} = ${fnStr};`;
|
|
3390
|
+
} else {
|
|
3391
|
+
newCode = `const ${fnName} = ${fnStr};`;
|
|
3392
|
+
}
|
|
3393
|
+
} else {
|
|
3394
|
+
newCode = `const ${fnName} = ${valueToCode(code, 0)};`;
|
|
3395
|
+
}
|
|
3396
|
+
if (startMatch) {
|
|
3397
|
+
const startIdx = startMatch.index;
|
|
3398
|
+
const idxCurly = src.indexOf("{", startIdx);
|
|
3399
|
+
const idxBracket = src.indexOf("[", startIdx);
|
|
3400
|
+
let braceOpen = -1;
|
|
3401
|
+
if (idxCurly === -1) braceOpen = idxBracket;
|
|
3402
|
+
else if (idxBracket === -1) braceOpen = idxCurly;
|
|
3403
|
+
else braceOpen = Math.min(idxCurly, idxBracket);
|
|
3404
|
+
if (braceOpen === -1) {
|
|
3405
|
+
const exportRe = new RegExp(
|
|
3406
|
+
`export\\s+const\\s+${escaped}\\s*:\\s*any\\s*=\\s*${escaped}\\s*;?`,
|
|
3407
|
+
"m"
|
|
3408
|
+
);
|
|
3409
|
+
if (exportRe.test(src)) {
|
|
3410
|
+
src = src.replace(
|
|
3411
|
+
exportRe,
|
|
3412
|
+
`${newCode}
|
|
3413
|
+
|
|
3414
|
+
export const ${fnName}: any = ${fnName};`
|
|
3415
|
+
);
|
|
3416
|
+
} else {
|
|
3417
|
+
src = src + `
|
|
3418
|
+
|
|
3419
|
+
${newCode}
|
|
3420
|
+
|
|
3421
|
+
export const ${fnName}: any = ${fnName};`;
|
|
3422
|
+
}
|
|
3423
|
+
} else {
|
|
3424
|
+
const openingChar = src[braceOpen];
|
|
3425
|
+
const closingChar = openingChar === "[" ? "]" : "}";
|
|
3426
|
+
let i = braceOpen + 1;
|
|
3427
|
+
let depth = 1;
|
|
3428
|
+
const len = src.length;
|
|
3429
|
+
while (i < len && depth > 0) {
|
|
3430
|
+
const ch = src[i];
|
|
3431
|
+
if (ch === openingChar) depth++;
|
|
3432
|
+
else if (ch === closingChar) depth--;
|
|
3433
|
+
i++;
|
|
3434
|
+
}
|
|
3435
|
+
let braceClose = i;
|
|
3436
|
+
let endIdx = braceClose;
|
|
3437
|
+
if (src.slice(braceClose, braceClose + 1) === ";")
|
|
3438
|
+
endIdx = braceClose + 1;
|
|
3439
|
+
const before = src.slice(0, startIdx);
|
|
3440
|
+
const after = src.slice(endIdx);
|
|
3441
|
+
src = before + newCode + after;
|
|
3442
|
+
}
|
|
3443
|
+
} else {
|
|
3444
|
+
const exportRe = new RegExp(
|
|
3445
|
+
`export\\s+const\\s+${escaped}\\s*:\\s*any\\s*=\\s*${escaped}\\s*;?`,
|
|
3446
|
+
"m"
|
|
3447
|
+
);
|
|
3448
|
+
if (exportRe.test(src)) {
|
|
3449
|
+
src = src.replace(
|
|
3450
|
+
exportRe,
|
|
3451
|
+
`${newCode}
|
|
3452
|
+
|
|
3453
|
+
export const ${fnName}: any = ${fnName};`
|
|
3454
|
+
);
|
|
3455
|
+
} else {
|
|
3456
|
+
src = src + `
|
|
3457
|
+
|
|
3458
|
+
${newCode}
|
|
3459
|
+
|
|
3460
|
+
export const ${fnName}: any = ${fnName};`;
|
|
3461
|
+
}
|
|
3462
|
+
}
|
|
3463
|
+
import_node_fs.default.writeFileSync(dbPath, src, "utf8");
|
|
3464
|
+
if (src === originalSrc) {
|
|
3465
|
+
return `Saved ${fnName} to database ${dbName}.`;
|
|
3466
|
+
} else {
|
|
3467
|
+
return `Updated ${dbName} with ${fnName}.`;
|
|
3468
|
+
}
|
|
3469
|
+
}
|
|
3470
|
+
function valueToCode(val, depth = 0) {
|
|
3471
|
+
const indentUnit = " ";
|
|
3472
|
+
const indent = indentUnit.repeat(depth);
|
|
3473
|
+
const indentInner = indentUnit.repeat(depth + 1);
|
|
3474
|
+
if (val === null) return "null";
|
|
3475
|
+
const t = typeof val;
|
|
3476
|
+
if (t === "string") return JSON.stringify(val);
|
|
3477
|
+
if (t === "number" || t === "boolean") return String(val);
|
|
3478
|
+
if (t === "function") return val.toString();
|
|
3479
|
+
if (Array.isArray(val)) {
|
|
3480
|
+
if (val.length === 0) return "[]";
|
|
3481
|
+
const items = val.map((v) => valueToCode(v, depth + 1));
|
|
3482
|
+
return "[\n" + items.map((it) => indentInner + it).join(",\n") + "\n" + indent + "]";
|
|
3483
|
+
}
|
|
3484
|
+
if (t === "object") {
|
|
3485
|
+
const keys = Object.keys(val);
|
|
3486
|
+
if (keys.length === 0) return "{}";
|
|
3487
|
+
const entries = keys.map((k) => {
|
|
3488
|
+
const keyPart = isIdentifier(k) ? k : JSON.stringify(k);
|
|
3489
|
+
const v = valueToCode(val[k], depth + 1);
|
|
3490
|
+
return indentInner + keyPart + ": " + v;
|
|
3491
|
+
});
|
|
3492
|
+
return "{\n" + entries.join(",\n") + "\n" + indent + "}";
|
|
3493
|
+
}
|
|
3494
|
+
return String(val);
|
|
3495
|
+
}
|
|
3496
|
+
function isIdentifier(key) {
|
|
3497
|
+
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);
|
|
3498
|
+
}
|
|
3499
|
+
var dbConsole = {
|
|
3500
|
+
create,
|
|
3501
|
+
read,
|
|
3502
|
+
remove,
|
|
3503
|
+
rename: rename2,
|
|
3504
|
+
save,
|
|
3505
|
+
update,
|
|
3506
|
+
...console
|
|
3507
|
+
};
|
|
3219
3508
|
|
|
3220
3509
|
// src/server.ts
|
|
3221
3510
|
var ServerDatabase = class {
|
package/dist/database.d.mts
CHANGED
|
@@ -27,5 +27,14 @@ declare class Database {
|
|
|
27
27
|
}>;
|
|
28
28
|
}
|
|
29
29
|
declare function database(): Database;
|
|
30
|
+
interface DatabaseConsole extends Console {
|
|
31
|
+
create?(dbName: string, code: string | Function): void;
|
|
32
|
+
read(dbName: string): string;
|
|
33
|
+
remove(dbName: string, fnName: string): any;
|
|
34
|
+
rename(oldName: string, newName: string): string;
|
|
35
|
+
save(dbName: string, code: string | Function | any): void;
|
|
36
|
+
update(dbName: string, fnName: string, code: string | Function): any;
|
|
37
|
+
}
|
|
38
|
+
declare const dbConsole: DatabaseConsole;
|
|
30
39
|
|
|
31
|
-
export { Database, type DatabaseConfig, database, database as default };
|
|
40
|
+
export { Database, type DatabaseConfig, type DatabaseConsole, database, dbConsole, database as default };
|
package/dist/database.d.ts
CHANGED
|
@@ -26,5 +26,14 @@ export declare class Database {
|
|
|
26
26
|
}>;
|
|
27
27
|
}
|
|
28
28
|
export declare function database(): Database;
|
|
29
|
+
export interface DatabaseConsole extends Console {
|
|
30
|
+
create?(dbName: string, code: string | Function): void;
|
|
31
|
+
read(dbName: string): string;
|
|
32
|
+
remove(dbName: string, fnName: string): any;
|
|
33
|
+
rename(oldName: string, newName: string): string;
|
|
34
|
+
save(dbName: string, code: string | Function | any): void;
|
|
35
|
+
update(dbName: string, fnName: string, code: string | Function): any;
|
|
36
|
+
}
|
|
37
|
+
export declare const dbConsole: DatabaseConsole;
|
|
29
38
|
export default database;
|
|
30
39
|
//# sourceMappingURL=database.d.ts.map
|
package/dist/database.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAMzB,MAAM,WAAW,cAAc;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,eAAe,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAC5C;AAED,qBAAa,QAAQ;IACjB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,OAAO,CAEb;gBAEU,MAAM,EAAE,cAAc;IAMlC,IAAI,MAAM,CAAC,MAAM,EAAE,cAAc,EAEhC;IAED,OAAO,CAAC,QAAQ;IAMhB,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG;IAI7C,OAAO,CAAC,WAAW;YAwBL,YAAY;
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAMzB,MAAM,WAAW,cAAc;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,eAAe,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAC5C;AAED,qBAAa,QAAQ;IACjB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,OAAO,CAEb;gBAEU,MAAM,EAAE,cAAc;IAMlC,IAAI,MAAM,CAAC,MAAM,EAAE,cAAc,EAEhC;IAED,OAAO,CAAC,QAAQ;IAMhB,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG;IAI7C,OAAO,CAAC,WAAW;YAwBL,YAAY;YA6BZ,KAAK;IAkJnB;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,kBAAkB,GAAG,MAAM;;;;CAIlF;AAkVD,wBAAgB,QAAQ,aAIvB;AAED,MAAM,WAAW,eAAgB,SAAQ,OAAO;IAC5C,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;IACvD,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5C,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC;IAC1D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,GAAG,CAAC;CACxE;AAED,eAAO,MAAM,SAAS,EAAE,eAQvB,CAAA;AACD,eAAe,QAAQ,CAAC"}
|
package/dist/database.js
CHANGED
|
@@ -32,6 +32,7 @@ var database_exports = {};
|
|
|
32
32
|
__export(database_exports, {
|
|
33
33
|
Database: () => Database,
|
|
34
34
|
database: () => database,
|
|
35
|
+
dbConsole: () => dbConsole,
|
|
35
36
|
default: () => database_default
|
|
36
37
|
});
|
|
37
38
|
module.exports = __toCommonJS(database_exports);
|
|
@@ -331,8 +332,16 @@ var Database = class {
|
|
|
331
332
|
acc[type] = (...args) => logs.push({ type, args });
|
|
332
333
|
return acc;
|
|
333
334
|
}, {});
|
|
335
|
+
const systemBase = {
|
|
336
|
+
update,
|
|
337
|
+
remove,
|
|
338
|
+
rename,
|
|
339
|
+
read,
|
|
340
|
+
create,
|
|
341
|
+
save
|
|
342
|
+
};
|
|
334
343
|
this.register({
|
|
335
|
-
|
|
344
|
+
dbConsole: { ...customConsole, ...systemBase }
|
|
336
345
|
});
|
|
337
346
|
let stringCode;
|
|
338
347
|
if (typeof code === "function") {
|
|
@@ -427,14 +436,296 @@ var Database = class {
|
|
|
427
436
|
return await this.vmRun(code, options);
|
|
428
437
|
}
|
|
429
438
|
};
|
|
439
|
+
function create(dbName, code) {
|
|
440
|
+
const DIR = "databases";
|
|
441
|
+
const basePath = process.cwd();
|
|
442
|
+
const baseDir = import_node_path.default.resolve(basePath, DIR);
|
|
443
|
+
const dbPath = import_node_path.default.join(baseDir, `${dbName}.ts`);
|
|
444
|
+
import_node_fs.default.appendFileSync(dbPath, code.toString(), "utf8");
|
|
445
|
+
}
|
|
446
|
+
function read(dbName) {
|
|
447
|
+
const DIR = "databases";
|
|
448
|
+
const basePath = process.cwd();
|
|
449
|
+
const baseDir = import_node_path.default.resolve(basePath, DIR);
|
|
450
|
+
const dbPath = import_node_path.default.join(baseDir, `${dbName}.ts`);
|
|
451
|
+
if (!import_node_fs.default.existsSync(dbPath)) {
|
|
452
|
+
throw new Error(`Database '${dbName}' not found`);
|
|
453
|
+
}
|
|
454
|
+
return import_node_fs.default.readFileSync(dbPath, "utf8");
|
|
455
|
+
}
|
|
456
|
+
function remove(dbName, fnName) {
|
|
457
|
+
const DIR = "databases";
|
|
458
|
+
const basePath = process.cwd();
|
|
459
|
+
const baseDir = import_node_path.default.resolve(basePath, DIR);
|
|
460
|
+
const dbPath = import_node_path.default.join(baseDir, `${dbName}.ts`);
|
|
461
|
+
if (!import_node_fs.default.existsSync(dbPath)) return false;
|
|
462
|
+
if (!fnName) {
|
|
463
|
+
const bak2 = `${dbPath}.bak`;
|
|
464
|
+
try {
|
|
465
|
+
import_node_fs.default.copyFileSync(dbPath, bak2);
|
|
466
|
+
} catch (e) {
|
|
467
|
+
}
|
|
468
|
+
try {
|
|
469
|
+
import_node_fs.default.unlinkSync(dbPath);
|
|
470
|
+
return "Removed successfully";
|
|
471
|
+
} catch (e) {
|
|
472
|
+
return "Removed failed";
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
const bak = `${dbPath}.bak`;
|
|
476
|
+
try {
|
|
477
|
+
import_node_fs.default.copyFileSync(dbPath, bak);
|
|
478
|
+
} catch (e) {
|
|
479
|
+
}
|
|
480
|
+
let src = import_node_fs.default.readFileSync(dbPath, "utf8");
|
|
481
|
+
const escaped = fnName.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
482
|
+
const startRe = new RegExp(
|
|
483
|
+
`function\\s+${escaped}\\s*\\(|\\bclass\\s+${escaped}\\b|\\b(?:const|let|var)\\s+${escaped}\\s*=\\s*(?:function\\b|class\\b|\\(|\\{|\\[)`,
|
|
484
|
+
"m"
|
|
485
|
+
);
|
|
486
|
+
const startMatch = src.match(startRe);
|
|
487
|
+
if (startMatch) {
|
|
488
|
+
const startIdx = startMatch.index;
|
|
489
|
+
const len = src.length;
|
|
490
|
+
const idxCurly = src.indexOf("{", startIdx);
|
|
491
|
+
const idxBracket = src.indexOf("[", startIdx);
|
|
492
|
+
let braceOpen = -1;
|
|
493
|
+
if (idxCurly === -1) braceOpen = idxBracket;
|
|
494
|
+
else if (idxBracket === -1) braceOpen = idxCurly;
|
|
495
|
+
else braceOpen = Math.min(idxCurly, idxBracket);
|
|
496
|
+
if (braceOpen !== -1) {
|
|
497
|
+
const openingChar = src[braceOpen];
|
|
498
|
+
const closingChar = openingChar === "[" ? "]" : "}";
|
|
499
|
+
let i = braceOpen + 1;
|
|
500
|
+
let depth = 1;
|
|
501
|
+
while (i < len && depth > 0) {
|
|
502
|
+
const ch = src[i];
|
|
503
|
+
if (ch === openingChar) depth++;
|
|
504
|
+
else if (ch === closingChar) depth--;
|
|
505
|
+
i++;
|
|
506
|
+
}
|
|
507
|
+
let braceClose = i;
|
|
508
|
+
let endIdx = braceClose;
|
|
509
|
+
if (src.slice(braceClose, braceClose + 1) === ";")
|
|
510
|
+
endIdx = braceClose + 1;
|
|
511
|
+
const before = src.slice(0, startIdx);
|
|
512
|
+
const after = src.slice(endIdx);
|
|
513
|
+
src = before + after;
|
|
514
|
+
} else {
|
|
515
|
+
const semi = src.indexOf(";", startIdx);
|
|
516
|
+
let endIdx = semi !== -1 ? semi + 1 : src.indexOf("\n\n", startIdx);
|
|
517
|
+
if (endIdx === -1) endIdx = len;
|
|
518
|
+
src = src.slice(0, startIdx) + src.slice(endIdx);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
const exportRe = new RegExp(
|
|
522
|
+
`export\\s+const\\s+${escaped}\\s*:\\s*any\\s*=\\s*${escaped}\\s*;?`,
|
|
523
|
+
"g"
|
|
524
|
+
);
|
|
525
|
+
src = src.replace(exportRe, "");
|
|
526
|
+
src = src.replace(/\n{3,}/g, "\n\n");
|
|
527
|
+
import_node_fs.default.writeFileSync(dbPath, src, "utf8");
|
|
528
|
+
return `Removed ${fnName} from database ${dbName}.`;
|
|
529
|
+
}
|
|
530
|
+
function rename(oldName, newName) {
|
|
531
|
+
const DIR = "databases";
|
|
532
|
+
const basePath = process.cwd();
|
|
533
|
+
const baseDir = import_node_path.default.resolve(basePath, DIR);
|
|
534
|
+
const oldPath = import_node_path.default.join(baseDir, `${oldName}.ts`);
|
|
535
|
+
const newPath = import_node_path.default.join(baseDir, `${newName}.ts`);
|
|
536
|
+
if (!import_node_fs.default.existsSync(oldPath)) {
|
|
537
|
+
return `Error: File '${oldName}.ts' does not exist in the database`;
|
|
538
|
+
}
|
|
539
|
+
if (import_node_fs.default.existsSync(newPath)) {
|
|
540
|
+
return `Error: File '${newName}.ts' already exists in the database`;
|
|
541
|
+
}
|
|
542
|
+
try {
|
|
543
|
+
import_node_fs.default.renameSync(oldPath, newPath);
|
|
544
|
+
return `Successfully renamed '${oldName}.ts' to '${newName}.ts'`;
|
|
545
|
+
} catch (error) {
|
|
546
|
+
return `Error renaming file: ${error instanceof Error ? error.message : String(error)}`;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
function save(dbName, code) {
|
|
550
|
+
const DIR = "databases";
|
|
551
|
+
const basePath = process.cwd();
|
|
552
|
+
const baseDir = import_node_path.default.resolve(basePath, DIR);
|
|
553
|
+
const dbPath = import_node_path.default.join(baseDir, `${dbName}.ts`);
|
|
554
|
+
let fileContent = typeof code === "function" ? code.toString() : code;
|
|
555
|
+
import_node_fs.default.writeFileSync(dbPath, fileContent, "utf8");
|
|
556
|
+
}
|
|
557
|
+
function update(dbName, fnName, code) {
|
|
558
|
+
const DIR = "databases";
|
|
559
|
+
const basePath = process.cwd();
|
|
560
|
+
const baseDir = import_node_path.default.resolve(basePath, DIR);
|
|
561
|
+
const dbPath = import_node_path.default.join(baseDir, `${dbName}.ts`);
|
|
562
|
+
let src;
|
|
563
|
+
if (!import_node_fs.default.existsSync(dbPath)) {
|
|
564
|
+
try {
|
|
565
|
+
import_node_fs.default.writeFileSync(dbPath, "", "utf8");
|
|
566
|
+
return `Created new database file: ${dbPath}`;
|
|
567
|
+
} catch (e) {
|
|
568
|
+
return `Failed to create dbPath file: ${dbPath}`;
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
src = import_node_fs.default.readFileSync(dbPath, "utf8");
|
|
572
|
+
const originalSrc = src;
|
|
573
|
+
const escaped = fnName.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
574
|
+
const startRe = new RegExp(
|
|
575
|
+
`function\\s+${escaped}\\s*\\(|\\bclass\\s+${escaped}\\b|\\b(?:const|let|var)\\s+${escaped}\\s*=\\s*(?:function\\b|class\\b|\\(|\\{|\\[)`,
|
|
576
|
+
"m"
|
|
577
|
+
);
|
|
578
|
+
const startMatch = src.match(startRe);
|
|
579
|
+
let declKind = null;
|
|
580
|
+
if (startMatch) {
|
|
581
|
+
let startIdx = startMatch.index;
|
|
582
|
+
const snippet = src.slice(startIdx, startIdx + 80);
|
|
583
|
+
if (/^function\b/.test(snippet)) declKind = "functionDecl";
|
|
584
|
+
else if (/^class\b/.test(snippet)) declKind = "classDecl";
|
|
585
|
+
else if (/^\b(?:const|let|var)\b/.test(snippet)) declKind = "varAssign";
|
|
586
|
+
}
|
|
587
|
+
let newCode;
|
|
588
|
+
if (typeof code === "function") {
|
|
589
|
+
const fnStr = code.toString();
|
|
590
|
+
if (declKind === "functionDecl") {
|
|
591
|
+
if (/^function\s+\w+/.test(fnStr)) newCode = fnStr;
|
|
592
|
+
else
|
|
593
|
+
newCode = `function ${fnName}${fnStr.replace(
|
|
594
|
+
/^function\s*\(/,
|
|
595
|
+
"("
|
|
596
|
+
)}`;
|
|
597
|
+
} else if (declKind === "classDecl") {
|
|
598
|
+
if (/^class\s+\w+/.test(fnStr)) newCode = fnStr;
|
|
599
|
+
else if (/^class\s*\{/.test(fnStr))
|
|
600
|
+
newCode = fnStr.replace(/^class\s*\{/, `class ${fnName} {`);
|
|
601
|
+
else newCode = `const ${fnName} = ${fnStr};`;
|
|
602
|
+
} else {
|
|
603
|
+
newCode = `const ${fnName} = ${fnStr};`;
|
|
604
|
+
}
|
|
605
|
+
} else {
|
|
606
|
+
newCode = `const ${fnName} = ${valueToCode(code, 0)};`;
|
|
607
|
+
}
|
|
608
|
+
if (startMatch) {
|
|
609
|
+
const startIdx = startMatch.index;
|
|
610
|
+
const idxCurly = src.indexOf("{", startIdx);
|
|
611
|
+
const idxBracket = src.indexOf("[", startIdx);
|
|
612
|
+
let braceOpen = -1;
|
|
613
|
+
if (idxCurly === -1) braceOpen = idxBracket;
|
|
614
|
+
else if (idxBracket === -1) braceOpen = idxCurly;
|
|
615
|
+
else braceOpen = Math.min(idxCurly, idxBracket);
|
|
616
|
+
if (braceOpen === -1) {
|
|
617
|
+
const exportRe = new RegExp(
|
|
618
|
+
`export\\s+const\\s+${escaped}\\s*:\\s*any\\s*=\\s*${escaped}\\s*;?`,
|
|
619
|
+
"m"
|
|
620
|
+
);
|
|
621
|
+
if (exportRe.test(src)) {
|
|
622
|
+
src = src.replace(
|
|
623
|
+
exportRe,
|
|
624
|
+
`${newCode}
|
|
625
|
+
|
|
626
|
+
export const ${fnName}: any = ${fnName};`
|
|
627
|
+
);
|
|
628
|
+
} else {
|
|
629
|
+
src = src + `
|
|
630
|
+
|
|
631
|
+
${newCode}
|
|
632
|
+
|
|
633
|
+
export const ${fnName}: any = ${fnName};`;
|
|
634
|
+
}
|
|
635
|
+
} else {
|
|
636
|
+
const openingChar = src[braceOpen];
|
|
637
|
+
const closingChar = openingChar === "[" ? "]" : "}";
|
|
638
|
+
let i = braceOpen + 1;
|
|
639
|
+
let depth = 1;
|
|
640
|
+
const len = src.length;
|
|
641
|
+
while (i < len && depth > 0) {
|
|
642
|
+
const ch = src[i];
|
|
643
|
+
if (ch === openingChar) depth++;
|
|
644
|
+
else if (ch === closingChar) depth--;
|
|
645
|
+
i++;
|
|
646
|
+
}
|
|
647
|
+
let braceClose = i;
|
|
648
|
+
let endIdx = braceClose;
|
|
649
|
+
if (src.slice(braceClose, braceClose + 1) === ";")
|
|
650
|
+
endIdx = braceClose + 1;
|
|
651
|
+
const before = src.slice(0, startIdx);
|
|
652
|
+
const after = src.slice(endIdx);
|
|
653
|
+
src = before + newCode + after;
|
|
654
|
+
}
|
|
655
|
+
} else {
|
|
656
|
+
const exportRe = new RegExp(
|
|
657
|
+
`export\\s+const\\s+${escaped}\\s*:\\s*any\\s*=\\s*${escaped}\\s*;?`,
|
|
658
|
+
"m"
|
|
659
|
+
);
|
|
660
|
+
if (exportRe.test(src)) {
|
|
661
|
+
src = src.replace(
|
|
662
|
+
exportRe,
|
|
663
|
+
`${newCode}
|
|
664
|
+
|
|
665
|
+
export const ${fnName}: any = ${fnName};`
|
|
666
|
+
);
|
|
667
|
+
} else {
|
|
668
|
+
src = src + `
|
|
669
|
+
|
|
670
|
+
${newCode}
|
|
671
|
+
|
|
672
|
+
export const ${fnName}: any = ${fnName};`;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
import_node_fs.default.writeFileSync(dbPath, src, "utf8");
|
|
676
|
+
if (src === originalSrc) {
|
|
677
|
+
return `Saved ${fnName} to database ${dbName}.`;
|
|
678
|
+
} else {
|
|
679
|
+
return `Updated ${dbName} with ${fnName}.`;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
function valueToCode(val, depth = 0) {
|
|
683
|
+
const indentUnit = " ";
|
|
684
|
+
const indent = indentUnit.repeat(depth);
|
|
685
|
+
const indentInner = indentUnit.repeat(depth + 1);
|
|
686
|
+
if (val === null) return "null";
|
|
687
|
+
const t = typeof val;
|
|
688
|
+
if (t === "string") return JSON.stringify(val);
|
|
689
|
+
if (t === "number" || t === "boolean") return String(val);
|
|
690
|
+
if (t === "function") return val.toString();
|
|
691
|
+
if (Array.isArray(val)) {
|
|
692
|
+
if (val.length === 0) return "[]";
|
|
693
|
+
const items = val.map((v) => valueToCode(v, depth + 1));
|
|
694
|
+
return "[\n" + items.map((it) => indentInner + it).join(",\n") + "\n" + indent + "]";
|
|
695
|
+
}
|
|
696
|
+
if (t === "object") {
|
|
697
|
+
const keys = Object.keys(val);
|
|
698
|
+
if (keys.length === 0) return "{}";
|
|
699
|
+
const entries = keys.map((k) => {
|
|
700
|
+
const keyPart = isIdentifier(k) ? k : JSON.stringify(k);
|
|
701
|
+
const v = valueToCode(val[k], depth + 1);
|
|
702
|
+
return indentInner + keyPart + ": " + v;
|
|
703
|
+
});
|
|
704
|
+
return "{\n" + entries.join(",\n") + "\n" + indent + "}";
|
|
705
|
+
}
|
|
706
|
+
return String(val);
|
|
707
|
+
}
|
|
708
|
+
function isIdentifier(key) {
|
|
709
|
+
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);
|
|
710
|
+
}
|
|
430
711
|
function database() {
|
|
431
712
|
return new Database({
|
|
432
713
|
dir: resolve(process.cwd(), "databases")
|
|
433
714
|
});
|
|
434
715
|
}
|
|
716
|
+
var dbConsole = {
|
|
717
|
+
create,
|
|
718
|
+
read,
|
|
719
|
+
remove,
|
|
720
|
+
rename,
|
|
721
|
+
save,
|
|
722
|
+
update,
|
|
723
|
+
...console
|
|
724
|
+
};
|
|
435
725
|
var database_default = database;
|
|
436
726
|
// Annotate the CommonJS export names for ESM import in node:
|
|
437
727
|
0 && (module.exports = {
|
|
438
728
|
Database,
|
|
439
|
-
database
|
|
729
|
+
database,
|
|
730
|
+
dbConsole
|
|
440
731
|
});
|