Skip to content

Conversation

@alumni
Copy link
Collaborator

@alumni alumni commented Jun 21, 2025

Description of change

Added rules from typescript-eslint's recommended type checked config.

Adjusted code to follow the new eslint rules.

Possibly fixes some issues, will try to add links if I discover any. Fixes #10370.

Pull-Request Checklist

  • Code is up-to-date with the master branch
  • This pull request links relevant issues as Fixes #00000
  • There are new or updated unit tests validating the change
  • Documentation has been updated to reflect this change

Summary by CodeRabbit

  • Refactor

    • Improved code clarity and consistency by converting many asynchronous functions and iterations to synchronous patterns where appropriate.
    • Enhanced type safety and code readability with updated type annotations and assertion styles.
    • Modernized test syntax and assertion methods for better maintainability.
    • Simplified internal asynchronous handling in database drivers and query runners for more straightforward execution flow.
    • Standardized event subscriber method signatures using rest parameters for clearer argument handling.
    • Reorganized MongoDB typings and BSON exports for cleaner module structure.
    • Refactored RegExp string transformer export for simpler usage.
    • Improved utility method typings and internal function signatures for better type safety and clarity.
  • Bug Fixes

    • Corrected improper use of asynchronous constructs in various areas, ensuring correct synchronous or asynchronous behavior.
  • Style

    • Updated variable declarations and assertion styles for improved code style and readability.
    • Added ESLint disable comments to suppress specific warnings and improved import ordering.
  • Chores

    • Upgraded development dependencies and adjusted package metadata.
    • Updated linting configuration for improved formatting and rule clarity.
    • Removed deprecated linting rules and added ESLint directives to suppress specific warnings.
  • Documentation

    • Improved in-code comments and disabled specific linting rules where necessary for clarity.
  • Tests

    • Refactored and enhanced test cases for better reliability, performance, and readability.
    • Consolidated and simplified test structures by replacing asynchronous promise aggregations with synchronous iterations.
    • Updated test assertions to use consistent styles and improved error specificity.
    • Improved connection lifecycle management in tests for better resource handling.

@alumni alumni requested a review from OSA413 June 21, 2025 13:04
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jun 21, 2025

## Walkthrough

This update refactors a wide range of files to improve type safety, modernize asynchronous handling, and enhance code clarity. Key changes include converting many asynchronous functions and test cases to synchronous patterns where appropriate, updating type annotations for improved precision, refining ESLint and package configurations, and cleaning up test assertions and import organization. No major runtime logic is altered.

## Changes

| Files/Groups                                                                                          | Change Summary                                                                                                    |
|-----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------|
| `eslint.config.mjs`, `package.json`                                                                 | Updated ESLint config for clarity and stricter rules; upgraded and fixed devDependencies and exports in package.  |
| `sample/sample*-entity/app.ts`                                                                       | Refactored from promise chains to `async/await` with improved error handling and resource cleanup.                |
| `src/cli.ts`, `src/query-builder/RelationLoader.ts`, `src/query-runner/QueryLock.ts`                 | Updated promise handling and added/suppressed ESLint directives for floating promises.                            |
| `src/connection/*`, `src/driver/*`, `src/entity-manager/MongoEntityManager.ts`                       | Refactored async methods to synchronous where possible; improved type annotations and removed unnecessary awaits. |
| `src/metadata/ColumnMetadata.ts`, `src/logger/FormattedConsoleLogger.ts`                             | Minor syntax cleanups and const/let usage improvements.                                                           |
| `src/persistence/SubjectExecutor.ts`, `src/util/ImportUtils.ts`, `src/util/OrmUtils.ts`              | Improved typings, refactored deep merge/clone logic, and simplified async handling.                               |
| `src/driver/mongodb/bson.typings.ts`, `src/driver/mongodb/typings.ts`                                | Removed internal BSON namespace exports; converted `AutoEncrypter` interface to class; cleaned imports/exports.   |
| `test/functional/*`, `test/github-issues/*`, `test/other-issues/*`, `test/unit/*`                    | Modernized test syntax, replaced `should` with `expect`, removed unnecessary async/await, improved assertions.    |
| `test/github-issues/1716/entity/mariadbEntity.ts`                                                   | Deleted unused MariaDB entity class.                                                                              |
| `test/utils/xfail.ts`                                                                                | Updated wrapper function to return correct async type.                                                            |
| `test/github-issues/3534/entity/RegExpStringTransformer.ts`                                         | Refactored namespace of RegExpStringTransformer to a constant object with methods.                                |
| Various test files                                                                                   | Replaced Promise.all with synchronous loops; removed redundant async/await; improved assertion styles and imports.|

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant TestRunner
    participant Connection
    participant Repository

    TestRunner->>Connection: getRepository(Entity) (sync)
    TestRunner->>Repository: perform operation (e.g., save, find)
    Repository-->>TestRunner: result (Promise or value)
    Note over TestRunner: Assertions performed with expect style
sequenceDiagram
    participant App
    participant DataSource

    App->>DataSource: initialize (await)
    alt Success
        App->>DataSource: perform operations (await)
        App->>DataSource: destroy (await)
    else Failure
        App->>App: Log error
    end
Loading

Possibly related PRs

  • chore: improve linting #11510: Updates ESLint configuration rules and dependencies related to linting, similar in purpose to this PR's ESLint updates but without overlapping code changes.

Suggested reviewers

  • gioboa

Poem

🐇 In code's vast field I hop and play,
Awaiting less, syncing the way.
Tests now dance with expect's bright cheer,
Async fades, clarity's near.
Lint rules sharpen, imports neat,
Rabbits code with nimble feet!
(✿◕‿◕) Hop along, all bugs retreat!


<!-- walkthrough_end -->
<!-- This is an auto-generated comment: all tool run failures by coderabbit.ai -->

> [!WARNING]
> There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.
> 
> <details>
> <summary>🔧 ESLint</summary>
> 
> > If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.
> 
> npm error Exit handler never called!
> npm error This is an error with npm itself. Please report this error at:
> npm error   <https://github.com/npm/cli/issues>
> npm error A complete log of this run can be found in: /.npm/_logs/2025-06-22T01_31_34_354Z-debug-0.log
> 
> 
> 
> </details>

<!-- end of auto-generated comment: all tool run failures by coderabbit.ai -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=typeorm/typeorm&utm_content=11540):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

@pkg-pr-new
Copy link

pkg-pr-new bot commented Jun 21, 2025

typeorm-sql-js-example

npm i https://pkg.pr.new/typeorm/typeorm@11540

commit: 3b8f7cd

@coveralls
Copy link

coveralls commented Jun 21, 2025

Coverage Status

coverage: 76.344% (-0.07%) from 76.418%
when pulling 3b8f7cd on alumni:stricter-typechecking
into abf8863 on typeorm:master.

@alumni alumni marked this pull request as ready for review June 21, 2025 13:43
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (2)
test/functional/columns/value-transformer/value-transformer.ts (2)

87-87: Verify that getRepository() is synchronous.

Similar to the previous occurrence, confirm that removing await from connection.getRepository() is correct.


106-106: Verify that getRepository() is synchronous.

Confirm that removing await from connection.getRepository() is correct for this occurrence as well.

🧹 Nitpick comments (8)
test/github-issues/1369/issue-1369.ts (1)

42-48: Consider adding null check for better test diagnostics.

While the direct assertion simplifies the code, removing the null check for foundEntity could make test failures less informative. If the entity lookup fails, the test will now throw a different error than intended.

