| 357 | const MODEL_SUFFIX = /(?:Repository|Repo|Dao|DAO|Model|Mapper|Store|Collection|Table|Service|Entity|Manager)$/; |
| 358 | |
| 359 | function modelOf(segments: string[], args: string | null, receiverType: string | null): string | null { |
| 360 | const noThis = segments[0] === 'this' || segments[0] === 'self' ? segments.slice(1) : segments; |
| 361 | const first = noThis[0] ?? ''; |
| 362 | const secondLast = noThis.length >= 3 ? noThis[noThis.length - 2]! : ''; |
| 363 | // `prisma.user.create`, `db.users.insert`, `_context.TodoItems.Add`, `this.prisma.user.findMany`. |
| 364 | if (noThis.length >= 3 && /^[A-Za-z_$][\w$]*$/.test(secondLast) && !/^(?:objects|query|session|db|\$|from|table|collection|opsForValue|Items)$/.test(secondLast) && !MODEL_SUFFIX.test(secondLast) && secondLast !== '$transaction') { |
| 365 | if (/^(?:prisma|db|database|orm|em|drizzle|sql|_context|context|dbContext|_db|ctx|this)$/i.test(first) || /(?:Context|Client|Prisma|Db|DB)$/.test(first)) return secondLast; |
| 366 | } |
| 367 | // `usersRepository.save`, `_orderRepository.AddAsync`, `userModel.find`, `ownerDao.get`. |
| 368 | const receiver = noThis.length >= 2 ? noThis[0]! : ''; |
| 369 | if (receiver && MODEL_SUFFIX.test(receiver) && !/^(?:this|self)$/.test(receiver)) { |
| 370 | const stem = receiver.replace(/^_+/, '').replace(MODEL_SUFFIX, ''); |
| 371 | if (stem) return stem; |
| 372 | } |
| 373 | // `User.objects.filter`, `User.query.get`, `User.find`, `Todo.query(on:)`, `User::find`. |
| 374 | if (noThis.length >= 2 && /^[A-Z][A-Za-z0-9]*$/.test(first) && !/^(?:DB|ActiveRecord|Files|File|Path|Base)$/.test(first)) return first; |
| 375 | // Spring: `owners.save` where `owners` is an `OwnerRepository`. |
| 376 | if (receiverType) { |
| 377 | const stem = receiverType.replace(/<[^>]*>/g, '').replace(/^I(?=[A-Z])/, '').replace(MODEL_SUFFIX, ''); |
| 378 | if (stem && stem !== receiverType && /^[A-Z]/.test(stem) && !/^(?:Entity|Db|Data|Jdbc|Mongo|Session|Async)$/.test(stem)) return stem; |
| 379 | } |
| 380 | // `knex('users')`, `db.from('users')`, `collection('todos')`, `sql.table('x')`. |
| 381 | if (args && /^(?:knex|db|collection|table|from|into|selectFrom|insertInto|updateTable|deleteFrom|sql\.table|query|getRepository|getCollection|model)$/i.test(noThis[noThis.length - 1] ?? '')) { |
| 382 | const m = /^['"`]([\w.-]+)['"`]/.exec(args); |
| 383 | if (m) return m[1]!; |
| 384 | } |
| 385 | return null; |
| 386 | } |
| 387 | |
| 388 | // ============================================================================= |
| 389 | // Response status |