@carlonicora/nestjs-neo4jsonapi 1.101.0 → 1.102.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.
@@ -1 +1 @@
1
- {"version":3,"file":"app.module.factory.d.ts","sourceRoot":"","sources":["../../src/bootstrap/app.module.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAmB7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAqIpE"}
1
+ {"version":3,"file":"app.module.factory.d.ts","sourceRoot":"","sources":["../../src/bootstrap/app.module.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAqB7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CA+IpE"}
@@ -42,6 +42,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
42
42
  exports.createAppModule = createAppModule;
43
43
  const common_1 = require("@nestjs/common");
44
44
  const config_1 = require("@nestjs/config");
45
+ const core_1 = require("@nestjs/core");
45
46
  const event_emitter_1 = require("@nestjs/event-emitter");
46
47
  const schedule_1 = require("@nestjs/schedule");
47
48
  const throttler_1 = require("@nestjs/throttler");
@@ -51,6 +52,7 @@ const nestjs_cls_1 = require("nestjs-cls");
51
52
  const nestjs_i18n_1 = require("nestjs-i18n");
52
53
  const path = __importStar(require("path"));
53
54
  const agents_modules_1 = require("../agents/agents.modules");
55
+ const custom_throttler_guard_1 = require("../common/guards/custom-throttler.guard");
54
56
  const config_2 = require("../config");
55
57
  const discord_module_1 = require("../foundations/discord/discord.module");
56
58
  const app_mode_module_1 = require("../core/appmode/app.mode.module");
@@ -81,6 +83,10 @@ function createAppModule(options) {
81
83
  // Get app config for extracting queue IDs (needed at module definition time)
82
84
  const appConfig = options.config ? options.config() : {};
83
85
  const queueIds = appConfig.chunkQueues?.queueIds ?? [];
86
+ // Whether to enforce global rate limiting (decided at module-definition time,
87
+ // like queueIds). The ThrottlerModule below always configures the limits; the
88
+ // APP_GUARD that actually enforces them is only registered when enabled.
89
+ const rateLimitEnabled = { ...config_2.baseConfig, ...appConfig }.rateLimit?.enabled ?? false;
84
90
  // Merge baseConfig with optional custom config
85
91
  const configLoader = options.config ? () => ({ ...config_2.baseConfig, ...appConfig }) : () => config_2.baseConfig;
86
92
  // Resolve i18n path - use absolute path or resolve from cwd
@@ -187,6 +193,11 @@ function createAppModule(options) {
187
193
  ],
188
194
  global: true,
189
195
  controllers: [],
196
+ providers: [
197
+ // Global rate-limit enforcement (adds X-RateLimit-* headers). Only
198
+ // registered when rateLimit.enabled — apps no longer wire this themselves.
199
+ ...(rateLimitEnabled ? [{ provide: core_1.APP_GUARD, useClass: custom_throttler_guard_1.CustomThrottlerGuard }] : []),
200
+ ],
190
201
  };
191
202
  }
192
203
  };