Consider adding a null check for better test diagnostics:

const foundEntity = await connection.manager.findOne(
    ConcreteEntity,
    {
        where: { id: 1 },
    },
)
+expect(foundEntity).to.not.be.null
expect(foundEntity).to.deep.equal({
    // ... rest of assertion
})
test/github-issues/587/issue-587.ts (1)

22-41: Consider the performance impact of sequential execution.

The refactor from Promise.all to forEach changes the test execution from parallel to concurrent sequential execution. While functionally correct, this may slow down test execution since each connection could be tested independently in parallel.

Consider whether parallel execution is beneficial here, especially if this pattern differs from similar test files in the codebase.

test/github-issues/9318/issue-9318.ts (1)

27-36: Performance regression from parallel to sequential execution.

Similar to other test files in this PR, this changes from parallel (Promise.all) to sequential (forEach) execution. This pattern is inconsistent across the PR and may negatively impact test performance.

For independent connection tests, parallel execution is typically preferable. Consider maintaining consistency with the async execution pattern chosen for similar test files.

eslint.config.mjs (2)

60-65: Consider re-enabling unsafe rules gradually.

Multiple @typescript-eslint/no-unsafe-* rules are disabled, which reduces the benefit of the stricter type checking configuration. While this is understandable for a large codebase migration, consider creating a plan to gradually re-enable these rules to improve type safety.


75-75: Temporary exception should be tracked.

The @typescript-eslint/no-unnecessary-type-assertion rule is marked as a "temporary exception". Consider creating a tracking issue to re-enable this rule once the unnecessary type assertions are cleaned up.

Would you like me to help create a tracking issue or generate a script to identify unnecessary type assertions in the codebase?

test/github-issues/8832/issue-8832.ts (1)

175-201: Consider granularity trade-off in consolidated entity validation tests.

While consolidating the three entity validation tests into a single test improves efficiency, it reduces debugging granularity. If one entity validation fails, it may be harder to identify which specific entity caused the issue.

Consider adding descriptive error messages or splitting into separate it blocks if debugging becomes problematic in the future.

src/util/OrmUtils.ts (2)

118-131: Good modernization with rest parameters

Using generic rest parameters ...args: T[] instead of the arguments object improves type safety and code clarity.

Note: Static analysis flagged the use of this in the static context (line 131). While the current usage is functionally correct, consider using OrmUtils.compare2Objects for consistency with static method conventions.


557-567: Type safety improvements with minor style suggestions

The updated signature with DeepPartial<T> and explicit void return type improves type safety. Using Object.entries is more idiomatic than for...in loops.

Consider addressing the static analysis hints by replacing this with OrmUtils in static method calls (lines 562, 567) for better clarity:

