@nestledjs/api 2.3.0 → 2.5.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.
package/CLAUDE.md ADDED
@@ -0,0 +1,18 @@
1
+ <claude-mem-context>
2
+ # Recent Activity
3
+
4
+ <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
+
6
+ ### Feb 4, 2026
7
+
8
+ | ID | Time | T | Title | Read |
9
+ |----|------|---|-------|------|
10
+ | #272 | 6:22 PM | ✅ | API Generator Upgraded to Prisma Internals v7.3.0 | ~280 |
11
+ | #257 | 6:20 PM | ✅ | Version Bump to API 2.1.0 and Generators 0.2.15 | ~308 |
12
+ | #219 | 4:17 PM | ✅ | Package Versions Released with Dependency Updates | ~367 |
13
+ | #191 | 3:55 PM | ✅ | API Generator Package Upgraded to Prisma v7.3.0 | ~317 |
14
+ | #179 | 3:29 PM | ✅ | API Generator Package Updated to Prisma v7 | ~315 |
15
+ | #150 | 3:20 PM | ⚖️ | Prisma v7 Migration Strategy for Nestled Generator Framework | ~584 |
16
+ | #73 | 2:24 PM | 🔵 | API Generator Commands Mapped | ~367 |
17
+ | #69 | 2:23 PM | 🔵 | API Generator Package Dependencies | ~312 |
18
+ </claude-mem-context>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nestledjs/api",
3
- "version": "2.3.0",
3
+ "version": "2.5.0",
4
4
  "generators": "./generators.json",
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -1,9 +1,7 @@
1
1
  import { Module } from '@nestjs/common'
2
- import { ApiCoreDataAccessModule } from '@<%= npmScope %>/api/core/data-access'
3
2
  import { ApiAccountDataAccessService } from './api-account-data-access.service'
4
3
 
5
4
  @Module({
6
- imports: [ApiCoreDataAccessModule],
7
5
  providers: [ApiAccountDataAccessService],
8
6
  exports: [ApiAccountDataAccessService],
9
7
  })
@@ -23,12 +23,9 @@ module.exports = {
23
23
  {
24
24
  test: /\.ts$/,
25
25
  use: 'ts-loader',
26
- exclude: [
27
- /node_modules/,
28
- path.resolve(__dirname, '../../libs/api/prisma/src/lib/prisma-generated')
29
- ],
26
+ // Prisma v7 generates TypeScript files that need to be compiled
27
+ exclude: /node_modules/,
30
28
  },
31
-
32
29
  ],
33
30
  },
34
31
  externals: [
@@ -36,19 +33,23 @@ module.exports = {
36
33
  allowlist: [
37
34
  /^@<%= npmScope %>\/api/, // allow your own libs
38
35
  ],
39
- // Manually exclude Prisma internals if needed
40
- function ({ request }, callback) {
41
- if (request && request.includes('@prisma/client')) {
42
- return callback(null, 'commonjs @prisma/client')
43
- }
44
- if (request && request.includes('.prisma/client')) {
45
- return callback(null, 'commonjs .prisma/client')
46
- }
47
- if (request && request === '@<%= npmScope %>/api/prisma') {
48
- return callback(null, 'commonjs @<%= npmScope %>/api/prisma')
49
- }
50
- callback()
36
+ }),
37
+ // Externalize Prisma packages for v7 compatibility
38
+ function ({ request }, callback) {
39
+ if (request && request.includes('@prisma/client')) {
40
+ return callback(null, 'commonjs ' + request)
41
+ }
42
+ if (request && request.includes('.prisma/client')) {
43
+ return callback(null, 'commonjs ' + request)
44
+ }
45
+ // Externalize Prisma adapter for v7 compatibility
46
+ if (request && (request === '@prisma/adapter-pg' || request.startsWith('@prisma/adapter-pg/'))) {
47
+ return callback(null, 'commonjs ' + request)
48
+ }
49
+ if (request && request === '@<%= npmScope %>/api/prisma') {
50
+ return callback(null, 'commonjs ' + request)
51
51
  }
52
- })
52
+ callback()
53
+ }
53
54
  ]
54
55
  };
