@spytecgps/nova-orm 1.4.227 → 1.4.229

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/README.md CHANGED
@@ -38,6 +38,28 @@ Delete the @spytecgps/nova-orm folder from the node_modules folder to make sure
38
38
 
39
39
  After that run `npm i @spytecgps/nova-orm` if you removed the dependency completely and this will bring the latest package, or run `npm i` if you just updated the version
40
40
 
41
+ ### Tagging queries with `queryTags()`
42
+
43
+ Use `queryTags()` to attach sqlcommenter-formatted metadata to a QueryBuilder so
44
+ PlanetScale Vitess Query Insights can group queries by controller/action, and so
45
+ the mysql2 OTel auto-instrumentation span gets a useful name (via the
46
+ `installMysqlSpanRenamer()` processor).
47
+
48
+ ```ts
49
+ import { queryTags } from '@spytecgps/nova-orm'
50
+
51
+ repo
52
+ .createQueryBuilder('alertType')
53
+ .comment(queryTags({ controller: 'AlertTypesRepository', action: 'getAlertTypes' }))
54
+ .select()
55
+ .getMany()
56
+ ```
57
+
58
+ `queryTags()` auto-injects `application` from `process.env.OTEL_SERVICE_NAME`
59
+ and `traceparent` from the active OTel span (if any). Caller-supplied keys
60
+ override the auto-injected values. Output keys are alphabetically sorted for
61
+ deterministic grouping in PlanetScale Insights.
62
+
41
63
  ### Copy Distribution folder to local project ((local testing))
42
64
 
43
65
  when making changes and would like to avoid commiting and publishing changes.