-if (this.isPlainObject(target) && this.isPlainObject(source)) {
+if (OrmUtils.isPlainObject(target) && OrmUtils.isPlainObject(source)) {
-this.mergeObjectKey(target, key, value, memo)
+OrmUtils.mergeObjectKey(target, key, value, memo)
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f2d2236 and d3a4a87.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (89)
  • eslint.config.mjs (3 hunks)
  • package.json (5 hunks)
  • sample/sample1-simple-entity/app.ts (1 hunks)
  • sample/sample16-indexes/app.ts (1 hunks)
  • sample/sample17-versioning/app.ts (1 hunks)
  • src/cli.ts (2 hunks)
  • src/connection/ConnectionOptionsReader.ts (1 hunks)
  • src/connection/options-reader/ConnectionOptionsEnvReader.ts (1 hunks)
  • src/driver/aurora-mysql/AuroraMysqlQueryRunner.ts (1 hunks)
  • src/driver/better-sqlite3/BetterSqlite3Driver.ts (2 hunks)
  • src/driver/cordova/CordovaQueryRunner.ts (1 hunks)
  • src/driver/expo/legacy/ExpoLegacyQueryRunner.ts (1 hunks)
  • src/driver/mysql/MysqlQueryRunner.ts (1 hunks)
  • src/driver/nativescript/NativescriptQueryRunner.ts (1 hunks)
  • src/driver/react-native/ReactNativeQueryRunner.ts (1 hunks)
  • src/driver/sap/SapQueryRunner.ts (1 hunks)
  • src/driver/sqlite-abstract/AbstractSqliteDriver.ts (1 hunks)
  • src/driver/sqlite/SqliteDriver.ts (1 hunks)
  • src/entity-manager/MongoEntityManager.ts (3 hunks)
  • src/logger/FormattedConsoleLogger.ts (1 hunks)
  • src/metadata/ColumnMetadata.ts (1 hunks)
  • src/persistence/SubjectExecutor.ts (2 hunks)
  • src/query-builder/RelationLoader.ts (2 hunks)
  • src/query-builder/transformer/RawSqlResultsToEntityTransformer.ts (2 hunks)
  • src/query-runner/QueryLock.ts (2 hunks)
  • src/util/ImportUtils.ts (2 hunks)
  • src/util/OrmUtils.ts (8 hunks)
  • test/functional/columns/value-transformer/value-transformer.ts (2 hunks)
  • test/functional/connection/connection.ts (13 hunks)
  • test/functional/custom-repository/custom-repository.test.ts (1 hunks)
  • test/functional/query-builder/brackets/query-builder-brackets.ts (1 hunks)
  • test/functional/query-builder/cte/materialized-cte.ts (4 hunks)
  • test/functional/query-builder/not/query-builder-not.ts (2 hunks)
  • test/functional/query-builder/subquery/query-builder-subquery.ts (5 hunks)
  • test/functional/query-builder/time-travel-query/time-travel-query.ts (5 hunks)
  • test/functional/sql-tag/entity/PostgresExample.ts (1 hunks)
  • test/functional/table-inheritance/single-table/database-option-inherited/database-option-inherited.ts (1 hunks)
  • test/functional/tree-tables/closure-table/closure-table-mysql.ts (1 hunks)
  • test/github-issues/10569/issue-10569.ts (1 hunks)
  • test/github-issues/10626/issue-10626.ts (2 hunks)
  • test/github-issues/108/issue-108.ts (1 hunks)
  • test/github-issues/11085/issue-11085.ts (1 hunks)
  • test/github-issues/11085/subscriber/UserSubscriber.ts (1 hunks)
  • test/github-issues/11440/issue-11440.ts (3 hunks)
  • test/github-issues/1369/issue-1369.ts (1 hunks)
  • test/github-issues/1369/subscriber/AbstractEntitySubscriber.ts (1 hunks)
  • test/github-issues/1576/issue-1576.ts (1 hunks)
  • test/github-issues/1716/entity/mariadbEntity.ts (0 hunks)
  • test/github-issues/1716/issue-1716.ts (4 hunks)
  • test/github-issues/1805/issue-1805.ts (1 hunks)
  • test/github-issues/2216/issue-2216.ts (2 hunks)
  • test/github-issues/2518/issue-2518.ts (1 hunks)
  • test/github-issues/2965/index.ts (1 hunks)
  • test/github-issues/2984/issue-2984.ts (1 hunks)
  • test/github-issues/3118/issue-3118.ts (1 hunks)
  • test/github-issues/3158/issue-3158.ts (1 hunks)
  • test/github-issues/3256/subscriber/PostSubscriber.ts (1 hunks)
  • test/github-issues/3443/issue-3443.ts (1 hunks)
  • test/github-issues/3588/issue-3588.ts (1 hunks)
  • test/github-issues/3857/issue-3857.ts (2 hunks)
  • test/github-issues/4185/subscriber/ExtendedAfterLoadSubscriber.ts (1 hunks)
  • test/github-issues/4185/subscriber/SimpleAfterLoadSubscriber.ts (1 hunks)
  • test/github-issues/4220/issue-4220.ts (1 hunks)
  • test/github-issues/4842/issue-4842.ts (1 hunks)
  • test/github-issues/4958/issue-4958.ts (1 hunks)
  • test/github-issues/4980/issue-4980.ts (1 hunks)
  • test/github-issues/5067/issue-5067.ts (1 hunks)
  • test/github-issues/5119/issue-5119.ts (1 hunks)
  • test/github-issues/512/issue-512.ts (2 hunks)
  • test/github-issues/521/issue-521.ts (1 hunks)
  • test/github-issues/5444/issue-5444.ts (1 hunks)
  • test/github-issues/5704/subscriber/CategorySubscriber.ts (1 hunks)
  • test/github-issues/587/issue-587.ts (1 hunks)
  • test/github-issues/6168/issue-6168.ts (1 hunks)
  • test/github-issues/6977/issue-6977.ts (1 hunks)
  • test/github-issues/7203/issue-7203.ts (1 hunks)
  • test/github-issues/7932/issue-7932.ts (1 hunks)
  • test/github-issues/799/issue-799.ts (1 hunks)
  • test/github-issues/8026/issue-8026.ts (1 hunks)
  • test/github-issues/8408/delete-orphans.ts (2 hunks)
  • test/github-issues/8832/issue-8832.ts (6 hunks)
  • test/github-issues/8892/issue-8892.ts (1 hunks)
  • test/github-issues/8970/issue-8970.ts (1 hunks)
  • test/github-issues/9049/issue-9049.ts (1 hunks)
  • test/github-issues/9318/issue-9318.ts (1 hunks)
  • test/other-issues/mongodb-entity-change-in-listeners/entity/Post.ts (1 hunks)
  • test/other-issues/preventing-injection/preventing-injection.ts (1 hunks)
  • test/unit/util/orm-utils.ts (2 hunks)
  • test/utils/xfail.ts (1 hunks)
💤 Files with no reviewable changes (1)
  • test/github-issues/1716/entity/mariadbEntity.ts
🧰 Additional context used
🧬 Code Graph Analysis (23)
test/functional/query-builder/brackets/query-builder-brackets.ts (1)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
test/functional/table-inheritance/single-table/database-option-inherited/database-option-inherited.ts (1)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
src/connection/ConnectionOptionsReader.ts (1)
src/connection/options-reader/ConnectionOptionsEnvReader.ts (1)
  • ConnectionOptionsEnvReader (12-153)
test/functional/columns/value-transformer/value-transformer.ts (2)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
src/schema-builder/view/View.ts (1)
  • View (13-123)
test/github-issues/4958/issue-4958.ts (1)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
test/github-issues/2984/issue-2984.ts (1)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
test/github-issues/3118/issue-3118.ts (1)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
test/github-issues/4980/issue-4980.ts (1)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
test/github-issues/587/issue-587.ts (1)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
test/github-issues/108/issue-108.ts (2)
test/utils/test-utils.ts (1)
  • closeTestingConnections (487-495)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
test/unit/util/orm-utils.ts (1)
src/common/DeepPartial.ts (1)
  • DeepPartial (4-14)
test/functional/tree-tables/closure-table/closure-table-mysql.ts (1)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
test/github-issues/7203/issue-7203.ts (2)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
src/query-builder/QueryBuilder.ts (1)
  • comment (546-549)
test/github-issues/9318/issue-9318.ts (3)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
src/driver/postgres/PostgresDriver.ts (1)
  • PostgresDriver (35-1608)
src/driver/DriverUtils.ts (1)
  • DriverUtils (8-297)
test/other-issues/mongodb-entity-change-in-listeners/entity/Post.ts (1)
src/decorator/listeners/AfterLoad.ts (1)
  • AfterLoad (8-16)
test/github-issues/2216/issue-2216.ts (1)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
test/github-issues/10569/issue-10569.ts (1)
test/github-issues/10569/contract/create-user-contract.ts (1)
  • CreateUserContract (1-3)
test/github-issues/7932/issue-7932.ts (1)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
test/github-issues/6977/issue-6977.ts (1)
src/connection/ConnectionManager.ts (1)
  • connections (16-18)
test/github-issues/4185/subscriber/ExtendedAfterLoadSubscriber.ts (1)
src/subscriber/event/LoadEvent.ts (1)
  • LoadEvent (9-36)
test/github-issues/3256/subscriber/PostSubscriber.ts (1)
src/subscriber/event/UpdateEvent.ts (1)
  • UpdateEvent (12-58)
test/github-issues/1369/subscriber/AbstractEntitySubscriber.ts (1)
src/subscriber/event/UpdateEvent.ts (1)
  • UpdateEvent (12-58)
test/github-issues/1716/issue-1716.ts (1)
test/utils/test-utils.ts (3)
  • createTestingConnections (388-482)
  • reloadTestingDatabases (500-505)
  • closeTestingConnections (487-495)
🪛 Biome (1.9.4)
src/util/OrmUtils.ts

[error] 131-131: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 562-562: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 562-562: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 567-567: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)

🔇 Additional comments (130)
src/logger/FormattedConsoleLogger.ts (1)

28-28: Enforce immutability for loop variable
Switching to const in the for...of loop prevents accidental reassignments to message and aligns with the project's immutability conventions.

src/driver/mysql/MysqlQueryRunner.ts (1)

211-211: LGTM! Good optimization removing unnecessary async keyword.

The callback function doesn't use await anywhere and performs only synchronous operations (logging, error handling, result creation). This change reduces unnecessary overhead and improves code clarity while maintaining the same functionality.

src/driver/cordova/CordovaQueryRunner.ts (1)

64-64: Good improvement: Removed unnecessary async from Promise executor.

Promise executor functions should be synchronous unless they specifically need to await asynchronous operations. This change correctly removes the unnecessary async keyword, improving performance by avoiding redundant promise wrapping.

src/driver/react-native/ReactNativeQueryRunner.ts (1)

126-126: Correctly removed unnecessary async from error callback.

The error callback only performs synchronous operations (logging, broadcasting, and promise rejection), so the async keyword was unnecessary. This change improves performance and aligns with similar patterns in other driver implementations.

src/driver/expo/legacy/ExpoLegacyQueryRunner.ts (1)

226-226: Good practice: Using const for array that doesn't need reassignment.

This change correctly uses const instead of let since the array reference never changes, only its contents are modified. This prevents accidental reassignment and follows modern JavaScript/TypeScript best practices.

src/driver/nativescript/NativescriptQueryRunner.ts (1)

59-59: Proper removal of unnecessary async from Promise executor.

The Promise executor function only performs synchronous operations and doesn't require await, so removing the async keyword is correct and improves performance by avoiding unnecessary promise overhead.

src/driver/sqlite/SqliteDriver.ts (1)

217-219: Correctly changed from async to synchronous iteration.

The change properly replaces for await...of with for...of since Object.values() returns a regular array, not an async iterable. This improves performance while maintaining the correct async behavior for the actual asynchronous operations within the loop.

src/driver/sqlite-abstract/AbstractSqliteDriver.ts (1)

916-916: LGTM: Interface alignment for async consistency.

The change from synchronous to asynchronous method signature aligns the abstract interface with concrete SQLite driver implementations that require asynchronous database connection setup. This improves type safety across the SQLite driver hierarchy.

src/entity-manager/MongoEntityManager.ts (3)

1030-1030: LGTM: Performance optimization by removing unnecessary async wrapper.

Removing the async keyword is correct here since the function returns a promise directly without awaiting any intermediate operations. This eliminates unnecessary promise wrapping overhead.


1045-1045: LGTM: Consistent optimization pattern applied.

Same optimization as the toArray method - removing the unnecessary async keyword for a function that returns a promise directly.


1180-1180: LGTM: Type annotation improvement.

Removing the generic type parameter <Entity> from createEntityCursor allows TypeScript to infer the type correctly, improving type safety.

src/driver/better-sqlite3/BetterSqlite3Driver.ts (2)

158-158: LGTM: Proper async handling for database preparation.

Adding await ensures that any asynchronous database preparation completes before proceeding with the connection setup. This is essential for proper initialization order.


201-203: LGTM: Correct iteration pattern for synchronous values.

Changing from for await...of to for...of is correct since Object.values(this.attachedDatabases) returns a regular array, not an async iterable. The previous usage was unnecessary and potentially confusing.

src/metadata/ColumnMetadata.ts (1)

572-572: LGTM! Type safety improvement.

Removing the explicit : any return type annotation allows TypeScript to properly infer the return type, improving type safety and enabling better static analysis.

test/functional/sql-tag/entity/PostgresExample.ts (1)

29-29: Excellent type safety improvement.

Narrowing the type from any | null to string[] | null provides better type safety, clearer intent, and improved developer experience for this JSONB column storing string arrays.

test/functional/query-builder/time-travel-query/time-travel-query.ts (1)

35-35: Correct removal of unnecessary await keywords.

The getRepository() method returns synchronously, not a Promise, so these await keywords were unnecessary and incorrect. These fixes improve code accuracy and align with proper async/await usage patterns.

Also applies to: 67-67, 99-99, 151-152, 211-212

package.json (3)

23-25: LGTM! Proper exports field structure.

Moving the "types" entry inside the "node" field before "import" and "require" follows Node.js conventions and removes duplication.


154-154: Good addition of reflect-metadata devDependency.

Adding reflect-metadata as a devDependency is appropriate for TypeScript decorator support and aligns with the stricter type-checking improvements.


111-111: [web_search]

What TypeScript versions does [email protected] support?
test/github-issues/3158/issue-3158.ts (1)

10-10: Correct removal of unnecessary async keyword.

The describe callback doesn't perform async operations itself - the async work is properly handled in the lifecycle hooks. This change improves code clarity and follows testing best practices.

test/github-issues/3588/issue-3588.ts (1)

10-10: Good simplification of the test suite declaration.

Removing the async keyword is correct since the describe callback doesn't perform any asynchronous operations. All async setup and teardown is properly handled in the hooks.

test/github-issues/5119/issue-5119.ts (1)

65-65: Excellent improvement to resource cleanup.

Switching from synchronous close() to await dataSource.destroy() ensures proper asynchronous cleanup of database connections and prevents potential resource leaks. This aligns well with the PR's objective of improving event loop handling.

test/github-issues/8970/issue-8970.ts (1)

11-11: Proper removal of unnecessary async keyword.

The describe callback doesn't perform any asynchronous operations, so removing the async keyword improves clarity and correctness. All async operations are appropriately handled within the test functions.

test/github-issues/5444/issue-5444.ts (1)

10-10: Correct conversion to synchronous test function.

The test performs only synchronous operations (transformer creation, method calls, and assertions), so removing the async keyword is appropriate and improves type accuracy.

test/functional/custom-repository/custom-repository.test.ts (1)

43-45: Proper removal of unnecessary await.

The withRepository() method is synchronous, so removing the await keyword is correct and improves type safety. This change aligns with the stricter type-checking objectives of the PR.

test/github-issues/2965/index.ts (1)

29-30: LGTM: Correctly removed unnecessary await from synchronous create method.

The repository.create() method is synchronous and returns the entity instance directly, so removing the await keywords is the correct approach.

test/github-issues/8892/issue-8892.ts (1)

12-12: LGTM: Correctly removed unnecessary async from describe callback.

The describe callback doesn't perform any direct asynchronous operations, so removing the async keyword is appropriate. The async operations are properly contained within the individual test hooks.

test/github-issues/11085/issue-11085.ts (1)

29-29: LGTM: Correctly removed unnecessary await from synchronous getRepository method.

The connection.getRepository() method is synchronous and returns the repository instance directly, so removing the await keyword is the correct approach.

test/github-issues/1805/issue-1805.ts (1)

28-28: LGTM: Correctly removed unnecessary await from synchronous getRepository method.

The connection.getRepository() method is synchronous and returns the repository instance directly, so removing the await keyword is the correct approach.

test/github-issues/4220/issue-4220.ts (1)

50-50: LGTM: Correctly removed unnecessary await from synchronous getRepository method.

The connection.getRepository() method is synchronous and returns the repository instance directly, so removing the await keyword is the correct approach.

test/github-issues/11085/subscriber/UserSubscriber.ts (1)

9-9: LGTM: Correctly removed unnecessary await.

The getRepository() method is synchronous and returns a Repository instance directly, not a Promise. Removing the await keyword here is the correct fix and aligns with the stricter type-checking objectives.

test/github-issues/799/issue-799.ts (1)

16-20: Excellent improvement to resource cleanup.

The changes properly handle asynchronous cleanup with:

  • Optional chaining (?.) to safely check initialization status
  • Awaiting dataSource.destroy() for proper resource disposal
  • Converting to async function to handle the awaited cleanup

This prevents potential resource leaks and improves test reliability.

test/functional/table-inheritance/single-table/database-option-inherited/database-option-inherited.ts (1)

31-37: Good simplification of synchronous operations.

Converting from Promise.all with async mapping to a synchronous forEach loop is appropriate here since:

  • Entity metadata access is synchronous
  • No async operations are performed within the iteration
  • The test logic remains unchanged while reducing complexity

This aligns well with the PR's goal of improving event loop handling by eliminating unnecessary async patterns.

test/github-issues/6168/issue-6168.ts (2)

110-113: Good type assertion improvement.

Replacing type assertion (as Table) with definite assignment assertion (!) is more semantically correct here. The definite assignment assertion clearly indicates that we expect the table to exist after the find operation, while providing the same non-null guarantee.


115-115: Proper asynchronous resource cleanup.

Adding await to queryRunner.release() ensures the query runner is properly disposed of before the test continues. This prevents potential resource leaks and improves test reliability.

test/github-issues/10569/issue-10569.ts (1)

28-40: ```shell
#!/bin/bash

Locate EntityManager.ts and inspect the create() method signature

set -e
FILE=$(fd EntityManager.ts | head -n1)
echo "Inspecting: $FILE"
grep -n -A3 -B2 "create<" "$FILE"


</details>
<details>
<summary>test/github-issues/10626/issue-10626.ts (2)</summary>

`27-30`: **LGTM: Correctly removed unnecessary `await` for synchronous method.**

The removal of `await` before `dataSource.setOptions()` is appropriate since configuration setters are typically synchronous operations that modify internal state immediately.

---

`42-45`: **LGTM: Correctly removed unnecessary `await` for synchronous method.**

Consistent with the previous change, removing `await` from the second `setOptions()` call is correct for a synchronous configuration method.

</details>
<details>
<summary>test/github-issues/4958/issue-4958.ts (1)</summary>

`23-34`: **LGTM: Correctly converted async test to synchronous iteration.**

The conversion from `Promise.all` with async callbacks to a synchronous `for...of` loop is appropriate here since:

1. `QueryBuilder.getSql()` is a synchronous method that returns the built SQL string immediately
2. The test logic remains unchanged - it still tests SQL generation for each connection
3. Synchronous iteration is simpler and more readable for this use case

</details>
<details>
<summary>test/github-issues/5704/subscriber/CategorySubscriber.ts (1)</summary>

`10-12`: **LGTM: Correctly simplified synchronous lifecycle hook.**

The conversion of `afterLoad` from async to synchronous is appropriate since the method only performs a simple property assignment (`entity.addedProp = true`). TypeORM's lifecycle hooks support both synchronous and asynchronous implementations, and using the synchronous form is more efficient when no async operations are needed.

</details>
<details>
<summary>src/query-runner/QueryLock.ts (2)</summary>

`5-5`: **LGTM: Improved type precision for the release function.**

The type annotation refinement from `Function` to `() => void` provides better type safety and clarity about the expected signature of the release function.

---

`21-22`: **LGTM: Appropriate ESLint suppression for synchronous array operation.**

The ESLint disable comment for `@typescript-eslint/no-floating-promises` is correctly applied here since `Array.splice()` is a synchronous method that doesn't return a Promise. The linter may be incorrectly flagging this as a floating promise, so the suppression is justified.

</details>
<details>
<summary>src/connection/ConnectionOptionsReader.ts (1)</summary>

`141-141`: **LGTM! Correctly aligned with synchronous method signature.**

The removal of `await` is appropriate since `ConnectionOptionsEnvReader.read()` is now synchronous and returns `DataSourceOptions[]` directly rather than a Promise.

</details>
<details>
<summary>test/github-issues/4185/subscriber/SimpleAfterLoadSubscriber.ts (1)</summary>

`14-16`: **LGTM! Correctly simplified synchronous lifecycle method.**

Removing `async` is appropriate since the method only performs a synchronous property assignment without any asynchronous operations.

</details>
<details>
<summary>test/github-issues/2984/issue-2984.ts (1)</summary>

`21-31`: **LGTM! Appropriately simplified test to synchronous iteration.**

The conversion from `Promise.all` with async callbacks to a synchronous `forEach` loop is correct since the test only accesses synchronous properties (`entityMetadatas`) without performing any asynchronous operations.

</details>
<details>
<summary>test/functional/query-builder/cte/materialized-cte.ts (5)</summary>

`11-11`: **LGTM! Updated to use modern DataSource type.**

The import change from `Connection` to `DataSource` aligns with TypeORM's current API.

---

`14-14`: **LGTM! Type declaration updated consistently.**

The type change from `Connection[]` to `DataSource[]` is consistent with the import update.

---

`52-57`: **LGTM! Correctly removed unnecessary await.**

The `createQueryBuilder()` method is synchronous and returns a QueryBuilder instance immediately, so removing `await` is appropriate and improves performance.

---

`91-96`: **LGTM! Correctly removed unnecessary await.**

Consistent with the previous change, removing `await` from the synchronous `createQueryBuilder()` call is correct.

---

`129-134`: **LGTM! Correctly removed unnecessary await.**

Another correct removal of `await` from the synchronous `createQueryBuilder()` method call.

</details>
<details>
<summary>test/unit/util/orm-utils.ts (2)</summary>

`2-2`: **LGTM! Added import for improved type safety.**

Adding the `DeepPartial` import supports the explicit type annotations added to the test.

---

`125-131`: **LGTM! Enhanced type safety with explicit annotations.**

The explicit `DeepPartial<typeof c>` type annotations improve type safety by clearly indicating that `a` and `b` are partial versions of the complete object structure `c`. This aligns with the PR's goal of stricter type-checking.

</details>
<details>
<summary>test/functional/query-builder/not/query-builder-not.ts (1)</summary>

`27-27`: **LGTM: Correctly removed unnecessary `await` keywords**

The `getSql()` method returns a synchronous string, so removing the `await` keywords is the correct fix. This change aligns with the stricter type-checking objectives of the PR.




Also applies to: 53-53

</details>
<details>
<summary>test/functional/query-builder/brackets/query-builder-brackets.ts (1)</summary>

`24-67`: **LGTM: Appropriate refactoring from async to sync pattern**

The refactoring from `Promise.all` to a synchronous `for` loop is correct since this test only calls `getSql()`, which is synchronous. This simplifies the code and removes unnecessary async complexity while maintaining the same test logic.

</details>
<details>
<summary>test/utils/xfail.ts (1)</summary>

`12-12`: **LGTM: Improved type accuracy**

Changing the return type from `Func` to `AsyncFunc` is correct since the function returns `PromiseLike<any>` (line 13). This improves type safety and aligns with the stricter type-checking objectives.

</details>
<details>
<summary>src/query-builder/RelationLoader.ts (1)</summary>

`406-406`: **LGTM: Appropriate ESLint suppressions for lazy loading**

The ESLint suppressions for `no-floating-promises` are justified in this context. These are intentional fire-and-forget promises used in lazy loading scenarios where the promises populate entity data asynchronously in the background and don't require explicit awaiting or error handling at the call site.




Also applies to: 445-445

</details>
<details>
<summary>src/cli.ts (1)</summary>

`19-19`: **LGTM: Appropriate CLI argument parsing improvements**

The changes are well-suited for a CLI context:
- Using `.parse()` instead of `.argv` is more explicit about triggering argument parsing and command execution
- The ESLint suppression is justified since the top-level yargs promise doesn't need to be awaited in a CLI script - the process will naturally exit when the command completes




Also applies to: 42-42

</details>
<details>
<summary>test/functional/columns/value-transformer/value-transformer.ts (4)</summary>

`80-80`: **Good conversion to expect assertion style.**

The change from `should` to `expect` assertion style improves consistency across the test suite.

---

`97-99`: **Good conversion to expect assertion style.**

The multi-line expect assertion is properly formatted and consistent with the new assertion style.

---

`114-114`: **Good conversion to expect assertion style.**

The assertion style conversion is consistent and properly implemented.

---

`72-72`: **Verify that getRepository() is synchronous.**

The removal of `await` assumes that `connection.getRepository()` is a synchronous method. Please confirm this is correct.


```shell
#!/bin/bash
# Description: Verify that getRepository method is synchronous by checking its return type
ast-grep --pattern 'getRepository($_): $RETURN_TYPE {
  $$$
}'
test/github-issues/11440/issue-11440.ts (3)

