@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 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: validateTimestampDefault
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);