@famgia/omnify-core 0.0.115 → 0.0.117
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/index.cjs +149 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +149 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1327,11 +1327,45 @@ var textTypes = [
|
|
|
1327
1327
|
];
|
|
1328
1328
|
|
|
1329
1329
|
// src/validation/types/numeric.ts
|
|
1330
|
+
var INTEGER_DB_KEYWORDS = [
|
|
1331
|
+
"AUTO_INCREMENT",
|
|
1332
|
+
"IDENTITY",
|
|
1333
|
+
"SERIAL",
|
|
1334
|
+
"BIGSERIAL",
|
|
1335
|
+
"SMALLSERIAL",
|
|
1336
|
+
"NEXTVAL",
|
|
1337
|
+
"RAND()",
|
|
1338
|
+
"RANDOM()",
|
|
1339
|
+
"FLOOR()",
|
|
1340
|
+
"CEIL()",
|
|
1341
|
+
"ROUND()",
|
|
1342
|
+
"ABS()"
|
|
1343
|
+
];
|
|
1344
|
+
var FLOAT_DB_KEYWORDS = [
|
|
1345
|
+
"RAND()",
|
|
1346
|
+
"RANDOM()",
|
|
1347
|
+
"PI()",
|
|
1348
|
+
"FLOOR()",
|
|
1349
|
+
"CEIL()",
|
|
1350
|
+
"ROUND()",
|
|
1351
|
+
"ABS()",
|
|
1352
|
+
"SQRT()"
|
|
1353
|
+
];
|
|
1354
|
+
function isDbKeyword(value, keywords) {
|
|
1355
|
+
const upperValue = value.toUpperCase().trim();
|
|
1356
|
+
return keywords.some((keyword) => upperValue === keyword.toUpperCase());
|
|
1357
|
+
}
|
|
1330
1358
|
function validateIntegerDefault(value) {
|
|
1331
1359
|
if (value === void 0 || value === null || value === "") {
|
|
1332
1360
|
return { valid: true };
|
|
1333
1361
|
}
|
|
1334
1362
|
const strValue = String(value);
|
|
1363
|
+
if (isDbKeyword(strValue, INTEGER_DB_KEYWORDS)) {
|
|
1364
|
+
return {
|
|
1365
|
+
valid: false,
|
|
1366
|
+
error: `Database function '${strValue}' is not allowed as default. Use a static integer value instead.`
|
|
1367
|
+
};
|
|
1368
|
+
}
|
|
1335
1369
|
if (!/^-?\d+$/.test(strValue)) {
|
|
1336
1370
|
return { valid: false, error: "Must be an integer" };
|
|
1337
1371
|
}
|
|
@@ -1342,6 +1376,12 @@ function validateNumberDefault(value) {
|
|
|
1342
1376
|
return { valid: true };
|
|
1343
1377
|
}
|
|
1344
1378
|
const strValue = String(value);
|
|
1379
|
+
if (isDbKeyword(strValue, FLOAT_DB_KEYWORDS)) {
|
|
1380
|
+
return {
|
|
1381
|
+
valid: false,
|
|
1382
|
+
error: `Database function '${strValue}' is not allowed as default. Use a static number value instead.`
|
|
1383
|
+
};
|
|
1384
|
+
}
|
|
1345
1385
|
if (!/^-?\d+(\.\d+)?$/.test(strValue)) {
|
|
1346
1386
|
return { valid: false, error: "Must be a number" };
|
|
1347
1387
|
}
|
|
@@ -1452,11 +1492,50 @@ var numericTypes = [
|
|
|
1452
1492
|
];
|
|
1453
1493
|
|
|
1454
1494
|
// src/validation/types/temporal.ts
|
|
1495
|
+
var TIMESTAMP_DB_KEYWORDS = [
|
|
1496
|
+
"CURRENT_TIMESTAMP",
|
|
1497
|
+
"NOW()",
|
|
1498
|
+
"GETDATE()",
|
|
1499
|
+
"GETUTCDATE()",
|
|
1500
|
+
"SYSDATE",
|
|
1501
|
+
"SYSDATETIME()",
|
|
1502
|
+
"LOCALTIMESTAMP",
|
|
1503
|
+
"CURRENT_DATE",
|
|
1504
|
+
"CURRENT_TIME"
|
|
1505
|
+
];
|
|
1506
|
+
var DATETIME_DB_KEYWORDS = [
|
|
1507
|
+
"CURRENT_TIMESTAMP",
|
|
1508
|
+
"NOW()",
|
|
1509
|
+
"GETDATE()",
|
|
1510
|
+
"GETUTCDATE()",
|
|
1511
|
+
"SYSDATE",
|
|
1512
|
+
"SYSDATETIME()",
|
|
1513
|
+
"LOCALTIMESTAMP"
|
|
1514
|
+
];
|
|
1515
|
+
var DATE_DB_KEYWORDS = [
|
|
1516
|
+
"CURRENT_DATE",
|
|
1517
|
+
"CURDATE()",
|
|
1518
|
+
"GETDATE()"
|
|
1519
|
+
];
|
|
1520
|
+
var TIME_DB_KEYWORDS = [
|
|
1521
|
+
"CURRENT_TIME",
|
|
1522
|
+
"CURTIME()"
|
|
1523
|
+
];
|
|
1524
|
+
function isDbKeyword2(value, keywords) {
|
|
1525
|
+
const upperValue = value.toUpperCase().trim();
|
|
1526
|
+
return keywords.some((keyword) => upperValue === keyword.toUpperCase());
|
|
1527
|
+
}
|
|
1455
1528
|
function validateDateDefault(value) {
|
|
1456
1529
|
if (value === void 0 || value === null || value === "") {
|
|
1457
1530
|
return { valid: true };
|
|
1458
1531
|
}
|
|
1459
1532
|
const strValue = String(value);
|
|
1533
|
+
if (isDbKeyword2(strValue, DATE_DB_KEYWORDS)) {
|
|
1534
|
+
return {
|
|
1535
|
+
valid: false,
|
|
1536
|
+
error: `Database function '${strValue}' is not allowed as default. Date type only accepts static date values in YYYY-MM-DD format.`
|
|
1537
|
+
};
|
|
1538
|
+
}
|
|
1460
1539
|
if (!/^\d{4}-\d{2}-\d{2}$/.test(strValue)) {
|
|
1461
1540
|
return { valid: false, error: "Must be in YYYY-MM-DD format" };
|
|
1462
1541
|
}
|
|
@@ -1467,16 +1546,44 @@ function validateTimeDefault(value) {
|
|
|
1467
1546
|
return { valid: true };
|
|
1468
1547
|
}
|
|
1469
1548
|
const strValue = String(value);
|
|
1549
|
+
if (isDbKeyword2(strValue, TIME_DB_KEYWORDS)) {
|
|
1550
|
+
return {
|
|
1551
|
+
valid: false,
|
|
1552
|
+
error: `Database function '${strValue}' is not allowed as default. Time type only accepts static time values in HH:MM or HH:MM:SS format.`
|
|
1553
|
+
};
|
|
1554
|
+
}
|
|
1470
1555
|
if (!/^\d{2}:\d{2}(:\d{2})?$/.test(strValue)) {
|
|
1471
1556
|
return { valid: false, error: "Must be in HH:MM or HH:MM:SS format" };
|
|
1472
1557
|
}
|
|
1473
1558
|
return { valid: true };
|
|
1474
1559
|
}
|
|
1560
|
+
function validateDateTimeDefault(value) {
|
|
1561
|
+
if (value === void 0 || value === null || value === "") {
|
|
1562
|
+
return { valid: true };
|
|
1563
|
+
}
|
|
1564
|
+
const strValue = String(value);
|
|
1565
|
+
if (isDbKeyword2(strValue, DATETIME_DB_KEYWORDS)) {
|
|
1566
|
+
return {
|
|
1567
|
+
valid: false,
|
|
1568
|
+
error: `Database function '${strValue}' is not allowed as default for DateTime. Use a static datetime value in YYYY-MM-DD HH:MM:SS format instead.`
|
|
1569
|
+
};
|
|
1570
|
+
}
|
|
1571
|
+
if (!/^\d{4}-\d{2}-\d{2}(T|\s)\d{2}:\d{2}(:\d{2})?/.test(strValue)) {
|
|
1572
|
+
return { valid: false, error: "Must be in YYYY-MM-DD HH:MM:SS format" };
|
|
1573
|
+
}
|
|
1574
|
+
return { valid: true };
|
|
1575
|
+
}
|
|
1475
1576
|
function validateTimestampDefault(value) {
|
|
1476
1577
|
if (value === void 0 || value === null || value === "") {
|
|
1477
1578
|
return { valid: true };
|
|
1478
1579
|
}
|
|
1479
1580
|
const strValue = String(value);
|
|
1581
|
+
if (isDbKeyword2(strValue, TIMESTAMP_DB_KEYWORDS)) {
|
|
1582
|
+
return {
|
|
1583
|
+
valid: false,
|
|
1584
|
+
error: `Database function '${strValue}' is not allowed as default. Use 'useCurrent: true' instead for CURRENT_TIMESTAMP, or 'useCurrentOnUpdate: true' for ON UPDATE CURRENT_TIMESTAMP.`
|
|
1585
|
+
};
|
|
1586
|
+
}
|
|
1480
1587
|
if (!/^\d{4}-\d{2}-\d{2}(T|\s)\d{2}:\d{2}(:\d{2})?/.test(strValue)) {
|
|
1481
1588
|
return { valid: false, error: "Must be in YYYY-MM-DD HH:MM:SS format" };
|
|
1482
1589
|
}
|
|
@@ -1516,7 +1623,7 @@ var DateTimeType = {
|
|
|
1516
1623
|
validate() {
|
|
1517
1624
|
return [];
|
|
1518
1625
|
},
|
|
1519
|
-
validateDefaultValue:
|
|
1626
|
+
validateDefaultValue: validateDateTimeDefault
|
|
1520
1627
|
};
|
|
1521
1628
|
var TimestampType = {
|
|
1522
1629
|
name: "Timestamp",
|
|
@@ -1543,11 +1650,33 @@ var temporalTypes = [
|
|
|
1543
1650
|
|
|
1544
1651
|
// src/validation/types/special.ts
|
|
1545
1652
|
var FILE_VALID_FIELDS = ["multiple", "maxFiles", "accept", "maxSize"];
|
|
1653
|
+
var UUID_DB_KEYWORDS = [
|
|
1654
|
+
"UUID()",
|
|
1655
|
+
"UUID_GENERATE_V4()",
|
|
1656
|
+
"GEN_RANDOM_UUID()",
|
|
1657
|
+
"NEWID()",
|
|
1658
|
+
"SYS_GUID()",
|
|
1659
|
+
"UUID_SHORT()"
|
|
1660
|
+
];
|
|
1661
|
+
var JSON_DB_KEYWORDS = [
|
|
1662
|
+
"JSON_ARRAY()",
|
|
1663
|
+
"JSON_OBJECT()"
|
|
1664
|
+
];
|
|
1665
|
+
function isDbKeyword3(value, keywords) {
|
|
1666
|
+
const upperValue = value.toUpperCase().trim();
|
|
1667
|
+
return keywords.some((keyword) => upperValue === keyword.toUpperCase());
|
|
1668
|
+
}
|
|
1546
1669
|
function validateJsonDefault(value) {
|
|
1547
1670
|
if (value === void 0 || value === null || value === "") {
|
|
1548
1671
|
return { valid: true };
|
|
1549
1672
|
}
|
|
1550
1673
|
const strValue = String(value);
|
|
1674
|
+
if (isDbKeyword3(strValue, JSON_DB_KEYWORDS)) {
|
|
1675
|
+
return {
|
|
1676
|
+
valid: false,
|
|
1677
|
+
error: `Database function '${strValue}' is not allowed as default. Use valid JSON like '{}' or '[]' instead.`
|
|
1678
|
+
};
|
|
1679
|
+
}
|
|
1551
1680
|
try {
|
|
1552
1681
|
JSON.parse(strValue);
|
|
1553
1682
|
return { valid: true };
|
|
@@ -1560,6 +1689,12 @@ function validateUuidDefault(value) {
|
|
|
1560
1689
|
return { valid: true };
|
|
1561
1690
|
}
|
|
1562
1691
|
const strValue = String(value);
|
|
1692
|
+
if (isDbKeyword3(strValue, UUID_DB_KEYWORDS)) {
|
|
1693
|
+
return {
|
|
1694
|
+
valid: false,
|
|
1695
|
+
error: `Database function '${strValue}' is not allowed as default. For auto-generated UUIDs, configure at the application or database level, not in schema default.`
|
|
1696
|
+
};
|
|
1697
|
+
}
|
|
1563
1698
|
if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(strValue)) {
|
|
1564
1699
|
return { valid: false, error: "Must be a valid UUID" };
|
|
1565
1700
|
}
|
|
@@ -2922,6 +3057,19 @@ function validateSchema(schema, options = {}) {
|
|
|
2922
3057
|
warnings.push(...dbCompat.warnings);
|
|
2923
3058
|
const rulesErrors = validateRules(name, property, schema.filePath);
|
|
2924
3059
|
errors.push(...rulesErrors);
|
|
3060
|
+
const baseProp = property;
|
|
3061
|
+
if (baseProp.default !== void 0) {
|
|
3062
|
+
const defaultResult = validateDefaultValue(property.type, baseProp.default, baseProp);
|
|
3063
|
+
if (!defaultResult.valid) {
|
|
3064
|
+
errors.push(
|
|
3065
|
+
validationError(
|
|
3066
|
+
`Property '${name}' has invalid default value: ${defaultResult.error}`,
|
|
3067
|
+
buildLocation7(schema.filePath),
|
|
3068
|
+
property.type === "Timestamp" ? `For Timestamp type, use 'useCurrent: true' for CURRENT_TIMESTAMP behavior` : void 0
|
|
3069
|
+
)
|
|
3070
|
+
);
|
|
3071
|
+
}
|
|
3072
|
+
}
|
|
2925
3073
|
}
|
|
2926
3074
|
}
|
|
2927
3075
|
const localizedStringWarnings = validateLocalizedStrings(schema, options.localeConfig);
|