24-24: Good refactoring to arrow function.

The conversion to an async arrow function that directly returns the Promise.all call simplifies the code structure.


108-108: Proper closing syntax for arrow function.

The closing syntax matches the arrow function structure introduced on line 24.


85-85: Verify SQL syntax correctness.

The removal of parentheses around the WHERE clause condition changes the SQL from WHERE ("Post"."title" IS DISTINCT FROM EXCLUDED."title") to WHERE "Post"."title" IS DISTINCT FROM EXCLUDED."title". Please confirm this is valid SQL syntax for the target databases.

Is the SQL syntax `WHERE "Post"."title" IS DISTINCT FROM EXCLUDED."title"` valid for PostgreSQL and CockroachDB without parentheses?
test/github-issues/4185/subscriber/ExtendedAfterLoadSubscriber.ts (1)

13-15: Verify that afterLoad can be synchronous.

The removal of async from the afterLoad method seems appropriate since it only performs synchronous property assignment. However, please confirm that the EntitySubscriberInterface allows synchronous afterLoad methods.

#!/bin/bash
# Description: Check the EntitySubscriberInterface definition for afterLoad method signature
ast-grep --pattern 'interface EntitySubscriberInterface<Entity> {
  $$$
  afterLoad?($_, $_): $RETURN_TYPE
  $$$
}'
test/github-issues/4980/issue-4980.ts (4)

