@carno.js/orm 0.2.10 → 1.0.0

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.
@@ -5,7 +5,7 @@ const core_1 = require("@carno.js/core");
5
5
  class ValueObject {
6
6
  constructor(value, skipValidation = false) {
7
7
  if (!skipValidation && (!this.validate(value) || !this.validateDatabase(value))) {
8
- throw new core_1.HttpException(`Invalid value for ${this.constructor.name}`, 400);
8
+ throw new core_1.HttpException(400, `Invalid value for ${this.constructor.name}`);
9
9
  }
10
10
  this.setValue(value);
11
11
  }
@@ -67,29 +67,29 @@ class ValueObject {
67
67
  validateDatabase(value) {
68
68
  if (typeof value === "string") {
69
69
  if (this.max !== undefined && value.length > this.max) {
70
- throw new core_1.HttpException(`Value exceeds maximum length of ${this.max}`, 400);
70
+ throw new core_1.HttpException(400, `Value exceeds maximum length of ${this.max}`);
71
71
  }
72
72
  if (this.min !== undefined && value.length < this.min) {
73
- throw new core_1.HttpException(`Value is less than minimum length of ${this.min}`, 400);
73
+ throw new core_1.HttpException(400, `Value is less than minimum length of ${this.min}`);
74
74
  }
75
75
  }
76
76
  else if (typeof value === "number") {
77
77
  if (this.max !== undefined && value > this.max) {
78
- throw new core_1.HttpException(`Value exceeds maximum value of ${this.max}`, 400);
78
+ throw new core_1.HttpException(400, `Value exceeds maximum value of ${this.max}`);
79
79
  }
80
80
  if (this.min !== undefined && value < this.min) {
81
- throw new core_1.HttpException(`Value is less than minimum value of ${this.min}`, 400);
81
+ throw new core_1.HttpException(400, `Value is less than minimum value of ${this.min}`);
82
82
  }
83
83
  if (this.precision !== undefined) {
84
84
  const totalDigits = value.toString().replace(".", "").length;
85
85
  if (totalDigits > this.precision) {
86
- throw new core_1.HttpException(`Value exceeds precision of ${this.precision}`, 400);
86
+ throw new core_1.HttpException(400, `Value exceeds precision of ${this.precision}`);
87
87
  }
88
88
  }
89
89
  if (this.scale !== undefined) {
90
90
  const decimalDigits = (value.toString().split(".")[1] || "").length;
91
91
  if (decimalDigits > this.scale) {
92
- throw new core_1.HttpException(`Value exceeds scale of ${this.scale}`, 400);
92
+ throw new core_1.HttpException(400, `Value exceeds scale of ${this.scale}`);
93
93
  }
94
94
  }
95
95
  }
package/dist/entry.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  import { Carno } from '@carno.js/core';
2
- export declare const CarnoOrm: Carno<import("@carno.js/core").ValidatorAdapterConstructor>;
2
+ export declare const CarnoOrm: Carno;
package/dist/entry.js CHANGED
@@ -8,6 +8,4 @@ const entities_1 = require("./domain/entities");
8
8
  const identity_map_middleware_1 = require("./middleware/identity-map.middleware");
9
9
  exports.CarnoOrm = new core_1.Carno({
10
10
  exports: [orm_1.Orm, orm_service_1.OrmService, entities_1.EntityStorage, identity_map_middleware_1.IdentityMapMiddleware],
11
- providers: [identity_map_middleware_1.IdentityMapMiddleware],
12
- globalMiddlewares: [identity_map_middleware_1.IdentityMapMiddleware],
13
11
  });
package/dist/index.d.ts CHANGED
@@ -26,3 +26,5 @@ export * from './repository/Repository';
26
26
  export { transactionContext } from './transaction/transaction-context';
27
27
  export { IdentityMapMiddleware } from './middleware/identity-map.middleware';
28
28
  export { identityMapContext } from './identity-map';
29
+ export type { Logger } from './logger';
30
+ export { createLogger, setLogger, resetLogger, setDebugEnabled, ConsoleLogger, SilentLogger } from './logger';
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.identityMapContext = exports.IdentityMapMiddleware = exports.transactionContext = exports.EntityStorage = void 0;
17
+ exports.SilentLogger = exports.ConsoleLogger = exports.setDebugEnabled = exports.resetLogger = exports.setLogger = exports.createLogger = exports.identityMapContext = exports.IdentityMapMiddleware = exports.transactionContext = exports.EntityStorage = void 0;
18
18
  __exportStar(require("./decorators/entity.decorator"), exports);
19
19
  __exportStar(require("./decorators/property.decorator"), exports);
20
20
  __exportStar(require("./decorators/primary-key.decorator"), exports);
@@ -46,3 +46,10 @@ var identity_map_middleware_1 = require("./middleware/identity-map.middleware");
46
46
  Object.defineProperty(exports, "IdentityMapMiddleware", { enumerable: true, get: function () { return identity_map_middleware_1.IdentityMapMiddleware; } });
47
47
  var identity_map_1 = require("./identity-map");
48
48
  Object.defineProperty(exports, "identityMapContext", { enumerable: true, get: function () { return identity_map_1.identityMapContext; } });
49
+ var logger_1 = require("./logger");
50
+ Object.defineProperty(exports, "createLogger", { enumerable: true, get: function () { return logger_1.createLogger; } });
51
+ Object.defineProperty(exports, "setLogger", { enumerable: true, get: function () { return logger_1.setLogger; } });
52
+ Object.defineProperty(exports, "resetLogger", { enumerable: true, get: function () { return logger_1.resetLogger; } });
53
+ Object.defineProperty(exports, "setDebugEnabled", { enumerable: true, get: function () { return logger_1.setDebugEnabled; } });
54
+ Object.defineProperty(exports, "ConsoleLogger", { enumerable: true, get: function () { return logger_1.ConsoleLogger; } });
55
+ Object.defineProperty(exports, "SilentLogger", { enumerable: true, get: function () { return logger_1.SilentLogger; } });
@@ -0,0 +1,11 @@
1
+ import type { Logger } from './logger.interface';
2
+ /**
3
+ * Console-based logger fallback.
4
+ * Used when @carno.js/logger is not installed.
5
+ */
6
+ export declare class ConsoleLogger implements Logger {
7
+ debug(message: string, data?: Record<string, any>): void;
8
+ info(message: string, data?: Record<string, any>): void;
9
+ warn(message: string, data?: Record<string, any>): void;
10
+ error(message: string, data?: Record<string, any>): void;
11
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConsoleLogger = void 0;
4
+ /**
5
+ * Console-based logger fallback.
6
+ * Used when @carno.js/logger is not installed.
7
+ */
8
+ class ConsoleLogger {
9
+ debug(message, data) {
10
+ console.debug(`[DEBUG] ${message}`, data ?? '');
11
+ }
12
+ info(message, data) {
13
+ console.info(`[INFO] ${message}`, data ?? '');
14
+ }
15
+ warn(message, data) {
16
+ console.warn(`[WARN] ${message}`, data ?? '');
17
+ }
18
+ error(message, data) {
19
+ console.error(`[ERROR] ${message}`, data ?? '');
20
+ }
21
+ }
22
+ exports.ConsoleLogger = ConsoleLogger;
@@ -0,0 +1,5 @@
1
+ import { createLogger, setLogger, resetLogger, setDebugEnabled } from './logger-factory';
2
+ import { ConsoleLogger } from './console-logger';
3
+ import { SilentLogger } from './silent-logger';
4
+ export { createLogger, setLogger, resetLogger, setDebugEnabled, ConsoleLogger, SilentLogger };
5
+ export type { Logger } from './logger.interface';
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SilentLogger = exports.ConsoleLogger = exports.setDebugEnabled = exports.resetLogger = exports.setLogger = exports.createLogger = void 0;
4
+ const logger_factory_1 = require("./logger-factory");
5
+ Object.defineProperty(exports, "createLogger", { enumerable: true, get: function () { return logger_factory_1.createLogger; } });
6
+ Object.defineProperty(exports, "setLogger", { enumerable: true, get: function () { return logger_factory_1.setLogger; } });
7
+ Object.defineProperty(exports, "resetLogger", { enumerable: true, get: function () { return logger_factory_1.resetLogger; } });
8
+ Object.defineProperty(exports, "setDebugEnabled", { enumerable: true, get: function () { return logger_factory_1.setDebugEnabled; } });
9
+ const console_logger_1 = require("./console-logger");
10
+ Object.defineProperty(exports, "ConsoleLogger", { enumerable: true, get: function () { return console_logger_1.ConsoleLogger; } });
11
+ const silent_logger_1 = require("./silent-logger");
12
+ Object.defineProperty(exports, "SilentLogger", { enumerable: true, get: function () { return silent_logger_1.SilentLogger; } });
@@ -0,0 +1,21 @@
1
+ import type { Logger } from './logger.interface';
2
+ /**
3
+ * Creates or returns a cached logger instance.
4
+ * Tries to use @carno.js/logger if available, falls back to console.
5
+ * Only logs if debug is enabled in config.
6
+ */
7
+ export declare function createLogger(): Logger;
8
+ /**
9
+ * Sets a custom logger instance.
10
+ * Useful for testing or custom implementations.
11
+ */
12
+ export declare function setLogger(logger: Logger): void;
13
+ /**
14
+ * Resets the cached logger.
15
+ * Useful for testing.
16
+ */
17
+ export declare function resetLogger(): void;
18
+ /**
19
+ * Enables or disables debug mode programmatically.
20
+ */
21
+ export declare function setDebugEnabled(enabled: boolean): void;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLogger = createLogger;
4
+ exports.setLogger = setLogger;
5
+ exports.resetLogger = resetLogger;
6
+ exports.setDebugEnabled = setDebugEnabled;
7
+ const console_logger_1 = require("./console-logger");
8
+ const silent_logger_1 = require("./silent-logger");
9
+ let cachedLogger = null;
10
+ let debugEnabled = null;
11
+ /**
12
+ * Creates or returns a cached logger instance.
13
+ * Tries to use @carno.js/logger if available, falls back to console.
14
+ * Only logs if debug is enabled in config.
15
+ */
16
+ function createLogger() {
17
+ if (cachedLogger) {
18
+ return cachedLogger;
19
+ }
20
+ if (!isDebugEnabled()) {
21
+ cachedLogger = new silent_logger_1.SilentLogger();
22
+ return cachedLogger;
23
+ }
24
+ cachedLogger = tryLoadCarnoLogger() ?? new console_logger_1.ConsoleLogger();
25
+ return cachedLogger;
26
+ }
27
+ function isDebugEnabled() {
28
+ if (debugEnabled !== null) {
29
+ return debugEnabled;
30
+ }
31
+ debugEnabled = loadDebugConfig();
32
+ return debugEnabled;
33
+ }
34
+ function loadDebugConfig() {
35
+ try {
36
+ const config = require(process.cwd() + '/carno.config');
37
+ return config?.debug === true || config?.default?.debug === true;
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ function tryLoadCarnoLogger() {
44
+ try {
45
+ const loggerModule = require('@carno.js/logger');
46
+ const LoggerService = loggerModule.LoggerService;
47
+ if (LoggerService) {
48
+ return new LoggerService({ level: 'DEBUG' });
49
+ }
50
+ }
51
+ catch {
52
+ // @carno.js/logger not installed
53
+ }
54
+ return null;
55
+ }
56
+ /**
57
+ * Sets a custom logger instance.
58
+ * Useful for testing or custom implementations.
59
+ */
60
+ function setLogger(logger) {
61
+ cachedLogger = logger;
62
+ }
63
+ /**
64
+ * Resets the cached logger.
65
+ * Useful for testing.
66
+ */
67
+ function resetLogger() {
68
+ cachedLogger = null;
69
+ debugEnabled = null;
70
+ }
71
+ /**
72
+ * Enables or disables debug mode programmatically.
73
+ */
74
+ function setDebugEnabled(enabled) {
75
+ debugEnabled = enabled;
76
+ cachedLogger = null;
77
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Logger interface for ORM.
3
+ * Abstracts logging to support both @carno.js/logger and console fallback.
4
+ */
5
+ export interface Logger {
6
+ debug(message: string, data?: Record<string, any>): void;
7
+ info(message: string, data?: Record<string, any>): void;
8
+ warn(message: string, data?: Record<string, any>): void;
9
+ error(message: string, data?: Record<string, any>): void;
10
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,11 @@
1
+ import type { Logger } from './logger.interface';
2
+ /**
3
+ * Silent logger that does nothing.
4
+ * Used when debug is disabled.
5
+ */
6
+ export declare class SilentLogger implements Logger {
7
+ debug(): void;
8
+ info(): void;
9
+ warn(): void;
10
+ error(): void;
11
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SilentLogger = void 0;
4
+ /**
5
+ * Silent logger that does nothing.
6
+ * Used when debug is disabled.
7
+ */
8
+ class SilentLogger {
9
+ debug() { }
10
+ info() { }
11
+ warn() { }
12
+ error() { }
13
+ }
14
+ exports.SilentLogger = SilentLogger;
@@ -1,4 +1,4 @@
1
- import { CarnoMiddleware, Context } from '@carno.js/core';
1
+ import { CarnoMiddleware, CarnoClosure, Context } from '@carno.js/core';
2
2
  export declare class IdentityMapMiddleware implements CarnoMiddleware {
3
- handle(ctx: Context, next: () => void): Promise<void>;
3
+ handle(ctx: Context, next: CarnoClosure): Promise<void>;
4
4
  }
@@ -18,5 +18,5 @@ let IdentityMapMiddleware = class IdentityMapMiddleware {
18
18
  };
19
19
  exports.IdentityMapMiddleware = IdentityMapMiddleware;
20
20
  exports.IdentityMapMiddleware = IdentityMapMiddleware = __decorate([
21
- (0, core_1.Injectable)()
21
+ (0, core_1.Service)()
22
22
  ], IdentityMapMiddleware);
package/dist/orm.d.ts CHANGED
@@ -1,15 +1,16 @@
1
1
  import { ConnectionSettings, DriverInterface } from './driver/driver.interface';
2
- import { LoggerService, CacheService } from '@carno.js/core';
2
+ import { CacheService } from '@carno.js/core';
3
3
  import { SqlBuilder } from './SqlBuilder';
4
4
  import { QueryCacheManager } from './cache/query-cache-manager';
5
+ import { type Logger } from './logger';
5
6
  export declare class Orm<T extends DriverInterface = DriverInterface> {
6
- logger: LoggerService;
7
7
  cacheService?: CacheService;
8
8
  driverInstance: T;
9
9
  static instance: Orm<any>;
10
10
  connection: ConnectionSettings<T>;
11
11
  queryCacheManager?: QueryCacheManager;
12
- constructor(logger: LoggerService, cacheService?: CacheService);
12
+ logger: Logger;
13
+ constructor(cacheService?: CacheService);
13
14
  private initializeQueryCacheManager;
14
15
  static getInstance(): Orm<any>;
15
16
  setConnection(connection: ConnectionSettings<T>): void;
package/dist/orm.js CHANGED
@@ -16,11 +16,12 @@ const SqlBuilder_1 = require("./SqlBuilder");
16
16
  const query_cache_manager_1 = require("./cache/query-cache-manager");
17
17
  const transaction_context_1 = require("./transaction/transaction-context");
18
18
  const orm_session_context_1 = require("./orm-session-context");
19
+ const logger_1 = require("./logger");
19
20
  const DEFAULT_MAX_KEYS_PER_TABLE = 10000;
20
21
  let Orm = Orm_1 = class Orm {
21
- constructor(logger, cacheService) {
22
- this.logger = logger;
22
+ constructor(cacheService) {
23
23
  this.cacheService = cacheService;
24
+ this.logger = (0, logger_1.createLogger)();
24
25
  Orm_1.instance = this;
25
26
  }
26
27
  initializeQueryCacheManager(cacheSettings) {
@@ -67,6 +68,5 @@ let Orm = Orm_1 = class Orm {
67
68
  exports.Orm = Orm;
68
69
  exports.Orm = Orm = Orm_1 = __decorate([
69
70
  (0, core_1.Service)(),
70
- __metadata("design:paramtypes", [core_1.LoggerService,
71
- core_1.CacheService])
71
+ __metadata("design:paramtypes", [core_1.CacheService])
72
72
  ], Orm);
@@ -3,7 +3,7 @@ import { EntityStorage, Options } from '../domain/entities';
3
3
  import { SqlConditionBuilder } from './sql-condition-builder';
4
4
  import { SqlColumnManager } from './sql-column-manager';
5
5
  import { ModelTransformer } from './model-transformer';
6
- import { LoggerService } from '@carno.js/core';
6
+ import type { Logger } from '../logger';
7
7
  export declare class SqlJoinManager<T> {
8
8
  private entityStorage;
9
9
  private statements;
@@ -16,7 +16,7 @@ export declare class SqlJoinManager<T> {
16
16
  private modelTransformer;
17
17
  private getOriginalColumnsCallback;
18
18
  private getAliasCallback;
19
- constructor(entityStorage: EntityStorage, statements: Statement<T>, entity: Options, model: new () => T, driver: DriverInterface, logger: LoggerService, conditionBuilder: SqlConditionBuilder<T>, columnManager: SqlColumnManager, modelTransformer: ModelTransformer, getOriginalColumnsCallback: () => string[], getAliasCallback: (tableName: string) => string);
19
+ constructor(entityStorage: EntityStorage, statements: Statement<T>, entity: Options, model: new () => T, driver: DriverInterface, logger: Logger, conditionBuilder: SqlConditionBuilder<T>, columnManager: SqlColumnManager, modelTransformer: ModelTransformer, getOriginalColumnsCallback: () => string[], getAliasCallback: (tableName: string) => string);
20
20
  addJoinForRelationshipPath(relationshipPath: string): void;
21
21
  applyJoin(relationShip: Relationship<any>, value: FilterQuery<any>, alias: string): string;
22
22
  handleSelectJoin(entities: any, models: any): Promise<void>;
@@ -1,7 +1,7 @@
1
- import { LoggerService } from '@carno.js/core';
2
1
  import { Orm } from '../orm';
3
2
  import { BunPgDriver } from '../driver/bun-pg.driver';
4
3
  import { ConnectionSettings } from '../driver/driver.interface';
4
+ import type { Logger } from '../logger';
5
5
  export type DatabaseTestContext = {
6
6
  orm: Orm<BunPgDriver>;
7
7
  executeSql: (sql: string) => Promise<{
@@ -11,7 +11,7 @@ export type DatabaseTestContext = {
11
11
  export type DatabaseTestOptions = {
12
12
  schema?: string;
13
13
  entityFile?: string;
14
- logger?: LoggerService;
14
+ logger?: Logger;
15
15
  connection?: Partial<ConnectionSettings<BunPgDriver>>;
16
16
  };
17
17
  type DatabaseTestRoutine = (context: DatabaseTestContext) => Promise<void>;
@@ -104,19 +104,11 @@ async function withDatabase(arg1, arg2, arg3) {
104
104
  });
105
105
  }
106
106
  async function createSession(options) {
107
- const logger = selectLogger(options);
108
- const orm = new orm_1.Orm(logger);
107
+ const orm = new orm_1.Orm();
109
108
  const storage = new entities_1.EntityStorage();
110
109
  await initializeOrm(orm, storage, options);
111
110
  return { orm, schema: options.schema ?? DEFAULT_SCHEMA, storage };
112
111
  }
113
- function selectLogger(options) {
114
- if (options.logger) {
115
- return options.logger;
116
- }
117
- const config = { applicationConfig: { logger: { level: 'info' } } };
118
- return new core_1.LoggerService(config);
119
- }
120
112
  async function initializeOrm(orm, storage, options) {
121
113
  if (options.entityFile) {
122
114
  const entityFiles = await (0, globby_1.default)(options.entityFile, { absolute: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carno.js/orm",
3
- "version": "0.2.10",
3
+ "version": "1.0.0",
4
4
  "description": "A simple ORM for Carno.js.",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",
@@ -37,7 +37,7 @@
37
37
  "uuid": "^9.0.1"
38
38
  },
39
39
  "peerDependencies": {
40
- "@carno.js/core": "^0.2.0"
40
+ "@carno.js/core": "^1.0.0"
41
41
  },
42
42
  "author": "",
43
43
  "license": "MIT",
@@ -55,5 +55,5 @@
55
55
  "bun",
56
56
  "value-object"
57
57
  ],
58
- "gitHead": "5c765c2c9172bec7f509ca2513f6c10472ec89eb"
58
+ "gitHead": "d2b000eeb352a03569b90d8eb2bf3557c00b741b"
59
59
  }