@famgia/omnify-core 0.0.116 → 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 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: validateTimestampDefault
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);