23-32: Good refactoring from parallel to sequential execution.

The conversion from Promise.all with map to a synchronous forEach loop simplifies the code while preserving all assertion logic. The sequential execution pattern is appropriate since the operations on different connections are independent.


34-45: Consistent refactoring pattern.

The same beneficial conversion pattern applied to the second test case, maintaining all existing assertions while simplifying control flow.


47-67: Good preservation of Oracle-specific logic.

The refactoring correctly preserves the Oracle-specific conditional checks for onUpdate behavior while converting to the simpler synchronous loop pattern.


69-90: Complete and consistent refactoring.

The final test case follows the same pattern, maintaining all logic including Oracle-specific conditions while benefiting from the simplified synchronous execution.

test/github-issues/7203/issue-7203.ts (1)

21-30: I’ll search the codebase for where createQueryBuilder is defined to confirm its return type.

#!/bin/bash
# Search for the definition of createQueryBuilder to see if it's synchronous
rg -n "createQueryBuilder(" -C3 --type ts
test/functional/query-builder/subquery/query-builder-subquery.ts (1)

79-79: Excellent cleanup of unnecessary await keywords.

Correctly removes await from synchronous query builder creation operations. These methods return immediately and don't require async handling, improving code clarity and performance.

Also applies to: 164-164, 190-190, 220-220, 257-257