@@ -0,0 +1,16 @@
1
+ <claude-mem-context>
2
+ # Recent Activity
3
+
4
+ <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
+
6
+ ### Feb 4, 2026
7
+
8
+ | ID | Time | T | Title | Read |
9
+ |----|------|---|-------|------|
10
+ | #212 | 4:17 PM | ✅ | Prisma v7 Decimal Type Handling Updated | ~318 |
11
+ | #208 | " | 🔴 | Seed Script Template Updated with Prisma v7 Adapter Pattern | ~384 |
12
+ | #209 | " | 🔵 | Core Generator Still References Prisma v6 Client Version | ~329 |
13
+ | #207 | 4:16 PM | 🔴 | Core Generator Prisma Client Version and Missing Decimal Dependencies Fixed | ~348 |
14
+ | #150 | 3:20 PM | ⚖️ | Prisma v7 Migration Strategy for Nestled Generator Framework | ~584 |
15
+ | #103 | 2:38 PM | 🔵 | Core Generator Installs Prisma Client v6 | ~292 |
16
+ </claude-mem-context>
@@ -0,0 +1,26 @@
1
+ <claude-mem-context>
2
+ # Recent Activity
3
+
4
+ <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
+
6
+ ### Feb 4, 2026
7
+
8
+ | ID | Time | T | Title | Read |
9
+ |----|------|---|-------|------|
10
+ | #329 | 7:40 PM | 🔄 | Extracted Adapter Creation into Separate Function | ~362 |
11
+ | #328 | " | 🟣 | PgBouncer Connection Pooling Support Added to Core Data Access Service | ~366 |
12
+ | #258 | 6:20 PM | ✅ | Core Data Access Service Template Enhanced with Query String Handling | ~364 |
13
+ | #254 | " | 🟣 | Core API Templates Enhanced with Production-Ready Patterns | ~452 |
14
+ | #249 | 6:19 PM | 🟣 | Enhanced Redis PubSub with Fallback and Multi-Provider Support | ~509 |
15
+ | #248 | " | ✅ | Core Data Access Module Made Global in NestJS | ~313 |
16
+ | #247 | 6:18 PM | 🔴 | Fixed Connection String Parameter Handling in Data Access Service | ~361 |
17
+ | #153 | 3:21 PM | 🔵 | Core Data Access Service Extends PrismaClient Directly | ~401 |
18
+
19
+ ### Feb 5, 2026
20
+
21
+ | ID | Time | T | Title | Read |
22
+ |----|------|---|-------|------|
23
+ | #493 | 10:32 AM | 🔄 | PgBouncer Adapter Logic Extracted to Helper Function | ~372 |
24
+ | #492 | " | 🔵 | Core Data Access Service Uses Prisma v7 Adapter Pattern | ~380 |
25
+ | #489 | " | 🔴 | Fixed PgBouncer Support and Enum Import Issues | ~417 |
26
+ </claude-mem-context>
@@ -46,6 +46,8 @@ function createRedisPubSub(): RedisPubSub | PubSub {
46
46
  rejectUnauthorized: false,
47
47
  },
48
48
  }),
49
+ // Force IPv6 for Railway private networking
50
+ family: 6,
49
51
  // Retry strategy to handle temporary connection issues
