@spytecgps/nova-orm 1.4.226 → 1.4.228
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 +22 -0
- package/dist/entities/assetProfile.d.ts +1 -0
- package/dist/entities/assetProfile.js +1 -1
- package/dist/entities/position.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -1
- package/dist/novaDataSource.js +1 -1
- package/dist/utils/mysqlSpanProcessor.d.ts +3 -0
- package/dist/utils/mysqlSpanProcessor.js +1 -0
- package/dist/utils/queryTags.d.ts +1 -0
- package/dist/utils/queryTags.js +1 -0
- package/package.json +2 -1
- package/schema.sql +4 -5
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.
|
|
@@ -23,5 +23,6 @@ export declare class AssetProfile {
|
|
|
23
23
|
medias?: Relation<AssetProfileMedia>[];
|
|
24
24
|
notes?: Relation<AssetProfileNote>[];
|
|
25
25
|
customFields?: Relation<AssetProfileCustomField>[];
|
|
26
|
+
metadata?: Record<string, unknown> | null;
|
|
26
27
|
customStatus?: Relation<AssetProfileCustomStatus> | null;
|
|
27
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("../node_modules/tslib/tslib.es6.js"),t=require("typeorm"),o=require("./assetProfileCustomField.js"),a=require("./assetProfileMedia.js"),r=require("./assetProfileNote.js"),s=require("./assetProfileType.js"),i=require("./device.js");exports.AssetProfile=class AssetProfile{id;deviceId;name;clientId;device;assetProfileTypeId;assetProfileType;make;model;serialNumber;year;status;createdAt;modifiedAt;medias;notes;customFields;customStatus},e.__decorate([t.PrimaryGeneratedColumn({type:"int",name:"id"}),e.__metadata("design:type",Number)],exports.AssetProfile.prototype,"id",void 0),e.__decorate([t.Column("int",{name:"deviceId",nullable:!0}),e.__metadata("design:type",Number)],exports.AssetProfile.prototype,"deviceId",void 0),e.__decorate([t.Column("varchar",{name:"name",length:100,nullable:!0}),e.__metadata("design:type",String)],exports.AssetProfile.prototype,"name",void 0),e.__decorate([t.Column("int",{name:"clientId"}),e.__metadata("design:type",Number)],exports.AssetProfile.prototype,"clientId",void 0),e.__decorate([t.OneToOne((()=>i.Device),{createForeignKeyConstraints:!1,nullable:!0}),t.JoinColumn(),e.__metadata("design:type",Object)],exports.AssetProfile.prototype,"device",void 0),e.__decorate([t.Column("smallint",{name:"assetProfileTypeId",nullable:!0}),e.__metadata("design:type",Number)],exports.AssetProfile.prototype,"assetProfileTypeId",void 0),e.__decorate([t.OneToOne((()=>s.AssetProfileType),{createForeignKeyConstraints:!1,nullable:!1}),t.JoinColumn(),e.__metadata("design:type",Object)],exports.AssetProfile.prototype,"assetProfileType",void 0),e.__decorate([t.Column("varchar",{name:"make",nullable:!0,length:50}),e.__metadata("design:type",String)],exports.AssetProfile.prototype,"make",void 0),e.__decorate([t.Column("varchar",{name:"model",nullable:!0,length:50}),e.__metadata("design:type",String)],exports.AssetProfile.prototype,"model",void 0),e.__decorate([t.Column("varchar",{name:"serialNumber",nullable:!0,length:512}),e.__metadata("design:type",String)],exports.AssetProfile.prototype,"serialNumber",void 0),e.__decorate([t.Column("smallint",{name:"year",nullable:!0}),e.__metadata("design:type",Number)],exports.AssetProfile.prototype,"year",void 0),e.__decorate([t.Column("varchar",{name:"status",length:50,default:()=>"'Active'"}),e.__metadata("design:type",String)],exports.AssetProfile.prototype,"status",void 0),e.__decorate([t.Column("datetime",{name:"createdAt",nullable:!0,default:()=>"CURRENT_TIMESTAMP"}),e.__metadata("design:type",Date)],exports.AssetProfile.prototype,"createdAt",void 0),e.__decorate([t.Column("datetime",{name:"modifiedAt",nullable:!0}),e.__metadata("design:type",Date)],exports.AssetProfile.prototype,"modifiedAt",void 0),e.__decorate([t.OneToMany((()=>a.AssetProfileMedia),(e=>e.assetProfile)),e.__metadata("design:type",Array)],exports.AssetProfile.prototype,"medias",void 0),e.__decorate([t.OneToMany((()=>r.AssetProfileNote),(e=>e.assetProfile)),e.__metadata("design:type",Array)],exports.AssetProfile.prototype,"notes",void 0),e.__decorate([t.OneToMany((()=>o.AssetProfileCustomField),(e=>e.assetProfile)),e.__metadata("design:type",Array)],exports.AssetProfile.prototype,"customFields",void 0),exports.AssetProfile=e.__decorate([t.Index("ix_clientId",["clientId"],{}),t.Index("ix_deviceId",["deviceId"],{unique:!0}),t.Entity("assetProfile",{schema:"nova"})],exports.AssetProfile);
|
|
1
|
+
"use strict";var e=require("../node_modules/tslib/tslib.es6.js"),t=require("typeorm"),o=require("./assetProfileCustomField.js"),a=require("./assetProfileMedia.js"),r=require("./assetProfileNote.js"),s=require("./assetProfileType.js"),i=require("./device.js");exports.AssetProfile=class AssetProfile{id;deviceId;name;clientId;device;assetProfileTypeId;assetProfileType;make;model;serialNumber;year;status;createdAt;modifiedAt;medias;notes;customFields;metadata;customStatus},e.__decorate([t.PrimaryGeneratedColumn({type:"int",name:"id"}),e.__metadata("design:type",Number)],exports.AssetProfile.prototype,"id",void 0),e.__decorate([t.Column("int",{name:"deviceId",nullable:!0}),e.__metadata("design:type",Number)],exports.AssetProfile.prototype,"deviceId",void 0),e.__decorate([t.Column("varchar",{name:"name",length:100,nullable:!0}),e.__metadata("design:type",String)],exports.AssetProfile.prototype,"name",void 0),e.__decorate([t.Column("int",{name:"clientId"}),e.__metadata("design:type",Number)],exports.AssetProfile.prototype,"clientId",void 0),e.__decorate([t.OneToOne((()=>i.Device),{createForeignKeyConstraints:!1,nullable:!0}),t.JoinColumn(),e.__metadata("design:type",Object)],exports.AssetProfile.prototype,"device",void 0),e.__decorate([t.Column("smallint",{name:"assetProfileTypeId",nullable:!0}),e.__metadata("design:type",Number)],exports.AssetProfile.prototype,"assetProfileTypeId",void 0),e.__decorate([t.OneToOne((()=>s.AssetProfileType),{createForeignKeyConstraints:!1,nullable:!1}),t.JoinColumn(),e.__metadata("design:type",Object)],exports.AssetProfile.prototype,"assetProfileType",void 0),e.__decorate([t.Column("varchar",{name:"make",nullable:!0,length:50}),e.__metadata("design:type",String)],exports.AssetProfile.prototype,"make",void 0),e.__decorate([t.Column("varchar",{name:"model",nullable:!0,length:50}),e.__metadata("design:type",String)],exports.AssetProfile.prototype,"model",void 0),e.__decorate([t.Column("varchar",{name:"serialNumber",nullable:!0,length:512}),e.__metadata("design:type",String)],exports.AssetProfile.prototype,"serialNumber",void 0),e.__decorate([t.Column("smallint",{name:"year",nullable:!0}),e.__metadata("design:type",Number)],exports.AssetProfile.prototype,"year",void 0),e.__decorate([t.Column("varchar",{name:"status",length:50,default:()=>"'Active'"}),e.__metadata("design:type",String)],exports.AssetProfile.prototype,"status",void 0),e.__decorate([t.Column("datetime",{name:"createdAt",nullable:!0,default:()=>"CURRENT_TIMESTAMP"}),e.__metadata("design:type",Date)],exports.AssetProfile.prototype,"createdAt",void 0),e.__decorate([t.Column("datetime",{name:"modifiedAt",nullable:!0}),e.__metadata("design:type",Date)],exports.AssetProfile.prototype,"modifiedAt",void 0),e.__decorate([t.OneToMany((()=>a.AssetProfileMedia),(e=>e.assetProfile)),e.__metadata("design:type",Array)],exports.AssetProfile.prototype,"medias",void 0),e.__decorate([t.OneToMany((()=>r.AssetProfileNote),(e=>e.assetProfile)),e.__metadata("design:type",Array)],exports.AssetProfile.prototype,"notes",void 0),e.__decorate([t.OneToMany((()=>o.AssetProfileCustomField),(e=>e.assetProfile)),e.__metadata("design:type",Array)],exports.AssetProfile.prototype,"customFields",void 0),e.__decorate([t.Column("json",{name:"metadata",nullable:!0}),e.__metadata("design:type",Object)],exports.AssetProfile.prototype,"metadata",void 0),exports.AssetProfile=e.__decorate([t.Index("ix_clientId",["clientId"],{}),t.Index("ix_deviceId",["deviceId"],{unique:!0}),t.Entity("assetProfile",{schema:"nova"})],exports.AssetProfile);
|
|
@@ -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("
|
|
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"),
|
|
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;
|
package/dist/novaDataSource.js
CHANGED
|
@@ -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/
|
|
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 @@
|
|
|
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 a=t.trace.getActiveSpan()?.spanContext();if(a?.traceId&&a.spanId){const t=(a.traceFlags??0).toString(16).padStart(2,"0");n.traceparent=`00-${a.traceId}-${a.spanId}-${t}`}for(const[t,r]of Object.entries(e))n[t]=r;const c=Object.keys(n).sort();return 0===c.length?"":c.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.
|
|
3
|
+
"version": "1.4.228",
|
|
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:
|
|
1
|
+
-- nova-orm-schema-checksum: 7adf261a86308f3a0d0f30ca485a5db2
|
|
2
2
|
-- Nova ORM Schema Dump
|
|
3
|
-
-- Generated at: 2026-05-
|
|
3
|
+
-- Generated at: 2026-05-11T10:42:22.480Z
|
|
4
4
|
|
|
5
5
|
SET FOREIGN_KEY_CHECKS = 0;
|
|
6
6
|
|
|
@@ -281,6 +281,7 @@ CREATE TABLE `assetProfile` (
|
|
|
281
281
|
`status` varchar(50) NOT NULL DEFAULT 'Active',
|
|
282
282
|
`createdAt` datetime DEFAULT CURRENT_TIMESTAMP,
|
|
283
283
|
`modifiedAt` datetime DEFAULT NULL,
|
|
284
|
+
`metadata` json DEFAULT NULL,
|
|
284
285
|
PRIMARY KEY (`id`),
|
|
285
286
|
UNIQUE KEY `ix_deviceId` (`deviceId`),
|
|
286
287
|
KEY `ix_clientId` (`clientId`)
|
|
@@ -2435,9 +2436,7 @@ CREATE TABLE `position` (
|
|
|
2435
2436
|
`deleted` tinyint(1) DEFAULT '0',
|
|
2436
2437
|
PRIMARY KEY (`id`),
|
|
2437
2438
|
UNIQUE KEY `ixuPositionMessageId` (`messageId`),
|
|
2438
|
-
KEY `ixPositionClientId_Imei_ActualDate` (`clientId`,`imei`,`actualDate`)
|
|
2439
|
-
KEY `ixPositionClientId_ActualDate` (`clientId`,`actualDate`),
|
|
2440
|
-
KEY `ixPositionImei` (`imei`)
|
|
2439
|
+
KEY `ixPositionClientId_Imei_ActualDate` (`clientId`,`imei`,`actualDate`)
|
|
2441
2440
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
|
2442
2441
|
|
|
2443
2442
|
DROP TABLE IF EXISTS `promotion`;
|