test/github-issues/4842/issue-4842.ts (1)

22-32: Good refactoring to remove unnecessary async complexity.

The conversion from Promise.all with async callbacks to a synchronous forEach is appropriate since all the operations (createQueryBuilder, distinct, disableEscaping, getSql, clone) are synchronous. This simplifies the test without changing its logic or assertions.

test/github-issues/521/issue-521.ts (1)

21-36: Appropriate simplification of test logic.

The refactoring from async Promise.all to synchronous forEach is correct since all query builder operations (createQueryBuilder, update, where, getQueryAndParameters) are synchronous. This improves test readability while maintaining the same assertions.

src/connection/options-reader/ConnectionOptionsEnvReader.ts (1)

20-20: Verify all callers have been updated for the API change.

The method signature change from async read(): Promise<DataSourceOptions[]> to read(): DataSourceOptions[] is appropriate since the method body was always synchronous - it only reads environment variables and constructs configuration objects. However, this is a breaking API change.

Please verify that all callers of ConnectionOptionsEnvReader.read() have been updated to remove await:

#!/bin/bash
# Search for calls to ConnectionOptionsEnvReader read method
rg -A 3 -B 3 "ConnectionOptionsEnvReader.*\.read\(\)"

# Also search for any remaining awaits on read()
rg -A 2 -B 2 "await.*\.read\(\)" --type ts
test/github-issues/5067/issue-5067.ts (1)

19-31: Let's broaden our search for createParameter definitions and async variants:

#!/bin/bash
# Find all occurrences of createParameter across the repo
rg "createParameter" -n

# Specifically look for async definitions
rg "async[[:space:]]+createParameter" -n
test/other-issues/mongodb-entity-change-in-listeners/entity/Post.ts (2)

22-24: Correct removal of unnecessary async keyword.

The beforeUpdate() method only performs a synchronous string concatenation (this.title += "!"), so removing the async keyword is appropriate and aligns with TypeORM's lifecycle hook patterns.


29-31: Good simplification of lifecycle hook.

The afterLoad() method only sets a boolean property synchronousl (this.loaded = true), so removing the async keyword is correct. The @AfterLoad decorator expects synchronous methods for simple property updates like this.

test/other-issues/preventing-injection/preventing-injection.ts (2)

114-128: LGTM! Appropriate refactoring from async to sync.

The QueryBuilder methods .take() and .skip() throw errors synchronously when given invalid input, making the change from Promise.all with async iteration to synchronous forEach appropriate and more readable.


130-144: LGTM! Consistent refactoring pattern.

The QueryBuilder .orderBy() method also throws errors synchronously for invalid input, making this refactoring consistent with the previous test case and improving code clarity.

test/github-issues/3118/issue-3118.ts (1)

158-178: LGTM! Correct refactoring and improved assertion style.

The metadata access operations (connection.driver.maxAliasLength and connection.entityMetadatas) are synchronous, making the refactoring appropriate. The assertion change from .to.be.true to .to.equal(true) is also an improvement for clarity.

test/github-issues/3443/issue-3443.ts (1)

23-42: LGTM! Appropriate conversion to synchronous iteration.

The dataSource.getMetadata() method and metadata property access are synchronous operations, making the refactoring from async Promise.all to synchronous forEach correct and more readable.

test/github-issues/108/issue-108.ts (2)

17-17: LGTM! Appropriate test setup for explicit synchronization testing.

Adding driverSpecific: { synchronize: false } is correct since this test explicitly calls and verifies the connection.synchronize() method. Disabling automatic synchronization ensures the test has full control over when synchronization occurs.


22-22: LGTM! Typo fix and improved test assertion.

Fixed the typo "unqiue" → "unique" and improved the test by explicitly verifying that connection.synchronize() completes successfully using .to.eventually.be.fulfilled. This makes the test more meaningful and explicit about what it's testing.

Also applies to: 25-26

test/functional/tree-tables/closure-table/closure-table-mysql.ts (3)

25-54: LGTM! Appropriate refactoring for synchronous metadata operations.

The test only performs synchronous metadata access operations (accessing dataSource.entityMetadatas and column properties), making the conversion from async Promise.all to synchronous forEach correct and more readable.


56-94: LGTM! Consistent refactoring pattern.

Like the previous test, this only performs synchronous metadata access operations for testing column properties (zerofill, width, precision, scale), making the async-to-sync refactoring appropriate.


96-131: LGTM! Final consistent refactoring in the pattern.

This test case follows the same pattern as the others, performing only synchronous metadata access operations for testing column properties (length, charset, collation). The refactoring is consistent and appropriate.

test/github-issues/1576/issue-1576.ts (1)

24-37: LGTM: Simplified test control flow

The refactoring from Promise.all with async callbacks to a synchronous forEach loop is appropriate here since the test logic only involves entity creation and property assertions without any actual asynchronous operations.

test/github-issues/3857/issue-3857.ts (2)

1-11: LGTM: Improved import organization

The import reordering groups related utilities together and moves frequently used imports like expect and DataSource to more prominent positions, improving code readability.


27-36: LGTM: Appropriate synchronous iteration

Converting from Promise.all with async callbacks to synchronous map is correct here since the test only accesses metadata properties and performs assertions without any asynchronous operations.

test/github-issues/6977/issue-6977.ts (1)

23-35: LGTM: Excellent test simplification

The refactoring achieves two improvements:

  1. Simplified control flow: Replacing Promise.all with forEach is appropriate since no async operations are performed
  2. Cleaner assertions: Consolidating multiple individual assertions into a single deep.equal check on a sorted array is more maintainable and provides clearer failure messages