50
52
  retryStrategy: (times: number) => {
51
53
  if (times > 3) {
@@ -0,0 +1,12 @@
1
+ <claude-mem-context>
2
+ # Recent Activity
3
+
4
+ <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
+
6
+ ### Feb 4, 2026
7
+
8
+ | ID | Time | T | Title | Read |
9
+ |----|------|---|-------|------|
10
+ | #254 | 6:20 PM | 🟣 | Core API Templates Enhanced with Production-Ready Patterns | ~452 |
11
+ | #251 | 6:19 PM | 🟣 | Added CSRF Protection to Apollo Server Configuration | ~385 |
12
+ </claude-mem-context>
@@ -9,6 +9,7 @@ import { ApiCoreFeatureController } from './api-core-feature.controller'
9
9
  import { ApiCoreFeatureResolver } from './api-core-feature.resolver'
10
10
  import { ApiCoreFeatureService } from './api-core-feature.service'
11
11
  import { ComplexityPlugin } from './plugins/complexity.plugin'
12
+ import { NoCachePlugin } from './plugins/no-cache.plugin'
12
13
 
13
14
  interface ConnectionParameters {
14
15
  headers?: Record<string, string>
@@ -40,7 +41,7 @@ const redisPubSubProvider = {
40
41
  const cookies = rawHeaders[i + 1].split(';')
41
42
  for (const cookie of cookies) {
42
43
  const [name, value] = cookie.trim().split('=')
43
- if (name === '__session') {
44
+ if (name === '<%= cookieName %>') {
44
45
  token = value
45
46
  break
46
47
  }
@@ -75,7 +76,7 @@ const redisPubSubProvider = {
75
76
  }),
76
77
  ],
77
78
  controllers: [ApiCoreFeatureController],
78
- providers: [ApiCoreFeatureResolver, ApiCoreFeatureService, ComplexityPlugin, redisPubSubProvider],
79
- exports: [ApiCoreFeatureService, ComplexityPlugin, 'REDIS_PUB_SUB'],
79
+ providers: [ApiCoreFeatureResolver, ApiCoreFeatureService, ComplexityPlugin, NoCachePlugin, redisPubSubProvider],
80
+ exports: [ApiCoreFeatureService, ComplexityPlugin, NoCachePlugin, 'REDIS_PUB_SUB'],
80
81
  })
81
82
  export class ApiCoreFeatureModule {}
@@ -0,0 +1,55 @@
1
+ import { ApolloServerPlugin, GraphQLRequestListener } from '@apollo/server'
2
+ import { Plugin } from '@nestjs/apollo'
3
+ import { Injectable } from '@nestjs/common'
4
+
5
+ const NO_CACHE_HEADERS = {
6
+ 'Cache-Control': 'no-store, no-cache, must-revalidate, private',
7
+ Pragma: 'no-cache',
8
+ Expires: '0',
9
+ } as const
10
+
11
+ /**
12
+ * Apollo Server plugin to add no-cache headers to all GraphQL responses.
13
+ * Prevents CDNs, proxies, and browsers from caching GraphQL responses
14
+ * which could lead to stale user data.
15
+ *
16
+ * Configurable via GRAPHQL_NO_CACHE_HEADERS environment variable (defaults to true).
17
+ */
18
+ @Injectable()
19
+ @Plugin()
20
+ export class NoCachePlugin implements ApolloServerPlugin {
21
+ private readonly enabled: boolean
22
+
23
+ constructor() {
24
+ this.enabled = process.env['GRAPHQL_NO_CACHE_HEADERS'] !== 'false'
25
+ }
26
+
27
+ async requestDidStart(): Promise<GraphQLRequestListener<any>> {
28
+ const enabled = this.enabled
29
+
30
+ return {
31
+ async willSendResponse(requestContext) {
32
+ if (!enabled) {
33
+ return
34
+ }
35
+
36
+ const { response, contextValue } = requestContext
37
+
38
+ // Set headers via Express response object
39
+ if (contextValue?.res) {
40
+ const res = contextValue.res
41
+ for (const [key, value] of Object.entries(NO_CACHE_HEADERS)) {
42
+ res.setHeader(key, value)
43
+ }
44
+ }
45
+
46
+ // Apollo Server 4+ response headers
47
+ if (response?.http?.headers) {
48
+ for (const [key, value] of Object.entries(NO_CACHE_HEADERS)) {
49
+ response.http.headers.set(key, value)
50
+ }
51
+ }
52
+ },
53
+ }
54
+ }
55
+ }
@@ -8,6 +8,7 @@ function generateLibraries(tree_1) {
8
8
  return tslib_1.__awaiter(this, arguments, void 0, function* (tree, options = {}) {
9
9
  const templateRootPath = (0, devkit_1.joinPathFragments)(__dirname, './files');
10
10
  const overwrite = options.overwrite === true;
11
+ const cookieName = options.cookieName || '__session';
11
12
  const dependencies = {
12
13
  'graphql-type-json': '^0.3.2',
13
14
  '@nestjs/graphql': '^13.2.0',
@@ -18,14 +19,14 @@ function generateLibraries(tree_1) {
18
19
  '@apollo/server': '^5.1.0',
19
20
  'graphql-fields': '^2.0.3',
20
21
  'decimal.js': '^10.4.3',
21
- 'prisma-graphql-type-decimal': '^3.0.0',
22
+ 'prisma-graphql-type-decimal': '^4.0.2',
22
23
  };
23
24
  const devDependencies = {
24
25
  '@types/graphql-fields': '^1.3.9',
25
26
  };
26
27
  yield (0, utils_1.installPlugins)(tree, dependencies, devDependencies);
27
- yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'core', overwrite }, templateRootPath, 'data-access');
28
- yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'core', overwrite }, templateRootPath, 'feature', true);
28
+ yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'core', overwrite }, templateRootPath, 'data-access', true);
29
+ yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'core', overwrite, cookieName }, templateRootPath, 'feature', true);
29
30
  yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'core', overwrite }, templateRootPath, 'models');