@@ -1 +1 @@
1
- {"version":3,"file":"app.module.factory.js","sourceRoot":"","sources":["../../src/bootstrap/app.module.factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.module.factory.js","sourceRoot":"","sources":["../../src/bootstrap/app.module.factory.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,0CA+IC;AAvLD,2CAA6D;AAC7D,2CAA6D;AAC7D,uCAAyC;AACzC,yDAA2D;AAC3D,+CAAkD;AAClD,iDAAoD;AACpD,2CAA+C;AAC/C,mCAAsC;AACtC,2CAAuC;AACvC,6CAAgG;AAChG,2CAA6B;AAE7B,6DAAwD;AACxD,oFAA+E;AAC/E,sCAA8G;AAC9G,0EAAsE;AACtE,qEAAgE;AAEhE,qDAAiD;AACjD,4EAAuE;AACvE,qEAAiE;AAGjE;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,eAAe,CAAC,OAAyB;;IAEvD,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;QACtB,MAAM,CAAC,OAAO,CAAC,UAAyB;YACtC,6EAA6E;YAC7E,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC;YAEvD,8EAA8E;YAC9E,8EAA8E;YAC9E,yEAAyE;YACzE,MAAM,gBAAgB,GAAI,EAAE,GAAG,mBAAU,EAAE,GAAG,SAAS,EAA0B,CAAC,SAAS,EAAE,OAAO,IAAI,KAAK,CAAC;YAE9G,+CAA+C;YAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,mBAAU,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,mBAAU,CAAC;YAEjG,4DAA4D;YAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI;gBACjC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;oBAClC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;oBACnB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBAClD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE1C,OAAO;gBACL,MAAM,EAAE,oBAAkB;gBAC1B,OAAO,EAAE;oBACP,iCAAiC;oBACjC,kCAAkB,CAAC,OAAO,EAAE;oBAE5B,yCAAyC;oBACzC,+BAAa,CAAC,OAAO,CAAC,UAAU,CAAC;oBAEjC,8BAA8B;oBAC9B,qBAAY,CAAC,OAAO,CAAC;wBACnB,IAAI,EAAE,CAAC,YAAY,CAAC;wBACpB,QAAQ,EAAE,IAAI;wBACd,KAAK,EAAE,IAAI;qBACZ,CAAC;oBAEF,kDAAkD;oBAClD,2BAAe,CAAC,YAAY,CAAC;wBAC3B,OAAO,EAAE,CAAC,qBAAY,CAAC;wBACvB,MAAM,EAAE,CAAC,sBAAa,CAAC;wBACvB,UAAU,EAAE,CAAC,MAA0C,EAAE,EAAE;4BACzD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAA2B,WAAW,CAAC,CAAC;4BACpE,OAAO;gCACL,UAAU,EAAE;oCACV,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE;oCAC/D,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE;iCAC7D;6BACF,CAAC;wBACJ,CAAC;qBACF,CAAC;oBAEF,0BAA0B;oBAC1B,sBAAS,CAAC,OAAO,CAAC;wBAChB,MAAM,EAAE,IAAI;wBACZ,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,iBAAiB,EAAE;qBACpD,CAAC;oBAEF,gCAAgC;oBAChC,wBAAU,CAAC,OAAO,CAAC;wBACjB,gBAAgB,EAAE,OAAO,CAAC,IAAI,EAAE,gBAAgB,IAAI,IAAI;wBACxD,OAAO,EAAE,KAAK;wBACd,aAAa,EAAE;4BACb,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,IAAI;yBACZ;wBACD,SAAS,EAAE;4BACT,EAAE,GAAG,EAAE,2BAAa,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE;4BACxD,IAAI,4BAAc,CAAC,CAAC,YAAY,CAAC,CAAC;4BAClC,oCAAsB;yBACvB;qBACF,CAAC;oBAEF,sDAAsD;oBACtD,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,yBAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAEhE,wCAAwC;oBACxC,wBAAU,CAAC,OAAO,CAAC;wBACjB,QAAQ;wBACR,eAAe,EAAE,OAAO,CAAC,eAAe;wBACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;qBAC3B,CAAC;oBAEF,qFAAqF;oBACrF,mFAAmF;oBACnF,4FAA4F;oBAC5F,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ;wBAC/B,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC;4BACE,uCAAiB,CAAC,OAAO,CAAC;gCACxB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;gCAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;gCAC1B,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,IAAI,EAAE;6BAC5C,CAAC;yBACH,CAAC;oBAEN,kEAAkE;oBAClE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,6BAAY,CAAC,CAAC;oBAEnD,iDAAiD;oBACjD,8BAAa;oBAEb,4FAA4F;oBAC5F,GAAG,OAAO,CAAC,UAAU;oBAErB,6DAA6D;oBAC7D,gFAAgF;oBAChF,GAAG,CAAC,UAAU,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;wBACxD,CAAC,CAAC;4BACE,qBAAY,CAAC,YAAY,CAAC;gCACxB,OAAO,EAAE,CAAC,qBAAY,CAAC;gCACvB,MAAM,EAAE,CAAC,sBAAa,CAAC;gCACvB,UAAU,EAAE,CAAC,MAA0C,EAAE,EAAE;oCACzD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAyB,SAAS,CAAC,CAAC;oCAC9D,OAAO;wCACL,KAAK,EAAE,OAAO,CAAC,KAAK;wCACpB,OAAO,EAAE;4CACP,8BAAiB,CAAC,MAAM;4CACxB,8BAAiB,CAAC,aAAa;4CAC/B,8BAAiB,CAAC,gBAAgB;yCACnC;wCACD,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;qCAC/D,CAAC;gCACJ,CAAC;6BACF,CAAC;4BACF,8BAAa;yBACd;wBACH,CAAC,CAAC,EAAE,CAAC;iBACR;gBACD,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,EAAE;gBACf,SAAS,EAAE;oBACT,mEAAmE;oBACnE,2EAA2E;oBAC3E,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAS,EAAE,QAAQ,EAAE,6CAAoB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBACtF;aACF,CAAC;QACJ,CAAC;KACF,CAAA;IA1IK,kBAAkB;QADvB,IAAA,eAAM,EAAC,EAAE,CAAC;OACL,kBAAkB,CA0IvB;IAED,OAAO,kBAAkB,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { ThrottlerGuard, ThrottlerRequest } from "@nestjs/throttler";
2
+ import { FastifyRequest } from "fastify";
3
+ /**
4
+ * Custom ThrottlerGuard that adds rate limit headers to responses.
5
+ *
6
+ * Headers added:
7
+ * - X-RateLimit-Limit: Maximum number of requests allowed in the time window
8
+ * - X-RateLimit-Remaining: Number of requests remaining in the current window
9
+ * - X-RateLimit-Reset: Unix timestamp when the rate limit window resets
10
+ *
11
+ * Registered as a global APP_GUARD by the bootstrap app module factory when
12
+ * `rateLimit.enabled` is true. Apps do not register it themselves.
13
+ */
14
+ export declare class CustomThrottlerGuard extends ThrottlerGuard {
15
+ protected getTracker(req: FastifyRequest): Promise<string>;
16
+ protected handleRequest(requestProps: ThrottlerRequest): Promise<boolean>;
17
+ }
18
+ //# sourceMappingURL=custom-throttler.guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-throttler.guard.d.ts","sourceRoot":"","sources":["../../../src/common/guards/custom-throttler.guard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,qBACa,oBAAqB,SAAQ,cAAc;cACtC,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;cAIhD,aAAa,CAAC,YAAY,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;CAyChF"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CustomThrottlerGuard = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const throttler_1 = require("@nestjs/throttler");
12
+ /**
13
+ * Custom ThrottlerGuard that adds rate limit headers to responses.
14
+ *
15
+ * Headers added:
16
+ * - X-RateLimit-Limit: Maximum number of requests allowed in the time window
17
+ * - X-RateLimit-Remaining: Number of requests remaining in the current window
18
+ * - X-RateLimit-Reset: Unix timestamp when the rate limit window resets
19
+ *
20
+ * Registered as a global APP_GUARD by the bootstrap app module factory when
21
+ * `rateLimit.enabled` is true. Apps do not register it themselves.
22
+ */
23
+ let CustomThrottlerGuard = class CustomThrottlerGuard extends throttler_1.ThrottlerGuard {
24
+ async getTracker(req) {
25
+ return req.ip;
26
+ }
27
+ async handleRequest(requestProps) {
28
+ const { context, limit, ttl, throttler, blockDuration, getTracker, generateKey } = requestProps;
29
+ const response = context.switchToHttp().getResponse();
30
+ const request = context.switchToHttp().getRequest();
31
+ const tracker = await getTracker(request, context);
32
+ const throttlerName = throttler.name || "default";
33
+ const key = generateKey(context, tracker, throttlerName);
34
+ const { totalHits, timeToExpire } = await this.storageService.increment(key, ttl, limit, blockDuration, throttlerName);
35
+ const remaining = Math.max(0, limit - totalHits);
36
+ const resetTime = Math.ceil(Date.now() / 1000) + Math.ceil(timeToExpire / 1000);
37
+ // Add rate limit headers to every response
38
+ response.header("X-RateLimit-Limit", String(limit));
39
+ response.header("X-RateLimit-Remaining", String(remaining));
40
+ response.header("X-RateLimit-Reset", String(resetTime));
41
+ if (totalHits > limit) {
42
+ await this.throwThrottlingException(context, {
43
+ totalHits,
44
+ timeToExpire,
45
+ isBlocked: totalHits > limit,
46
+ timeToBlockExpire: timeToExpire,
47
+ ttl,
48
+ limit,
49
+ key,
50
+ tracker,
51
+ });
52
+ }
53
+ return true;
54
+ }
55
+ };
56
+ exports.CustomThrottlerGuard = CustomThrottlerGuard;
57
+ exports.CustomThrottlerGuard = CustomThrottlerGuard = __decorate([
58
+ (0, common_1.Injectable)()
59
+ ], CustomThrottlerGuard);
60
+ //# sourceMappingURL=custom-throttler.guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-throttler.guard.js","sourceRoot":"","sources":["../../../src/common/guards/custom-throttler.guard.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,iDAAqE;AAGrE;;;;;;;;;;GAUG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,0BAAc;IAC5C,KAAK,CAAC,UAAU,CAAC,GAAmB;QAC5C,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,YAA8B;QAC1D,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC;QAEhG,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,WAAW,EAAgB,CAAC;QACpE,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAkB,CAAC;QAEpE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC;QAClD,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QAEzD,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CACrE,GAAG,EACH,GAAG,EACH,KAAK,EACL,aAAa,EACb,aAAa,CACd,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QAEhF,2CAA2C;QAC3C,QAAQ,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpD,QAAQ,CAAC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5D,QAAQ,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAExD,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE;gBAC3C,SAAS;gBACT,YAAY;gBACZ,SAAS,EAAE,SAAS,GAAG,KAAK;gBAC5B,iBAAiB,EAAE,YAAY;gBAC/B,GAAG;gBACH,KAAK;gBACL,GAAG;gBACH,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA9CY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;GACA,oBAAoB,CA8ChC"}
@@ -1,3 +1,4 @@
1
+ export * from "./custom-throttler.guard";
1
2
  export * from "./jwt.auth.admin.guard";
2
3
  export * from "./jwt.auth.guard";
3
4
  export * from "./jwt.auth.optional.guard";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/guards/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/guards/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC"}
@@ -14,6 +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
+ __exportStar(require("./custom-throttler.guard"), exports);
17
18
  __exportStar(require("./jwt.auth.admin.guard"), exports);
18
19
  __exportStar(require("./jwt.auth.guard"), exports);
19
20
  __exportStar(require("./jwt.auth.optional.guard"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/guards/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,mDAAiC;AACjC,4DAA0C;AAC1C,uDAAqC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/guards/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,yDAAuC;AACvC,mDAAiC;AACjC,4DAA0C;AAC1C,uDAAqC"}
@@ -1,2 +1,3 @@
1
1
  export * from "./define-entity";
2
+ export * from "./neo4j-date";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC"}
@@ -15,4 +15,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./define-entity"), exports);
18
+ __exportStar(require("./neo4j-date"), exports);
18
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,+CAA6B"}
@@ -0,0 +1,24 @@
1
+ export type Neo4jTemporalType = "date" | "datetime";
2
+ /**
3
+ * Normalize a value for Neo4j's date() or datetime() constructor.
4
+ *
5
+ * Returns:
6
+ * type='date' → "YYYY-MM-DD" (time stripped)
7
+ * type='datetime' → "YYYY-MM-DDTHH:mm:ss.sssZ" (canonical ISO 8601 UTC)
8
+ * null → null (Cypher caller MUST branch
9
+ * with CASE WHEN IS NULL)
10
+ * undefined → undefined (field not being written)
11
+ *
12
+ * Accepts:
13
+ * Date — valid JS Date
14
+ * "YYYY-MM-DD" — date-only string
15
+ * "YYYY-MM-DDTHH:mm:ss[.sss][Z]" — ISO datetime (with or without ms/tz)
16
+ *
17
+ * Throws BadRequestException on NaN Date, unknown string shape, wrong type.
18
+ *
19
+ * UTC is used throughout — calendar dates must not drift across timezones.
20
+ * Use at the repository boundary together with `date(left($v, 10))` (calendar
21
+ * dates) or `datetime($v)` (point-in-time) in Cypher.
22
+ */
23
+ export declare function normalizeNeo4jTemporal(value: Date | string | null | undefined, type: Neo4jTemporalType): string | null | undefined;
24
+ //# sourceMappingURL=neo4j-date.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neo4j-date.d.ts","sourceRoot":"","sources":["../../../src/common/helpers/neo4j-date.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,UAAU,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACvC,IAAI,EAAE,iBAAiB,GACtB,MAAM,GAAG,IAAI,GAAG,SAAS,CA0B3B"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeNeo4jTemporal = normalizeNeo4jTemporal;
4
+ const common_1 = require("@nestjs/common");
5
+ /**
6
+ * Normalize a value for Neo4j's date() or datetime() constructor.
7
+ *
8
+ * Returns:
9
+ * type='date' → "YYYY-MM-DD" (time stripped)
10
+ * type='datetime' → "YYYY-MM-DDTHH:mm:ss.sssZ" (canonical ISO 8601 UTC)
11
+ * null → null (Cypher caller MUST branch
12
+ * with CASE WHEN IS NULL)
13
+ * undefined → undefined (field not being written)
14
+ *
15
+ * Accepts:
16
+ * Date — valid JS Date
17
+ * "YYYY-MM-DD" — date-only string
18
+ * "YYYY-MM-DDTHH:mm:ss[.sss][Z]" — ISO datetime (with or without ms/tz)
19
+ *
20
+ * Throws BadRequestException on NaN Date, unknown string shape, wrong type.
21
+ *
22
+ * UTC is used throughout — calendar dates must not drift across timezones.
23
+ * Use at the repository boundary together with `date(left($v, 10))` (calendar
24
+ * dates) or `datetime($v)` (point-in-time) in Cypher.
25
+ */
26
+ function normalizeNeo4jTemporal(value, type) {
27
+ if (value === undefined)
28
+ return undefined;
29
+ if (value === null)
30
+ return null;
31
+ if (value instanceof Date) {
32
+ if (Number.isNaN(value.getTime())) {
33
+ throw new common_1.BadRequestException("Invalid Date value");
34
+ }
35
+ return type === "datetime" ? value.toISOString() : formatDateOnlyUTC(value);
36
+ }
37
+ if (typeof value === "string") {
38
+ if (/^\d{4}-\d{2}-\d{2}$/.test(value)) {
39
+ return type === "datetime" ? new Date(`${value}T00:00:00.000Z`).toISOString() : value;
40
+ }
41
+ if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(value)) {
42
+ const parsed = new Date(value);
43
+ if (Number.isNaN(parsed.getTime())) {
44
+ throw new common_1.BadRequestException(`Invalid ISO datetime: ${value}`);
45
+ }
46
+ return type === "datetime" ? parsed.toISOString() : formatDateOnlyUTC(parsed);
47
+ }
48
+ throw new common_1.BadRequestException(`Unrecognized date/datetime string: ${value}`);
49
+ }
50
+ throw new common_1.BadRequestException(`Unsupported temporal value type: ${typeof value}`);
51
+ }
52
+ function formatDateOnlyUTC(d) {
53
+ const y = d.getUTCFullYear();
54
+ const m = String(d.getUTCMonth() + 1).padStart(2, "0");
55
+ const day = String(d.getUTCDate()).padStart(2, "0");
56
+ return `${y}-${m}-${day}`;
57
+ }
58
+ //# sourceMappingURL=neo4j-date.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neo4j-date.js","sourceRoot":"","sources":["../../../src/common/helpers/neo4j-date.ts"],"names":[],"mappings":";;AAyBA,wDA6BC;AAtDD,2CAAqD;AAIrD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,sBAAsB,CACpC,KAAuC,EACvC,IAAuB;IAEvB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEhC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,4BAAmB,CAAC,oBAAoB,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACxF,CAAC;QACD,IAAI,sCAAsC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACvD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,4BAAmB,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,IAAI,4BAAmB,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,IAAI,4BAAmB,CAAC,oCAAoC,OAAO,KAAK,EAAE,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAO;IAChC,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;IAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;AAC5B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carlonicora/nestjs-neo4jsonapi",
3
- "version": "1.101.0",
3
+ "version": "1.102.0",
4
4
  "description": "NestJS foundation package with JSON:API, Neo4j, Redis, LangChain agents, and common utilities",
5
5
  "author": "Carlo Nicora",
6
6
  "license": "GPL-3.0-or-later",