src/persistence/SubjectExecutor.ts (2)

657-667: LGTM: Improved async handling pattern

The refactoring from manual Promise construction to an async function is cleaner and more maintainable. The sequential await pattern for nested set subjects is preserved while improving readability and following modern async/await best practices.


1115-1115: LGTM: Improved type safety

Removing the type assertion indicates better type inference, likely from the stricter TypeScript configuration mentioned in the PR objectives. This improves type safety without affecting functionality.

test/github-issues/2216/issue-2216.ts (2)

37-50: LGTM: Appropriate synchronous conversion

Converting this test to use synchronous forEach is correct since it only performs sinon assertions without any async operations. The test logic is preserved exactly.


95-108: LGTM: Consistent synchronous pattern

This change mirrors the previous test case, appropriately using synchronous iteration for assertion-only logic. Good judgment in selectively applying async-to-sync conversion only where no actual async operations occur.

test/github-issues/7932/issue-7932.ts (1)

61-76: Good refactoring to synchronous pattern.

The conversion from Promise.all to forEach is appropriate here since the test is only accessing synchronous metadata properties (repo.metadata.ownColumns) rather than performing asynchronous database operations. This simplifies the test structure while preserving the same verification logic.

src/query-builder/transformer/RawSqlResultsToEntityTransformer.ts (2)

592-594: Good explicit type annotation.

Adding the explicit generic type <{ [idHash: string]: any[] }> to the reducer improves type safety and code clarity by making the accumulator structure explicit rather than relying on type inference.


625-625: Let’s inspect the surrounding conditional in RawSqlResultsToEntityTransformer to see how column.referencedColumn is guarded:

#!/bin/bash
# Show context around the referencedColumn check and value assignment
rg -n "column\.referencedColumn" -A10 -B5 src/query-builder/transformer/RawSqlResultsToEntityTransformer.ts
test/github-issues/3256/subscriber/PostSubscriber.ts (2)

15-17: Correctly removed unnecessary async keyword.

The beforeInsert method performs only synchronous operations (setting the inserted property), so removing the async keyword is appropriate and improves performance by avoiding unnecessary promise wrapping.


19-23: Correctly removed unnecessary async keyword.

The beforeUpdate method performs only synchronous operations (conditionally setting the updated property), so removing the async keyword is appropriate and improves performance.

test/github-issues/8408/delete-orphans.ts (2)

1-8: Import organization improved.

The import reordering enhances code organization without functional changes.


33-78: Good test consolidation with parallel execution.

The restructuring from nested describe blocks to a single it block using Promise.all is appropriate here because:

  • The test performs actual database operations (async) unlike metadata-only tests
  • Parallel execution across connections is efficient and maintains test isolation
  • The consolidated structure is cleaner while preserving all original test logic and assertions
  • All the key test scenarios are maintained: entity creation, orphan deletion verification, and foreign key retention checks
sample/sample16-indexes/app.ts (1)

18-46: Excellent refactoring to modern async/await pattern.

This refactoring significantly improves the code quality by:

  • Better readability: async/await is more intuitive than promise chains
  • Improved error handling: Separate try-catch blocks for initialization and entity operations provide clearer error context
  • Proper resource cleanup: The finally block ensures data source destruction even if errors occur
  • Modern patterns: The main() function pattern is a best practice for top-level async code

The void main() correctly indicates intentional fire-and-forget execution while maintaining the same functionality as the original promise-based approach.

test/github-issues/8026/issue-8026.ts (1)

25-42: LGTM - Logic is correct, but verify test execution compatibility.

The refactoring from Promise.all with async mapping to a synchronous for...of loop is appropriate since the query builder operations are synchronous. However, ensure that changing the test function from async to sync doesn't break the test runner's expectations.

Run the following script to verify the test still executes properly:

#!/bin/bash
# Description: Verify the test executes without issues after async to sync conversion

# Test: Run this specific test file to ensure it executes properly
npm test -- --grep "github issues > #8026"
sample/sample17-versioning/app.ts (1)

17-48: Excellent refactoring to modern async/await pattern!

This refactoring significantly improves the code by:

  • Replacing promise chains with cleaner async/await syntax
  • Adding proper error handling with try/catch blocks
  • Ensuring resource cleanup in the finally block
  • Using void main() to properly invoke the async function

The implementation follows modern Node.js best practices for database connection management.

sample/sample1-simple-entity/app.ts (1)

18-45: Consistent and well-structured async/await refactoring.

The refactoring follows the same excellent pattern as other samples in this PR:

  • Clean async/await syntax replacing promise chains
  • Granular error handling for connection and save operations
  • Early return on connection failure to avoid unnecessary operations
  • Explicit resource cleanup with dataSource.destroy()

The consistency across sample applications will help developers understand the recommended patterns.

test/github-issues/512/issue-512.ts (2)

1-3: Improved imports and assertion style.

The import consolidation and addition of expect from chai improves consistency and readability.


22-37: Good refactoring with assertion style improvement, but verify test compatibility.

The changes improve the code by:

  • Simplifying the iteration from Promise.all to synchronous forEach
  • Using more explicit expect().to.deep.contain() assertion style
  • Maintaining the same test logic for table name escaping

However, similar to the previous test file, ensure that changing from async to sync doesn't affect test runner compatibility.

Run the following script to verify test execution:

#!/bin/bash
# Description: Verify the test executes properly after refactoring

# Test: Run this specific test to ensure it works with the new structure
npm test -- --grep "github issues > #512"
src/util/ImportUtils.ts (3)

7-7: Good type simplification.

Removing the named tuple element simplifies the return type while maintaining the same functionality.


12-12: Appropriate ESLint directive for dynamic import.

The ESLint directive is necessary here since Function constructor is intentionally used to preserve the import() statement after transpilation, avoiding conversion to require().


21-23: Good optimization - removing unnecessary async wrapper.

Converting tryToRequire from async to sync is a good optimization since require() is inherently synchronous. This removes unnecessary Promise overhead.

Run the following script to verify this change doesn't break existing usage:

#!/bin/bash
# Description: Check if any code depends on tryToRequire being async

# Search for usage patterns that might expect async behavior
rg -A 5 -B 5 "tryToRequire|importOrRequireFile" --type ts
eslint.config.mjs (1)

26-29: Good upgrade to stricter type checking configuration.

The switch from tseslint.configs.recommended to tseslint.configs.recommendedTypeChecked enables more comprehensive type checking. This aligns well with the PR's objective of adding stricter type-checking.

test/functional/connection/connection.ts (3)

1-26: Excellent test modernization.

The refactoring improves code consistency by:

  • Switching to expect assertions for better readability
  • Organizing imports more logically
  • Using specific error types for better error handling

77-83: Improved async error handling.

The use of expect(...).to.eventually.be.rejectedWith() with specific error types like CannotExecuteNotConnectedError provides better error validation than generic error catching.


53-53: Consistent API usage.

The change from connection.isConnected to connection.isInitialized reflects the updated DataSource API and maintains consistency with the new initialize()/destroy() methods.

test/github-issues/1369/subscriber/AbstractEntitySubscriber.ts (3)

17-19: Correct removal of unnecessary async.

The beforeInsert method doesn't perform any asynchronous operations, so removing the async keyword improves performance by avoiding unnecessary promise creation and aligns with the PR's goal of improving event loop handling.


21-25: Consistent async removal.

Similar to beforeInsert, the beforeUpdate method doesn't need to be async since it only performs synchronous operations.