30
31
  yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'core', overwrite }, templateRootPath, 'helpers');
31
32
  yield (0, devkit_1.formatFiles)(tree);
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/core/generator.ts"],"names":[],"mappings":";;AAIA,oCAoCC;;AAxCD,uCAAyG;AACzG,4CAAsE;AAGtE,SAA8B,iBAAiB;iEAC7C,IAAU,EACV,UAAkC,EAAE;QAEpC,MAAM,gBAAgB,GAAG,IAAA,0BAAiB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAA;QAE5C,MAAM,YAAY,GAAG;YACnB,mBAAmB,EAAE,QAAQ;YAC7B,iBAAiB,EAAE,SAAS;YAC5B,gBAAgB,EAAE,SAAS;YAC3B,kBAAkB,EAAE,SAAS;YAC7B,eAAe,EAAE,QAAQ;YACzB,gBAAgB,EAAE,QAAQ;YAC1B,gBAAgB,EAAE,QAAQ;YAC1B,gBAAgB,EAAE,QAAQ;YAC1B,YAAY,EAAE,SAAS;YACvB,6BAA6B,EAAE,QAAQ;SACxC,CAAA;QAED,MAAM,eAAe,GAAG;YACtB,uBAAuB,EAAE,QAAQ;SAClC,CAAA;QAED,MAAM,IAAA,sBAAc,EAAC,IAAI,EAAE,YAAY,EAAE,eAAe,CAAC,CAAA;QAEzD,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAA;QAC7F,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;QAC/F,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAA;QACxF,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAA;QAEzF,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAA;QAEvB,OAAO,GAAG,EAAE;YACV,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAA;IACH,CAAC;CAAA"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/core/generator.ts"],"names":[],"mappings":";;AAIA,oCAqCC;;AAzCD,uCAAyG;AACzG,4CAAsE;AAGtE,SAA8B,iBAAiB;iEAC7C,IAAU,EACV,UAAkC,EAAE;QAEpC,MAAM,gBAAgB,GAAG,IAAA,0BAAiB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAA;QAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,WAAW,CAAA;QAEpD,MAAM,YAAY,GAAG;YACnB,mBAAmB,EAAE,QAAQ;YAC7B,iBAAiB,EAAE,SAAS;YAC5B,gBAAgB,EAAE,SAAS;YAC3B,kBAAkB,EAAE,SAAS;YAC7B,eAAe,EAAE,QAAQ;YACzB,gBAAgB,EAAE,QAAQ;YAC1B,gBAAgB,EAAE,QAAQ;YAC1B,gBAAgB,EAAE,QAAQ;YAC1B,YAAY,EAAE,SAAS;YACvB,6BAA6B,EAAE,QAAQ;SACxC,CAAA;QAED,MAAM,eAAe,GAAG;YACtB,uBAAuB,EAAE,QAAQ;SAClC,CAAA;QAED,MAAM,IAAA,sBAAc,EAAC,IAAI,EAAE,YAAY,EAAE,eAAe,CAAC,CAAA;QAEzD,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,aAAa,EAAE,IAAI,CAAC,CAAA;QACnG,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;QAC3G,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAA;QACxF,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAA;QAEzF,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAA;QAEvB,OAAO,GAAG,EAAE;YACV,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAA;IACH,CAAC;CAAA"}
@@ -1,3 +1,4 @@
1
1
  export interface ApiCoreGeneratorSchema {
2
2
  overwrite?: boolean
3
+ cookieName?: string
3
4
  }
