masterrecord 0.3.61 → 0.3.63

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/SQLLiteEngine.js CHANGED
@@ -797,17 +797,11 @@ class SQLLiteEngine {
797
797
  var fieldName = dirtyFields[column];
798
798
  var entityDef = model.__entity[fieldName];
799
799
  if(entityDef && entityDef.nullable === false && entityDef.primary !== true){
800
- // Determine the value that will actually be persisted for this field
801
- var persistedValue;
802
- switch(entityDef.type){
803
- case "integer":
804
- persistedValue = model["_" + fieldName];
805
- break;
806
- case "belongsTo":
807
- persistedValue = model["_" + fieldName] !== undefined ? model["_" + fieldName] : model[fieldName];
808
- break;
809
- default:
810
- persistedValue = model[fieldName];
800
+ // Read the raw backing field to get the set()-transformed value,
801
+ // bypassing get() which may change the type (e.g. parseFloat)
802
+ var persistedValue = model["_" + fieldName];
803
+ if(persistedValue === undefined){
804
+ persistedValue = model[fieldName];
811
805
  }
812
806
  var isEmptyString = (typeof persistedValue === 'string') && (persistedValue.trim() === '');
813
807
  if(persistedValue === undefined || persistedValue === null || isEmptyString){
@@ -862,7 +856,7 @@ class SQLLiteEngine {
862
856
  params.push(intValue);
863
857
  break;
864
858
  case "string":
865
- var strValue = model[dirtyFields[column]];
859
+ var strValue = model["_" + dirtyFields[column]];
866
860
 
867
861
  // 🔥 Apply toDatabase transformer before validation
868
862
  try {
@@ -880,7 +874,7 @@ class SQLLiteEngine {
880
874
  params.push(strValue);
881
875
  break;
882
876
  case "boolean":
883
- var boolValue = model[dirtyFields[column]];
877
+ var boolValue = model["_" + dirtyFields[column]];
884
878
 
885
879
  // 🔥 Apply toDatabase transformer before validation
886
880
  try {
@@ -902,7 +896,7 @@ class SQLLiteEngine {
902
896
  params.push(boolValue);
903
897
  break;
904
898
  case "time":
905
- var timeValue = model[dirtyFields[column]];
899
+ var timeValue = model["_" + dirtyFields[column]];
906
900
 
907
901
  // 🔥 Apply toDatabase transformer before validation
908
902
  try {
@@ -925,7 +919,7 @@ class SQLLiteEngine {
925
919
  break;
926
920
  default:
927
921
  sqlParts.push(`[${dirtyFields[column]}] = ?`);
928
- params.push(model[dirtyFields[column]]);
922
+ params.push(model["_" + dirtyFields[column]]);
929
923
  }
930
924
  }
931
925
 
@@ -1224,7 +1218,10 @@ class SQLLiteEngine {
1224
1218
  return mainString;;
1225
1219
  }
1226
1220
 
1227
- _execute(query){
1221
+ _execute(query, params){
1222
+ if (params && params.length > 0) {
1223
+ return this._executeWithParams(query, params);
1224
+ }
1228
1225
  if (process.env.LOG_SQL === 'true' || process.env.NODE_ENV !== 'production') {
1229
1226
  console.debug("[SQL]", query);
1230
1227
  }
package/context.js CHANGED
@@ -1824,20 +1824,25 @@ class context {
1824
1824
 
1825
1825
 
1826
1826
  /**
1827
- * Execute a raw SQL query
1827
+ * Execute a raw SQL query, optionally with parameterized values
1828
1828
  *
1829
1829
  * @param {string} query - SQL query to execute
1830
+ * @param {Array} [params] - Optional array of parameter values for placeholders
1830
1831
  *
1831
1832
  * @example
1832
1833
  * context._execute('CREATE INDEX idx_user_email ON User(email)');
1834
+ * context._execute('UPDATE User SET name = ? WHERE id = ?', ['Alice', 1]);
1833
1835
  */
1834
- _execute(query) {
1836
+ _execute(query, params) {
1835
1837
  if (!this._SQLEngine) {
1836
1838
  throw new DatabaseConnectionError(
1837
1839
  'Cannot execute query: database engine not initialized. Ensure you have awaited env() before running queries.',
1838
1840
  this.isMySQL ? 'MySQL' : this.isPostgres ? 'PostgreSQL' : 'SQLite'
1839
1841
  );
1840
1842
  }
1843
+ if (params && params.length > 0) {
1844
+ return this._SQLEngine._execute(query, params);
1845
+ }
1841
1846
  return this._SQLEngine._execute(query);
1842
1847
  }
1843
1848
 
package/mySQLEngine.js CHANGED
@@ -520,16 +520,11 @@ class MySQLEngine {
520
520
  const entityDef = model.__entity[fieldName];
521
521
 
522
522
  if (entityDef && entityDef.nullable === false && entityDef.primary !== true) {
523
- let persistedValue;
524
- switch (entityDef.type) {
525
- case "integer":
526
- persistedValue = model["_" + fieldName];
527
- break;
528
- case "belongsTo":
529
- persistedValue = model["_" + fieldName] !== undefined ? model["_" + fieldName] : model[fieldName];
530
- break;
531
- default:
532
- persistedValue = model[fieldName];
523
+ // Read the raw backing field to get the set()-transformed value,
524
+ // bypassing get() which may change the type (e.g. parseFloat)
525
+ let persistedValue = model["_" + fieldName];
526
+ if (persistedValue === undefined) {
527
+ persistedValue = model[fieldName];
533
528
  }
534
529
  const isEmptyString = (typeof persistedValue === 'string') && (persistedValue.trim() === '');
535
530
  if (persistedValue === undefined || persistedValue === null || isEmptyString) {
@@ -578,7 +573,7 @@ class MySQLEngine {
578
573
  break;
579
574
 
580
575
  case "string":
581
- let strValue = model[dirtyFields[column]];
576
+ let strValue = model["_" + dirtyFields[column]];
582
577
  try {
583
578
  strValue = FieldTransformer.toDatabase(strValue, model.__entity[dirtyFields[column]], model.__entity.__name, dirtyFields[column]);
584
579
  } catch (transformError) {
@@ -594,7 +589,7 @@ class MySQLEngine {
594
589
  break;
595
590
 
596
591
  case "boolean":
597
- let boolValue = model[dirtyFields[column]];
592
+ let boolValue = model["_" + dirtyFields[column]];
598
593
  try {
599
594
  boolValue = FieldTransformer.toDatabase(boolValue, model.__entity[dirtyFields[column]], model.__entity.__name, dirtyFields[column]);
600
595
  } catch (transformError) {
@@ -612,7 +607,7 @@ class MySQLEngine {
612
607
  break;
613
608
 
614
609
  case "time":
615
- let timeValue = model[dirtyFields[column]];
610
+ let timeValue = model["_" + dirtyFields[column]];
616
611
  try {
617
612
  timeValue = FieldTransformer.toDatabase(timeValue, model.__entity[dirtyFields[column]], model.__entity.__name, dirtyFields[column]);
618
613
  } catch (transformError) {
@@ -629,12 +624,12 @@ class MySQLEngine {
629
624
 
630
625
  case "hasMany":
631
626
  sqlParts.push(`\`${dirtyFields[column]}\` = ?`);
632
- params.push(model[dirtyFields[column]]);
627
+ params.push(model["_" + dirtyFields[column]]);
633
628
  break;
634
629
 
635
630
  default:
636
631
  sqlParts.push(`\`${dirtyFields[column]}\` = ?`);
637
- params.push(model[dirtyFields[column]]);
632
+ params.push(model["_" + dirtyFields[column]]);
638
633
  }
639
634
  }
640
635
 
@@ -802,8 +797,8 @@ class MySQLEngine {
802
797
  * Execute raw SQL (DDL statements like CREATE TABLE, ALTER TABLE, etc.)
803
798
  * Used by migration schema for non-parameterized DDL queries.
804
799
  */
805
- _execute(query) {
806
- return this._runWithParams(query, []);
800
+ _execute(query, params) {
801
+ return this._runWithParams(query, params || []);
807
802
  }
808
803
 
809
804
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "masterrecord",
3
- "version": "0.3.61",
3
+ "version": "0.3.63",
4
4
  "description": "An Object-relational mapping for the Master framework. Master Record connects classes to relational database tables to establish a database with almost zero-configuration ",
5
5
  "main": "MasterRecord.js",
6
6
  "bin": {
package/postgresEngine.js CHANGED
@@ -457,16 +457,11 @@ class postgresEngine {
457
457
 
458
458
  // Check for required fields
459
459
  if (entityDef && entityDef.nullable === false && entityDef.primary !== true) {
460
- let persistedValue;
461
- switch (entityDef.type) {
462
- case "integer":
463
- persistedValue = model["_" + fieldName];
464
- break;
465
- case "belongsTo":
466
- persistedValue = model["_" + fieldName] !== undefined ? model["_" + fieldName] : model[fieldName];
467
- break;
468
- default:
469
- persistedValue = model[fieldName];
460
+ // Read the raw backing field to get the set()-transformed value,
461
+ // bypassing get() which may change the type (e.g. parseFloat)
462
+ let persistedValue = model["_" + fieldName];
463
+ if (persistedValue === undefined) {
464
+ persistedValue = model[fieldName];
470
465
  }
471
466
  const isEmptyString = (typeof persistedValue === 'string') && (persistedValue.trim() === '');
472
467
  if (persistedValue === undefined || persistedValue === null || isEmptyString) {
@@ -519,7 +514,7 @@ class postgresEngine {
519
514
  break;
520
515
 
521
516
  case "string":
522
- let strValue = model[dirtyFields[column]];
517
+ let strValue = model["_" + dirtyFields[column]];
523
518
  // Apply toDatabase transformer
524
519
  try {
525
520
  strValue = FieldTransformer.toDatabase(strValue, model.__entity[dirtyFields[column]], model.__entity.__name, dirtyFields[column]);
@@ -537,7 +532,7 @@ class postgresEngine {
537
532
  break;
538
533
 
539
534
  case "boolean":
540
- let boolValue = model[dirtyFields[column]];
535
+ let boolValue = model["_" + dirtyFields[column]];
541
536
  // Apply toDatabase transformer
542
537
  try {
543
538
  boolValue = FieldTransformer.toDatabase(boolValue, model.__entity[dirtyFields[column]], model.__entity.__name, dirtyFields[column]);
@@ -555,7 +550,7 @@ class postgresEngine {
555
550
  break;
556
551
 
557
552
  case "time":
558
- let timeValue = model[dirtyFields[column]];
553
+ let timeValue = model["_" + dirtyFields[column]];
559
554
  // Apply toDatabase transformer
560
555
  try {
561
556
  timeValue = FieldTransformer.toDatabase(timeValue, model.__entity[dirtyFields[column]], model.__entity.__name, dirtyFields[column]);
@@ -574,12 +569,12 @@ class postgresEngine {
574
569
 
575
570
  case "hasMany":
576
571
  sqlParts.push(`${dirtyFields[column]} = $${paramIndex++}`);
577
- params.push(model[dirtyFields[column]]);
572
+ params.push(model["_" + dirtyFields[column]]);
578
573
  break;
579
574
 
580
575
  default:
581
576
  sqlParts.push(`${dirtyFields[column]} = $${paramIndex++}`);
582
- params.push(model[dirtyFields[column]]);
577
+ params.push(model["_" + dirtyFields[column]]);
583
578
  }
584
579
  }
585
580
 
@@ -754,8 +749,8 @@ class postgresEngine {
754
749
  * Execute raw SQL (DDL statements like CREATE TABLE, ALTER TABLE, etc.)
755
750
  * Used by migration schema for non-parameterized DDL queries.
756
751
  */
757
- _execute(query) {
758
- return this._runWithParams(query, []);
752
+ _execute(query, params) {
753
+ return this._runWithParams(query, params || []);
759
754
  }
760
755
 
761
756
  async _runWithParams(query, params = []) {