@@ -1 +1 @@
1
- "use strict";var e=require("../node_modules/tslib/tslib.es6.js"),t=require("typeorm"),o=require("../utils/boolToNumberTransformer.js");exports.Position=class Position{id;imei;lat;lon;actualDate;speed;odometer;createdAt;messageId;batteryPercentage;clientId;address;sendTime;gpsUtcTime;externalBatteryPercentage;externalPowerVoltage;azimuth;motionDetected;deleted},e.__decorate([t.PrimaryGeneratedColumn({type:"bigint",name:"id"}),e.__metadata("design:type",Number)],exports.Position.prototype,"id",void 0),e.__decorate([t.Column("varchar",{name:"imei",length:15}),e.__metadata("design:type",String)],exports.Position.prototype,"imei",void 0),e.__decorate([t.Column("decimal",{name:"lat",nullable:!0,precision:8,scale:6}),e.__metadata("design:type",Number)],exports.Position.prototype,"lat",void 0),e.__decorate([t.Column("decimal",{name:"lon",nullable:!0,precision:9,scale:6}),e.__metadata("design:type",Number)],exports.Position.prototype,"lon",void 0),e.__decorate([t.Column("datetime",{name:"actualDate",precision:3}),e.__metadata("design:type",Date)],exports.Position.prototype,"actualDate",void 0),e.__decorate([t.Column("float",{name:"speed",nullable:!0}),e.__metadata("design:type",Number)],exports.Position.prototype,"speed",void 0),e.__decorate([t.Column("double",{name:"odometer",nullable:!0}),e.__metadata("design:type",Number)],exports.Position.prototype,"odometer",void 0),e.__decorate([t.Column("datetime",{name:"createdAt",precision:3}),e.__metadata("design:type",Date)],exports.Position.prototype,"createdAt",void 0),e.__decorate([t.Column("binary",{name:"messageId",length:16}),e.__metadata("design:type",Buffer)],exports.Position.prototype,"messageId",void 0),e.__decorate([t.Column("smallint",{name:"batteryPercentage",nullable:!0}),e.__metadata("design:type",Number)],exports.Position.prototype,"batteryPercentage",void 0),e.__decorate([t.Column("int",{name:"clientId"}),e.__metadata("design:type",Number)],exports.Position.prototype,"clientId",void 0),e.__decorate([t.Column("varchar",{name:"address",nullable:!0,length:255}),e.__metadata("design:type",String)],exports.Position.prototype,"address",void 0),e.__decorate([t.Column("datetime",{name:"sendTime",nullable:!0,precision:3}),e.__metadata("design:type",Date)],exports.Position.prototype,"sendTime",void 0),e.__decorate([t.Column("datetime",{name:"gpsUtcTime",nullable:!0,precision:3}),e.__metadata("design:type",Date)],exports.Position.prototype,"gpsUtcTime",void 0),e.__decorate([t.Column("smallint",{name:"externalBatteryPercentage",nullable:!0}),e.__metadata("design:type",Number)],exports.Position.prototype,"externalBatteryPercentage",void 0),e.__decorate([t.Column("float",{name:"externalPowerVoltage",nullable:!0}),e.__metadata("design:type",Number)],exports.Position.prototype,"externalPowerVoltage",void 0),e.__decorate([t.Column("smallint",{name:"azimuth",nullable:!0}),e.__metadata("design:type",Number)],exports.Position.prototype,"azimuth",void 0),e.__decorate([t.Column("tinyint",{name:"motionDetected",width:1,nullable:!0,transformer:new o.BoolToNumberTransformer}),e.__metadata("design:type",Boolean)],exports.Position.prototype,"motionDetected",void 0),e.__decorate([t.Column("tinyint",{name:"deleted",nullable:!0,width:1,transformer:new o.BoolToNumberTransformer,default:()=>"'0'"}),e.__metadata("design:type",Boolean)],exports.Position.prototype,"deleted",void 0),exports.Position=e.__decorate([t.Index("ixuPositionMessageId",["messageId"],{unique:!0}),t.Index("ixPositionImei",["imei"],{}),t.Index("ixPositionClientId_ActualDate",["clientId","actualDate"],{}),t.Index("ixPositionClientId_Imei_ActualDate",["clientId","imei","actualDate"],{}),t.Entity("position",{schema:"nova"})],exports.Position);
1
+ "use strict";var e=require("../node_modules/tslib/tslib.es6.js"),t=require("typeorm"),o=require("../utils/boolToNumberTransformer.js");exports.Position=class Position{id;imei;lat;lon;actualDate;speed;odometer;createdAt;messageId;batteryPercentage;clientId;address;sendTime;gpsUtcTime;externalBatteryPercentage;externalPowerVoltage;azimuth;motionDetected;deleted},e.__decorate([t.PrimaryGeneratedColumn({type:"bigint",name:"id"}),e.__metadata("design:type",Number)],exports.Position.prototype,"id",void 0),e.__decorate([t.Column("varchar",{name:"imei",length:15}),e.__metadata("design:type",String)],exports.Position.prototype,"imei",void 0),e.__decorate([t.Column("decimal",{name:"lat",nullable:!0,precision:8,scale:6}),e.__metadata("design:type",Number)],exports.Position.prototype,"lat",void 0),e.__decorate([t.Column("decimal",{name:"lon",nullable:!0,precision:9,scale:6}),e.__metadata("design:type",Number)],exports.Position.prototype,"lon",void 0),e.__decorate([t.Column("datetime",{name:"actualDate",precision:3}),e.__metadata("design:type",Date)],exports.Position.prototype,"actualDate",void 0),e.__decorate([t.Column("float",{name:"speed",nullable:!0}),e.__metadata("design:type",Number)],exports.Position.prototype,"speed",void 0),e.__decorate([t.Column("double",{name:"odometer",nullable:!0}),e.__metadata("design:type",Number)],exports.Position.prototype,"odometer",void 0),e.__decorate([t.Column("datetime",{name:"createdAt",precision:3}),e.__metadata("design:type",Date)],exports.Position.prototype,"createdAt",void 0),e.__decorate([t.Column("binary",{name:"messageId",length:16}),e.__metadata("design:type",Buffer)],exports.Position.prototype,"messageId",void 0),e.__decorate([t.Column("smallint",{name:"batteryPercentage",nullable:!0}),e.__metadata("design:type",Number)],exports.Position.prototype,"batteryPercentage",void 0),e.__decorate([t.Column("int",{name:"clientId"}),e.__metadata("design:type",Number)],exports.Position.prototype,"clientId",void 0),e.__decorate([t.Column("varchar",{name:"address",nullable:!0,length:255}),e.__metadata("design:type",String)],exports.Position.prototype,"address",void 0),e.__decorate([t.Column("datetime",{name:"sendTime",nullable:!0,precision:3}),e.__metadata("design:type",Date)],exports.Position.prototype,"sendTime",void 0),e.__decorate([t.Column("datetime",{name:"gpsUtcTime",nullable:!0,precision:3}),e.__metadata("design:type",Date)],exports.Position.prototype,"gpsUtcTime",void 0),e.__decorate([t.Column("smallint",{name:"externalBatteryPercentage",nullable:!0}),e.__metadata("design:type",Number)],exports.Position.prototype,"externalBatteryPercentage",void 0),e.__decorate([t.Column("float",{name:"externalPowerVoltage",nullable:!0}),e.__metadata("design:type",Number)],exports.Position.prototype,"externalPowerVoltage",void 0),e.__decorate([t.Column("smallint",{name:"azimuth",nullable:!0}),e.__metadata("design:type",Number)],exports.Position.prototype,"azimuth",void 0),e.__decorate([t.Column("tinyint",{name:"motionDetected",width:1,nullable:!0,transformer:new o.BoolToNumberTransformer}),e.__metadata("design:type",Boolean)],exports.Position.prototype,"motionDetected",void 0),e.__decorate([t.Column("tinyint",{name:"deleted",nullable:!0,width:1,transformer:new o.BoolToNumberTransformer,default:()=>"'0'"}),e.__metadata("design:type",Boolean)],exports.Position.prototype,"deleted",void 0),exports.Position=e.__decorate([t.Index("ixuPositionMessageId",["messageId"],{unique:!0}),t.Index("ixPositionClientId_Imei_ActualDate",["clientId","imei","actualDate"],{}),t.Entity("position",{schema:"nova"})],exports.Position);
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ import { syncSchemaFromDump, SyncSchemaFromDumpConfig } from './syncSchemaFromDu
6
6
  import * as Types from './types';