@@ -8,6 +8,11 @@
8
8
  "type": "boolean",
9
9
  "description": "Whether to overwrite existing core libraries if they exist.",
10
10
  "default": false
11
+ },
12
+ "cookieName": {
13
+ "type": "string",
14
+ "description": "The name of the session cookie used for WebSocket authentication.",
15
+ "default": "__session"
11
16
  }
12
17
  }
13
18
  }
@@ -0,0 +1,11 @@
1
+ <claude-mem-context>
2
+ # Recent Activity
3
+
4
+ <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
+
6
+ ### Feb 4, 2026
7
+
8
+ | ID | Time | T | Title | Read |
9
+ |----|------|---|-------|------|
10
+ | #158 | 3:21 PM | 🔵 | CRUD Service Injects Core Data Access Service | ~342 |
11
+ </claude-mem-context>
@@ -1,10 +1,8 @@
1
1
  import { Module } from '@nestjs/common'
2
2
 
3
3
  import { ApiCrudDataAccessService } from './api-crud-data-access.service'
4
- import { ApiCoreDataAccessModule } from '@<%= npmScope %>/api/core/data-access'
5
4
 
6
5
  @Module({
7
- imports: [ApiCoreDataAccessModule],
8
6
  providers: [ApiCrudDataAccessService],
9
7
  exports: [ApiCrudDataAccessService],
10
8
  })
@@ -3,3 +3,13 @@ export * from './lib/prisma-generated/client'
3
3
 
4
4
  // Explicitly export Prisma namespace for better CI compatibility
5
5
  export { Prisma } from './lib/prisma-generated/client'
6
+
7
+ // Re-export commonly used Prisma utility types for direct import
8
+ // This fixes webpack resolution issues with Prisma.JsonValue etc.
9
+ import { Prisma as PrismaNamespace } from './lib/prisma-generated/client'
10
+ export type JsonValue = PrismaNamespace.JsonValue
11
+ export type JsonObject = PrismaNamespace.JsonObject
12
+ export type JsonArray = PrismaNamespace.JsonArray
13
+ export type InputJsonValue = PrismaNamespace.InputJsonValue
14
+ export type InputJsonObject = PrismaNamespace.InputJsonObject
15
+ export type InputJsonArray = PrismaNamespace.InputJsonArray
@@ -75,7 +75,7 @@ function apiSetupGenerator(tree) {
75
75
  'webpack-cli': '^6.0.1',
76
76
  'webpack-node-externals': '^3.0.0',
77
77
  'tsconfig-paths-webpack-plugin': '^4.2.0',
78
- 'prisma-graphql-type-decimal': '^3.0.1',
78
+ 'prisma-graphql-type-decimal': '^4.0.2',
79
79
  'graphql-type-json': '^0.3.2',
80
80
  });
81
81
  // Update pnpm-workspace.yaml with build dependencies
@@ -1,9 +1,7 @@
1
1
  import { Module } from '@nestjs/common'
2
2
  import { SmtpMailerService } from './api-smtp-mailer-data-access.service'
3
- import { ApiCoreFeatureModule } from '@<%= npmScope %>/api/core/feature'
4
3
 
5
4
  @Module({
6
- imports: [ApiCoreFeatureModule],
7
5
  providers: [SmtpMailerService],
8
6
  exports: [SmtpMailerService],
9
7
  })
@@ -1,9 +1,7 @@
1
1
  import { Module } from '@nestjs/common'
2
- import { ApiCoreDataAccessModule } from '@<%= npmScope %>/api/core/data-access'
3
2
  import { ApiUserDataAccessService } from './api-user-data-access.service'
4
3
 
5
4
  @Module({
6
- imports: [ApiCoreDataAccessModule],
7
5
  providers: [ApiUserDataAccessService],
8
6
  exports: [ApiUserDataAccessService],
9
7
  })