@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.cjs
CHANGED
|
@@ -1438,11 +1438,45 @@ var textTypes = [
|
|
|
1438
1438
|
];
|
|
1439
1439
|
|
|
1440
1440
|
// src/validation/types/numeric.ts
|
|
1441
|
+
var INTEGER_DB_KEYWORDS = [
|
|
1442
|
+
"AUTO_INCREMENT",
|
|
1443
|
+
"IDENTITY",
|
|
1444
|
+
"SERIAL",
|
|
1445
|
+
"BIGSERIAL",
|
|
1446
|
+
"SMALLSERIAL",
|
|
1447
|
+
"NEXTVAL",
|
|
1448
|
+
"RAND()",
|
|
1449
|
+
"RANDOM()",
|
|
1450
|
+
"FLOOR()",
|
|
1451
|
+
"CEIL()",
|
|
1452
|
+
"ROUND()",
|
|
1453
|
+
"ABS()"
|
|
1454
|
+
];
|
|
1455
|
+
var FLOAT_DB_KEYWORDS = [
|
|
1456
|
+
"RAND()",
|
|
1457
|
+
"RANDOM()",
|
|
1458
|
+
"PI()",
|
|
1459
|
+
"FLOOR()",
|
|
1460
|
+
"CEIL()",
|
|
1461
|
+
"ROUND()",
|
|
1462
|
+
"ABS()",
|
|
1463
|
+
"SQRT()"
|
|
1464
|
+
];
|
|
1465
|
+
function isDbKeyword(value, keywords) {
|
|
1466
|
+
const upperValue = value.toUpperCase().trim();
|
|
1467
|
+
return keywords.some((keyword) => upperValue === keyword.toUpperCase());
|
|
1468
|
+
}
|
|
1441
1469
|
function validateIntegerDefault(value) {
|
|
1442
1470
|
if (value === void 0 || value === null || value === "") {
|
|
1443
1471
|
return { valid: true };
|
|
1444
1472
|
}
|
|
1445
1473
|
const strValue = String(value);
|
|
1474
|
+
if (isDbKeyword(strValue, INTEGER_DB_KEYWORDS)) {
|
|
1475
|
+
return {
|
|
1476
|
+
valid: false,
|
|
1477
|
+
error: `Database function '${strValue}' is not allowed as default. Use a static integer value instead.`
|
|
1478
|
+
};
|
|
1479
|
+
}
|
|
1446
1480
|
if (!/^-?\d+$/.test(strValue)) {
|
|
1447
1481
|
return { valid: false, error: "Must be an integer" };
|
|
1448
1482
|
}
|
|
@@ -1453,6 +1487,12 @@ function validateNumberDefault(value) {
|
|
|
1453
1487
|
return { valid: true };
|
|
1454
1488
|
}
|
|
1455
1489
|
const strValue = String(value);
|
|
1490
|
+
if (isDbKeyword(strValue, FLOAT_DB_KEYWORDS)) {
|
|
1491
|
+
return {
|
|
1492
|
+
valid: false,
|
|
1493
|
+
error: `Database function '${strValue}' is not allowed as default. Use a static number value instead.`
|
|
1494
|
+
};
|
|
1495
|
+
}
|
|
1456
1496
|
if (!/^-?\d+(\.\d+)?$/.test(strValue)) {
|
|
1457
1497
|
return { valid: false, error: "Must be a number" };
|
|
1458
1498
|
}
|
|
@@ -1563,11 +1603,50 @@ var numericTypes = [
|
|
|
1563
1603
|
];
|
|
1564
1604
|
|
|
1565
1605
|
// src/validation/types/temporal.ts
|
|
1606
|
+
var TIMESTAMP_DB_KEYWORDS = [
|
|
1607
|
+
"CURRENT_TIMESTAMP",
|
|
1608
|
+
"NOW()",
|
|
1609
|
+
"GETDATE()",
|
|
1610
|
+
"GETUTCDATE()",
|
|
1611
|
+
"SYSDATE",
|
|
1612
|
+
"SYSDATETIME()",
|
|
1613
|
+
"LOCALTIMESTAMP",
|
|
1614
|
+
"CURRENT_DATE",
|
|
1615
|
+
"CURRENT_TIME"
|
|
1616
|
+
];
|
|
1617
|
+
var DATETIME_DB_KEYWORDS = [
|
|
1618
|
+
"CURRENT_TIMESTAMP",
|
|
1619
|
+
"NOW()",
|
|
1620
|
+
"GETDATE()",
|
|
1621
|
+
"GETUTCDATE()",
|
|
1622
|
+
"SYSDATE",
|
|
1623
|
+
"SYSDATETIME()",
|
|
1624
|
+
"LOCALTIMESTAMP"
|
|
1625
|
+
];
|
|
1626
|
+
var DATE_DB_KEYWORDS = [
|
|
1627
|
+
"CURRENT_DATE",
|
|
1628
|
+
"CURDATE()",
|
|
1629
|
+
"GETDATE()"
|
|
1630
|
+
];
|
|
1631
|
+
var TIME_DB_KEYWORDS = [
|
|
1632
|
+
"CURRENT_TIME",
|
|
1633
|
+
"CURTIME()"
|
|
1634
|
+
];
|
|
1635
|
+
function isDbKeyword2(value, keywords) {
|
|
1636
|
+
const upperValue = value.toUpperCase().trim();
|
|
1637
|
+
return keywords.some((keyword) => upperValue === keyword.toUpperCase());
|
|
1638
|
+
}
|
|
1566
1639
|
function validateDateDefault(value) {
|
|
1567
1640
|
if (value === void 0 || value === null || value === "") {
|
|
1568
1641
|
return { valid: true };
|
|
1569
1642
|
}
|
|
1570
1643
|
const strValue = String(value);
|
|
1644
|
+
if (isDbKeyword2(strValue, DATE_DB_KEYWORDS)) {
|
|
1645
|
+
return {
|
|
1646
|
+
valid: false,
|
|
1647
|
+
error: `Database function '${strValue}' is not allowed as default. Date type only accepts static date values in YYYY-MM-DD format.`
|
|
1648
|
+
};
|
|
1649
|
+
}
|
|
1571
1650
|
if (!/^\d{4}-\d{2}-\d{2}$/.test(strValue)) {
|
|
1572
1651
|
return { valid: false, error: "Must be in YYYY-MM-DD format" };
|
|
1573
1652
|
}
|
|
@@ -1578,16 +1657,44 @@ function validateTimeDefault(value) {
|
|
|
1578
1657
|
return { valid: true };
|
|
1579
1658
|
}
|
|
1580
1659
|
const strValue = String(value);
|
|
1660
|
+
if (isDbKeyword2(strValue, TIME_DB_KEYWORDS)) {
|
|
1661
|
+
return {
|
|
1662
|
+
valid: false,
|
|
1663
|
+
error: `Database function '${strValue}' is not allowed as default. Time type only accepts static time values in HH:MM or HH:MM:SS format.`
|
|
1664
|
+
};
|
|
1665
|
+
}
|
|
1581
1666
|
if (!/^\d{2}:\d{2}(:\d{2})?$/.test(strValue)) {
|
|
1582
1667
|
return { valid: false, error: "Must be in HH:MM or HH:MM:SS format" };
|
|
1583
1668
|
}
|
|
1584
1669
|
return { valid: true };
|
|
1585
1670
|
}
|
|
1671
|
+
function validateDateTimeDefault(value) {
|
|
1672
|
+
if (value === void 0 || value === null || value === "") {
|
|
1673
|
+
return { valid: true };
|
|
1674
|
+
}
|
|
1675
|
+
const strValue = String(value);
|
|
1676
|
+
if (isDbKeyword2(strValue, DATETIME_DB_KEYWORDS)) {
|
|
1677
|
+
return {
|
|
1678
|
+
valid: false,
|
|
1679
|
+
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.`
|
|
1680
|
+
};
|
|
1681
|
+
}
|
|
1682
|
+
if (!/^\d{4}-\d{2}-\d{2}(T|\s)\d{2}:\d{2}(:\d{2})?/.test(strValue)) {
|
|
1683
|
+
return { valid: false, error: "Must be in YYYY-MM-DD HH:MM:SS format" };
|
|
1684
|
+
}
|
|
1685
|
+
return { valid: true };
|
|
1686
|
+
}
|
|
1586
1687
|
function validateTimestampDefault(value) {
|
|
1587
1688
|
if (value === void 0 || value === null || value === "") {
|
|
1588
1689
|
return { valid: true };
|
|
1589
1690
|
}
|
|
1590
1691
|
const strValue = String(value);
|
|
1692
|
+
if (isDbKeyword2(strValue, TIMESTAMP_DB_KEYWORDS)) {
|
|
1693
|
+
return {
|
|
1694
|
+
valid: false,
|
|
1695
|
+
error: `Database function '${strValue}' is not allowed as default. Use 'useCurrent: true' instead for CURRENT_TIMESTAMP, or 'useCurrentOnUpdate: true' for ON UPDATE CURRENT_TIMESTAMP.`
|
|
1696
|
+
};
|
|
1697
|
+
}
|
|
1591
1698
|
if (!/^\d{4}-\d{2}-\d{2}(T|\s)\d{2}:\d{2}(:\d{2})?/.test(strValue)) {
|
|
1592
1699
|
return { valid: false, error: "Must be in YYYY-MM-DD HH:MM:SS format" };
|
|
1593
1700
|
}
|
|
@@ -1627,7 +1734,7 @@ var DateTimeType = {
|
|
|
1627
1734
|
validate() {
|
|
1628
1735
|
return [];
|
|
1629
1736
|
},
|
|
1630
|
-
validateDefaultValue:
|
|
1737
|
+
validateDefaultValue: validateDateTimeDefault
|
|
1631
1738
|
};
|
|
1632
1739
|
var TimestampType = {
|
|
1633
1740
|
name: "Timestamp",
|
|
@@ -1654,11 +1761,33 @@ var temporalTypes = [
|
|
|
1654
1761
|
|
|
1655
1762
|
// src/validation/types/special.ts
|
|
1656
1763
|
var FILE_VALID_FIELDS = ["multiple", "maxFiles", "accept", "maxSize"];
|
|
1764
|
+
var UUID_DB_KEYWORDS = [
|
|
1765
|
+
"UUID()",
|
|
1766
|
+
"UUID_GENERATE_V4()",
|
|
1767
|
+
"GEN_RANDOM_UUID()",
|
|
1768
|
+
"NEWID()",
|
|
1769
|
+
"SYS_GUID()",
|
|
1770
|
+
"UUID_SHORT()"
|
|
1771
|
+
];
|
|
1772
|
+
var JSON_DB_KEYWORDS = [
|
|
1773
|
+
"JSON_ARRAY()",
|
|
1774
|
+
"JSON_OBJECT()"
|
|
1775
|
+
];
|
|
1776
|
+
function isDbKeyword3(value, keywords) {
|
|
1777
|
+
const upperValue = value.toUpperCase().trim();
|
|
1778
|
+
return keywords.some((keyword) => upperValue === keyword.toUpperCase());
|
|
1779
|
+
}
|
|
1657
1780
|
function validateJsonDefault(value) {
|
|
1658
1781
|
if (value === void 0 || value === null || value === "") {
|
|
1659
1782
|
return { valid: true };
|
|
1660
1783
|
}
|
|
1661
1784
|
const strValue = String(value);
|
|
1785
|
+
if (isDbKeyword3(strValue, JSON_DB_KEYWORDS)) {
|
|
1786
|
+
return {
|
|
1787
|
+
valid: false,
|
|
1788
|
+
error: `Database function '${strValue}' is not allowed as default. Use valid JSON like '{}' or '[]' instead.`
|
|
1789
|
+
};
|
|
1790
|
+
}
|
|
1662
1791
|
try {
|
|
1663
1792
|
JSON.parse(strValue);
|
|
1664
1793
|
return { valid: true };
|
|
@@ -1671,6 +1800,12 @@ function validateUuidDefault(value) {
|
|
|
1671
1800
|
return { valid: true };
|
|
1672
1801
|
}
|
|
1673
1802
|
const strValue = String(value);
|
|
1803
|
+
if (isDbKeyword3(strValue, UUID_DB_KEYWORDS)) {
|
|
1804
|
+
return {
|
|
1805
|
+
valid: false,
|
|
1806
|
+
error: `Database function '${strValue}' is not allowed as default. For auto-generated UUIDs, configure at the application or database level, not in schema default.`
|
|
1807
|
+
};
|
|
1808
|
+
}
|
|
1674
1809
|
if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(strValue)) {
|
|
1675
1810
|
return { valid: false, error: "Must be a valid UUID" };
|
|
1676
1811
|
}
|
|
@@ -3033,6 +3168,19 @@ function validateSchema(schema, options = {}) {
|
|
|
3033
3168
|
warnings.push(...dbCompat.warnings);
|
|
3034
3169
|
const rulesErrors = validateRules(name, property, schema.filePath);
|
|
3035
3170
|
errors.push(...rulesErrors);
|
|
3171
|
+
const baseProp = property;
|
|
3172
|
+
if (baseProp.default !== void 0) {
|
|
3173
|
+
const defaultResult = validateDefaultValue(property.type, baseProp.default, baseProp);
|
|
3174
|
+
if (!defaultResult.valid) {
|
|
3175
|
+
errors.push(
|
|
3176
|
+
validationError(
|
|
3177
|
+
`Property '${name}' has invalid default value: ${defaultResult.error}`,
|
|
3178
|
+
buildLocation7(schema.filePath),
|
|
3179
|
+
property.type === "Timestamp" ? `For Timestamp type, use 'useCurrent: true' for CURRENT_TIMESTAMP behavior` : void 0
|
|
3180
|
+
)
|
|
3181
|
+
);
|
|
3182
|
+
}
|
|
3183
|
+
}
|
|
3036
3184
|
}
|
|
3037
3185
|
}
|
|
3038
3186
|
const localizedStringWarnings = validateLocalizedStrings(schema, options.localeConfig);
|