27-29: Improved encapsulation.

Changing updateFullName from public to private is good encapsulation since it's only used internally within the subscriber class.

test/github-issues/1716/issue-1716.ts (3)

119-128: Good test consolidation.

Merging MySQL and MariaDB tests into a single describe block makes sense since they likely have similar date/time handling behavior. The enabledDrivers: ["mysql", "mariadb"] ensures both drivers are tested when available.


45-116: Efficient concurrent test execution.

Using Promise.all with connections.map ensures that tests run concurrently across all available database connections, improving test performance while maintaining thorough coverage.


34-39: Explicit timezone configuration.

Setting the timezone to UTC for PostgreSQL tests ensures consistent behavior across different environments and makes the test results more predictable.

src/driver/aurora-mysql/AuroraMysqlQueryRunner.ts (1)

2065-2397: LGTM! Effective async-to-sync refactoring.

The removal of Promise.all and conversion to synchronous map is appropriate here since the table creation logic doesn't perform any asynchronous operations. This change improves performance by eliminating unnecessary promise overhead while maintaining the same functionality.

The refactoring aligns with the PR's objective of modernizing asynchronous handling patterns.

test/github-issues/8832/issue-8832.ts (4)

1-16: Clean import organization.

The import reordering and cleanup improves code organization and readability.


20-31: Improved test lifecycle management.

Converting from afterEach to before/after hooks for connection management is more appropriate since connections don't need to be recreated between individual tests. This reduces test execution time and improves clarity.

Also applies to: 108-119, 162-173


63-71: Enhanced SQL query safety with tagged template literals.

The conversion to tagged template literals (connection.sql) improves SQL injection safety by properly parameterizing the database and table names. This is a significant security improvement over string concatenation.

Also applies to: 135-143


55-57: Standard IPv6 address compression.

The change from expanded (2001:0db8:0000:0000:0000:ff00:0042:8329) to compressed (2001:db8::ff00:42:8329) IPv6 format follows RFC standards and is the preferred representation.

src/driver/sap/SapQueryRunner.ts (1)

2623-2927: LGTM! Correct synchronous refactoring

The refactoring from Promise.all to synchronous .map() is appropriate here since all operations within the map callback are synchronous. The asynchronous database queries are already resolved before the mapping operation, making the async wrapper unnecessary.

src/util/OrmUtils.ts (4)

1-1: Good addition for type safety

The DeepPartial import enhances type safety for the mergeDeep method, allowing more precise typing of partial objects being merged.


51-56: Excellent type safety improvement

Changing the criteria parameter type from implicit any to (item: T) => unknown is a good practice. Using unknown instead of any enforces type checking and prevents potential runtime errors.


84-87: Well-designed generic implementation

The generic type parameter and DeepPartial<T> usage provide excellent type safety while maintaining flexibility. The method signature now correctly enforces that merged sources must be structurally compatible with the target type.


108-108: Necessary type assertion for proper inference

The as T cast is appropriate here since Object.create returns any. This ensures proper type inference for callers while maintaining the shallow copy semantics.

Comment on lines +25 to +42
it("should save entities properly", () =>
Promise.all(
connections.map(async (connection) => {
const post = new Post()
const comment = new Comment()
const value = new Value()

value.description = "description"
comment.values = [value]
post.comments = [comment]
value.description = "description"
comment.values = [value]
post.comments = [comment]

await connection.mongoManager.save(post)
await connection.mongoManager.save(post)

const postRepo = await connection.getRepository(Post)
const posts = await postRepo.find({})
posts.forEach((post) => expect(post).to.be.instanceof(Post))
}
})
const postRepo = connection.getRepository(Post)
const posts = await postRepo.find({})
posts.forEach((post) => expect(post).to.be.instanceof(Post))
}),
))
Copy link
Contributor

@coderabbitai coderabbitai bot Jun 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Inconsistent async execution pattern across the PR.

This test moves from sequential to parallel execution using Promise.all, which improves performance. However, other files in this PR (e.g., test/github-issues/587/issue-587.ts) are moving in the opposite direction from parallel to sequential execution.

Consider establishing a consistent pattern across all test files. For independent connection tests like these, parallel execution is generally preferable for performance.

🤖 Prompt for AI Agents
In test/github-issues/9049/issue-9049.ts around lines 25 to 42, the test uses
Promise.all to run connection tests in parallel, but other test files in the PR
use sequential execution. To maintain consistency and improve performance for
independent connection tests, keep the parallel execution pattern here and
update other test files to also use Promise.all for running connection tests
concurrently.

Copy link
Collaborator Author

@alumni alumni Jun 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@OSA413 @sgarner what do you think about this? I was also wondering while fixing require-await if I should do this change.

@coderabbitai's comment about performance is not valid in our case, because we are using Promise.all(dataSources.map(async (dataSource) => {...})) for async tests and dataSources.forEach((dataSource) => {...}) for non-async, I was rather thinking about code style and consistency.

It would be nice if we had it.each like in jest. There's a package called it-each which would add this, but hasn't received updates in about 2 years. We can also talk about this in our chat

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it help to have our own test helper function wrapping the Promises.all part, to make all such tests consistent?

Something like...

it("should save entities properly", withDataSources(dataSources, async dataSource => {
    // async code here to run in parallel with each data source
}))

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was thinking we could add it-each. Then, the tests would look like this:

it.each(
    dataSources,
    'should save entities properly for driver %s',
    ['type'], // replaces '%s' in title with dataSource.type
    (dataSource) => { // can also be async
        ...
    })

If we do something like this, it should definitely be a dedicated PR, since there are a lot of tests that need updating. Luckily, indentation shouldn't change for this example.

It's just a suggestion, I've only worked with jest.each until now.

While there are some things I don't like about the way jest runs the tests (which they apparently fixed last week), I actually like to write tests with it. There are some codemods that convert mocha+chai to jest. Also since vitest is compatible with the jest APIs, we could use vitest to run the tests. So there are some options, but I'd say let's chat when one of us has time to look into them :)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am personally more used to writing tests in jest, so would support a change in that direction :)

Otherwise though - I think rather than using an unmaintained third-party package for it-each, it would be better to create something ourselves that is tuned for our requirements, since this pattern of looping through data sources is repeated so many times across our tests.

Copy link
Collaborator

@sgarner sgarner left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a great cleanup! Very nice work @alumni 👌

@alumni alumni force-pushed the stricter-typechecking branch from e5304f8 to 12614ba Compare June 22, 2025 01:19
@alumni alumni force-pushed the stricter-typechecking branch from 12614ba to 3b8f7cd Compare June 22, 2025 01:29
@alumni alumni merged commit 01dddfe into typeorm:master Jun 22, 2025
58 checks passed
@alumni alumni mentioned this pull request Jun 22, 2025
4 tasks
@alumni alumni deleted the stricter-typechecking branch June 22, 2025 11:18
@alumni alumni mentioned this pull request Jul 30, 2025
18 tasks
ThbltLmr pushed a commit to ThbltLmr/typeorm that referenced this pull request Dec 2, 2025
…orm#11540)

* refactor: minor type improvements

* chore: add type-checked eslint rules

* fix: enable no-misused-promises

* fix: enable no-floating-promises

* fix: enable await-thenable

* fix: enable require-await

* fix: enable no-misused-new

* refactor: enable no-namespace

* refactor: enable tseslint eslint recommended

* code review
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Export 'BSON' is not defined

4 participants