7
7
  import * as Enums from './types/enums';
8
8
  import { ConsoleLogger } from './utils/consoleLogger';
9
+ import { queryTags } from './utils/queryTags';
9
10
  declare const Utils: {
10
11
  uuidStringToBinaryBuffer: (uuidString: string) => Buffer;
11
12
  binaryBufferToUuidString: (buffer: Buffer | null) => string;
@@ -24,4 +25,4 @@ declare const Utils: {
24
25
  addMonthsToNow: (months: number) => Date;
25
26
  mapRawEntityToEntity: <T>(rawEntity: any, columnsPrefix?: string) => T;
26
27
  };
27
- export { Cache, ConsoleLogger, Entities, Enums, NovaDataSource, NovaDataSourceConfig, Repository, syncSchemaFromDump, SyncSchemaFromDumpConfig, Types, Utils, };
28
+ export { Cache, ConsoleLogger, Entities, Enums, NovaDataSource, NovaDataSourceConfig, queryTags, Repository, syncSchemaFromDump, SyncSchemaFromDumpConfig, Types, Utils, };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e=require("typeorm"),r=require("./cache/index.js"),t=require("./entities/index.js"),o=require("./novaDataSource.js"),a=require("./syncSchemaFromDump.js"),n=require("./types/index.js"),s=require("./types/enums.js"),i=require("./utils/consoleLogger.js"),u=require("./utils/dateTool.js"),l=require("./utils/mapRawEntityToEntity.js"),y=require("./utils/paramsValidators.js"),m=require("./utils/parsingTools.js"),g=require("./utils/randomizer.js"),d=require("./utils/uuidHelpers.js");const p={uuidStringToBinaryBuffer:d.uuidStringToBinaryBuffer,binaryBufferToUuidString:d.binaryBufferToUuidString,getRandomBoolean:g.getRandomBoolean,getRandomImei:g.getRandomImei,getRandomDateInRange:g.getRandomDateInRange,getRandomInteger:g.getRandomInteger,getRandomString:g.getRandomString,tryParseBoolean:m.tryParseBoolean,tryParseDate:m.tryParseDate,tryParseFloat:m.tryParseFloat,allAttributesAreNull:y.allAttributesAreNull,anyAttributeInArrayIsNull:y.anyAttributeInArrayIsNull,anyAttributeIsNull:y.anyAttributeIsNull,now:u.now,addMonthsToNow:u.addMonthsToNow,mapRawEntityToEntity:l.mapRawEntityToEntity};Object.defineProperty(exports,"Repository",{enumerable:!0,get:function(){return e.Repository}}),exports.Cache=r,exports.Entities=t,exports.NovaDataSource=o.NovaDataSource,exports.syncSchemaFromDump=a.syncSchemaFromDump,exports.Types=n,exports.Enums=s,exports.ConsoleLogger=i.ConsoleLogger,exports.Utils=p;
1
+ "use strict";var e=require("typeorm"),r=require("./cache/index.js"),t=require("./entities/index.js"),o=require("./novaDataSource.js"),a=require("./syncSchemaFromDump.js"),s=require("./types/index.js"),i=require("./types/enums.js"),n=require("./utils/consoleLogger.js"),u=require("./utils/dateTool.js"),l=require("./utils/mapRawEntityToEntity.js"),y=require("./utils/paramsValidators.js"),g=require("./utils/parsingTools.js"),m=require("./utils/queryTags.js"),d=require("./utils/randomizer.js"),p=require("./utils/uuidHelpers.js");const q={uuidStringToBinaryBuffer:p.uuidStringToBinaryBuffer,binaryBufferToUuidString:p.binaryBufferToUuidString,getRandomBoolean:d.getRandomBoolean,getRandomImei:d.getRandomImei,getRandomDateInRange:d.getRandomDateInRange,getRandomInteger:d.getRandomInteger,getRandomString:d.getRandomString,tryParseBoolean:g.tryParseBoolean,tryParseDate:g.tryParseDate,tryParseFloat:g.tryParseFloat,allAttributesAreNull:y.allAttributesAreNull,anyAttributeInArrayIsNull:y.anyAttributeInArrayIsNull,anyAttributeIsNull:y.anyAttributeIsNull,now:u.now,addMonthsToNow:u.addMonthsToNow,mapRawEntityToEntity:l.mapRawEntityToEntity};Object.defineProperty(exports,"Repository",{enumerable:!0,get:function(){return e.Repository}}),exports.Cache=r,exports.Entities=t,exports.NovaDataSource=o.NovaDataSource,exports.syncSchemaFromDump=a.syncSchemaFromDump,exports.Types=s,exports.Enums=i,exports.ConsoleLogger=n.ConsoleLogger,exports.queryTags=m.queryTags,exports.Utils=q;
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var _1684483704434AddLowerCaseIndex = require('../1684483704434-addLowerCaseIndex.js');
4
3
  var _1684483705001UpdateSecurityUserViewsV1 = require('../1684483705001-updateSecurityUserViewsV1.js');
4
+ var _1684483704434AddLowerCaseIndex = require('../1684483704434-addLowerCaseIndex.js');
5
5
  var _1684483705002UpdateSecurityUserViewsV2 = require('../1684483705002-updateSecurityUserViewsV2.js');
6
6
  var _1746434400000AddQuickSearchFulltextIndexes = require('../1746434400000-addQuickSearchFulltextIndexes.js');
7
7
 
8
8
 
9
9
 
10
- exports.addLowerCaseIndex1684483704434 = _1684483704434AddLowerCaseIndex.addLowerCaseIndex1684483704434;
11
10
  exports.updateSecurityUserViewsV11684483705001 = _1684483705001UpdateSecurityUserViewsV1.updateSecurityUserViewsV11684483705001;
11
+ exports.addLowerCaseIndex1684483704434 = _1684483704434AddLowerCaseIndex.addLowerCaseIndex1684483704434;
12
12
  exports.updateSecurityUserViewsV21684483705002 = _1684483705002UpdateSecurityUserViewsV2.updateSecurityUserViewsV21684483705002;
13
13
  exports.addQuickSearchFulltextIndexes1746434400000 = _1746434400000AddQuickSearchFulltextIndexes.addQuickSearchFulltextIndexes1746434400000;
@@ -1 +1 @@
1
- "use strict";var e=require("typeorm");require("lru-cache");var r=require("./entities/index.js"),t=require("./subscribers/index.js"),a=require("./utils/queryLogger.js"),i=require("./utils/spanSubscriber.js");require("fs"),require("mysql2/promise"),require("path"),require("./types/enums.js"),require("./types/logger.js"),require("./entities/retailAlertExternalRecipient.js"),require("./utils/dateTool.js");exports.NovaDataSource=class NovaDataSource{dataSource;logger;constructor(i,s,o){this.logger=s;const c=[];for(const e in r){const t=r[e];c.push(t)}const n=[];for(const e in t){const r=t[e];n.push(r)}const u={host:"aws.connect.psdb.cloud",port:3306,database:"nova",ssl:{rejectUnauthorized:!0}};this.dataSource=new e.DataSource({type:"mysql",connectorPackage:"mysql2",synchronize:!1,logging:!0,logger:new a.QueryLogger(this.logger,i.logging),entities:c,subscribers:n,migrations:["node_modules/@spytecgps/nova-orm/dist/migration/*.js"],supportBigNumbers:!0,bigNumberStrings:!1,extra:{decimalNumbers:!0},...u,...i,replication:{master:{...u,...i},slaves:o?[{...u,...o}]:[{...u,...i}],defaultMode:i.replicationMode??"master"}})}async connect(){if(this.dataSource.isInitialized||await this.dataSource.initialize(),!this.dataSource.subscribers.some((e=>e._spanSubscriber))){const e=i.createSpanSubscriber(this.logger);e._spanSubscriber=!0,this.dataSource.subscribers.push(e)}}async disconnect(){try{this.dataSource.isInitialized&&await this.dataSource.destroy()}catch(e){this.logger.error({error:e},"Failed to close connection to database")}}getRepository(e){return this.dataSource.getRepository(e)}async query(e,r){return this.dataSource.query(e,r,null)}async createQueryBuilder(e,r){return this.dataSource.createQueryBuilder(e,r,null)}createQueryRunner(e){return this.dataSource.createQueryRunner(e)}createQueryRunnerFromParams(e){const r=e?.queryOptions?.forceUseReplica?"slave":"master";return this.logger.trace({replicationMode:r},"Creating query runner with replication mode"),this.dataSource.createQueryRunner(r)}async safeQuery(e,r,t){try{await this.connect();return await e(this,t)}catch(e){throw this.logger.error({error:e},r?r+" ":"Error while executing query"),e}finally{t&&await t.release(),await this.disconnect()}}async safeQuery2(e,r,t){try{this.dataSource.isInitialized||(this.logger.info("nova-orm new connection"),await this.connect());return await e(this,t)}catch(e){throw this.logger.error({error:e},r?r+" ":"Error while executing query"),e}finally{t&&await t.release()}}async safeQuery3(e,r,t,{replicationMode:a,tag:i}={}){return(async()=>{let s;try{await this.connect(),a?(this.logger.trace({replicationMode:a},"Creating query runner with replication mode"),s=this.dataSource.createQueryRunner(a)):this.logger.trace({replicationMode:this.dataSource.defaultReplicationModeForReads},"Creating query builder with default replication mode for reads");const o=this.dataSource.createQueryBuilder(e,r,s);i&&o.comment(i);return await t(o)}catch(e){throw this.logger.error({error:e},i?i+" ":"Error while executing query"),e}finally{s&&await s.release()}})()}async syncSchema(e=!0){this.logger.warn("Initiating schema sync"),await this.connect(),await this.dataSource.synchronize(e),await this.dataSource.runMigrations()}async clearCache(){this.dataSource.queryResultCache?(this.logger.info("Clearing query result cache"),await this.dataSource.queryResultCache.clear()):this.logger.info("No query result cache to clear")}async invalidateCacheKey(e){this.dataSource.queryResultCache&&(this.logger.info("Invalidating cache key",{key:e}),await this.dataSource.queryResultCache.remove([e]))}};
1
+ "use strict";var e=require("typeorm");require("lru-cache");var r=require("./entities/index.js"),t=require("./subscribers/index.js"),a=require("./utils/mysqlSpanProcessor.js"),i=require("./utils/queryLogger.js"),s=require("./utils/spanSubscriber.js");require("fs"),require("mysql2/promise"),require("path"),require("./types/enums.js"),require("./types/logger.js"),require("./entities/retailAlertExternalRecipient.js"),require("./utils/dateTool.js"),require("@opentelemetry/api");exports.NovaDataSource=class NovaDataSource{dataSource;logger;constructor(a,s,o){this.logger=s;const n=[];for(const e in r){const t=r[e];n.push(t)}const c=[];for(const e in t){const r=t[e];c.push(r)}const u={host:"aws.connect.psdb.cloud",port:3306,database:"nova",ssl:{rejectUnauthorized:!0}};this.dataSource=new e.DataSource({type:"mysql",connectorPackage:"mysql2",synchronize:!1,logging:!0,logger:new i.QueryLogger(this.logger,a.logging),entities:n,subscribers:c,migrations:["node_modules/@spytecgps/nova-orm/dist/migration/*.js"],supportBigNumbers:!0,bigNumberStrings:!1,extra:{decimalNumbers:!0},...u,...a,replication:{master:{...u,...a},slaves:o?[{...u,...o}]:[{...u,...a}],defaultMode:a.replicationMode??"master"}})}async connect(){if(this.dataSource.isInitialized||await this.dataSource.initialize(),a.isOtelAutoInstrumented())a.installMysqlSpanRenamer();else if(!this.dataSource.subscribers.some((e=>e._spanSubscriber))){const e=s.createSpanSubscriber(this.logger);e._spanSubscriber=!0,this.dataSource.subscribers.push(e)}}async disconnect(){try{this.dataSource.isInitialized&&await this.dataSource.destroy()}catch(e){this.logger.error({error:e},"Failed to close connection to database")}}getRepository(e){return this.dataSource.getRepository(e)}async query(e,r){return this.dataSource.query(e,r,null)}async createQueryBuilder(e,r){return this.dataSource.createQueryBuilder(e,r,null)}createQueryRunner(e){return this.dataSource.createQueryRunner(e)}createQueryRunnerFromParams(e){const r=e?.queryOptions?.forceUseReplica?"slave":"master";return this.logger.trace({replicationMode:r},"Creating query runner with replication mode"),this.dataSource.createQueryRunner(r)}async safeQuery(e,r,t){try{await this.connect();return await e(this,t)}catch(e){throw this.logger.error({error:e},r?r+" ":"Error while executing query"),e}finally{t&&await t.release(),await this.disconnect()}}async safeQuery2(e,r,t){try{this.dataSource.isInitialized||(this.logger.info("nova-orm new connection"),await this.connect());return await e(this,t)}catch(e){throw this.logger.error({error:e},r?r+" ":"Error while executing query"),e}finally{t&&await t.release()}}async safeQuery3(e,r,t,{replicationMode:a,tag:i}={}){return(async()=>{let s;try{await this.connect(),a?(this.logger.trace({replicationMode:a},"Creating query runner with replication mode"),s=this.dataSource.createQueryRunner(a)):this.logger.trace({replicationMode:this.dataSource.defaultReplicationModeForReads},"Creating query builder with default replication mode for reads");const o=this.dataSource.createQueryBuilder(e,r,s);i&&o.comment(i);return await t(o)}catch(e){throw this.logger.error({error:e},i?i+" ":"Error while executing query"),e}finally{s&&await s.release()}})()}async syncSchema(e=!0){this.logger.warn("Initiating schema sync"),await this.connect(),await this.dataSource.synchronize(e),await this.dataSource.runMigrations()}async clearCache(){this.dataSource.queryResultCache?(this.logger.info("Clearing query result cache"),await this.dataSource.queryResultCache.clear()):this.logger.info("No query result cache to clear")}async invalidateCacheKey(e){this.dataSource.queryResultCache&&(this.logger.info("Invalidating cache key",{key:e}),await this.dataSource.queryResultCache.remove([e]))}};
@@ -0,0 +1,3 @@
1
+ export declare function installMysqlSpanRenamer(): boolean;
2
+ export declare function _resetForTests(): void;
3
+ export declare function isOtelAutoInstrumented(): boolean;
@@ -0,0 +1 @@
1
+ "use strict";var e=require("@opentelemetry/api");const t=/^\/\*\s*(.+?)\s*\*\//,n=/([A-Za-z_][A-Za-z0-9_]*)='([^']*)'/g;const r={onStart(e){if("mysql"!==e.attributes?.["db.system"])return;const r=e.attributes["db.statement"];if("string"!=typeof r)return;const s=r.match(t);if(!s)return;const o=s[1],c=function(e){const t={};let r,s=!1,o=0;for(n.lastIndex=0;null!==(r=n.exec(e));){s=!0;const n=e.slice(o,r.index);if(n&&!/^\s*,?\s*$/.test(n))return null;try{t[r[1]]=decodeURIComponent(r[2])}catch{t[r[1]]=r[2]}o=r.index+r[0].length}if(!s)return null;const c=e.slice(o);return c&&!/^\s*,?\s*$/.test(c)?null:t}(o);if(c){const t=function(e){if(e.controller&&e.action)return`${e.controller}::${e.action}`;if(e.action)return e.action;if(e.controller)return e.controller;const t=Object.keys(e)[0];return t?e[t]:null}(c);if(t)return void e.updateName(t)}e.updateName(o)},onEnd(){},shutdown:()=>Promise.resolve(),forceFlush:()=>Promise.resolve()};let s=!1;exports.installMysqlSpanRenamer=function(){if(s)return!0;const t=e.trace.getTracerProvider(),n=t._delegate??t.getDelegate?.()??t,o=n._activeSpanProcessor?._spanProcessors;return!!Array.isArray(o)&&(o.includes(r)||o.push(r),s=!0,!0)},exports.isOtelAutoInstrumented=function(){return Boolean(process.env.AWS_LAMBDA_EXEC_WRAPPER?.includes("otel-handler")||process.env.OPENTELEMETRY_COLLECTOR_CONFIG_FILE)};
@@ -0,0 +1 @@
1
+ export declare function queryTags(tags: Record<string, string>): string;
@@ -0,0 +1 @@
1
+ "use strict";var t=require("@opentelemetry/api");exports.queryTags=function(e){const n={},r=process.env.OTEL_SERVICE_NAME;r&&(n.application=r);const s=process.env.AWS_LAMBDA_FUNCTION_NAME;s&&(n.controller=r&&s.startsWith(`${r}-`)?s.slice(r.length+1):s);const c=t.trace.getActiveSpan()?.spanContext();if(c?.traceId&&c.spanId){const t=(c.traceFlags??0).toString(16).padStart(2,"0");n.traceparent=`00-${c.traceId}-${c.spanId}-${t}`}for(const[t,r]of Object.entries(e))n[t]=r;const o=Object.keys(n).sort();return 0===o.length?"":o.map((t=>`${t}='${encodeURIComponent(n[t]).replace(/'/g,"%27")}'`)).join(",")};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spytecgps/nova-orm",
3
- "version": "1.4.227",
3
+ "version": "1.4.229",
4
4
  "description": "ORM with PlanetScale",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -34,6 +34,7 @@
34
34
  "ioredis": "^5.6.1"
35
35
  },
