@famgia/omnify-core 0.0.116 → 0.0.118
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 +156 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +156 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -998,6 +998,13 @@ async function loadSchemas(directoryPath, options = {}) {
|
|
|
998
998
|
}
|
|
999
999
|
const target = schemas[targetName];
|
|
1000
1000
|
if (!target) {
|
|
1001
|
+
if (partial.name === targetName) {
|
|
1002
|
+
schemas[partial.name] = {
|
|
1003
|
+
...partial,
|
|
1004
|
+
kind: "object"
|
|
1005
|
+
};
|
|
1006
|
+
continue;
|
|
1007
|
+
}
|
|
1001
1008
|
console.warn(`Partial schema '${partial.name}' targets unknown schema '${targetName}', skipping`);
|
|
1002
1009
|
continue;
|
|
1003
1010
|
}
|
|
@@ -1438,11 +1445,45 @@ var textTypes = [
|
|
|
1438
1445
|
];
|
|
1439
1446
|
|
|
1440
1447
|
// src/validation/types/numeric.ts
|
|
1448
|
+
var INTEGER_DB_KEYWORDS = [
|
|
1449
|
+
"AUTO_INCREMENT",
|
|
1450
|
+
"IDENTITY",
|
|
1451
|
+
"SERIAL",
|
|
1452
|
+
"BIGSERIAL",
|
|
1453
|
+
"SMALLSERIAL",
|
|
1454
|
+
"NEXTVAL",
|
|
1455
|
+
"RAND()",
|
|
1456
|
+
"RANDOM()",
|
|
1457
|
+
"FLOOR()",
|
|
1458
|
+
"CEIL()",
|
|
1459
|
+
"ROUND()",
|
|
1460
|
+
"ABS()"
|
|
1461
|
+
];
|
|
1462
|
+
var FLOAT_DB_KEYWORDS = [
|
|
1463
|
+
"RAND()",
|
|
1464
|
+
"RANDOM()",
|
|
1465
|
+
"PI()",
|
|
1466
|
+
"FLOOR()",
|
|
1467
|
+
"CEIL()",
|
|
1468
|
+
"ROUND()",
|
|
1469
|
+
"ABS()",
|
|
1470
|
+
"SQRT()"
|
|
1471
|
+
];
|
|
1472
|
+
function isDbKeyword(value, keywords) {
|
|
1473
|
+
const upperValue = value.toUpperCase().trim();
|
|
1474
|
+
return keywords.some((keyword) => upperValue === keyword.toUpperCase());
|
|
1475
|
+
}
|
|
1441
1476
|
function validateIntegerDefault(value) {
|
|
1442
1477
|
if (value === void 0 || value === null || value === "") {
|
|
1443
1478
|
return { valid: true };
|
|
1444
1479
|
}
|
|
1445
1480
|
const strValue = String(value);
|
|
1481
|
+
if (isDbKeyword(strValue, INTEGER_DB_KEYWORDS)) {
|
|
1482
|
+
return {
|
|
1483
|
+
valid: false,
|
|
1484
|
+
error: `Database function '${strValue}' is not allowed as default. Use a static integer value instead.`
|
|
1485
|
+
};
|
|
1486
|
+
}
|
|
1446
1487
|
if (!/^-?\d+$/.test(strValue)) {
|
|
1447
1488
|
return { valid: false, error: "Must be an integer" };
|
|
1448
1489
|
}
|
|
@@ -1453,6 +1494,12 @@ function validateNumberDefault(value) {
|
|
|
1453
1494
|
return { valid: true };
|
|
1454
1495
|
}
|
|
1455
1496
|
const strValue = String(value);
|
|
1497
|
+
if (isDbKeyword(strValue, FLOAT_DB_KEYWORDS)) {
|
|
1498
|
+
return {
|
|
1499
|
+
valid: false,
|
|
1500
|
+
error: `Database function '${strValue}' is not allowed as default. Use a static number value instead.`
|
|
1501
|
+
};
|
|
1502
|
+
}
|
|
1456
1503
|
if (!/^-?\d+(\.\d+)?$/.test(strValue)) {
|
|
1457
1504
|
return { valid: false, error: "Must be a number" };
|
|
1458
1505
|
}
|
|
@@ -1563,11 +1610,50 @@ var numericTypes = [
|
|
|
1563
1610
|
];
|
|
1564
1611
|
|
|
1565
1612
|
// src/validation/types/temporal.ts
|
|
1613
|
+
var TIMESTAMP_DB_KEYWORDS = [
|
|
1614
|
+
"CURRENT_TIMESTAMP",
|
|
1615
|
+
"NOW()",
|
|
1616
|
+
"GETDATE()",
|
|
1617
|
+
"GETUTCDATE()",
|
|
1618
|
+
"SYSDATE",
|
|
1619
|
+
"SYSDATETIME()",
|
|
1620
|
+
"LOCALTIMESTAMP",
|
|
1621
|
+
"CURRENT_DATE",
|
|
1622
|
+
"CURRENT_TIME"
|
|
1623
|
+
];
|
|
1624
|
+
var DATETIME_DB_KEYWORDS = [
|
|
1625
|
+
"CURRENT_TIMESTAMP",
|
|
1626
|
+
"NOW()",
|
|
1627
|
+
"GETDATE()",
|
|
1628
|
+
"GETUTCDATE()",
|
|
1629
|
+
"SYSDATE",
|
|
1630
|
+
"SYSDATETIME()",
|
|
1631
|
+
"LOCALTIMESTAMP"
|
|
1632
|
+
];
|
|
1633
|
+
var DATE_DB_KEYWORDS = [
|
|
1634
|
+
"CURRENT_DATE",
|
|
1635
|
+
"CURDATE()",
|
|
1636
|
+
"GETDATE()"
|
|
1637
|
+
];
|
|
1638
|
+
var TIME_DB_KEYWORDS = [
|
|
1639
|
+
"CURRENT_TIME",
|
|
1640
|
+
"CURTIME()"
|
|
1641
|
+
];
|
|
1642
|
+
function isDbKeyword2(value, keywords) {
|
|
1643
|
+
const upperValue = value.toUpperCase().trim();
|
|
1644
|
+
return keywords.some((keyword) => upperValue === keyword.toUpperCase());
|
|
1645
|
+
}
|
|
1566
1646
|
function validateDateDefault(value) {
|
|
1567
1647
|
if (value === void 0 || value === null || value === "") {
|
|
1568
1648
|
return { valid: true };
|
|
1569
1649
|
}
|
|
1570
1650
|
const strValue = String(value);
|
|
1651
|
+
if (isDbKeyword2(strValue, DATE_DB_KEYWORDS)) {
|
|
1652
|
+
return {
|
|
1653
|
+
valid: false,
|
|
1654
|
+
error: `Database function '${strValue}' is not allowed as default. Date type only accepts static date values in YYYY-MM-DD format.`
|
|
1655
|
+
};
|
|
1656
|
+
}
|
|
1571
1657
|
if (!/^\d{4}-\d{2}-\d{2}$/.test(strValue)) {
|
|
1572
1658
|
return { valid: false, error: "Must be in YYYY-MM-DD format" };
|
|
1573
1659
|
}
|
|
@@ -1578,16 +1664,44 @@ function validateTimeDefault(value) {
|
|
|
1578
1664
|
return { valid: true };
|
|
1579
1665
|
}
|
|
1580
1666
|
const strValue = String(value);
|
|
1667
|
+
if (isDbKeyword2(strValue, TIME_DB_KEYWORDS)) {
|
|
1668
|
+
return {
|
|
1669
|
+
valid: false,
|
|
1670
|
+
error: `Database function '${strValue}' is not allowed as default. Time type only accepts static time values in HH:MM or HH:MM:SS format.`
|
|
1671
|
+
};
|
|
1672
|
+
}
|
|
1581
1673
|
if (!/^\d{2}:\d{2}(:\d{2})?$/.test(strValue)) {
|
|
1582
1674
|
return { valid: false, error: "Must be in HH:MM or HH:MM:SS format" };
|
|
1583
1675
|
}
|
|
1584
1676
|
return { valid: true };
|
|
1585
1677
|
}
|
|
1678
|
+
function validateDateTimeDefault(value) {
|
|
1679
|
+
if (value === void 0 || value === null || value === "") {
|
|
1680
|
+
return { valid: true };
|
|
1681
|
+
}
|
|
1682
|
+
const strValue = String(value);
|
|
1683
|
+
if (isDbKeyword2(strValue, DATETIME_DB_KEYWORDS)) {
|
|
1684
|
+
return {
|
|
1685
|
+
valid: false,
|
|
1686
|
+
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.`
|
|
1687
|
+
};
|
|
1688
|
+
}
|
|
1689
|
+
if (!/^\d{4}-\d{2}-\d{2}(T|\s)\d{2}:\d{2}(:\d{2})?/.test(strValue)) {
|
|
1690
|
+
return { valid: false, error: "Must be in YYYY-MM-DD HH:MM:SS format" };
|
|
1691
|
+
}
|
|
1692
|
+
return { valid: true };
|
|
1693
|
+
}
|
|
1586
1694
|
function validateTimestampDefault(value) {
|
|
1587
1695
|
if (value === void 0 || value === null || value === "") {
|
|
1588
1696
|
return { valid: true };
|
|
1589
1697
|
}
|
|
1590
1698
|
const strValue = String(value);
|
|
1699
|
+
if (isDbKeyword2(strValue, TIMESTAMP_DB_KEYWORDS)) {
|
|
1700
|
+
return {
|
|
1701
|
+
valid: false,
|
|
1702
|
+
error: `Database function '${strValue}' is not allowed as default. Use 'useCurrent: true' instead for CURRENT_TIMESTAMP, or 'useCurrentOnUpdate: true' for ON UPDATE CURRENT_TIMESTAMP.`
|
|
1703
|
+
};
|
|
1704
|
+
}
|
|
1591
1705
|
if (!/^\d{4}-\d{2}-\d{2}(T|\s)\d{2}:\d{2}(:\d{2})?/.test(strValue)) {
|
|
1592
1706
|
return { valid: false, error: "Must be in YYYY-MM-DD HH:MM:SS format" };
|
|
1593
1707
|
}
|
|
@@ -1627,7 +1741,7 @@ var DateTimeType = {
|
|
|
1627
1741
|
validate() {
|
|
1628
1742
|
return [];
|
|
1629
1743
|
},
|
|
1630
|
-
validateDefaultValue:
|
|
1744
|
+
validateDefaultValue: validateDateTimeDefault
|
|
1631
1745
|
};
|
|
1632
1746
|
var TimestampType = {
|
|
1633
1747
|
name: "Timestamp",
|
|
@@ -1654,11 +1768,33 @@ var temporalTypes = [
|
|
|
1654
1768
|
|
|
1655
1769
|
// src/validation/types/special.ts
|
|
1656
1770
|
var FILE_VALID_FIELDS = ["multiple", "maxFiles", "accept", "maxSize"];
|
|
1771
|
+
var UUID_DB_KEYWORDS = [
|
|
1772
|
+
"UUID()",
|
|
1773
|
+
"UUID_GENERATE_V4()",
|
|
1774
|
+
"GEN_RANDOM_UUID()",
|
|
1775
|
+
"NEWID()",
|
|
1776
|
+
"SYS_GUID()",
|
|
1777
|
+
"UUID_SHORT()"
|
|
1778
|
+
];
|
|
1779
|
+
var JSON_DB_KEYWORDS = [
|
|
1780
|
+
"JSON_ARRAY()",
|
|
1781
|
+
"JSON_OBJECT()"
|
|
1782
|
+
];
|
|
1783
|
+
function isDbKeyword3(value, keywords) {
|
|
1784
|
+
const upperValue = value.toUpperCase().trim();
|
|
1785
|
+
return keywords.some((keyword) => upperValue === keyword.toUpperCase());
|
|
1786
|
+
}
|
|
1657
1787
|
function validateJsonDefault(value) {
|
|
1658
1788
|
if (value === void 0 || value === null || value === "") {
|
|
1659
1789
|
return { valid: true };
|
|
1660
1790
|
}
|
|
1661
1791
|
const strValue = String(value);
|
|
1792
|
+
if (isDbKeyword3(strValue, JSON_DB_KEYWORDS)) {
|
|
1793
|
+
return {
|
|
1794
|
+
valid: false,
|
|
1795
|
+
error: `Database function '${strValue}' is not allowed as default. Use valid JSON like '{}' or '[]' instead.`
|
|
1796
|
+
};
|
|
1797
|
+
}
|
|
1662
1798
|
try {
|
|
1663
1799
|
JSON.parse(strValue);
|
|
1664
1800
|
return { valid: true };
|
|
@@ -1671,6 +1807,12 @@ function validateUuidDefault(value) {
|
|
|
1671
1807
|
return { valid: true };
|
|
1672
1808
|
}
|
|
1673
1809
|
const strValue = String(value);
|
|
1810
|
+
if (isDbKeyword3(strValue, UUID_DB_KEYWORDS)) {
|
|
1811
|
+
return {
|
|
1812
|
+
valid: false,
|
|
1813
|
+
error: `Database function '${strValue}' is not allowed as default. For auto-generated UUIDs, configure at the application or database level, not in schema default.`
|
|
1814
|
+
};
|
|
1815
|
+
}
|
|
1674
1816
|
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
1817
|
return { valid: false, error: "Must be a valid UUID" };
|
|
1676
1818
|
}
|
|
@@ -3033,6 +3175,19 @@ function validateSchema(schema, options = {}) {
|
|
|
3033
3175
|
warnings.push(...dbCompat.warnings);
|
|
3034
3176
|
const rulesErrors = validateRules(name, property, schema.filePath);
|
|
3035
3177
|
errors.push(...rulesErrors);
|
|
3178
|
+
const baseProp = property;
|
|
3179
|
+
if (baseProp.default !== void 0) {
|
|
3180
|
+
const defaultResult = validateDefaultValue(property.type, baseProp.default, baseProp);
|
|
3181
|
+
if (!defaultResult.valid) {
|
|
3182
|
+
errors.push(
|
|
3183
|
+
validationError(
|
|
3184
|
+
`Property '${name}' has invalid default value: ${defaultResult.error}`,
|
|
3185
|
+
buildLocation7(schema.filePath),
|
|
3186
|
+
property.type === "Timestamp" ? `For Timestamp type, use 'useCurrent: true' for CURRENT_TIMESTAMP behavior` : void 0
|
|
3187
|
+
)
|
|
3188
|
+
);
|
|
3189
|
+
}
|
|
3190
|
+
}
|
|
3036
3191
|
}
|
|
3037
3192
|
}
|
|
3038
3193
|
const localizedStringWarnings = validateLocalizedStrings(schema, options.localeConfig);
|