36
36
  "dependencies": {
37
+ "@opentelemetry/api": "^1.9.0",
37
38
  "dayjs": "^1.11.11",
38
39
  "dotenv": "^16.4.7",
39
40
  "lru-cache": "^11.0.0",
package/schema.sql CHANGED
@@ -1,6 +1,6 @@
1
- -- nova-orm-schema-checksum: 193c428a4761336dc80b76d6ca35f66d
1
+ -- nova-orm-schema-checksum: 2c12667bb782636db47e66f34c77470d
2
2
  -- Nova ORM Schema Dump
3
- -- Generated at: 2026-05-08T07:48:24.529Z
3
+ -- Generated at: 2026-05-11T13:50:57.955Z
4
4
 
5
5
  SET FOREIGN_KEY_CHECKS = 0;
6
6
 
@@ -2436,9 +2436,7 @@ CREATE TABLE `position` (
2436
2436
  `deleted` tinyint(1) DEFAULT '0',
2437
2437
  PRIMARY KEY (`id`),
2438
2438
  UNIQUE KEY `ixuPositionMessageId` (`messageId`),
2439
- KEY `ixPositionClientId_Imei_ActualDate` (`clientId`,`imei`,`actualDate`),
2440
- KEY `ixPositionClientId_ActualDate` (`clientId`,`actualDate`),
2441
- KEY `ixPositionImei` (`imei`)
2439
+ KEY `ixPositionClientId_Imei_ActualDate` (`clientId`,`imei`,`actualDate`)
2442
2440
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
2443
2441
 
2444
2442
  DROP TABLE IF EXISTS `promotion`;