Browse Source

first commit

neilzhu 1 month ago
commit
44d9a51f8a
100 changed files with 4611 additions and 0 deletions
  1. 14 0
      .editorconfig
  2. 222 0
      .eslintrc.js
  3. 1 0
      .gitattributes
  4. 1 0
      .github/CODEOWNERS
  5. 12 0
      .github/FUNDING.yml
  6. 87 0
      .github/ISSUE_TEMPLATE/bug_report.md
  7. 11 0
      .github/ISSUE_TEMPLATE/config.yml
  8. 55 0
      .github/ISSUE_TEMPLATE/feature_request.md
  9. 25 0
      .github/PULL_REQUEST_TEMPLATE.md
  10. 189 0
      .github/copilot-instructions.md
  11. 37 0
      .github/workflows/authors.yml
  12. 23 0
      .github/workflows/auto-add-pending-approval.yml
  13. 20 0
      .github/workflows/auto-remove-awaiting-response-label.yml
  14. 57 0
      .github/workflows/autoupdate.yml
  15. 360 0
      .github/workflows/ci.yml
  16. 37 0
      .github/workflows/notify.yml
  17. 45 0
      .github/workflows/pr-title.yml
  18. 24 0
      .github/workflows/semgrep.yml
  19. 61 0
      .github/workflows/stale.yml
  20. 30 0
      .gitignore
  21. 2 0
      .husky/pre-commit
  22. 38 0
      .markdownlint.json
  23. 47 0
      .mocharc.jsonc
  24. 4 0
      .prettierignore
  25. 15 0
      .prettierrc.json
  26. 3 0
      .yarn/releases/yarn-4.9.2.cjs
  27. 3 0
      .yarnrc.yml
  28. 1298 0
      AUTHORS
  29. 21 0
      CHANGELOG.md
  30. 68 0
      CODE-OF-CONDUCT.md
  31. 14 0
      CONTACT.md
  32. 12 0
      CONTRIBUTING.DOCS.md
  33. 282 0
      CONTRIBUTING.md
  34. 21 0
      LICENSE
  35. 83 0
      README.md
  36. 17 0
      SECURITY.md
  37. 110 0
      build-packages.mjs
  38. 12 0
      dev/check-connection.ts
  39. 14 0
      dev/db2/.env_list
  40. 26 0
      dev/db2/latest/docker-compose.yml
  41. 5 0
      dev/db2/latest/reset.sh
  42. 10 0
      dev/db2/latest/start.sh
  43. 7 0
      dev/db2/latest/stop.sh
  44. 26 0
      dev/db2/oldest/docker-compose.yml
  45. 5 0
      dev/db2/oldest/reset.sh
  46. 10 0
      dev/db2/oldest/start.sh
  47. 7 0
      dev/db2/oldest/stop.sh
  48. 21 0
      dev/db2/wait-until-healthy.sh
  49. 54 0
      dev/delete-changelog.mjs
  50. 26 0
      dev/mariadb/latest/docker-compose.yml
  51. 5 0
      dev/mariadb/latest/reset.sh
  52. 13 0
      dev/mariadb/latest/start.sh
  53. 7 0
      dev/mariadb/latest/stop.sh
  54. 26 0
      dev/mariadb/oldest/docker-compose.yml
  55. 5 0
      dev/mariadb/oldest/reset.sh
  56. 13 0
      dev/mariadb/oldest/start.sh
  57. 7 0
      dev/mariadb/oldest/stop.sh
  58. 40 0
      dev/mssql/latest/docker-compose.yml
  59. 5 0
      dev/mssql/latest/reset.sh
  60. 13 0
      dev/mssql/latest/start.sh
  61. 7 0
      dev/mssql/latest/stop.sh
  62. 39 0
      dev/mssql/oldest/docker-compose.yml
  63. 5 0
      dev/mssql/oldest/reset.sh
  64. 13 0
      dev/mssql/oldest/start.sh
  65. 7 0
      dev/mssql/oldest/stop.sh
  66. 26 0
      dev/mysql/latest/docker-compose.yml
  67. 5 0
      dev/mysql/latest/reset.sh
  68. 15 0
      dev/mysql/latest/start.sh
  69. 7 0
      dev/mysql/latest/stop.sh
  70. 26 0
      dev/mysql/oldest/docker-compose.yml
  71. 5 0
      dev/mysql/oldest/reset.sh
  72. 13 0
      dev/mysql/oldest/start.sh
  73. 7 0
      dev/mysql/oldest/stop.sh
  74. 25 0
      dev/postgres/latest/docker-compose.yml
  75. 5 0
      dev/postgres/latest/reset.sh
  76. 13 0
      dev/postgres/latest/start.sh
  77. 7 0
      dev/postgres/latest/stop.sh
  78. 25 0
      dev/postgres/oldest/docker-compose.yml
  79. 5 0
      dev/postgres/oldest/reset.sh
  80. 13 0
      dev/postgres/oldest/start.sh
  81. 7 0
      dev/postgres/oldest/stop.sh
  82. 13 0
      dev/sscce-helpers.ts
  83. 143 0
      dev/sync-exports.mjs
  84. 70 0
      dev/update-authors.js
  85. 28 0
      dev/wait-until-healthy.sh
  86. 4 0
      lerna.json
  87. 41 0
      logo.svg
  88. 32 0
      nx.json
  89. 13 0
      package-support.json
  90. 108 0
      package.json
  91. 5 0
      packages/cli/.eslintrc.cjs
  92. 8 0
      packages/cli/.gitignore
  93. 11 0
      packages/cli/.mocharc.jsonc
  94. 33 0
      packages/cli/CHANGELOG.md
  95. 26 0
      packages/cli/README.md
  96. 3 0
      packages/cli/bin/dev.cmd
  97. 5 0
      packages/cli/bin/dev.js
  98. 3 0
      packages/cli/bin/run.cmd
  99. 5 0
      packages/cli/bin/run.js
  100. 79 0
      packages/cli/package.json

+ 14 - 0
.editorconfig

@@ -0,0 +1,14 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# editorconfig.org
+
+root = true
+
+[*]
+
+indent_style = space
+indent_size = 2
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true

+ 222 - 0
.eslintrc.js

@@ -0,0 +1,222 @@
+// eslint does not properly load plugins loaded by presets
+// this fixes that
+require('@rushstack/eslint-patch/modern-module-resolution');
+
+module.exports = {
+  root: true,
+  extends: [
+    '@ephys/eslint-config-typescript',
+    '@ephys/eslint-config-typescript/node',
+    '@ephys/eslint-config-typescript/commonjs',
+  ],
+  plugins: ['mocha', 'jsdoc'],
+  rules: {
+    'jsdoc/check-param-names': 'error',
+    'jsdoc/check-tag-names': 'error',
+    'jsdoc/check-types': 'off',
+    'jsdoc/tag-lines': ['error', 'any', { startLines: 1 }],
+    'jsdoc/no-undefined-types': 'off',
+    'jsdoc/require-description-complete-sentence': 'off',
+    'jsdoc/require-example': 'off',
+    'jsdoc/require-hyphen-before-param-description': 'off',
+    'jsdoc/require-param': 'error',
+    'jsdoc/require-param-description': 'off',
+    'jsdoc/require-param-name': 'error',
+    'jsdoc/require-param-type': 'off',
+    'jsdoc/require-returns-description': 'off',
+    'jsdoc/require-returns-type': 'off',
+    'jsdoc/valid-types': 'error',
+    'jsdoc/no-types': 'error',
+
+    // TODO: enable in follow-up PR. Requires the utils package.
+    'no-restricted-syntax': 'off',
+    'no-restricted-imports': 'off',
+    '@typescript-eslint/ban-types': 'off',
+    // TODO: enable in follow-up PR. Requires enabling TSC's noUncheckedIndexedAccess
+    '@typescript-eslint/no-unnecessary-condition': 'off',
+    // TODO: enable in follow-up PR. Requires manual code changes.
+    '@typescript-eslint/naming-convention': 'off',
+    '@typescript-eslint/unbound-method': 'off',
+    '@typescript-eslint/member-ordering': 'off',
+    'unicorn/no-object-as-default-parameter': 'off',
+    '@typescript-eslint/prefer-optional-chain': 'off',
+    'logical-assignment-operators': 'off',
+  },
+  overrides: [
+    {
+      files: ['**/*.{js,mjs,cjs}'],
+      rules: {
+        'jsdoc/no-types': 'off',
+        'jsdoc/require-param-type': 'error',
+        'jsdoc/check-types': 'error',
+        'jsdoc/require-returns-type': 'error',
+      },
+    },
+    {
+      files: ['**/*.js'],
+      rules: {
+        // These rules have been disabled in .js files to ease adoption.
+        // They'll be fixed during the TS migration.
+        // Remove these once most files have been migrated to TS.
+
+        // This will catch a lot of bugs with early-returns
+        'consistent-return': 'off',
+
+        // code smells that should be resolved
+        'no-restricted-syntax': 'off',
+        'no-await-in-loop': 'off',
+        'default-case': 'off',
+        'no-loop-func': 'off',
+        'no-shadow': 'off',
+        'default-param-last': 'off',
+        'no-fallthrough': 'off',
+        'prefer-rest-params': 'off',
+        'no-loss-of-precision': 'off',
+
+        // optimisation
+        'unicorn/consistent-function-scoping': 'off',
+
+        // array.reduce is difficult to reason about and can almost always
+        // be replaced by a more explicit method
+        'unicorn/no-array-reduce': 'off',
+        'unicorn/no-array-for-each': 'off',
+        'unicorn/prefer-spread': 'off',
+
+        // makes code clearer
+        'unicorn/prefer-default-parameters': 'off',
+        'max-statements-per-line': 'off',
+
+        // makes debug easier
+        'func-names': 'off',
+
+        // multi-assigns can be difficult to understand
+        // https://eslint.org/docs/rules/no-multi-assign
+        'no-multi-assign': 'off',
+
+        // GitHub's display length is 125 chars.
+        // This enforces that length.
+        'max-len': 'off',
+        'max-depth': 'off',
+
+        // Reduce diff noise.
+        'import/order': 'off',
+
+        // consistency
+        'unicorn/filename-case': 'off',
+
+        // Passing a function reference to an array callback can accidentally introduce bug
+        // due to array methods passing more than one parameter.
+        'unicorn/no-array-callback-reference': 'off',
+      },
+    },
+    {
+      // most tests are written in old JS style
+      // let's disable the most problematic rules for now.
+      // they're only disabled for .js files.
+      // .ts files will need to migrate.
+      files: ['packages/*/test/**/*.js'],
+      rules: {
+        'func-names': 'off',
+        'import/order': 'off',
+
+        'consistent-this': 'off',
+        'no-invalid-this': 'off',
+        'unicorn/no-this-assignment': 'off',
+        'no-unused-expressions': 'off',
+        camelcase: 'off',
+        'no-console': 'off',
+        'no-prototype-builtins': 'off',
+        'no-multi-spaces': 'off',
+        'unicorn/error-message': 'off',
+      },
+    },
+    {
+      // Disable slow rules that are not important in tests (perf)
+      files: ['packages/*/test/**/*', '*.test.{ts,js}'],
+      rules: {
+        'import/no-extraneous-dependencies': 'off',
+        // no need to check jsdoc in tests & docs
+        'jsdoc/check-types': 'off',
+        'jsdoc/valid-types': 'off',
+        'jsdoc/tag-lines': 'off',
+        'jsdoc/check-tag-names': 'off',
+
+        // Enable test-specific rules (perf)
+        'mocha/no-exclusive-tests': 'error',
+        'mocha/no-skipped-tests': 'warn',
+
+        // it's fine if we're not very efficient in tests.
+        'no-inner-declarations': 'off',
+        'unicorn/no-unsafe-regex': 'off',
+
+        // because of Chai
+        '@typescript-eslint/no-unused-expressions': 'off',
+      },
+      env: {
+        mocha: true,
+      },
+    },
+    {
+      files: ['packages/*/test/types/**/*'],
+      rules: {
+        // This code is never executed, it's typing only, so these rules make no sense:
+        '@typescript-eslint/no-unused-vars': 'off',
+        '@typescript-eslint/no-floating-promises': 'off',
+        'no-console': 'off',
+      },
+    },
+    {
+      files: ['**/tsconfig.json'],
+      rules: {
+        'json/*': ['error', { allowComments: true }],
+      },
+    },
+    {
+      files: ['sscce.ts'],
+      rules: {
+        'no-console': 'off',
+      },
+    },
+  ],
+  settings: {
+    jsdoc: {
+      tagNamePreference: {
+        augments: 'extends',
+      },
+      structuredTags: {
+        typeParam: {
+          type: false,
+          required: ['name'],
+        },
+        category: {
+          type: false,
+          required: ['name'],
+        },
+        internal: {
+          type: false,
+        },
+        hidden: {
+          type: false,
+        },
+      },
+    },
+  },
+  parserOptions: {
+    ecmaVersion: 2020,
+    sourceType: 'module',
+  },
+  ignorePatterns: [
+    'packages/*/lib/**/*',
+    'packages/*/types/**/*',
+    'packages/**/skeletons/**/*',
+    '.typedoc-build',
+    'packages/cli/migrations/**/*',
+    'packages/cli/seeds/**/*',
+  ],
+  env: {
+    node: true,
+    mocha: true,
+    es6: true,
+    es2020: true,
+  },
+};

+ 1 - 0
.gitattributes

@@ -0,0 +1 @@
+* -lf

+ 1 - 0
.github/CODEOWNERS

@@ -0,0 +1 @@
+* @sequelize/code-reviewers

+ 12 - 0
.github/FUNDING.yml

@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: sequelize
+patreon: # Replace with a single Patreon username
+open_collective: sequelize
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

+ 87 - 0
.github/ISSUE_TEMPLATE/bug_report.md

@@ -0,0 +1,87 @@
+---
+name: 🐛 Bug report
+about: Create a bug report to help us improve
+title: ''
+labels: ['pending-approval']
+type: Bug
+assignees: ''
+---
+
+<!--
+If you don't follow the issue template, your issue may be closed.
+
+Remember to properly format your code in code blocks.
+
+Please note this is an issue tracker, not a support forum.
+For general questions, please use one of these:
+- StackOverflow: https://stackoverflow.com/questions/tagged/sequelize.js
+- GitHub discussions: https://github.com/sequelize/sequelize/discussions
+-->
+
+## Issue Creation Checklist
+
+- [ ] I understand that my issue will be automatically closed if I don't fill in the requested information
+- [ ] I have read the [contribution guidelines](https://github.com/sequelize/sequelize/blob/main/CONTRIBUTING.md)
+
+## Bug Description
+
+<!-- You can describe your issue here -->
+
+### Reproducible Example
+
+<!--
+We almost always need a reproducible example (SSCCE) of your error.
+You should use https://github.com/sequelize/sequelize-sscce to create one.
+
+Please understand that your issue will be closed if you do not provide a reproducible example.
+-->
+
+Here is the link to the SSCCE for this issue:
+
+<!--
+We also accept pasting the relevant source code here, but it must follow the rules of SSCCE: http://sscce.org/
+-->
+
+### What do you expect to happen?
+
+<!-- Explain what behavior you wanted/expected. You may include an output. -->
+
+### What is actually happening?
+
+<!-- Describe what happened. Including relevant details like complete stacktraces & the SQL output -->
+
+### Environment
+
+<!---
+Please answer the questions below. If you don't, your issue will be closed.
+
+To find the version numbers for the three systems below use the following commands:
+- `npm list sequelize` / `yarn list --pattern sequelize` (v6 stable)
+- `npm list @sequelize/core` / `yarn list --pattern @sequelize/core` (v7 alpha)
+- `node -v`
+- `npm list typescript` / `yarn list --pattern typescript`
+- 'Database' is which actual database system you're using. e.g. 'PostgreSQL 14', 'MariaDB 10.11', etc…
+- 'Connector library' is the dependency sequelize requires you to install to interact with a given database type.
+  e.g. 'pg' or 'pg-native' for PostgreSQL, 'mysql2' for MySQL, 'tedious' for SQL Server, etc… (see README for complete list).
+--->
+
+- Sequelize version:
+- Node.js version:
+- If TypeScript related: TypeScript version:
+- Database & Version:
+- Connector library & Version:
+
+## Would you be willing to resolve this issue by submitting a Pull Request?
+
+<!-- Remember that first contributors are welcome! -->
+
+- [ ] Yes, I have the time and I know how to start.
+- [ ] Yes, I have the time but I will need guidance.
+- [ ] No, I don't have the time, but my company or I are [supporting Sequelize through donations on OpenCollective](https://opencollective.com/sequelize).
+- [ ] No, I don't have the time, and I understand that I will need to wait until someone from the community or maintainers is interested in resolving my issue.
+
+---
+
+<!-- do not delete this footer -->
+
+_Indicate your interest in the resolution of this issue by adding the 👍 reaction. Comments such as "+1" will be removed._

+ 11 - 0
.github/ISSUE_TEMPLATE/config.yml

@@ -0,0 +1,11 @@
+blank_issues_enabled: false
+contact_links:
+  - name: 💬 Help & Questions
+    url: https://github.com/sequelize/sequelize/discussions
+    about: The issue tracker is for bug reports and feature requests. Use GitHub Discussions for question and help requests.
+  - name: 🔧 Having issues with Sequelize CLI?
+    url: https://github.com/sequelize/cli/issues
+    about: Please file an issue in the Sequelize CLI repository.
+  - name: 📗 Found an issue in our documentation?
+    url: https://github.com/sequelize/website/issues
+    about: Please file an issue in the Sequelize website repository.

+ 55 - 0
.github/ISSUE_TEMPLATE/feature_request.md

@@ -0,0 +1,55 @@
+---
+name: 🚀 Feature request
+about: Suggest an idea for this project
+title: ''
+labels: ['pending-approval']
+type: Feature
+assignees: ''
+---
+
+<!--
+If you don't follow the issue template, your issue may be closed.
+
+Remember to properly format your code in code blocks.
+
+Please note this is an issue tracker, not a support forum.
+For general questions, please use one of these:
+- Stack Overflow: https://stackoverflow.com/questions/tagged/sequelize.js
+- GitHub Discussions: https://github.com/sequelize/sequelize/discussions
+-->
+
+## Issue Creation Checklist
+
+- [ ] I understand that my issue will be automatically closed if I don't fill in the requested information
+- [ ] I have read the [contribution guidelines](https://github.com/sequelize/sequelize/blob/main/CONTRIBUTING.md)
+
+## Feature Description
+
+### Describe the feature you'd like to see implemented
+
+<!-- A clear and concise description of what you want to happen. How can the requested feature be used to approach the problem it's supposed to solve? -->
+<!-- If applicable, add a code snippet showing how your feature would be used in a real use-case -->
+
+### Describe why you would like this feature to be added to Sequelize
+
+<!-- Short explanation why this should be part of Sequelize rather than a separate package. -->
+
+### Is this feature dialect-specific?
+
+- [ ] No. This feature is relevant to Sequelize as a whole.
+- [ ] Yes. This feature only applies to the following dialect(s): <!-- fill this in -->
+
+### Would you be willing to resolve this issue by submitting a Pull Request?
+
+<!-- Remember that first contributors are welcome! -->
+
+- [ ] Yes, I have the time and I know how to start.
+- [ ] Yes, I have the time but I will need guidance.
+- [ ] No, I don't have the time, but my company or I are [supporting Sequelize through donations on OpenCollective](https://opencollective.com/sequelize).
+- [ ] No, I don't have the time, and I understand that I will need to wait until someone from the community or maintainers is interested in implementing my feature.
+
+---
+
+<!-- do not delete this footer -->
+
+_Indicate your interest in the addition of this feature by adding the 👍 reaction. Comments such as "+1" will be removed._

+ 25 - 0
.github/PULL_REQUEST_TEMPLATE.md

@@ -0,0 +1,25 @@
+<!--
+Thanks for wanting to fix something on Sequelize - we already love you!
+Please fill in the template below.
+If unsure about something, just do as best as you're able.
+-->
+
+## Pull Request Checklist
+
+<!-- Please make sure to review and check all of these items: -->
+
+- [ ] Have you added new tests to prevent regressions?
+- [ ] If a documentation update is necessary, have you opened a PR to [the documentation repository](https://github.com/sequelize/website/)? <!-- Put PR link here -->
+- [ ] Did you update the typescript typings accordingly (if applicable)?
+- [ ] Does the description below contain a link to an existing issue (Closes #[issue]) or a description of the issue you are solving?
+- [ ] Does the name of your PR follow [our conventions](https://github.com/sequelize/sequelize/blob/main/CONTRIBUTING.md#6-commit-your-modifications)?
+
+<!-- NOTE: these things are not required to open a PR and can be done afterwards / while the PR is open. -->
+
+## Description of Changes
+
+<!-- Please provide a description of the change here. -->
+
+## List of Breaking Changes
+
+<!-- If you have caused any breaking changes, you should list them below. -->

+ 189 - 0
.github/copilot-instructions.md

@@ -0,0 +1,189 @@
+# Sequelize AI Development Guide
+
+## Architecture Overview
+
+Sequelize is a monorepo ORM for Node.js supporting 9+ databases. Key architectural patterns:
+
+- **Packages**: Core ORM (`@sequelize/core`) + dialect-specific packages (`@sequelize/postgres`, `@sequelize/mysql`, etc.)
+- **Dialect Pattern**: Each database has its own package with `dialect.ts`, `query-generator.js`, `query-interface.js`, and `connection-manager.ts`
+- **Model System**: Legacy models use `model.js` with TypeScript definitions, but **all new code should be written in TypeScript**
+- **Build System**: Uses esbuild via `build-packages.mjs` to compile TypeScript to both CommonJS and ESM
+- **TypeScript Migration**: Project is actively migrating from JavaScript to TypeScript - prefer `.ts` files for all new implementations
+
+## Development Workflow
+
+### Essential Commands
+
+```bash
+# Build specific package
+node build-packages.mjs core
+node build-packages.mjs postgres
+
+# Run tests by dialect
+yarn test-integration-postgres
+yarn test-unit
+
+# Start local DBs for testing
+yarn start-postgres-latest
+yarn reset-postgres
+
+# SSCCE (debugging minimal reproductions)
+yarn sscce-postgres
+```
+
+### Database Testing Setup
+
+- Docker containers in `dev/{dialect}/{latest|oldest}/` with start/stop/reset scripts
+- Test config in `packages/core/test/config/config.ts` with environment-based settings
+- Integration tests use `Support.createMultiTransactionalTestSequelizeInstance()` for isolation
+
+## Code Patterns
+
+### Dialect Implementation
+
+When adding dialect features:
+
+1. Update `packages/{dialect}/src/dialect.ts` for feature support flags
+2. Implement in `query-generator.js` (legacy) or `query-generator.ts` (preferred for new features)
+3. Add to `query-interface.js` (legacy) or `query-interface.ts` (preferred) for schema operations
+4. **Write all new implementations in TypeScript** - avoid creating new `.js` files
+5. TypeScript definitions are co-located with implementation files
+
+### Model Definition Pattern
+
+```javascript
+// Core pattern in tests and examples
+this.User = sequelize.define('User', {
+  field: DataTypes.STRING,
+  uniqueField: { type: DataTypes.STRING, unique: true },
+});
+```
+
+### Testing Conventions
+
+- Use `Support.getTestDialectTeaser()` for dialect-specific test descriptions
+- `beforeEach`/`afterEach` with `customSequelize.sync({ force: true })` and `.close()`
+- Test files: `.test.js` for integration, `.test.ts` for unit tests
+- Chai assertions with custom extensions in `packages/core/test/chai-extensions.d.ts`
+
+### Writing Integration Tests for New Features
+
+```typescript
+import type { CreationOptional, InferAttributes, InferCreationAttributes } from '@sequelize/core';
+import { DataTypes, Model } from '@sequelize/core';
+import { Attribute, NotNull } from '@sequelize/core/decorators-legacy';
+import { expect } from 'chai';
+import { beforeAll2, sequelize, setResetMode } from '../support';
+
+describe('Model#newFeature', () => {
+  // Skip entire suite if feature is not supported
+  if (!sequelize.dialect.supports.newFeature) {
+    return;
+  }
+
+  setResetMode('destroy');
+
+  const vars = beforeAll2(async () => {
+    class User extends Model<InferAttributes<User>, InferCreationAttributes<User>> {
+      declare id: CreationOptional<number>;
+
+      @Attribute(DataTypes.INTEGER)
+      @NotNull
+      declare someField: number;
+
+      @Attribute(DataTypes.STRING)
+      declare name: string | null;
+    }
+
+    sequelize.addModels([User]);
+    await sequelize.sync({ force: true });
+
+    return { User };
+  });
+
+  beforeEach(async () => {
+    await vars.User.create({ someField: 1, name: 'test' });
+  });
+
+  it('works with basic functionality', async () => {
+    const user = await vars.User.findByPk(1, { rejectOnEmpty: true });
+    await user.newFeature();
+    expect(user.someField).to.equal(2);
+  });
+
+  it('handles edge cases properly', async () => {
+    const user = await vars.User.findByPk(1, { rejectOnEmpty: true });
+    await expect(user.newFeature({ invalid: 'option' })).to.be.rejected;
+  });
+
+  // Test dialect-specific behavior
+  if (sequelize.dialect.name === 'postgres') {
+    it('supports postgres-specific functionality', async () => {
+      const user = await vars.User.findByPk(1, { rejectOnEmpty: true });
+      await user.newFeature({ postgresOption: true });
+      expect(user.someField).to.equal(3);
+    });
+  }
+
+  // Test feature variations
+  if (sequelize.dialect.supports.newFeature?.advanced) {
+    it('supports advanced newFeature options', async () => {
+      const user = await vars.User.findByPk(1, { rejectOnEmpty: true });
+      await user.newFeature({ mode: 'advanced' });
+      expect(user.someField).to.equal(5);
+    });
+  }
+});
+```
+
+### Testing Database Compatibility
+
+- Use `dialect.supports.featureName` checks to skip unsupported tests
+- Test against both oldest and latest database versions via Docker containers
+- Integration tests should use `Support.createMultiTransactionalTestSequelizeInstance()` for proper isolation
+- Unit tests for pure logic, integration tests for database interactions
+
+## File Structure Conventions
+
+### Package Structure
+
+```
+packages/{dialect}/
+├── src/
+│   ├── dialect.ts              # Feature flags & dialect config
+│   ├── query-generator.js      # SQL generation logic
+│   ├── query-interface.js      # Schema operations
+│   ├── connection-manager.ts   # Connection pooling
+│   └── index.ts               # Package exports
+└── test/                      # Package-specific tests
+```
+
+### Core Package Critical Files
+
+- `src/model.js` - Main Model class implementation
+- `src/sequelize.js` - Core Sequelize class
+- `src/associations/` - Relationship definitions
+- `src/data-types.ts` - Type system
+- `test/support.ts` - Test utilities and setup
+
+## Integration Points
+
+### Cross-Package Dependencies
+
+- Core package is database-agnostic, dialects extend abstract classes
+- `@sequelize/utils` provides shared utilities across packages
+- Test support utilities in `packages/core/test/support.ts` used across dialect tests
+
+### Build & Export System
+
+- Dual CommonJS/ESM exports via `exports` field in package.json
+- TypeScript compiled to `lib/` directory with both `.d.ts` and `.d.mts` files
+- Legacy decorators exported separately as `@sequelize/core/decorators-legacy`
+
+## Common Gotchas
+
+- Always use `dialect.supports.xyz` checks before implementing dialect-specific features
+- Integration tests require database containers - use dev scripts to start them
+- Model methods use `.js` files with separate TypeScript definitions
+- When modifying query generation, update both the base class and dialect-specific implementations
+- **Prefer TypeScript for all new code** - only modify existing `.js` files when necessary

+ 37 - 0
.github/workflows/authors.yml

@@ -0,0 +1,37 @@
+name: 'authors update'
+on:
+  schedule:
+    # Run once a week at 00:05 AM UTC on Sunday.
+    - cron: '5 0 * * 0'
+
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+jobs:
+  authors_update:
+    permissions:
+      contents: write # for gr2m/create-or-update-pull-request-action to push local changes
+      pull-requests: write # for gr2m/create-or-update-pull-request-action to create a PR
+    if: github.repository == 'sequelize/sequelize'
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          fetch-depth: '0' # This is required to actually get all the authors
+          persist-credentials: false
+      - run: 'dev/update-authors.js' # Run the AUTHORS tool
+      - uses: gr2m/create-or-update-pull-request-action@b65137ca591da0b9f43bad7b24df13050ea45d1b # Create a PR or update the Action's existing PR
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          author: SequelizeJS <mail@sequelizejs.com>
+          body: >
+            Here are some new additions to the AUTHORS file.
+            This is an automatically generated PR by the
+            `authors.yml` GitHub Action, which runs `dev/update-authors.js`.
+          branch: 'actions/authors-update' # Custom branch *just* for this Action.
+          commit-message: 'meta: update sequelize AUTHORS'
+          labels: meta
+          title: 'meta: update sequelize AUTHORS'

+ 23 - 0
.github/workflows/auto-add-pending-approval.yml

@@ -0,0 +1,23 @@
+name: Label new issues with pending-approval
+on:
+  issues:
+    types:
+      - opened
+permissions:
+  contents: read
+
+jobs:
+  label_issues:
+    runs-on: ubuntu-latest
+    permissions:
+      issues: write
+    steps:
+      - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
+        with:
+          script: |
+            github.rest.issues.addLabels({
+              issue_number: context.issue.number,
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              labels: ["pending-approval"]
+            })

+ 20 - 0
.github/workflows/auto-remove-awaiting-response-label.yml

@@ -0,0 +1,20 @@
+name: Auto-remove "awaiting response" label
+on:
+  issue_comment:
+    types: [created]
+
+jobs:
+  auto-remove-awaiting-response-label:
+    name: Run
+    if: "${{ contains(github.event.issue.labels.*.name, 'status: awaiting response') }}"
+    runs-on: ubuntu-latest
+    env:
+      # Case insensitive. Replace spaces with `%20`.
+      LABEL_TO_REMOVE: 'status:%20awaiting%20response'
+    steps:
+      - name: Run
+        run: |-
+          curl -X DELETE \
+            -H "Accept: application/vnd.github.v3+json" \
+            -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
+            "${{ github.event.comment.issue_url }}/labels/$LABEL_TO_REMOVE"

+ 57 - 0
.github/workflows/autoupdate.yml

@@ -0,0 +1,57 @@
+name: auto-update PRs & label conflicts
+on:
+  push:
+    branches:
+      - main
+  # can also be used with the pull_request event
+  pull_request_target:
+    types:
+      - synchronize
+      # allow the workflow to correct any label incorrectly added or removed by a user.
+      - labeled
+      - unlabeled
+      # update the PR as soon as the auto-merge is enabled.
+      - auto_merge_enabled
+      # process the PR once they appear in the search filters
+      - ready_for_review
+      - opened
+      - reopened
+jobs:
+  autoupdate:
+    runs-on: ubuntu-latest
+    steps:
+      # This step is used by the fork update feature, which uses git instead of the API
+      - name: Configure git
+        env:
+          UPDATE_FORK_USERNAME: '${{ vars.UPDATE_FORK_USERNAME }}'
+          UPDATE_FORK_EMAIL: '${{ vars.UPDATE_FORK_EMAIL }}'
+        run: |
+          # The username of the "UPDATE_FORK_PAT" owner
+          git config --global user.name "${UPDATE_FORK_USERNAME}"
+          # The email of the "UPDATE_FORK_PAT" owner
+          git config --global user.email "${UPDATE_FORK_EMAIL}"
+      - name: Generate Sequelize Bot Token
+        id: generate-token
+        uses: actions/create-github-app-token@v1
+        with:
+          app-id: '${{ secrets.SEQUELIZE_BOT_APP_ID }}'
+          private-key: '${{ secrets.SEQUELIZE_BOT_PRIVATE_KEY }}'
+      - uses: sequelize/pr-auto-update-and-handle-conflicts@74929c430b8843e691e7b83d229d8d13d78d89e3 # 2.0.0
+        with:
+          conflict-label: 'conflicted'
+          conflict-requires-ready-state: 'ready_for_review'
+          conflict-excluded-authors: 'bot/renovate'
+          update-pr-branches: true
+          update-requires-auto-merge: true
+          update-requires-ready-state: 'ready_for_review'
+          update-excluded-authors: 'bot/renovate'
+          update-excluded-labels: 'no-autoupdate'
+        env:
+          # We need to use a GitHub App PAT to update PRs
+          # or workflows will not be triggered by the update
+          GITHUB_TOKEN: '${{ steps.generate-token.outputs.token }}'
+
+          # updating forks require a user PAT instead of an app PAT,
+          # as the permissions of the app PAT do not apply to forks.
+          UPDATE_FORK_PAT: '${{ secrets.UPDATE_FORK_PAT }}'
+          UPDATE_FORK_USERNAME: '${{ vars.UPDATE_FORK_USERNAME }}'

+ 360 - 0
.github/workflows/ci.yml

@@ -0,0 +1,360 @@
+name: CI
+on:
+  push:
+    branches:
+      - renovate/**
+  pull_request:
+  merge_group:
+  workflow_dispatch:
+
+# workflow_ref includes the branch ref & the file name
+# which means a unique run per branch for push & pull_request
+# pull_request_target would use the ref of the target branch, which would not be suitable
+concurrency:
+  group: '${{ github.workflow_ref }}'
+  cancel-in-progress: true
+
+jobs:
+  install-and-build:
+    # We already run the CI on "push" for renovate branches
+    if: ${{ github.event_name != 'pull_request' || !startsWith(github.head_ref, 'renovate/') }}
+    strategy:
+      fail-fast: false
+      matrix:
+        node-version: [18, 20]
+    name: Upload install and build artifact (Node ${{ matrix.node-version }})
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+        with:
+          node-version: ${{ matrix.node-version }}
+          cache: yarn
+      - name: Install dependencies
+        run: yarn install --immutable
+      - name: Build sequelize
+        run: yarn build
+      - name: Reset NX cache
+        run: yarn nx reset
+      - name: Compress artifact
+        run: tar -cf install-build-node-${{ matrix.node-version }}.tar ./packages/*/lib ./node_modules ./packages/*/node_modules
+      - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+        with:
+          name: install-build-artifact-node-${{ matrix.node-version }}
+          path: install-build-node-${{ matrix.node-version }}.tar
+          retention-days: 1
+  lint:
+    name: Lint code
+    runs-on: ubuntu-latest
+    needs: install-and-build
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+        with:
+          node-version: 20.19.4
+          cache: yarn
+      - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+        with:
+          name: install-build-artifact-node-20
+      - name: Extract artifact
+        run: tar -xf install-build-node-20.tar
+      - run: yarn test:format
+  unit-test:
+    strategy:
+      fail-fast: false
+      matrix:
+        node-version: [18, 20]
+    name: Unit test all dialects (Node ${{ matrix.node-version }})
+    runs-on: ubuntu-latest
+    needs: lint
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+        with:
+          node-version: ${{ matrix.node-version }}
+          cache: yarn
+      - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+        with:
+          name: install-build-artifact-node-${{ matrix.node-version }}
+      - name: Extract artifact
+        run: tar -xf install-build-node-${{ matrix.node-version }}.tar
+      - name: ESM / CJS export equivalence
+        run: yarn test-unit-esm
+      - name: Unit tests (validator.js)
+        run: yarn lerna run test-unit --scope=@sequelize/validator.js
+      - name: Unit tests (cli)
+        run: yarn lerna run test-unit --scope=@sequelize/cli
+      - name: Unit tests (utils)
+        run: yarn lerna run test-unit --scope=@sequelize/utils
+      - name: Unit tests (core - mariadb)
+        run: yarn lerna run test-unit-mariadb --scope=@sequelize/core
+      - name: Unit tests (mariadb package)
+        run: yarn lerna run test-unit --scope=@sequelize/mariadb
+      - name: Unit tests (core - mysql)
+        run: yarn lerna run test-unit-mysql --scope=@sequelize/core
+      - name: Unit tests (mysql package)
+        run: yarn lerna run test-unit --scope=@sequelize/mysql
+      - name: Unit tests (core - postgres)
+        run: yarn lerna run test-unit-postgres --scope=@sequelize/core
+      - name: Unit tests (postgres package)
+        run: yarn lerna run test-unit --scope=@sequelize/postgres
+      - name: Unit tests (core - sqlite3)
+        run: yarn lerna run test-unit-sqlite3 --scope=@sequelize/core
+      - name: Unit tests (core - mssql)
+        run: yarn lerna run test-unit-mssql --scope=@sequelize/core
+      - name: Unit tests (mssql package)
+        run: yarn lerna run test-unit --scope=@sequelize/mssql
+      - name: Unit tests (core - db2)
+        run: yarn lerna run test-unit-db2 --scope=@sequelize/core
+      - name: Unit tests (core - ibmi)
+        run: yarn lerna run test-unit-ibmi --scope=@sequelize/core
+      - name: Unit tests (core - snowflake)
+        run: yarn lerna run test-unit-snowflake --scope=@sequelize/core
+      - name: SQLite SSCCE
+        run: yarn sscce-sqlite3
+  test-win:
+    strategy:
+      fail-fast: false
+      matrix:
+        node-version: [18, 20]
+    name: Build and test on Windows (Node ${{ matrix.node-version }})
+    runs-on: windows-latest
+    needs: lint # don't bother running if lint tests fail
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+        with:
+          node-version: ${{ matrix.node-version }}
+          cache: yarn
+      - name: Install dependencies
+        run: yarn install --immutable
+      - name: Build sequelize
+        run: yarn build
+      - name: Unit tests
+        run: yarn lerna run test-unit
+      - name: SSCCE
+        run: yarn sscce-sqlite3
+      - name: Integration tests (sqlite3)
+        run: yarn lerna run test-integration-sqlite3 --scope=@sequelize/core
+  docs:
+    name: Generate TypeDoc
+    runs-on: ubuntu-latest
+    needs: lint
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+        with:
+          node-version: 20.19.4
+          cache: yarn
+      - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+        with:
+          name: install-build-artifact-node-20
+      - name: Extract artifact
+        run: tar -xf install-build-node-20.tar
+      - run: yarn docs
+  test-typings:
+    strategy:
+      fail-fast: false
+      matrix:
+        ts-version: ['5.5', '5.6', '5.7', '5.8']
+    name: TS Typings (${{ matrix.ts-version }})
+    runs-on: ubuntu-latest
+    needs: lint
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+        with:
+          node-version: 20.19.4
+          cache: yarn
+      - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+        with:
+          name: install-build-artifact-node-20
+      - name: Extract artifact
+        run: tar -xf install-build-node-20.tar
+      - name: Install TypeScript
+        run: yarn add typescript@~${{ matrix.ts-version }}
+      - name: Typing Tests
+        run: yarn test-typings
+  test-sqlite3:
+    strategy:
+      fail-fast: false
+      matrix:
+        node-version: [18, 20]
+    name: sqlite3 (Node ${{ matrix.node-version }})
+    runs-on: ubuntu-latest
+    needs: [unit-test, test-typings]
+    env:
+      DIALECT: sqlite3
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+        with:
+          node-version: ${{ matrix.node-version }}
+          cache: yarn
+      - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+        with:
+          name: install-build-artifact-node-${{ matrix.node-version }}
+      - name: Extract artifact
+        run: tar -xf install-build-node-${{ matrix.node-version }}.tar
+      - name: Integration Tests
+        run: yarn lerna run test-integration --scope=@sequelize/core
+  test-postgres:
+    strategy:
+      fail-fast: false
+      matrix:
+        node-version: [18, 20]
+        postgres-version: [oldest, latest]
+        minify-aliases: [true, false]
+        native: [true, false]
+    name: postgres ${{ matrix.postgres-version }}${{ matrix.native && ' (native)' || '' }} (Node ${{ matrix.node-version }})${{ matrix.minify-aliases && ' (minified aliases)' || '' }}
+    runs-on: ubuntu-latest
+    needs: [unit-test, test-typings]
+    env:
+      DIALECT: ${{ matrix.native && 'postgres-native' || 'postgres' }}
+      SEQ_PG_MINIFY_ALIASES: ${{ matrix.minify-aliases && '1' || '' }}
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+        with:
+          node-version: ${{ matrix.node-version }}
+          cache: yarn
+      - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+        with:
+          name: install-build-artifact-node-${{ matrix.node-version }}
+      - name: Extract artifact
+        run: tar -xf install-build-node-${{ matrix.node-version }}.tar
+      - name: Install pg-native
+        run: yarn workspace @sequelize/core add pg-native
+        if: matrix.native
+      - run: yarn start-postgres-${{ matrix.postgres-version }}
+      - name: Integration Tests
+        run: yarn lerna run test-integration --scope=@sequelize/core
+  test-oldest-latest:
+    strategy:
+      fail-fast: false
+      matrix:
+        node-version: [18, 20]
+        database-version: [oldest, latest]
+        dialect: [mysql, mariadb, db2]
+    name: ${{ matrix.dialect }} ${{ matrix.database-version }} (Node ${{ matrix.node-version }})
+    runs-on: ubuntu-latest
+    needs: [unit-test, test-typings]
+    env:
+      DIALECT: ${{ matrix.dialect }}
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+        with:
+          node-version: ${{ matrix.node-version }}
+          cache: yarn
+      - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+        with:
+          name: install-build-artifact-node-${{ matrix.node-version }}
+      - name: Extract artifact
+        run: tar -xf install-build-node-${{ matrix.node-version }}.tar
+      - run: yarn start-${{ matrix.dialect }}-${{ matrix.database-version }}
+      - name: Integration Tests
+        run: yarn lerna run test-integration --scope=@sequelize/core
+  test-mssql-latest:
+    strategy:
+      fail-fast: false
+      matrix:
+        node-version: [18, 20]
+    name: mssql latest (Node ${{ matrix.node-version }})
+    runs-on: ubuntu-latest
+    needs: [unit-test, test-typings]
+    env:
+      DIALECT: mssql
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+        with:
+          node-version: ${{ matrix.node-version }}
+          cache: yarn
+      - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+        with:
+          name: install-build-artifact-node-${{ matrix.node-version }}
+      - name: Extract artifact
+        run: tar -xf install-build-node-${{ matrix.node-version }}.tar
+      - run: yarn start-mssql-latest
+      - name: Integration Tests
+        run: yarn lerna run test-integration --scope=@sequelize/core
+  # TODO: the following CI job is disabled due to mssql 2017 Docker image not working with ubuntu-22.04 or later. See https://github.com/sequelize/sequelize/pull/17772
+  # test-mssql-oldest:
+  #   strategy:
+  #     fail-fast: false
+  #     matrix:
+  #       node-version: [18, 20]
+  #   name: mssql oldest (Node ${{ matrix.node-version }})
+  #   runs-on: ubuntu-20.04
+  #   needs: [unit-test, test-typings]
+  #   env:
+  #     DIALECT: mssql
+  #   steps:
+  #     - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+  #     - uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
+  #       with:
+  #         node-version: ${{ matrix.node-version }}
+  #         cache: yarn
+  #     - uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
+  #       with:
+  #         name: install-build-artifact-node-${{ matrix.node-version }}
+  #     - name: Extract artifact
+  #       run: tar -xf install-build-node-${{ matrix.node-version }}.tar
+  #     - run: yarn start-mssql-oldest
+  #     - name: Integration Tests
+  #       run: yarn lerna run test-integration --scope=@sequelize/core
+  release:
+    name: Release
+    runs-on: ubuntu-latest
+    needs:
+      # TODO: add test-mssql-oldest back here when it's uncommented
+      [docs, test-sqlite3, test-postgres, test-oldest-latest, test-mssql-latest]
+    if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main'
+    env:
+      NPM_TOKEN: '${{ secrets.NPM_TOKEN }}'
+    steps:
+      - name: Generate Sequelize Bot Token
+        id: generate-token
+        uses: actions/create-github-app-token@v1
+        with:
+          app-id: '${{ secrets.SEQUELIZE_BOT_APP_ID }}'
+          private-key: '${{ secrets.SEQUELIZE_BOT_PRIVATE_KEY }}'
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          # Number of commits to fetch. 0 indicates all history for all branches and tags.
+          # We need the entire history to generate the changelog properly
+          fetch-depth: 0
+          # The credentials used for checkout are persisted
+          # Lerna will use the same credentials later for "git push".
+          # This must be done using the Sequelize bot.
+          token: '${{ steps.generate-token.outputs.token }}'
+      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+        with:
+          node-version: 20.19.4
+          cache: yarn
+      - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+        with:
+          name: install-build-artifact-node-20
+      - name: Extract artifact
+        run: tar -xf install-build-node-20.tar
+      - name: Configure git
+        run: |
+          git config --global user.name "github-actions[bot]"
+          git config --global user.email "bot@sequelize.org"
+      - name: Set npm auth token
+        run: npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}"
+      - run: yarn publish-all
+        env:
+          GITHUB_TOKEN: '${{ steps.generate-token.outputs.token }}'
+          GH_TOKEN: '${{ steps.generate-token.outputs.token }}'
+      - id: sequelize
+        uses: sdepold/github-action-get-latest-release@aa12fcb2943e8899cbcc29ff6f73409b32b48fa1 # master
+        with:
+          repository: sequelize/sequelize
+      - name: Notify channels
+        run: |
+          curl -XPOST -u "sdepold:${{ secrets.GH_TOKEN }}" -H "Accept: application/vnd.github.v3+json" -H "Content-Type: application/json" https://api.github.com/repos/sequelize/sequelize/dispatches --data '{"event_type":"Release notifier","client_payload":{"release-id": ${{ steps.sequelize.outputs.id }}}}'
+      - name: Notify docs repo
+        run: |
+          curl -XPOST -u "sdepold:${{ secrets.GH_TOKEN }}" -H "Accept: application/vnd.github.v3+json" -H "Content-Type: application/json" https://api.github.com/repos/sequelize/website/dispatches --data '{"event_type":"Build website"}'

+ 37 - 0
.github/workflows/notify.yml

@@ -0,0 +1,37 @@
+# Get releases:
+# curl -XGET -u "username:access-token" -H "Accept: application/vnd.github.everest-preview+json" -H "Accept: application/vnd.github.everest-preview+json" -H "Content-Type: application/json" https://api.github.com/repos/sequelize/sequelize/releases
+
+# Trigger manually:
+# curl -XPOST -u "username:access-token" -H "Accept: application/vnd.github.everest-preview+json" -H "Content-Type: application/json" https://api.github.com/repos/sequelize/sequelize/dispatches --data '{"event_type":"Release notifier","client_payload":{"release-id": release-id}}'
+
+name: Notify release channels
+on: repository_dispatch
+jobs:
+  tweet:
+    name: Tweet release
+    runs-on: ubuntu-latest
+    steps:
+      - uses: cardinalby/git-get-release-action@319798e20e923b75a49d335f1afdaf6f18422118 # v1.1
+        id: releaseInfo
+        env:
+          GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
+        with:
+          releaseId: ${{ github.event.client_payload.release-id }}
+      - uses: ethomson/send-tweet-action@288f9339e0412e3038dce350e0da5ecdf12133a6 # v1.0.0
+        with:
+          status: 'We have just released ${{ steps.releaseInfo.outputs.name }} of Sequelize. https://github.com/sequelize/sequelize/releases/tag/${{ steps.releaseInfo.outputs.name }}'
+          consumer-key: ${{ secrets.TWITTER_CONSUMER_API_KEY }}
+          consumer-secret: ${{ secrets.TWITTER_CONSUMER_API_SECRET }}
+          access-token: ${{ secrets.TWITTER_ACCESS_TOKEN }}
+          access-token-secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
+  notify-opencollective:
+    name: Notify OpenCollective
+    runs-on: ubuntu-latest
+    steps:
+      - uses: sequelize/proxy-release-to-open-collective@d8edaf56f12f51518fb97829b699a2e2e6d8166e # main
+        with:
+          releaseId: ${{ github.event.client_payload.release-id }}
+          projectSlug: sequelize/sequelize
+          ocSlug: sequelize
+          ocApiKey: ${{ secrets.OPEN_COLLECTIVE_KEY }}
+          githubToken: ${{ secrets.GH_TOKEN }}

+ 45 - 0
.github/workflows/pr-title.yml

@@ -0,0 +1,45 @@
+name: 'Lint PR'
+on:
+  pull_request:
+    types:
+      - opened
+      - edited
+      - synchronize
+permissions:
+  contents: read
+concurrency:
+  group: ${{ github.workflow }}-${{ github.ref }}
+  cancel-in-progress: true
+jobs:
+  main:
+    permissions:
+      pull-requests: read # for amannn/action-semantic-pull-request to analyze PRs
+      statuses: write # for amannn/action-semantic-pull-request to mark status of analyzed PR
+    name: PR has semantic title
+    runs-on: ubuntu-latest
+    steps:
+      - uses: amannn/action-semantic-pull-request@0723387faaf9b38adef4775cd42cfd5155ed6017 # v5.5.3
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          types: |
+            fix
+            feat
+            docs
+            meta
+          scopes: |
+            cli
+            core
+            db2
+            ibmi
+            mariadb
+            mssql
+            mysql
+            oracle
+            postgres
+            snowflake
+            sqlite3
+            utils
+            validator.js
+          ignoreLabels: |
+            ignore-semantic-pull-request

+ 24 - 0
.github/workflows/semgrep.yml

@@ -0,0 +1,24 @@
+on:
+  workflow_dispatch: {}
+  pull_request: {}
+  push:
+    branches:
+      - main
+      - master
+    paths:
+      - .github/workflows/semgrep.yml
+  schedule:
+    # random HH:MM to avoid a load spike on GitHub Actions at 00:00
+    - cron: 35 14 * * *
+name: Semgrep
+jobs:
+  semgrep:
+    name: Scan
+    runs-on: ubuntu-22.04
+    env:
+      SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+    container:
+      image: returntocorp/semgrep
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
+      - run: semgrep ci

+ 61 - 0
.github/workflows/stale.yml

@@ -0,0 +1,61 @@
+name: 'Stale issue handler'
+on:
+  workflow_dispatch:
+  schedule:
+    - cron: '0 0 * * *'
+
+permissions:
+  contents: read
+
+jobs:
+  stale:
+    permissions:
+      issues: write # for actions/stale to close stale issues
+      pull-requests: write # for actions/stale to close stale PRs
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
+        id: stale-bug
+        with:
+          stale-issue-label: 'stale'
+          stale-issue-message: 'This bug report has not been verified by maintainers yet, and has been open for 14 days without activity. It will be closed if no further activity occurs within the next 14 days. If this is still an issue, consider commenting with more information to help us verify it.'
+          days-before-issue-stale: -1
+          days-before-issue-close: -1
+          operations-per-run: 1000
+          days-before-pr-stale: -1
+          days-before-pr-close: -1
+          only-issue-labels: 'type: bug'
+          any-of-issue-labels: 'pending-approval'
+      - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
+        id: stale-feature
+        with:
+          stale-issue-label: 'stale'
+          stale-issue-message: 'This feature request has not been approved by maintainers yet, and has been open for 14 days without activity. It will be closed as "not planned" if no further activity occurs within the next 14 days.'
+          stale-pr-message: 'This pull request has been marked as maybe-abandoned and has not seen any activity for 14 days. It will be closed if no further activity occurs within the next 30 days. If you would still like to work on this, please comment to let us know and the label will be removed.'
+          days-before-issue-stale: -1
+          days-before-issue-close: -1
+          operations-per-run: 1000
+          days-before-pr-stale: 14
+          days-before-pr-close: 30
+          only-issue-labels: 'type: feature'
+          any-of-issue-labels: 'pending-approval'
+          any-of-pr-labels: 'maybe-abandoned'
+      - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
+        id: invalid
+        with:
+          stale-issue-label: 'stale'
+          stale-issue-message: 'This issue has been marked as invalid ([see our contributing guidelines](https://github.com/sequelize/sequelize/blob/main/CONTRIBUTING.md)) and has not been active in 2 weeks. It will be closed if no further activity occurs within the next 2 weeks.'
+          stale-pr-message: 'This pull request has been marked as invalid ([see our contributing guidelines](https://github.com/sequelize/sequelize/blob/main/CONTRIBUTING.md)) and has not been active in 2 weeks. It will be closed if no further activity occurs within the next 2 weeks.'
+          days-before-issue-stale: 14
+          days-before-issue-close: 14
+          operations-per-run: 1000
+          days-before-pr-stale: 14
+          days-before-pr-close: 14
+          any-of-issue-labels: 'invalid'
+          any-of-pr-labels: 'invalid'
+      - name: Print outputs (stale-bug)
+        run: echo ${{ join(steps.stale-bug.outputs.*, ',') }}
+      - name: Print outputs (stale-feature)
+        run: echo ${{ join(steps.stale-feature.outputs.*, ',') }}
+      - name: Print outputs (invalid)
+        run: echo ${{ join(steps.invalid.outputs.*, ',') }}

+ 30 - 0
.gitignore

@@ -0,0 +1,30 @@
+*.swp
+.idea
+.DS_STORE
+npm-debug.log*
+*~
+*.sublime*
+package-lock.json
+pnpm-lock.yaml
+
+.nyc_output
+coverage-*
+coverage
+.vscode/
+.typedoc-build
+node_modules
+*.log
+/packages/*/lib
+/packages/*/types
+/packages/core/test/sqlite-databases
+/.nx
+
+lib
+
+.pnp.*
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+!.yarn/sdks
+!.yarn/versions

+ 2 - 0
.husky/pre-commit

@@ -0,0 +1,2 @@
+yarn lint-staged --concurrent false
+yarn delete-changelog

+ 38 - 0
.markdownlint.json

@@ -0,0 +1,38 @@
+{
+  "default": false,
+  "ul-style": true,
+  "list-indent": true,
+  "ul-start-left": true,
+  "ul-indent": true,
+  "no-trailing-spaces": true,
+  "no-hard-tabs": true,
+  "no-reversed-links": true,
+  "no-multiple-blanks": true,
+  "no-missing-space-atx": true,
+  "no-multiple-space-atx": true,
+  "no-missing-space-closed-atx": true,
+  "no-multiple-space-closed-atx": true,
+  "blanks-around-headings": true,
+  "heading-start-left": true,
+  "no-duplicate-heading": {
+    "siblings_only": true
+  },
+  "single-h1": {
+    "level": 1
+  },
+  "no-multiple-space-blockquote": true,
+  "ol-prefix": {
+    "style": "one_or_ordered"
+  },
+  "list-marker-space": true,
+  "blanks-around-fences": true,
+  "blanks-around-lists": true,
+  "no-bare-urls": true,
+  "hr-style": true,
+  "no-space-in-emphasis": true,
+  "no-space-in-code": true,
+  "no-space-in-links": true,
+  "fenced-code-language": true,
+  "no-empty-links": true,
+  "no-alt-text": true
+}

+ 47 - 0
.mocharc.jsonc

@@ -0,0 +1,47 @@
+{
+  "require": "ts-node/register",
+  "loader": "ts-node/esm",
+  "extensions": ["js", "ts"],
+  "watch-files": ["src"],
+  "check-leaks": true,
+  "timeout": 30000,
+  "reporter": "spec",
+  "exit": true,
+  "inline-diffs": true,
+  "full-trace": true,
+  // Globals added as per https://github.com/sequelize/sequelize/pull/17206#discussion_r1538541573
+  "globals": [
+    "__extends",
+    "__assign",
+    "__rest",
+    "__decorate",
+    "__param",
+    "__esDecorate",
+    "__runInitializers",
+    "__propKey",
+    "__setFunctionName",
+    "__metadata",
+    "__awaiter",
+    "__generator",
+    "__exportStar",
+    "__createBinding",
+    "__values",
+    "__read",
+    "__spread",
+    "__spreadArrays",
+    "__spreadArray",
+    "__await",
+    "__asyncGenerator",
+    "__asyncDelegator",
+    "__asyncValues",
+    "__makeTemplateObject",
+    "__importStar",
+    "__importDefault",
+    "__classPrivateFieldGet",
+    "__classPrivateFieldSet",
+    "__classPrivateFieldIn",
+    "__addDisposableResource",
+    "__disposeResources",
+    "__rewriteRelativeImportExtension"
+  ]
+}

+ 4 - 0
.prettierignore

@@ -0,0 +1,4 @@
+.yarn
+/packages/cli/migrations
+/packages/cli/seeds
+*.tar

+ 15 - 0
.prettierrc.json

@@ -0,0 +1,15 @@
+{
+  "plugins": ["prettier-plugin-organize-imports"],
+  "bracketSameLine": true,
+  "printWidth": 100,
+  "singleQuote": true,
+  "arrowParens": "avoid",
+  "overrides": [
+    {
+      "files": [".mocharc.jsonc"],
+      "options": {
+        "trailingComma": "none"
+      }
+    }
+  ]
+}

File diff suppressed because it is too large
+ 3 - 0
.yarn/releases/yarn-4.9.2.cjs


+ 3 - 0
.yarnrc.yml

@@ -0,0 +1,3 @@
+nodeLinker: node-modules
+
+yarnPath: .yarn/releases/yarn-4.9.2.cjs

+ 1298 - 0
AUTHORS

@@ -0,0 +1,1298 @@
+# Authors ordered by first contribution.
+
+Sascha Depold <sascha@depold.com>
+Israel De La Hoz <israel.delahoz@koombea.com>
+Vangelis Tsoumenis <kioopi@gmail.com>
+Allan Carroll <allanca@gmail.com>
+corpix <me@corpix.ru>
+Mark Kornfilt <mark.kornfilt@livestream.com>
+Laurent Zuijdwijk <Laurent.Zuijdwijk@gamil.com>
+Meg Sharkey <meg@metamarketsgroup.com>
+Ram <ram@RamLaptop1.(none)>
+Edward Tsech <edtsech@gmail.com>
+Ramesh Nair <ram@hiddentao.com>
+Brenden Grace <brenden.grace@gmail.com>
+Gabriel Falcao <gabriel@nacaolivre.org>
+nov matake <nov@matake.jp>
+Chase Geigle <sky@skystrife.com>
+Ross Grayton <rossgrayton@gmail.com>
+dgf <github@dagnu.de>
+SirUli <m@il.wolf-u.li>
+Lachèze Alexandre <alexandre.lacheze@gmail.com>
+Ken Perkins <ken@clipboard.com>
+Shawn Woodtke <swoodtke@codefall.com>
+Shawn Woodtke <swoodtke@gmail.com>
+Nao Iizuka <iizuka@kyu-mu.net>
+Meg Sharkey <meg@metamarkets.com>
+Nazar Aziz <nazar@panthersoftware.com>
+Andy Burke <aburke@bitflood.org>
+Sorin Stoiana <sorinalin.stoiana@gmail.com>
+Daniel Schwartz <dschwartz88@gmail.com>
+Eugene Korbut <me@mvl.ru>
+Grzegorz Niewisiewicz <grzegorz@niewisiewicz.pl>
+Raúl Acuña <reacuna@gmail.com>
+Mick Hansen <doomschild@gmail.com>
+Jan Aagaard Meier <janzeh@gmail.com>
+Rauno56 <rviskus@gmail.com>
+Edgar Veiga <edgarmveiga@gmail.com>
+Rob Raux <rraux@whentomanage.com>
+Edward Lin <237lin@gmail.com>
+joshm <jmather@whentomanage.com>
+Gavri Fernandez <gavri.fernandez@gmail.com>
+Michael Philpott <mphilpot@gmail.com>
+kbackowski <kbackowski@gmail.com>
+René Oelke <rene.oelke@gmail.com>
+David Chester <david@shutterstock.com>
+Gabe Hernandez <ghernandez345@gmail.com>
+Jisoo Park <xxxyel@gmail.com>
+Aslak Hellesøy <aslak.hellesoy@gmail.com>
+Roman Ostolosh <RomanO@dev-pro.net>
+Leif Johnson <leif@leifjohnson.net>
+kevin.xu <kevin.xu@gree.co.jp>
+denysonique <dennisonic@gmail.com>
+Gavri <gavri@thoughtworks.com>
+Joost de Vries <joost@closealert.com>
+Dominik Lessel <dominik@nuform.info>
+Guilherme Souza <Guivideojob@gmail.com>
+shane adams <adamsch1@yahoo.com>
+slamkajs <jslamka5685@gmail.com>
+Brian Johnson <bjohnson@1on1.com>
+Shaun Rader <shaunrader@gmail.com>
+Daniel Durante <daniel@fractureme.com>
+Ricardo Graça <ricardo@devius.net>
+Thomas Watson Steen <w@tson.dk>
+Daniel Durante <officedebo@gmail.com>
+Kevin Martin <kevfirst101+git@gmail.com>
+carsondarling <carsondarling@gmail.com>
+Chia-liang Kao <clkao@clkao.org>
+Pasvaz <pasqualevazzana@gmail.com>
+Konstantinos Vaggelakos <kozze89@gmail.com>
+Alex Young <alex@helicoid.net>
+Ivan Popovski <ip@sipware.org>
+solotimes <toknight@gmail.com>
+Michael Weibel <michael.weibel@gmail.com>
+zanamixx <jausset@wyplay.com>
+Jochem Maas <jochem@iamjochem.com>
+Mason Blier <mason.blier@gmail.com>
+Jonathan Crossman <jcrossman@digication.com>
+James Sapara <james.sapara@gmail.com>
+Rob Fletcher <rob@redgiantsoftware.com>
+Filip Bonnevier <filip.bonnevier@gmail.com>
+tjmehta <tejesh.mehta@gmail.com>
+reedog117 <patrickc81@gmail.com>
+Alexandre Joly <alexandre.joly@mekanics.ch>
+Joshua Frederick <josh@jfred.net>
+Sergey Klimov <sergey.v.klimov@gmail.com>
+Martin Aspeli <optilude@gmail.com>
+terraflubb <rob@terraflubb.com>
+William Riancho <wr.wllm@gmail.com>
+Javier Echenique <javier.echenique@patagonialabs.com>
+Kevin Beaty <kevin@simplectic.com>
+Peter Braun <pbraun@gmx.com>
+Bart Nagel <bart@tremby.net>
+sevastos <me@sevthedev.com>
+Elliot Chong <elliotjameschong@gmail.com>
+sevastos <me@sevastos.com>
+Scott Tadman <github@tadman.ca>
+Jesse Clark <jjclark1982@gmail.com>
+Benjamin Woodruff <benjaminwoodruff@ufl.edu>
+Seth Samuel <seth@admitted.ly>
+Domas Lapinskas <domasx2@gmail.com>
+freezy <freezy@xbmc.org>
+Percy <pperez@cbtnuggets.com>
+Percy Perez <percyp3@gmail.com>
+sonnym <michaud.sonny@gmail.com>
+Indra Gunawan <indra.sync@gmail.com>
+Michael Storgaard <github@michaelstorgaard.com>
+Antoine Marcadet <antoine.marcadet@gmail.com>
+Josh Marchán <sykopomp@sykosomatic.org>
+Lemon <lemon@x-plane.org>
+Jonathan M. Altman <jonathan@async.io>
+Tony DiPasquale <anthony.r.dipasquale@gmail.com>
+whito <whit@whit.ca>
+Joe Wilm <jdwilm@gmail.com>
+Jan Scheurer <lj1102@googlemail.com>
+hackwaly <hackwaly@gmail.com>
+Ming-Wei Shih <xmingske#gmail.com>
+Andre Cerqueira <me@andrecerqueira.com>
+Brad Harris <bmharris@gmail.com>
+wenyuxiang <wenyuxiang@zhubajie.com>
+David Rivera <david.r.rivera193@gmail.com>
+Sebastian Hoitz <hoitz@komola.de>
+Po-Ying Chen <poying.me@gmail.com>
+Daniel Durante <me@danieldurante.com>
+Goran Gajic <fero.null@gmail.com>
+Charles Hill <charlesh@degreesofzero.com>
+Thanasis Polychronakis <thanpolas@gmail.com>
+edolfo <elicudine@svbio.com>
+Kevin Jose Martin <kevfirst101+github@gmail.com>
+Rafael Martins <snit.ram@gmail.com>
+Josemando Sobral <josemando@gmail.com>
+Will Whitney <wwhitney@mit.edu>
+Brandon Skari <brandon@skari.org>
+Elliot Foster <efoster@firetaco.com>
+Oliver Walzer <walzer@incuray.com>
+Patrik Björklund <p.bjorklund@gmail.com>
+Jan Aagaard Meier <jan@it-kartellet.dk>
+thomascool <thomas.cool@gmail.com>
+Anh-Kiet Ngo <anhkiet@gmail.com>
+Andreas Franzén <andreas@devil.se>
+Ben Evans <ben@bensbit.co.uk>
+Andreas Lubbe <andreaslubbe@gmail.com>
+mulderr <kazulakm@gmail.com>
+Andrej Mihajlov <and.mikhaylov@gmail.com>
+Mick Hansen <mick.kasper.hansen@gmail.com>
+Marc-Aurèle DARCHE <ma.darche@cynode.org>
+Simon Townsend <stowns3@gmail.com>
+Steffen Persch <s.persch@unlooped.com>
+oubushixb <chenjun7878@qq.com>
+Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+maximeCony <maxime.cony@gmail.com>
+Sascha Gehlich <sascha@gehlich.us>
+iuri aranda <iuri.aranda@uwhisp.com>
+Yuri Sulyma <yuri@ualberta.ca>
+dominik zunftmeister <d.zunftmeister@evorhei.de>
+Evan Tahler <evantahler@gmail.com>
+Michael Schonfeld <michael@dwolla.com>
+Michael Schonfeld <michael@schonfeld.org>
+Overlook Motel <theoverlookmotel@gmail.com>
+Bulkan Evcimen <bulkan@gmail.com>
+Mathieu Amiot <m.amiot@otak-arts.com>
+Christian Schuhmann <chris@madebyherzblut.com>
+Dan Kohn <dan@dankohn.com>
+Sohum Banerjea <sohumb@gmail.com>
+jValdron <jason@valdron.ca>
+Joseph Verburg <josephverburg@gmail.com>
+Rui Fortes <ruisantosfortes@gmail.com>
+Scott Dial <scott@scottdial.com>
+fundon <cfddream@gmail.com>
+tomchentw <developer@tomchentw.com>
+Rob Skillington <rob.skillington@gmail.com>
+Rob Skillington <rskillington@groupon.com>
+Kara <kara.erickson3@gmail.com>
+Mark Engel <mark@mbr-targeting.com>
+Daniel Cohen <daniel@codeinvain.com>
+Tiago Ribeiro <tlr@seegno.com>
+Nuno Sousa <nfs@seegno.com>
+Matt Broadstone <mbroadstone@devonit.com>
+heartsentwined <heartsentwined.me@gmail.com>
+Loïc Mahieu <mahieuloic@gmail.com>
+José Moreira <jmoreira@microdual.com>
+Sascha Depold <sdepold@users.noreply.github.com>
+alexwl <alexey.a.kiryushin@gmail.com>
+변상필 <sangpire@daumcorp.com>
+Siyang Bi <siyang.bi@gmail.com>
+Terry Xu <txu@twitter.com>
+Siyang Bi <siyangbi@Siyangs-MacBook-Pro.local>
+Joshua Perry <josh@6bit.com>
+Nick Mitchinson <nrmitchi@gmail.com>
+edgarsilva <edgar.osc@gmail.com>
+pola88 <pola88@gmail.com>
+Whitney Young <wbyoung@fadingred.com>
+tngraessler <mail@torsten-graessler.de>
+Sean McCann <sean@mudbugmedia.com>
+Matt McFarland <matmcfarland@gmail.com>
+stilia <stilia@users.noreply.github.com>
+Björn Dahlgren <bjorn@dahlgren.at>
+Matthew Ohlman <matthew@ohlman.com>
+Sean Arme <sean.arme@gmail.com>
+Chris Wilhelm <chris.wilhelm@gmail.com>
+Jan Scheurer <js@xe-dev.com>
+Joey G <joeylgutierrez@gmail.com>
+Thaddeus Quintin <thaddeus@quiddle.net>
+SM@K <smali.kazmi@hotmail.com>
+Dirk Raeder <dirk@raeder.cc>
+rogerc <rc@ataclick.net>
+youxiachai <youxiachai@gmail.com>
+Aleksander Barszczewski <alek.barszczewski@gmail.com>
+Ryan Pon <ryan@meetearnest.com>
+Jason Valdron <jason@dealerinstincts.com>
+Thomas Wickham <thomas@wickham.epimeros.org>
+Brian Romanko <hello@bromanko.com>
+Joe Lutz <jlutz@linkstechnology.com>
+Joe Lutz <dizlexik@gmail.com>
+jchbh-duplicate <changhai.jiang@gmail.com>
+Javier Cornejo <javier@MacBook-Pro-de-Javier.local>
+ryanking <jinzhihua@howell.net.cn>
+overlookmotel <jim@jims-mbp.home>
+Craig Beck <luckybonza@gmail.com>
+jtschoonhoven <jtschoonhoven@gmail.com>
+Sveinn Fannar Kristjansson <sveinnfannar@gmail.com>
+Mousset Axel <pymzorr@gmail.com>
+overlookmotel <jim@terrence.local>
+Malte Legenhausen <mlegenhausen@gmail.com>
+Jack <3ch01c@gmail.com>
+Victor Pontis <vpontis@gmail.com>
+jharia <jesikaharia@gmail.com>
+Ryan Fink <ryanjfink@gmail.com>
+Holger <holger@airbug.de>
+ekmartin <ekmartinb@gmail.com>
+vvo <vincent.voyer@gmail.com>
+Alexander Kuzmin <alexander.ivan.kuzmin@gmail.com>
+paul-sh <paul.shmakov@gmail.com>
+haches <estlerh@eth.edu>
+Daniel Shelton <sheltond@angrybadger.net>
+Bryan Tong <contact@nullivex.com>
+Jacob Lauzier <lauzierj@gmail.com>
+Mikk Andresen <mikk.andresen@gmail.com>
+Jacob Lauzier <jacob.lauzier@machinemetrics.com>
+Igor Nawrocki <igor@qburst.com>
+Jeff French <jeff.french@moonswitch.com>
+Daniel Hanover <hanover.daniel@hotmail.com>
+Roman Shtylman <shtylman@gmail.com>
+Josh Kalderimis <josh.kalderimis@gmail.com>
+Simon Gaeremynck <gaeremyncks@gmail.com>
+Kyle <kylewhite@gmail.com>
+Jarkko Mönkkönen <jarkko.monkkonen@leonidasoy.fi>
+David Pate <davidtpate@gmail.com>
+Yoni Jah <yonjah@gmail.com>
+Teemu Heikkilä <sienikasvusto@pistoke.org>
+fhc023 <fhc023@qq.com>
+qjroberts <quinton@qjr.ca>
+Jerome C <jcombes@sierrawireless.com>
+Joel Trost <joelt@zillow.com>
+Jason Jung <jwkjng@msn.com>
+Nikita <dr.evil@krtn.eu>
+Jean-Philippe Monette <contact@jpmonette.net>
+Dejan Ranisavljevic <dejan.ranisavljevic@gmail.com>
+Brian Lundin <brian.lundin@gmail.com>
+Domi <dominikseifert@yahoo.de>
+Matheus Bratfisch <matheusbrat@gmail.com>
+Mark Wainwright <markwainwright1@gmail.com>
+paulmaszlik <paulmaszlik@gmail.com>
+Chris Dibbern <chrisdibbern@gmail.com>
+Nick Kleinschmidt <nick.kleinschmidt@gmail.com>
+Tiago Ribeiro <tiago.ribeiro@gmail.com>
+Chris White <cw@smartvue.com>
+Garrett Gottlieb <garrett@pumpup.co>
+James Irving-Swift <james@irving-swift.com>
+GuilhermeReda <guilhermereda95@gmail.com>
+Kara <kara@users.noreply.github.com>
+alubbe <git@lubbe.org>
+Philip J Briggs <pjbr@users.noreply.github.com>
+Andrew Smith <andrewsmith@alumni.stanford.edu>
+James Billingham <james@billingham.net>
+Fırat KÜÇÜK <firatkucuk@gmail.com>
+Preston Parry <ClimbsRocks@users.noreply.github.com>
+Pranay S <peerwitty@gmail.com>
+Matt Conrad <mmconrad@gmail.com>
+Kiran Rao <k.ranrao@gmail.com>
+Erik van de Ven <erik.vandeven@fresh-fruit.com>
+ksmithut <ksmith.ut@gmail.com>
+Robert Ing <rmi22186@gmail.com>
+Mike DeLucco <mdelucco@gmail.com>
+Ruslan Kovtun <koutoftimer@gmail.com>
+Casey Watson <watsoncj@gmail.com>
+Nicolas Silberman <nicolas.silberman@gmail.com>
+Thaddeus Quintin <thaddeus@admail.net>
+catalint11main <catalin.tanasescu@11main.com>
+toastynerd <tylermorgan86@gmail.com>
+Rui Marinho <rpm@seegno.com>
+Peng Hou <dustsnow@gmail.com>
+Y Kang <yokangy@users.noreply.github.com>
+Michael Pauley <mdpauley@gmail.com>
+mdpauley <mdpauley@zippynzbs.com>
+Denis Shirokov <dan@zlogic.ru>
+Alexis Määttä Vinkler <alexis@brimful.se>
+Luca Moser <l.moser@triumph-adler.ch>
+Willyham <willyd@uber.com>
+Nick Acker <acker2@me.com>
+Rachel Higley <me@rachelhigley.com>
+Amine Mouafik <amine@mouafik.fr>
+Jumpei Ogawa <ogawa@growaspeople.org>
+Arturo Guzman <guzart@users.noreply.github.com>
+Ryan Lane <ryan@ryanalane.com>
+Ruben Bridgewater <ruben.bridgewater@fintura.de>
+Jonatan Männchen <jonatan@maennchen.ch>
+Jonatan Männchen <jonatan.maennchen@mediahead.com>
+Steven Lu <tacticalazn@gmail.com>
+Calvin Tan <calvin14@gmail.com>
+Luc Verdier <luc.verdier1@gmail.com>
+Frank0628 <miaochenx@163.com>
+Brad Dunbar <dunbarb2@gmail.com>
+Martin Otten <m.otten83@googlemail.com>
+Matt Broadstone <mbroadst@gmail.com>
+Manuel Martinez <manmar92@gmail.com>
+Robert Falkén <f@lken.se>
+Pavel Karoukin <pavel@karoukin.us>
+Stanislav <darkpark@pisem.net>
+David Granqvist <david.granqvist@gmail.com>
+Ricardo Lopes <prplopes@gmail.com>
+harimohanraj89 <hari.mohanraj89@gmail.com>
+Ruben Bridgewater <BridgeAR@users.noreply.github.com>
+Shoshomiga <richard@xelerium.net>
+John Wang <johnw424@gmail.com>
+Richard Kho <hello@richardkho.com>
+John Giudici III <john.giudici.iii@gmail.com>
+Binh Nguyen <rbtnguyen@gmail.com>
+Luca Moser <moser.luca@gmail.com>
+Gennaro Del Sorbo <gennarodelsorbo@icloud.com>
+Manuel Darveau <manueldarveau@gmail.com>
+jub3i <anon66@gmail.com>
+vilicvane <i@vilic.info>
+Victor Zeng <victor.zeng@styluxinc.com>
+Pete Mertz <pmertz@circle.com>
+Matthias Dietrich <perl@rb.ly>
+Chase <chase@sillevis.net>
+tvoronov <tvoronov@infusion.com>
+Noah Chase <nchase@gmail.com>
+Alex Turek <alexturek@users.noreply.github.com>
+Manuel Darveau <mdarveau@8d.com>
+Mike Groseclose <mike.groseclose@gmail.com>
+XadillaX <admin@xcoder.in>
+Ben Stephenson <ben@undesk.co>
+mickael couzinet <mcouzinet@gmail.com>
+Derek Barnes <derek@bigbento.com>
+saneki <s@neki.me>
+Pedro Pereira <pmh.pereira@gmail.com>
+Brian Lauber <constructible.truth@gmail.com>
+syldor <dorey.sylvain@gmail.com>
+Idris Mokhtarzada <idris.m@gmail.com>
+Luke265 <n.lukas265@gmail.com>
+Francisco Cardoso <francisco@bitreserve.org>
+hkulkarni <hariprasad.kulkarni@effiser.com>
+Petar Koretić <petar.koretic@gmail.com>
+Jimmy Gong <gong.jim@gmail.com>
+Fred K. Schott <fkschott@gmail.com>
+Cameron Pitt <cpitt@users.noreply.github.com>
+Sanketh Katta <sanketh@smartcar.com>
+Justin Houk <jhouk@rapid7.com>
+Safonov Nikita <ns3777k@gmail.com>
+Jonathan Davis <jdstep23@gmail.com>
+MrVoltz <MrVoltz@users.noreply.github.com>
+Geoffrey Plitt <geoff@gweb.org>
+Markus Hedlund <znarkus@gmail.com>
+Sunshine Yin <sunshine.w.yin@gmail.com>
+Jason Murad <jason.murad@electronifie.com>
+soundyogi <soundyogi@gmail.com>
+Chris Rinaldi <cgrinaldi@gmail.com>
+Pranav Raj S <pranavrajs@users.noreply.github.com>
+John Giudici <jgiudici@devonit.com>
+Jeff Lee <leejeffc@gmail.com>
+Joseph Page <josephpage@users.noreply.github.com>
+shakib bawa <shakibb@zillow.com>
+Mike Ringrose <mike.ringrose@myfilip.com>
+Richard Comley <richard.comley@news.co.uk>
+David Langer <mail@davidlanger.de>
+Gustav Pursche <pursche@posteo.de>
+Jamel Toms <jameltoms@gmail.com>
+Tim Perry <pimterry@gmail.com>
+Daniel Friesen <daniel@nadir-seen-fire.com>
+rosston <ross.brandes@appropos.com>
+Eamonn McHugh-Roohr <eamonn.m.r@gmail.com>
+Tim Perry <tim.perry@softwire.com>
+joao.bortolozzo <joao.bortolozzo@objective.com.br>
+Sami Jaktholm <sjakthol@outlook.com>
+Kenneth Kouot <kenneth@techmatehq.com>
+wilsonianb <bwilson@ripple.com>
+Christian Holm <holm@podio.com>
+Urs Wolfer <uwolfer@fwo.ch>
+Alexey Torkhov <atorkhov@gmail.com>
+Gustav Pursche <gustavpursche@gmail.com>
+Jim O'Brien <jim@lens.io>
+oznu <dev@oz.nu>
+Ghost141 <kidd747@gmail.com>
+elvo86 <elliot@thevos.es>
+Sean Herman <seanherman@gmail.com>
+Gustavo Henke <gustavo@injoin.com.br>
+Fengda Huang <phodal@users.noreply.github.com>
+Fräntz Miccoli <frantz.miccoli@fakedomain.com>
+smihica <smihica@gmail.com>
+Sorin Neacsu <sorin.neacsu@gmail.com>
+Carter Chung <carterchung@users.noreply.github.com>
+superclarkk <github-superclarkk@netaxiom.net>
+Johannes Würbach <johannes.wuerbach@googlemail.com>
+Stan S <ysagal+git@gmail.com>
+Stan <ysagal@users.noreply.github.com>
+Michael Kearns <mike.john.kearns@gmail.com>
+Diosney Sarmiento <diosney.s@gmail.com>
+Joseph Page <joseph.page@rednet.io>
+Ivan Postic <biber.np@gmail.com>
+Kevin Woo <kevinwoo@luxe.com>
+laggingreflex <laggingreflex@gmail.com>
+Alessandro Zanardi <alessandro@zanardi.org>
+Jaryd Carolin <prods3@gmail.com>
+Rodrigo de Almeida Pereira <contato@rodrigo-pereira.net>
+Andy White <greatwhitehope@gmail.com>
+Aniket Panse <aniket@getpostman.com>
+wKich <wKich@users.noreply.github.com>
+Brandon Dail <Aweary@users.noreply.github.com>
+Clement Teule <clement@infoteria.com>
+Hack Reactor Students <accounts@hackreactor.com>
+jessicalc <jessica@crayoncollective.com>
+Mohamad mehdi Kharatizadeh <m_kharatizadeh@yahoo.com>
+Kenji Tayama <kenji.tayama@gmail.com>
+festo <gergely.munkacsy@gmail.com>
+Alex Booker <alexbooker@fastmail.im>
+= <bjones6@uoregon.edu>
+Ali Taheri <ali.taheri.m@gmail.com>
+superclarkk <superclarkk@users.noreply.github.com>
+Emil Janitzek <emil@pixel2.se>
+Tommy McLeroy <tmcleroy@gmail.com>
+Matt Liszewski <mliszewski@peachworks.com>
+Cody Rigney <codyrigney92@yahoo.com>
+william gueiros <williamgueiros@iMac-de-william.local>
+Tyler Mandry <tmandry@gmail.com>
+Tore Klock <alphapenguin73@gmail.com>
+Andrew Eddie <mamboblue@gmail.com>
+Nuno Sousa <nunofgs@gmail.com>
+jonnolen <jon.nolen+github@gmail.com>
+Tiago Ribeiro <tiago@bitreserve.org>
+Rob Raux <rraux@peachworks.com>
+Alejandro Oviedo <alejandro.oviedo.g@gmail.com>
+Trey Thomas <treythomas123@gmail.com>
+Frederik Nordahl Jul Sabroe <fs@blackwoodseven.com>
+Yogesh Choudhary <yogesum@gmail.com>
+James Kitamirike <jkc621@users.noreply.github.com>
+Chris Antaki <ChrisAntaki@gmail.com>
+User4martin <n>
+Samuel Beek <samuel.beek@gmail.com>
+Nick Matenaar <nick@prismatik.com.au>
+Adam Back <adam-back@users.noreply.github.com>
+User4martin <user4martin@mfriebe.de>
+Sébastien Requiem <sebastien.requiem@gmail.com>
+Dannii Willis <curiousdannii@gmail.com>
+Simon Paris <simon.paris.93@gmail.com>
+Horcrux <cyang@vip.deyi.com>
+Michael Robinson <michael.robinson@kiwirail.co.nz>
+Thiago Sigrist <sigrist@gmail.com>
+Michael Robinson <mike@pagesofinterest.net>
+Lewis Sobotkiewicz <lsobotkiewicz@kixeye.com>
+Brandon <brandontruong@udacity.com>
+Eric Thompson <etoreo@gmail.com>
+Jay Springate <jay.springate@gmail.com>
+Sebastian Wilzbach <seb@wilzba.ch>
+Felix Becker <felix.b@outlook.com>
+Limian Wang <limian.wang@gmail.com>
+Alex Schneider <alex@schneids.me>
+Jim Cook <github@visualxs.com>
+Luke Albao <lukealbao@gmail.com>
+Alrik Hausdorf <admin@morulia.de>
+Sushant <sushantdhiman@outlook.com>
+Gabe Isman <gabe.isman@gmail.com>
+Dallas Read <dallasread@users.noreply.github.com>
+Shoshomiga <admin@videoclip.bg>
+Aaron Nielsen <aaron@spitimage.com>
+Aaron Nielsen <spitimage@gmail.com>
+Nathan Marks <nathan@poweredbysearch.com>
+Jason Ku <jku@jasontku.com>
+Conner McNamara <connermcnamara@gmail.com>
+Matthew Scragg <scragg@gmail.com>
+Osagie <oedebiri@gmail.com>
+Thalis Kalfigkopoulos <thalis.kalfigkopoulos@here.com>
+Jay Prakash <jay.prakash1@gmail.com>
+Cristian Lupu <cristian.lupu@khez.ro>
+zapatek <zapatek@outlook.com>
+Ozum Eldogan <ozum@ozum.net>
+oss92 <mohamed.o.alnagdy@gmail.com>
+Sushant <sushantdhiman@users.noreply.github.com>
+Jérôme Steunou <jerome.steunou+github@gmail.com>
+Sam Kelleher <sam@samkelleher.com>
+mliszewski <mliszewski@users.noreply.github.com>
+Stefan Kleeschulte <mail@stefan-kleeschulte.de>
+Matthew Heck <matthewheck5@gmail.com>
+Robert Grimes <rmzgrimes@gmail.com>
+Augusto Franzoia <ajfranzoia@gmail.com>
+Nuno Sousa <nuno@uphold.com>
+tornillo <tornillov@gmail.com>
+Samuel Debionne <samuel-debionne@uiowa.edu>
+zhuqingling <zhuqingling@shangnatao.com>
+Karthik Viswanathan <karthik.ksv@gmail.com>
+Renato Elias <renato.elias@gmail.com>
+Stuart P. Bentley <stuart@testtrack4.com>
+Joshua Kennedy <josh@ponycode.com>
+taylorhakes <taylor@taylorhakes.com>
+Ashok Fernandez <ashok.fernandez@gmail.com>
+Martin Zagora <zaggino@gmail.com>
+EdwardGonzalez <ejgonzalezviera@gmail.com>
+Wong Yong Jie <yjwong92@gmail.com>
+Michael Kearns <michael.kearns@softwire.com>
+Rafis Ganeyev <rafisganeyev@gmail.com>
+Austin J. Alexander <austinjalexander@gmail.com>
+Caleb Bauermeister <caleb_bauermeister@mentor.com>
+Zihua Li <i@zihua.li>
+Connor Peet <connor@peet.io>
+Brendon Boshell <brendonboshell@gmail.com>
+Jozef Hartinger <jharting@redhat.com>
+djstroky <djstroky@yahoo.com>
+Jonatan Lundqvist <jontelm@hotmail.com>
+mcarboni-redant <mcarboni@redant.com>
+Michael Buckley <mbuckley@extensis.com>
+Mark Kornblum <mark.kornblum@gmail.com>
+Trey Thomas <trey@treythomas.me>
+Alexander Reiff <alexander.reiff@me.com>
+Kevin Mannix <kevin@verbalapp.co>
+Kyle Hotchkiss <kyle@kylehotchkiss.com>
+Juan Hoyos <juan.hoyosr@gmail.com>
+esteban.wagner <esteban.wagner@mi9.com.au>
+ming.deng <ming.deng@dji.com>
+Nick <newbiecraft@gmail.com>
+Alex Plescan <alexpls@gmail.com>
+david <david.rapin@gmail.com>
+Amin Ogarrio <amin.ogarrio@gmail.com>
+Travis Vander Hoop <travis.vanderhoop@nbcuni.com>
+Anton Drukh <adrukh@users.noreply.github.com>
+daniel sim <daniel_sim@data.gov.sg>
+Kevin Mannix <kmannix@bu.edu>
+Marcel Pursche <marcel.pursche@3dcontentlogistics.com>
+Michael Haselton <icereval@gmail.com>
+Daniel Pedersen <daniel@scandinav.se>
+Philip Patzer <philip.patzer@gmail.com>
+Vadim Kazakov <yads12@gmail.com>
+Ricardo Lopes <mail@ricardolopes.net>
+Alex Ahn <github@alexahn.com>
+loulin <lin.lou@hotmail.com>
+Christoph Werner <gonsfx@users.noreply.github.com>
+Will Anderson <will@willand.co>
+K.J. Valencik <kjvalencik@gmail.com>
+Bertola Lucas <lucasBertola@users.noreply.github.com>
+Yoyo Zhou <yozhov@gmail.com>
+Giancarlo <giancarlo@smartlogic.io>
+Denis C de Azevedo <denis.azevedo@gmail.com>
+Angelo Paolo Obispo <angelopaolo.obispo@gmail.com>
+Erich <erichbschulz@gmail.com>
+gtelljohann <g.telljohann@gmail.com>
+Cristi Scheye <cristi.scheye@gmail.com>
+Michael Kelley <mkelley82@gmail.com>
+Lewis Sobotkiewicz <lewis.sobot@gmail.com>
+Junliang Huang <JLHwung@users.noreply.github.com>
+Tom Jenkinson <tjenkinson@users.noreply.github.com>
+Randall Crock <rlcrock@gmail.com>
+overlookmotel <overlookmotel@users.noreply.github.com>
+Rui Marinho <ruipmarinho@gmail.com>
+Ryan Thomas <Ryan.Thomas@rhinobyte.com>
+Westley Argentum Hennigh-Palermo <WestleyArgentum@gmail.com>
+Michael D. Stemle, Jr <themanchicken@gmail.com>
+ivo-stefchev <ivakaetuk@gmail.com>
+Ryer Wong <ryerh@live.com>
+Yaohan Chen <yaohan.chen@gmail.com>
+Kevin Simper <kevin.simper@gmail.com>
+cristoforo <cristoforo.mione@gmail.com>
+Cao Jiannan <frogcjn@163.com>
+mabeebam <mabeebam@users.noreply.github.com>
+Kieron Wiltshire <kieron.wiltshire@outlook.com>
+elliotthill <elliott.hill@gmail.com>
+Jozef Hartinger <jozefhartinger@gmail.com>
+Brody Chen <rufengch@gmail.com>
+Acker Dawn Apple <AckerApple@users.noreply.github.com>
+ivesdebruycker <ives.debruycker@gmail.com>
+Connor Hindley <conn.hindley@gmail.com>
+Eric Koslow <ekoslow@gmail.com>
+hendrul <hendrul@gmail.com>
+Ryan Lewis <ryanharrisonlewis@gmail.com>
+GongYi <topikachu@163.com>
+Simeon Theobald <simeon.theobald@gmail.com>
+Emmet McPoland <emcpoland@gmail.com>
+John <oznu@users.noreply.github.com>
+Jonathan <pollak.jonathan@gmail.com>
+Josh Rickert <rickertjosh@gmail.com>
+Michał Wadas <michalwadas@gmail.com>
+Alexander Mochalin <horroshow@mail.ru>
+fogine <fogine@users.noreply.github.com>
+OKNoah <OKNoah@users.noreply.github.com>
+Faris Masad <farismasad@gmail.com>
+Kevin Lacker <kevin@parse.com>
+p512 <p512@users.noreply.github.com>
+turbofoxwave <turbofoxwave@gmail.com>
+Erik Seliger <eseliger@uni-bremen.de>
+Todd Bluhm <toddbluhm@gmail.com>
+Jeremy Morton <github@game-point.net>
+Jonathon Munsell <munsellj@gmail.com>
+Paul Bombo <pbombo@gmail.com>
+Francesco Infante <francesco@linkurio.us>
+Adam Williams <kainolophobia@gmail.com>
+Per Gullberg <per@eprodukter.se>
+Harshith Kashyap <harshithkashyap@yahoo.com>
+Tim Scott <tscott@lunaversesoftware.com>
+Nathan Schwartz <nathan.schwartz95@gmail.com>
+Yu Qi <iyuq@outlook.com>
+contra <contra@users.noreply.github.com>
+Robert Scheinpflug <neversun@users.noreply.github.com>
+Bryan Sapot <bsapot@users.noreply.github.com>
+Chris Coggburn <noderat@users.noreply.github.com>
+legomind <legomind@gmail.com>
+Michael Gauthier <mike.gauthier@gmail.com>
+Lukas Spieß <lumaxis@users.noreply.github.com>
+David Tsai <david@zhurosoft.com>
+daleoooo <daleoooo@users.noreply.github.com>
+Antonio Begines <abegines@users.noreply.github.com>
+yjhuoh <yjhuoh@users.noreply.github.com>
+TimMurnaghan <tim@analyticrisktechnology.co.uk>
+Muhammad AbdulMoiz <abdulmoizeng@gmail.com>
+Nicholas Drane <nicholasDrane@gmail.com>
+Robert Kieffer <robert@broofa.com>
+Ash Lux <ashlux@gmail.com>
+Brian Woodward <brian.woodward@gmail.com>
+Daniel Hayes <danielhayes5@gmail.com>
+Miguel Ruiz <myguelruiz@gmail.com>
+Todd Wolfson <todd@twolfson.com>
+LoneWolfPR <LoneWolfPR@users.noreply.github.com>
+C. T. Lin <chentsulin@gmail.com>
+Pedro Branco <pedrobranco@users.noreply.github.com>
+elasticsearcher <elasticsearcher@users.noreply.github.com>
+Artem <witem.artem@gmail.com>
+Maks Nemisj <maks@nemisj.com>
+Nicholas W Fortner <nwfortner@gmail.com>
+Michael Kaufman <mkaufmaner@gmail.com>
+Cyrus Bowman <cyrusbow@gmail.com>
+Youngrok Kim <rok0810@gmail.com>
+Jiepei Min <vickymin@users.noreply.github.com>
+Stefano Dalpiaz <ste.dalpiaz@gmail.com>
+Nate Silva <natesilva@users.noreply.github.com>
+Fabio Espinosa <fa.espinosa10@uniandes.edu.co>
+Weston Siegenthaler <Westons+github@gmail.com>
+Jedediah Smith <jedsmith13@gmail.com>
+Cezar Berea <cezar-berea@users.noreply.github.com>
+Vu Bui <vdb34@drexel.edu>
+Daniel Sim <daniel.ssq89@gmail.com>
+Konstantin Meiklyar <k.meiklyar@gmail.com>
+Julian Meyer <julianmeyer2000@gmail.com>
+Wing Lian <wing.lian@gmail.com>
+Mentor Palokaj <mentor@palokaj.co>
+Seshadri Mahalingam <seshadri.mahalingam@gmail.com>
+Bartosz Łęcki <bartosz.lecki@netguru.pl>
+Andrew Hookom <strangefrond@users.noreply.github.com>
+Connor Clark <cjamcl@gmail.com>
+Viliam Jobko <viliam.jobko@gmail.com>
+Jesse Atkinson <jesse@jsatk.us>
+Arik Fraimovich <arik@arikfr.com>
+contactakagrawal <contactakagrawal@gmail.com>
+Louis-Rémi Babé <lrbabe@gmail.com>
+Satvik Sharma <ramblingenzyme@users.noreply.github.com>
+Alexsey <agat00@gmail.com>
+Christopher Lis <christopher4lis@users.noreply.github.com>
+anthony de silva <anthonymds@hotmail.com>
+Lucas Vieira <vieiralucas@users.noreply.github.com>
+Alexander James Phillips <ajp.global@gmail.com>
+Laurent VB <LaurentVB@users.noreply.github.com>
+Martin H. Bramwell <martinhbramwell@gmail.com>
+Azeem Bande-Ali <A.BandeAli@gmail.com>
+Dana Woodman <dana@danawoodman.com>
+YoussefOuirini <youssefouirini@gmail.com>
+Damian Bushong <damianb@users.noreply.github.com>
+Even <hieven.c@gmail.com>
+Nick Schultz <nrschultz@gmail.com>
+Kevin Kwa <altern8tif@users.noreply.github.com>
+Doug Patti <douglas.patti@gmail.com>
+Ivan Montiel <idmontie@gmail.com>
+Alberto Souza <alberto.souza.99@gmail.com>
+Leroy Witteveen <leroydev@users.noreply.github.com>
+renaudholcombe <renaudholcombe@users.noreply.github.com>
+ezelohar <ezelohar@gmail.com>
+o-pikozh <o-pikozh@users.noreply.github.com>
+Pete Peterson <jedipetey@gmail.com>
+reinerBa <reinerbam@mailbox.org>
+Scott Rocha <s.rocha@pc-serv.ca>
+ShaunParsons <ShaunP1989@Gmail.com>
+Keo Lin <linkeo@qq.com>
+Chris Kalmar <christian.kalmar@gmail.com>
+clncln1 <nico.haller@gmail.com>
+Oleg Ozimok <oleg.tukavin@gmail.com>
+Erik Seliger <erikseliger@me.com>
+Skylar Graika <swordfish444@users.noreply.github.com>
+Joshua Cullen <joshua.cullen@luxgroup.com>
+Garry Polley <garrympolley@gmail.com>
+Jon Koon <jondkoon@gmail.com>
+Michael Rosata <mrosata@users.noreply.github.com>
+Paul Bienkowski <pb@opatut.de>
+Grigory <tomfun1990@gmail.com>
+Anshul Mittal <anshulmittal0409@gmail.com>
+Harish K <harish2704@gmail.com>
+William Cheung <indreamhk@gmail.com>
+Eugene Shilin <e.shilin@paralect.com>
+Jeremy Dagorn <jeremy.dagorn@gmail.com>
+John Schulz <github.com@jfsiii.org>
+miclill <miclill@users.noreply.github.com>
+Nick Slocum <nslocum@gmail.com>
+Dan Rumney <dancrumb@gmail.com>
+Chad Huntley <chadhuntley@gmail.com>
+Timshel Knoll-Miller <yazshel@users.noreply.github.com>
+Caíque de Castro Soares da Silva <caiquecastro@outlook.com>
+Cameron Reid <csreid.cr@gmail.com>
+Brett Vitaz <brett@vitaz.net>
+Guillaume GRIMBERT <ggrimbert@kimoce.com>
+Johan Sandmark <johansandmark@gmail.com>
+Carlos Weckesser <cweckesser@users.noreply.github.com>
+Lars Tijhuis <ljtijhuis@gmail.com>
+木士羽 <lext-7@users.noreply.github.com>
+Satana Charuwichitratana <micksatana@live.com>
+Ilia Ermolin <dotpack@gmail.com>
+Maurice Ronet Dominguez <maurice.ronet.dominguez@gmail.com>
+Aleksandr <nixomsk@gmail.com>
+Turanchoks <ipuncho@gmail.com>
+Axetroy <troy450409405@gmail.com>
+Gareth Flowers <garethflowers@users.noreply.github.com>
+Yoni Jah <yonjah+github@gmail.com>
+Amjad Masad <amjad.masad@gmail.com>
+Yu Qi <njuyuqi@gmail.com>
+Gabe Gorelick <gabegorelick@gmail.com>
+DC <danconnell@users.noreply.github.com>
+Matej Jellus <juffalow@juffalow.com>
+knibb800 <32358232+knibb800@users.noreply.github.com>
+Marshall Thompson <marshall@creativeideal.net>
+Austin deBruyn <austin.debruyn@gmail.com>
+Veekas Shrivastava <veekas@users.noreply.github.com>
+Pravdomil <pravdomil.toman@gmail.com>
+ydamani <yashesh@fullstacklabs.co>
+Damian <visualfanatic@users.noreply.github.com>
+Tyler Watson <tylerjwatson@users.noreply.github.com>
+Brendan Jurd <direvus@gmail.com>
+Dan Chung <danchung90@gmail.com>
+netsgnut <284779+netsgnut@users.noreply.github.com>
+cbauerme <cbauerman+github2@gmail.com>
+mrHoliday <ilia.aptsiauri@gmail.com>
+David Beitey <david@davidjb.com>
+up9cloud <up9cloud.net@gmail.com>
+wjh000123 <wjh000123@gmail.com>
+gavrilyak <gavrilyak@gmail.com>
+Jonathan Chen <dijonkitchen@users.noreply.github.com>
+Mickael Burguet <bash88@gmail.com>
+gfranco93 <guillef.93@gmail.com>
+Zhanwen "Phil" Chen <phil.zhanwen.chen@gmail.com>
+Dan Siroky <dansiroky@gmail.com>
+Andrii Muzalevskyi <amuzalevskiy@users.noreply.github.com>
+TarekAlQaddy <tarek.alqaddy@gmail.com>
+Ali Essam <ali.essam.arafa@gmail.com>
+Laurens <laurensdc@gmail.com>
+arcdev1 <arcdev1@users.noreply.github.com>
+Mars Wong <marswong618@gmail.com>
+Jonas Zhang <106856363@qq.com>
+Joe Miller <joemillervi@gmail.com>
+musicformellons <musicformellons@users.noreply.github.com>
+Grant Carthew <grant@carthew.net>
+Karthic Madanagopal <karthic.madanagopal@gmail.com>
+Ivan Akulov <iamakulov@outlook.com>
+markablov <mark.ablov@gmail.com>
+Ilyes Hermellin <yachaka@gmail.com>
+willrpike <pike.wil@gmail.com>
+Ian Sutherland <ian@iansutherland.ca>
+Oscar Reyes <nosthertus@gmail.com>
+Martin Gutfeldt <martingutfeldt@gmail.com>
+Ratanak Lun <ratanakvlun@gmail.com>
+Wanny Miarelli <wannymiarelli@live.com>
+Peggy Li <hi@lipeggy.com>
+Andrew Balakirev <balakirev.andrey@gmail.com>
+Michael McCabe <mccabemj@users.noreply.github.com>
+木士羽 <lext.nobody@outlook.com>
+Michael McCabe <michaelmccabe@hotmail.co.uk>
+Jorrit Schippers <jorrit@ncode.nl>
+Luke Gumbley <luke-gumbley@users.noreply.github.com>
+Michael Storgaard <git@mex.io>
+Mikko Kautto <mkautto@users.noreply.github.com>
+Claire L <iamchangxx@gmail.com>
+tim-soft <tim-soft@users.noreply.github.com>
+Gareth Oakley <gazoakley@users.noreply.github.com>
+Christian Holm <cho@cubitech.dk>
+cavalor <max.cavalor@gmail.com>
+Krishna Biradar <kr5hn4@users.noreply.github.com>
+Jourdan Rodrigues <thiagojourdan@gmail.com>
+Rodrigo O <rodorgas@users.noreply.github.com>
+Kirill <kirill89@gmail.com>
+Aaron Williams <aceew@users.noreply.github.com>
+Alan Bueno <alanbueno8@gmail.com>
+Jeremy Fowler <jeremy.f76@gmail.com>
+Håkon Solbjørg <hlsolbjorg@gmail.com>
+Varga Zsolt <hello@hisorange.me>
+Jacob Robertson <g.jacob.robertson@gmail.com>
+Andrii Stepaniuk <andriis@users.noreply.github.com>
+Jaime Pillora <jpillora@gmail.com>
+Timothée Alby <timothee.alby@gmail.com>
+tobybro32 <tyhs1414@gmail.com>
+Manan Vaghasiya <manV@users.noreply.github.com>
+Chris Jensen <code@chrisjensen.info>
+Dylan Lingelbach <dylan.lingelbach@gmail.com>
+barsheshet <guy.barsheshet@nielsen.com>
+Konstantin Kutsevalov <adamasantares@yandex.ru>
+maayany_h <maayan.hoffman@gmail.com>
+SLOBYYYY <szabolcs.maj@gmail.com>
+joshuacullen <joshua.cullen111@gmail.com>
+Soumya Ranjan Mohanty <webgene@users.noreply.github.com>
+Michael Yates <michael@fivehourswest.com.au>
+Andrew Hessler-Loch <andrewhessloch@gmail.com>
+Andy Edwards <jedwards@fastmail.com>
+Chris Streeter <streeter@users.noreply.github.com>
+Yaroslav Repeta <yaroslav.repeta@gmail.com>
+Alexander Sergyeyev <tuktun@users.noreply.github.com>
+Alejandro Aguirre <presaguirre@gmail.com>
+Maxime Suret <maxime.suret@gmail.com>
+Scott BonAmi <1145657+sbonami@users.noreply.github.com>
+Jahil Khalfe <jahilgk@gmail.com>
+Ducky Hong <pacifings@gmail.com>
+Matt <mjcmatrix@gmail.com>
+Richard Kemp <sylv3r@pm.me>
+Mirko Jotic <joticmirko@gmail.com>
+ylambda <ylambda@koalabeast.com>
+jony89 <ariel@emath.co.il>
+Bünyamin Benny Genel <bennygenel@gmail.com>
+Mrinal Purohit <mrinal1892005@gmail.com>
+u9r52sld <u9r52sld@users.noreply.github.com>
+Tommy Montgomery <tmont@users.noreply.github.com>
+Pavel Kabakin <kim110488@gmail.com>
+Tomoyuki Tsujimoto <tomo.tsujimoto@gmail.com>
+Paul Mowat <paul@paulmowat.co.uk>
+Lawton Spelliscy <lawton@tribalscale.com>
+David DOLCIMASCOLO <david.dolcimascolo@gmail.com>
+Benjamin Lacy <benlacy5@gmail.com>
+Ali Ismayilov <ali@ismailov.info>
+Marco Barcellos <marcogbarcellos@gmail.com>
+Marco Amado <mjamado@dreamsincode.com>
+DivX.Hu <wishgood@gmail.com>
+andrewAtPaymentRails <39348113+andrewAtPaymentRails@users.noreply.github.com>
+Dario <dario1985@users.noreply.github.com>
+Evans Hauser <evanshauser@gmail.com>
+Antoine Pham <MystK@users.noreply.github.com>
+Manish Demblani <mdemblani@gmail.com>
+Alex Korn <madworkscreation@gmail.com>
+Alastair Taft <AlastairTaft@users.noreply.github.com>
+Leonardo Gatica <lgaticaq@users.noreply.github.com>
+frlinw <frlinw@users.noreply.github.com>
+Takashi Sasaki <tsasaki609@gmail.com>
+Benji Koltai <koltaibenji@gmail.com>
+Peter Müller <munter@fumle.dk>
+Tiago Bonatti <tiago.bonatti@gmail.com>
+Cameron Moss <40439344+c-moss-talk@users.noreply.github.com>
+Nicolas Bouvrette <bouvrette.nicolas@gmail.com>
+Fernando Fabricio dos Santos <ferfabricio@gmail.com>
+ugogiordano87 <ugo.giordano@unina.it>
+Justin Kalland <43973143+justinkalland@users.noreply.github.com>
+Wei-Liang Liou <me@aliangliang.top>
+Pedro Augusto de Paula Barbosa <papb1996@gmail.com>
+Simon Schick <SimonSchick@users.noreply.github.com>
+Asutosh Palai <asupalai@gmail.com>
+nack43 <guringurin43@icloud.com>
+Pavel <me@pavelpolyakov.com>
+javiertury <javiertury@gmail.com>
+Igor Ovsiannikov <garek@mail.ru>
+Simon Schick <demwizzy@gmail.com>
+Diogo Simões <36140182+s1moe2@users.noreply.github.com>
+Vladlen <negezor@gmail.com>
+Tommy van der Vorst <tommy@pixelspark.nl>
+diego dupin <diego.dupin@mariadb.com>
+farisn <45453249+farisn@users.noreply.github.com>
+Michal Bryc <1891931+Furchin@users.noreply.github.com>
+Bryan Crowe <bryan@bryan-crowe.com>
+Samuela Keller <skellertor@gmail.com>
+zhangshichun <zhangshichun_looper@aliyun.com>
+Miroslav <miro95@gmail.com>
+Ivan Stumpf <ivanstumpf@gmail.com>
+joe beuckman <joe@beigerecords.com>
+Andrew Schmadel <schmod@users.noreply.github.com>
+Petar Ivancevic <petar.ivancevic171@gmail.com>
+Indospace.io <justin@indospace.io>
+Yazan Medanat <medanat@gmail.com>
+Igor Szymanski <igor.szymanski@me.com>
+Oliver Sayers <171312+SavageCore@users.noreply.github.com>
+Pedro Machado <lpedromachado@gmail.com>
+Rémy Dufour <remy.dufour@gmail.com>
+Val <Hrysa@users.noreply.github.com>
+Travis Haby <travis@guildeducation.com>
+Justin Abene <jabene@gmail.com>
+Andrey Goncharov <andrey.goncharov+it@protonmail.com>
+Julian Hundeloh <jaulz@users.noreply.github.com>
+Florian Herrengt <florian.herrengt@gmail.com>
+Benoit MERIAUX <bmeriaux@users.noreply.github.com>
+Yaroslav Admin <devoto13@gmail.com>
+Waldir Pimenta <waldyrious@gmail.com>
+amitaymolko <amitaymolko@gmail.com>
+Jesse Rosenberger <git@jro.cc>
+Sam Alexander <samalexander@users.noreply.github.com>
+Alex <alexframe@users.noreply.github.com>
+KillWolfVlad <KillWolfVlad@users.noreply.github.com>
+杨奕 <Leopoldthecoder@users.noreply.github.com>
+Jeff Bernstein <jeffreybbernstein@gmail.com>
+Philipp <ppetzold@users.noreply.github.com>
+Jonathan Hoyt <jonmagic@gmail.com>
+Tony Brix <tony@brix.ninja>
+Chocobozzz <chocobozzz@cpy.re>
+Andrew Heuermann <aheuermann@gmail.com>
+Martin <machstg@gmail.com>
+Mike Fowler <mike@mikefowler.me>
+Patrick Geyer <PatrickGeyer@users.noreply.github.com>
+Tony <toxuin@users.noreply.github.com>
+Thomas Egbert Duursma <thomasduursma@outlook.com>
+Sean Hagstrom <hagstromsg@gmail.com>
+Emmanuel Gautier <manu.gautier1394@gmail.com>
+Ægir Örn Símonarson <agirorn@gmail.com>
+Vitaliy Zaytsev <teh.kroleg@gmail.com>
+Abady <gamersspeaks@gmail.com>
+Wouter De Schuyter <wouter.de.schuyter@gmail.com>
+dy93 <dy93_@hotmail.com>
+Théo Frasquet <theo2354@users.noreply.github.com>
+Musiienko Serhii <serhiimusienko@gmail.com>
+JP Denford <jpdenford@users.noreply.github.com>
+Levi Bostian <levi.bostian@gmail.com>
+LittleSaya <2472609815@qq.com>
+VictorKunzler <VictorKunzler@users.noreply.github.com>
+Noah Chase <nchase@users.noreply.github.com>
+Will Hogben <will@dave.com>
+Corey Buckley <coreybuckley13@gmail.com>
+Zachary J. Rollyson <me@zjr.io>
+Chocobozzz <me@florianbigard.com>
+Jorge López Fernández <lopez.fernandez.jorge@gmail.com>
+Evgeniy <shook@live.ru>
+Matthew Williams <matthew.lloyd.williams@gmail.com>
+mannol <mannol@users.noreply.github.com>
+pch18 <pch18@qq.com>
+Niyobe <49311570+niyobe@users.noreply.github.com>
+Shoya Shiraki <12c1055@gmail.com>
+Ariel Barabas <810664+knoid@users.noreply.github.com>
+Mike <mrgcohen@gmail.com>
+Evan <thaddeusmt@users.noreply.github.com>
+Mike Sadowski <msadowsk@mail.uoguelph.ca>
+bparan <bparan@softserveinc.com>
+Gabe Gorelick <gabe@catalytic.com>
+Yuping Zuo <zypA13510@users.noreply.github.com>
+Aleksandr <Equals182@users.noreply.github.com>
+supperchong <2267805901@qq.com>
+James Jansson <jamesjansson@gmail.com>
+Gregory McLean <gdonaldsonmclean@gmail.com>
+Chris Jensen <2920476+chrisjensen@users.noreply.github.com>
+Liran Tal <liran.tal@gmail.com>
+Soonwoo Hong <qpseh2m7@gmail.com>
+Roman UNTILOV <51822105+roman-tek@users.noreply.github.com>
+Dany Ral <lendormi@users.noreply.github.com>
+Bill Li <billxinli@users.noreply.github.com>
+Jordan <jordan.pollard@live.com>
+Thomas Hoppe <thomas.hoppe@n-fuse.co>
+Raphaël Ricard <22248411+mrrinot@users.noreply.github.com>
+Pasha Riger <pashariger@users.noreply.github.com>
+wata-lb <kenji.watatani@l-is-b.com>
+Andreas Tschirpke <andreas.tschirpke@gmail.com>
+warkenji <warkenji.yukochi@gmail.com>
+Felix Wehnert <flashspys@gmail.com>
+PeledYuval <50297862+PeledYuval@users.noreply.github.com>
+Wender Pinto Machado <wenderpmachado@gmail.com>
+supperchong <supperchong@gmail.com>
+João Eiras <joao.carlos.eiras@tine.no>
+Kunal Nain <31940639+nainkunal933@users.noreply.github.com>
+Gal Jozsef <contact@dody.hu>
+Matheus Assis <adowtatepmar@gmail.com>
+sergey-kudriavtsev <head@ico-founder.com>
+George Maddocks <gmaddocks1@gmail.com>
+Hugo Des <hugo.deslongchamps@gmail.com>
+danetrata-bvsecurity <53787162+danetrata-bvsecurity@users.noreply.github.com>
+Mohammad Tahsin <41298152+tahsinature@users.noreply.github.com>
+Awwab Ul Haq <awwabhaq@gmail.com>
+2kindsofcs <42531877+2kindsofcs@users.noreply.github.com>
+milkwalk <1810542+milkwalk@users.noreply.github.com>
+Ponnar Sankar A <ssmnster@gmail.com>
+Paul Oldridge <poldridge@users.noreply.github.com>
+Mark Silverberg <mark@mark-s.net>
+Pedro Luiz Cabral Salomon Prado <pedroprado010@users.noreply.github.com>
+Phil Gebauer <github@phil-g.com>
+Samuli Asmala <samuli.asmala@gmail.com>
+ckeboss <mosesdog2@gmail.com>
+BenBenHu <benjamin658gae@gmail.com>
+Ricardo Proença <ricardo.proenca@uphold.com>
+Ivaylo Kirov <ivo.kirov@gmail.com>
+Luiz Victor Linhares Rocha <luizvictorlrocha@gmail.com>
+thesame <thesame.ml@gmail.com>
+Esteban Ibarra <eibarra1992@hotmail.com>
+SAURABH CHOPRA <schopra2607@gmail.com>
+Alejandro Corredor <aecorredor93@gmail.com>
+Martin Mena <mmena@stackbuilders.com>
+Jonatan Alexis Anauati <barakawins@gmail.com>
+wenpin <wpchou@outlook.com>
+James Dietz <james-dietz@users.noreply.github.com>
+brownman <brownman556@gmail.com>
+Huned Botee <24231+huned@users.noreply.github.com>
+Todd Bealmear <todd@users.noreply.github.com>
+Siddharth Udeniya <techguysid.23@gmail.com>
+Florian Schmidt <Floppy012@users.noreply.github.com>
+Pelle Jacobs <pellejacobs@hotmail.com>
+Shahbaz Tariq <shahbaz@ssst.co>
+Hang Jiang <jianghangscu@gmail.com>
+Ian Mathews <imathews@users.noreply.github.com>
+Darren "Dee" Lee <darrendouglas.lee@gmail.com>
+spinlud <ludovico.fabbri@gmail.com>
+Tyler <engelhardt.chevy@gmail.com>
+Oliver Emery <thrymgjol@gmail.com>
+Muhammed Kalkan <kalkanikbal@gmail.com>
+Eike  Lurz <eike.lurz@tuta.io>
+Andrew Vereshchak <andrew.vereshchak@gmail.com>
+Alan Koger <adkoge@users.noreply.github.com>
+andres112013 <andrescastellanos112013@gmail.com>
+Emiliano Gaston Delgadillo <emilianog.delgadillo@gmail.com>
+Wojtek <gosuhiman@gmail.com>
+segersniels <segers.n@hotmail.com>
+Colin Cheng <zbinlin@gmail.com>
+Tim Mensch <TimMensch@users.noreply.github.com>
+iamdi <helloiamdi@gmail.com>
+Fabian Krüger <krueger.fabian@gmail.com>
+MartinJLee <therhymeorange@gmail.com>
+Robin Baum <robinbuschmann@hotmail.de>
+Vidit Kothari <kothari.vidit@gmail.com>
+Ben Leith <benjamyn.leith@gmail.com>
+Chris Chew <chriskchew@users.noreply.github.com>
+McGrady Chen <mcgradycchen@users.noreply.github.com>
+Mohamed Nainar <mdnainar9615@gmail.com>
+Andrew Vereshchak <vereschak@gmail.com>
+Kenny D <xamarindevelopervietnam@outlook.com>
+Sam Dhondt <53523625+sam-dt@users.noreply.github.com>
+JacobLey <37151850+JacobLey@users.noreply.github.com>
+Luis <f1729@users.noreply.github.com>
+Juarez Lustosa <juarez.lustosa@gmail.com>
+Pankaj Vaghela <vpankaj1998official@gmail.com>
+SuHun Han <ssut@users.noreply.github.com>
+Ivan Rubinson <soryy708@gmail.com>
+Yufan Lou <2263580+louy2@users.noreply.github.com>
+Vyacheslav Aristov <vv.aristov@gmail.com>
+Sebastian Di Luzio <sebidiluzio@gmail.com>
+Thodoris Sotiropoulos <theosotr@windowslive.com>
+Marquitos <sonirico@users.noreply.github.com>
+Over Martinez <overmartinez@gmail.com>
+Mikxail <snmi@inbox.ru>
+Jose Miguel Colella <josecolella@yahoo.com>
+Adam Uhlíř <adam@uhlir.dev>
+Rémi Weislinger <2735603+closingin@users.noreply.github.com>
+Davide Mauri <damauri@microsoft.com>
+Shahar Hadas <shaharhd@gmail.com>
+Harry Yu <hy.harry.yu@gmail.com>
+Constantin Metz <58604248+Keimeno@users.noreply.github.com>
+Carson McManus <dyc3@users.noreply.github.com>
+Márton Csordás <csordasmarton92@gmail.com>
+Chris Northwood <cnorthwood@users.noreply.github.com>
+Patrick Carnahan <patrickcarnahan@github.com>
+Tommy Odom <tommy.odom@gmail.com>
+Daan Roet <DRoet@users.noreply.github.com>
+Hyunyoung Cho <zerohch0@gmail.com>
+Bagus Budi Cahyono <bagusbudy@gmail.com>
+Valetek <34715110+Valetek@users.noreply.github.com>
+Valentin Almeida--Lemaire <valentin.almeida@onrewind.com>
+Fernando Maia <2966576+fernandomaia@users.noreply.github.com>
+Vishal Sood <vishalsood1995@gmail.com>
+Piotr <karpik.pl@gmail.com>
+Stanley Ume <coolstanlee@gmail.com>
+Hiroki.Ihoriya <38400669+ia17011@users.noreply.github.com>
+Ajaz Ur Rehman <Fateslayer47@gmail.com>
+Ricky Curtice <kf6kjg@users.noreply.github.com>
+Tobias Büschel <13087421+tobiasbueschel@users.noreply.github.com>
+Jano Kacer <jan@vestberry.com>
+Sébastien BRAMILLE <2752200+oktapodia@users.noreply.github.com>
+Shivam Kalra <shivamkalra98@gmail.com>
+john gravois <jagravois@gmail.com>
+sliterok <korobatov2011@yandex.ru>
+William Gurzoni <william_luizat@hotmail.com>
+Augusto Amaral Pereira <guto_wow@hotmail.com>
+Hugo Denizart <thepoon@cartooncraft.fr>
+김성환 <kyle.hwan.k@gmail.com>
+Lorhan Sohaky <lorhansohaky@gmail.com>
+Tobin Brown <tobinjbrown@gmail.com>
+KapitanOczywisty <44417092+KapitanOczywisty@users.noreply.github.com>
+Amin Mahrami <amin.mahrami@yahoo.com>
+Sahil Rajput <sahilrajput03@gmail.com>
+Khinenw <deu07115@gmail.com>
+Emilio Cristalli <emiliocristalli@gmail.com>
+markvp <6936351+markvp@users.noreply.github.com>
+Daniel Schwartz <505433+danielschwartz@users.noreply.github.com>
+Sid <sidneyarci@gmail.com>
+Brian Schardt <35744893+brianschardt@users.noreply.github.com>
+AllAwesome497 <47748690+AllAwesome497@users.noreply.github.com>
+Mohab Abd El-Dayem <mohab.m.mohamed@gmail.com>
+Daren McCulley <mcculleydj@gmail.com>
+Fernando-Rodriguez <62259661+Fernando-Rodriguez@users.noreply.github.com>
+Nicolas Padula <nahog@msn.com>
+Gabriel Ramos <gabriel.luiz.ramos@gmail.com>
+Selenium39 <a895484122@gmail.com>
+wantao <wan.tao@cn.ricoh.com>
+roikoren755 <26850796+roikoren755@users.noreply.github.com>
+Laure Retru-Chavastel <laure.retru-chavastel@gadz.org>
+Abdul Raheem <Abdul.rahim8@hotmail.com>
+colpachoque <colpachoque@users.noreply.github.com>
+SunMyeong Lee <actumn814@gmail.com>
+Jairo Mancebo <jairolmr@hotmail.com>
+Shreyansh shrey <shreyansh.shrey1999@gmail.com>
+Peter Timoshevsky <fcFn@users.noreply.github.com>
+Joel Bradshaw <cincodenada@gmail.com>
+Anuj Joshi <anujjoshi63@gmail.com>
+Zach Azar <zach.azar@gmail.com>
+Felipe Silva <felipedevbrasil@gmail.com>
+Bene-Graham <35272170+Bene-Graham@users.noreply.github.com>
+Arneesh Aima <44923038+arneesh@users.noreply.github.com>
+caolvchong <caolvchong@gmail.com>
+atrick-speedline <51718553+atrick-speedline@users.noreply.github.com>
+George Zhao <zorji@users.noreply.github.com>
+Wesley Reed <reed.wesley.s@gmail.com>
+Sergio Bernal <sergioguillot@gmail.com>
+Alexey Lyakhov <justfly1984@gmail.com>
+salehdeh76 <salehdeh76@gmail.com>
+Kamalakannan Jayaraman <sincerekamal@gmail.com>
+Kamalakannan Jayaraman <kamalakannan.j@brillio.com>
+Jan Kleinert <jankleinert@gmail.com>
+Mykyta Lypniahov <80581736+aboutml@users.noreply.github.com>
+Ikko Ashimine <eltociear@gmail.com>
+Victor Korzunin <ifloydrose@gmail.com>
+Victor Korzunin <victor.korzunin@blanco.services>
+f[nZk] <fncolon@pm.me>
+dror-heller <drorheller@users.noreply.github.com>
+drorh <dror.heller@nielsen.com>
+Lukas Hroch <223967+lukashroch@users.noreply.github.com>
+pahadimunu <72349611+pahadimunu@users.noreply.github.com>
+Steve Schmitt <steve.schmitt@gmail.com>
+Abhishek Shah <abhishekshah5658@gmail.com>
+Cryptos <74561974+cryptosbyte@users.noreply.github.com>
+Bishwodahal <61019968+Bishwodahal@users.noreply.github.com>
+Matthew Blasius <matthew.blasius@gmail.com>
+Aman Jain <jn_aman@yahoo.com>
+l2ysho <solar.richard@gmail.com>
+Richard Solar <Solar>
+Deniz Kanmaz <denizkanmaz@users.noreply.github.com>
+Mattia Malonni <mattia.malonni@gmail.com>
+lzc <92916529+liangzhicheng0423@users.noreply.github.com>
+zhicheng.liang <zhicheng.liang@9amtech.com>
+Marces Engel <marces.engel@googlemail.com>
+Marces Engel <mengel@incoqnito.io>
+Sascha Depold <sdepold@ebay.com>
+Constantin Metz <constantin@metzworld.com>
+Adrien Boullé <adrien.boulle@gadz.org>
+Rick Bergfalk <rick.bergfalk@gmail.com>
+Daniel Durante <durango@users.noreply.github.com>
+Danny Sullivan <dbsullivan23@gmail.com>
+r253.hmdryou <r253.hmdryou@gmail.com>
+WeRDyin <heyin223@163.com>
+Jerry Zhou <33133448+Jerry-zhk@users.noreply.github.com>
+Sander Mol <Sandermol95@hotmail.com>
+sander-mol <SMol@thepeoplegroup.nl>
+vikas gupta <vikas.rg@somaiya.edu>
+Rik Smale <13023439+WikiRik@users.noreply.github.com>
+sschwenker <30476508+sschwenker@users.noreply.github.com>
+sschwenker <sschwenker@inmoment.com>
+Mohamed El Mahallawy <mmahalwy@gmail.com>
+Rafi Shamim <rafiss@gmail.com>
+Mukesh Suthar <mukeshsuthar336@gmail.com>
+Mukesh Suthar <mukesh@stepsetgo.com>
+Matthew Blasius <matthew.blasius@expel.io>
+WeRDyin <heyin223@gmail.com>
+Marco Gonzalez <marcogrcr@gmail.com>
+Rik Smale <WikiRik@users.noreply.github.com>
+manish kakoti <madguy02@users.noreply.github.com>
+Marco Kerwitz <marco@kerwitz.com>
+Jesse Peng <vijcp@outlook.com>
+Jesse Peng <jesse.peng@dynatrace.com>
+bishwodahal <bishwodahal123@gmail.com>
+Binit Kumar <bkumar@rocketsoftware.com>
+Binit Kumar <bkumar@waldevdbctpyl01.dev.rocketsoftware.com>
+Binit Kumar <AWADHAMBIKA@users.noreply.github.com>
+Zoé <zoe@ephys.dev>
+Sanyam Singhal <42322654+sanyamsinghal@users.noreply.github.com>
+Jonathan (JC) Chen <jc@dijonkitchen.org>
+John Mikolay <j.mikolay22@gmail.com>
+Adam Krebs <akre54@users.noreply.github.com>
+Zoé <hello@guylian.me>
+Drethic <drethic@msn.com>
+Дилян Палаузов <dpa-github@aegee.org>
+Ben Bernstein <benb116@gmail.com>
+Chris Crewdson <chriscrewdson@gmail.com>
+Sam Rui <rc0129@126.com>
+Florian Morello <arsonik@me.com>
+jesse23 <jessepeng@stockx.com>
+Shayon Mukherjee <shayonj@users.noreply.github.com>
+julien <42035819+jlmbrt@users.noreply.github.com>
+Anton <Feverqwe@users.noreply.github.com>
+Andre Azzolini <andre@azzolini.io>
+Dev Agrawal <devagrawal09@gmail.com>
+Chris Chudzicki <christopher.chudzicki@gmail.com>
+Joel Bradshaw <joel@vivor.com>
+brano543 <46269759+brano543@users.noreply.github.com>
+Vadim Nicolaev <vadim.vicolaev.v@gmail.com>
+Mark Irish <markdirish@gmail.com>
+Nikita Sychev <root@nsychev.ru>
+emilio-notable <60191184+emilio-notable@users.noreply.github.com>
+Guy Ellis <wildfiction@gmail.com>
+Guy Ellis <guy.ellis@walmartlabs.com>
+EtienneTurc <34250388+EtienneTurc@users.noreply.github.com>
+KreativJos <jos@kreativsoftware.com>
+Mark Irish <mirish@ibm.com>
+alluvm <44160042+alluvm@users.noreply.github.com>
+Gabriel Marmitt Linassi <gabrielm.linassi@gmail.com>
+San Mônico <alanderson_laird@yahoo.com.br>
+San 'rdn' Mônico <san@monico.com.br>
+lbitoy <lbitoy@users.noreply.github.com>
+Andreas Lind <andreaslindpetersen@gmail.com>
+DraftMan <contact@draftman.fr>
+beninsydney <99156635+beninsydney@users.noreply.github.com>
+Mike <19392121+mike-usa@users.noreply.github.com>
+bowei-hatch <89421372+bowei-hatch@users.noreply.github.com>
+PythonCoderAS <sarkaraoyan@gmail.com>
+Ross Harrison <rtharrison86@gmail.com>
+Johan Mattsson <39247600+mjunix@users.noreply.github.com>
+nholmes3 <69873985+nholmes3@users.noreply.github.com>
+SeongJaeSong <58547105+SeongJaeSong@users.noreply.github.com>
+Nikolay <antamohin@gmail.com>
+lishimin <beaceshimin@gmail.com>
+Amit Kumar <heroic@users.noreply.github.com>
+vansh <vansh7uppal@gmail.com>
+Vansh Uppal <59787404+joker00777@users.noreply.github.com>
+martineso <m.kontilov@gmail.com>
+William Bert <william.bert@gmail.com>
+Ana Margarida Silva <ams-amargarida@hotmail.com>
+Evan Rittenhouse <84083822+evanrittenhouse@users.noreply.github.com>
+Daryl Chan <6095637+dvrylc@users.noreply.github.com>
+Necromansr <maximkerimov88@gmail.com>
+JaoodxD <jaood96@gmail.com>
+JaoodxD <39469154+JaoodxD@users.noreply.github.com>
+Trond Marius Øvstetun <trond@ovstetun.no>
+Emmanuel Rodriguez <56197+emo-slido@users.noreply.github.com>
+Damian Gadomski <damian.gadomski@snowflake.com>
+bnorbi95 <norb.balogh@gmail.com>
+Andrii Kostenko <andrey@kostenko.name>
+Alex <alexgladin17@gmail.com>
+Reto Fahrni <82324518+retfah@users.noreply.github.com>
+Kevin Kee <kevinkee9@gmail.com>
+Sourav Singh Rawat <aidenfrostbite@gmail.com>
+Rik Smale <github@riksmale.info>
+Harry Kao <harry@hairycow.name>
+Luke Hart <50547373+lohart13@users.noreply.github.com>
+Bailey Kuebelbeck <71611929+baileykue@users.noreply.github.com>
+Ricardo Spear <spear.ricardo@gmail.com>
+Ricardo Spear <rspear@adventhealth.com>
+Markus Suonto <markus.suonto@eficode.com>
+Markus Suonto <markus.suonto@withsecure.com>
+elijahb <maurolewinzon@gmail.com>
+Ethan Setnik <esetnik@gmail.com>
+Evan Rittenhouse <evanrittenhouse@gmail.com>
+Chris <christinittyofc@gmail.com>
+rcronin <ryancronin23@gmail.com>
+lesion <lesion@autistici.org>
+Filip Havel <fhavel99@gmail.com>
+Edouard Benauw <edouardbenauw@gmail.com>
+Mateusz Burzyński <mateuszburzynski@gmail.com>
+Leon Semmens <35655841+Synthetic-Dev@users.noreply.github.com>
+siddhsql <127623723+siddhsql@users.noreply.github.com>
+Mhashh <77043440+Mhashh@users.noreply.github.com>
+Zayd Krunz <70227235+ShrootBuck@users.noreply.github.com>
+Nikolay <catamphetamine@users.noreply.github.com>
+Josh Watzman <github@jwatzman.org>
+Andreas Lind <andreas.lind@workday.com>
+Rakesh Lanjewar <36743306+rakeshlanjewar@users.noreply.github.com>
+Rakesh Lanjewar <rakesh.lanjewar@techalchemy.com>
+Hornwitser <github@hornwitser.no>
+Ajani Bilby <me@ajanibilby.com>
+Ben Sykes <me@sykesey.id.au>
+rcronin <rcronin@daytonfreight.com>
+Vinícius Stein Dahmer <30452636+viniciussdahmer@users.noreply.github.com>
+Vatroslav Vrbanic <v.vrbanic@cream.gmbh>
+Guillaume Gautreau <guillaume+github@ghusse.com>
+Guillaume Gautreau <guillaumeg@forestadmin.com>
+Lucas Bazetto <lucas.bazetto@gmail.com>
+Lucas Bazetto <l_bazetto@apple.com>
+ckvv <k_0520@qq.com>
+Katerina Skroumpelou <mandarini@users.noreply.github.com>
+Navid Naseri <navid.lee79@gmail.com>
+webdiscus <6752572+webdiscus@users.noreply.github.com>
+SEMICS <47321195+semics-tech@users.noreply.github.com>
+Oliver Breeden <oliver.breeden@mbihealth.com>
+Libright <n32717325@gmail.com>
+Leandro Costa <contato@leandrocosta.pro.br>
+Martin Slota <46676886+martinslota@users.noreply.github.com>
+Thiago F Pappacena <pappacena@gmail.com>
+Dazhuang <159422091+dazhuangc@users.noreply.github.com>
+Alex Escobedo <alejandro.escobedogarcia@workday.com>
+Miro Markaravanes <miromarkarian@gmail.com>
+Andrew Sidhu <SippieCup@users.noreply.github.com>
+Andrew Sidhu <sid@foyer.ai>
+James Kiefer <zinefer@gmail.com>
+Lukasz Jagielski <lukasz.jagielski@snowflake.com>
+Seho Lee <31482043+seho0808@users.noreply.github.com>
+
+# Generated by dev/update-authors.js

+ 21 - 0
CHANGELOG.md

@@ -0,0 +1,21 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# [7.0.0-alpha.46](https://github.com/sequelize/sequelize/compare/v7.0.0-alpha.45...v7.0.0-alpha.46) (2025-03-22)
+
+### Bug Fixes
+
+- **cli:** remove redundant types export in package.json ([#17781](https://github.com/sequelize/sequelize/issues/17781)) ([2391263](https://github.com/sequelize/sequelize/commit/2391263eaa09ae8c3fe1ce624b3f696ccfae8501))
+- **core:** fix issues with composite PK in `findByPk` ([#17747](https://github.com/sequelize/sequelize/issues/17747)) ([dd587cb](https://github.com/sequelize/sequelize/commit/dd587cb86a1b636cdc9cc490c9325e2f6e7640a8))
+- **core:** fix msg of error thrown when decorating a non-model ([#17745](https://github.com/sequelize/sequelize/issues/17745)) ([c43c270](https://github.com/sequelize/sequelize/commit/c43c2708d75535edd0fd78e990884a3e38f2fb0d))
+- **core:** proper check upsert support in query-interface ([#17358](https://github.com/sequelize/sequelize/issues/17358)) ([68d7d75](https://github.com/sequelize/sequelize/commit/68d7d758671e0f80bafd68c6980be9dc818683fd))
+- **postgres:** correct existing enum type matching ([#17576](https://github.com/sequelize/sequelize/issues/17576)) ([425d217](https://github.com/sequelize/sequelize/commit/425d21718af40f86015f6496ea6cf721cc61b981))
+- **postgres:** update to postgres 17 ([#17740](https://github.com/sequelize/sequelize/issues/17740)) ([b5c2b26](https://github.com/sequelize/sequelize/commit/b5c2b2667004b3b27e5634c677507f5593987938))
+- update typescript to v5.8.2 ([#17728](https://github.com/sequelize/sequelize/issues/17728)) ([6c5a82d](https://github.com/sequelize/sequelize/commit/6c5a82dbc82ec45bbe85112c51e1b496f3f7dbaa))
+
+### Features
+
+- **core:** add `sql.join` & improve `sql.identifier` ([#17744](https://github.com/sequelize/sequelize/issues/17744)) ([e914861](https://github.com/sequelize/sequelize/commit/e914861c084ef0ed8f12ca7b59be4965326e9641))
+- **core:** count grouped rows ([#17751](https://github.com/sequelize/sequelize/issues/17751)) ([a396673](https://github.com/sequelize/sequelize/commit/a396673b4edad0d3d3379111a3b1cbf3695d22cc))

+ 68 - 0
CODE-OF-CONDUCT.md

@@ -0,0 +1,68 @@
+# Code of Conduct
+
+All participants of Sequelize are expected to abide by our Code of Conduct,
+both online (be it on GitHub, Slack, and others) and during in-person events (such as meetups) that are hosted and/or associated with Sequelize.
+
+## The Pledge
+
+In the interest of fostering an open and welcoming environment, we pledge to make participation in our project
+and our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability,
+ethnicity, sex characteristics, gender identity and expression, level of experience, education, socioeconomic status,
+nationality, personal appearance, race, caste, color, religion (or lack thereof), or sexual identity and orientation.
+
+## The Standards
+
+Examples of behaviour that contributes to creating a positive environment include:
+
+- Using welcoming and inclusive language.
+- Demonstrating empathy and kindness toward other people.
+- Referring to people by their preferred pronouns and using gender-neutral pronouns when uncertain.
+- Being respectful of differing viewpoints and experiences.
+- Giving and gracefully accepting constructive feedback.
+- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience.
+
+Examples of unacceptable behaviour by participants include:
+
+- Trolling, insulting or derogatory comments, and personal or political attacks.
+- Public or private harassment.
+- Publishing others' private information, such as a physical or electronic address, without explicit permission.
+- Not being respectful to reasonable communication boundaries, such as 'leave me alone,' 'go away,' or 'I’m not discussing this with you.'.
+- The use of sexualized language or imagery, and sexual attention or advances of any kind.
+- The use of disturbing language or imagery.
+- Assuming or promoting any kind of inequality including but not limited to: age, body size, disability, ethnicity,
+  gender identity and expression, nationality and race, skin color, personal appearance, religion, or sexual identity and orientation.
+- Other conduct which you know could reasonably be considered inappropriate in a professional setting.
+
+We pledge to prioritize marginalized people’s safety over privileged people’s comfort. We will not act on complaints regarding:
+
+- ‘Reverse’ -isms, including ‘reverse racism,’ ‘reverse sexism,’ and ‘cisphobia’
+- Reasonable communication of boundaries, such as 'leave me alone,' 'go away,' or 'I’m not discussing this with you.'
+- Someone’s refusal to explain or debate social justice concepts
+- Criticisms of racist, sexist, cissexist, or otherwise oppressive behavior or assumptions
+
+## Enforcement
+
+Violations of the Code of Conduct may be reported by, but is not limited to, [contacting a member of the team](./CONTACT.md), and using the "report content" feature on GitHub.
+All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances.
+The project team is obligated to maintain confidentiality with regard to the reporter of an incident.
+
+The project team is responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate
+and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
+Corrective actions may go up to and including a temporary ban or permanent expulsion from the community without warning.
+
+The project team has the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues,
+and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
+
+## Addressing Grievances
+
+If you feel you have been falsely or unfairly accused of violating this Code of Conduct, you should notify one of the members of the team
+with a concise description of your grievance. Your grievance will be handled in accordance with our existing governing policies.
+
+## Attribution
+
+This Code of Conduct is adapted from:
+
+- [dev.to's code of conduct](https://dev.to/code-of-conduct)
+- [Geek Feminism](https://geekfeminismdotorg.wordpress.com/about/code-of-conduct/)
+- [Contributor Covenant, version 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/)
+- [Berlin Code of Conduct](https://berlincodeofconduct.org/)

+ 14 - 0
CONTACT.md

@@ -0,0 +1,14 @@
+# Contact Us
+
+In some cases you might want to reach the maintainers privately. These can be reporting a security vulnerability or any other specific cases.
+You can use the information below to contact maintainers directly. We will try to get back to you as soon as possible.
+
+## Via Email
+
+- **Sascha Depold** sascha@depold.com
+- **Zoé Cox** zoe@ephys.dev (accepts CoC violation reports, security reports)
+- **Rik Smale** sequelize@riksmale.info (accepts CoC violation reports, security reports)
+
+## Via Slack
+
+Most of the team is also reachable privately through [our Slack](https://sequelize.org/slack)

+ 12 - 0
CONTRIBUTING.DOCS.md

@@ -0,0 +1,12 @@
+# Documentation
+
+The sequelize documentation is divided in two parts:
+
+- Tutorials, guides, and example based documentation are written in Markdown
+- The API reference is generated automatically from source code comments and types with [TypeDoc](https://typedoc.org/).
+
+The tutorials, written in markdown, are located at the [website repository](https://github.com/sequelize/website).
+
+To generate the API reference locally, run `yarn docs` and open the generated `.typedoc-build/index.html` in your favorite browser.
+
+The whole documentation is rendered using [Docusaurus](https://docusaurus.io/) and continuously deployed to https://sequelize.org. See the [website repository](https://github.com/sequelize/website) for more information.

+ 282 - 0
CONTRIBUTING.md

@@ -0,0 +1,282 @@
+# Introduction
+
+We are happy to see that you might be interested in contributing to Sequelize! There is no need to ask for permission to contribute. For example, anyone can open issues and propose changes to the source code (via Pull Requests). Here are some ways people can contribute:
+
+- Opening well-written bug reports (via [New Issue](https://github.com/sequelize/sequelize/issues/new/choose))
+- Opening well-written feature requests (via [New Issue](https://github.com/sequelize/sequelize/issues/new/choose))
+- Proposing improvements to the documentation (via [New Issue](https://github.com/sequelize/sequelize/issues/new/choose))
+- Opening Pull Requests to fix bugs or make other improvements
+- Reviewing (i.e. commenting on) open Pull Requests, to help their creators improve it if needed and allow maintainers to take less time looking into them
+- Helping to clarify issues opened by others, commenting and asking for clarification
+- Answering [questions tagged with `sequelize.js` on StackOverflow](https://stackoverflow.com/questions/tagged/sequelize.js)
+- Helping people in our [public Slack channel](https://sequelize.slack.com/) (note: if you don't have access, get yourself an invite automatically via [this link](https://sequelize.org/slack))
+
+Sequelize is strongly moved by contributions from people like you. All maintainers also work on their free time here.
+
+## Opening Issues
+
+Issues are always very welcome - after all, they are a big part of making Sequelize better. An issue usually describes a bug, feature request, or documentation improvement request.
+
+If you open an issue, try to be as clear as possible. Don't assume that the maintainers will immediately understand the problem. Write your issue in a way that new contributors can also help (add links to helpful resources when applicable).
+
+Make sure you know what is an [SSCCE](http://sscce.org/)/[MCVE](https://stackoverflow.com/help/minimal-reproducible-example).
+
+Learn to use [GitHub flavored markdown](https://help.github.com/articles/github-flavored-markdown) to write an issue that is nice to read.
+
+### Opening an issue to report a bug
+
+It is essential that you provide an [SSCCE](http://sscce.org/)/[MCVE](https://stackoverflow.com/help/minimal-reproducible-example) for your issue. You can use the [sequelize-sscce](https://github.com/sequelize/sequelize-sscce) repository. Tell us what is the actual (incorrect) behavior and what should have happened (do not expect the maintainers to know what should happen!). Make sure you checked the bug persists in the latest Sequelize version.
+
+If you can even provide a Pull Request with a failing test (unit test or integration test), that is great! The bug will likely be fixed much faster in this case.
+
+You can also create and execute your SSCCE locally: see [Section 5](https://github.com/sequelize/sequelize/blob/main/CONTRIBUTING.md#running-an-sscce).
+
+### Opening an issue to request a new feature
+
+We're more than happy to accept feature requests! Before we get into how you can bring these to our attention, let's talk about our process for evaluating feature requests:
+
+- A feature request can have three states - _approved_, _pending_ and _rejected_.
+  - _Approved_ feature requests are accepted by maintainers as a valuable addition to Sequelize, and are ready to be worked on by anyone.
+  - _Rejected_ feature requests were considered not applicable to be a part of the Sequelize ORM. This can change, so feel free to comment on a rejected feature request providing a good reasoning and clarification on why it should be reconsidered.
+  - _Pending_ feature requests are waiting to be looked at by maintainers. They may or may not need clarification. Contributors can still submit pull requests implementing a pending feature request, if they want, at their own risk of having the feature request rejected (and the pull request closed without being merged).
+
+Please be sure to communicate the following:
+
+1. What problem your feature request aims to solve OR what aspect of the Sequelize workflow it aims to improve.
+
+2. Under what conditions are you anticipating this feature to be most beneficial?
+
+3. Why does it make sense that Sequelize should integrate this feature?
+
+4. See our [Feature Request template](https://github.com/sequelize/sequelize/blob/main/.github/ISSUE_TEMPLATE/feature_request.md) for more details on what to include. Please be sure to follow this template.
+
+If we don't approve your feature request, we'll provide you with our reasoning before closing it out. Some common reasons for denial may include (but are not limited to):
+
+- Something too similar to already exists within Sequelize
+- This feature seems out of scope of what Sequelize exists to accomplish
+
+We don't want to deny feature requests that could potentially make our users lives easier, so please be sure to clearly communicate your goals within your request!
+
+### Opening an issue to request improvements to the documentation
+
+Please state clearly what is missing/unclear/confusing in the documentation. If you have a rough idea of what should be written, please provide a suggestion within the issue.
+
+## Opening a Pull Request
+
+A Pull Request is a request for maintainers to "pull" a specific change in code (or documentation) from your copy ("fork") into the repository.
+
+Anyone can open a Pull Request, there is no need to ask for permission. Maintainers will look at your pull request and tell you if anything else must be done before it can be merged.
+
+The target of the Pull Request should be the `main` branch (or in rare cases the `v6` branch, if previously agreed with a maintainer).
+
+Please check the _allow edits from maintainers_ box when opening it. Thank you in advance for any pull requests that you open!
+
+If you started to work on something but didn't finish it yet, you can open a draft pull request if you want (by choosing the "draft" option). Maintainers will know that it's not ready to be reviewed yet.
+
+A pull request should mention in its description one or more issues that is addresses. If your pull request does not address any existing issue, explain in its description what it is doing - you are also welcome to write an issue first, and then mention this new issue in the PR description.
+
+If your pull request implements a new feature, it's better if the feature was already explicitly approved by a maintainer, otherwise you are taking the risk of having the feature request rejected later and your pull request closed without merge.
+
+Once you open a pull request, our automated checks will run (they take a few minutes). Make sure they are all passing. If they're not, make new commits to your branch fixing that, and the pull request will pick them up automatically and rerun our automated checks.
+
+Note: if you believe a test failed but is completely unrelated to your changes, it could be a rare situation of a _flaky test_ that is not your fault, and if it's indeed the case, and everything else passed, a maintainer will ignore the _flaky test_ and merge your pull request, so don't worry.
+
+A pull request that fixes a bug or implements a new feature must add at least one automated test that:
+
+- Passes
+- Would not pass if executed without your implementation
+
+## How to prepare a development environment for Sequelize
+
+### 0. Requirements
+
+Most operating systems provide all the needed tools (including Windows, Linux and MacOS):
+
+- Mandatory:
+
+  - [Node.js](http://nodejs.org), it is preferred to use the current LTS version of Node
+  - [Git](https://git-scm.com/)
+
+- Optional (recommended):
+
+  - [Docker](https://docs.docker.com/get-docker/) and [Docker Compose Plugin](https://docs.docker.com/compose/install/)
+    - It is not mandatory because you can easily locally run tests against SQLite without it.
+    - It is practically mandatory if you want to locally run tests against any other database engine (MySQL, MariaDB, Postgres,Db2 and MSSQL), unless you happen to have the engine installed and is willing to make some manual configuration.
+  - [Visual Studio Code](https://code.visualstudio.com/)
+    - [EditorConfig extension](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig)
+      - Also run `npm install --global editorconfig` (or `yarn global add editorconfig`) to make sure this extension will work properly
+    - [ESLint extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
+    - [Prettier extension](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
+
+### 1. Clone the repository
+
+Clone the repository (if you haven't already) via `git clone https://github.com/sequelize/sequelize`. If you plan on submitting a pull request, you can create a fork by clicking the _fork_ button and clone it instead with `git clone https://github.com/your-github-username/sequelize`, or add your fork as an upstream on the already cloned repo with `git remote add upstream https://github.com/your-github-username/sequelize`.
+
+### 2. Install the Node.js dependencies
+
+Run `yarn install` within the cloned repository folder to install the dependencies.
+
+Once installed, run the `yarn build` command to build the project.
+
+#### 2.1 Adding and updating dependencies
+
+[Yarn v4](https://yarnpkg.com//) is used in the CI/CD pipeline so adding and updating dependencies must be done with Yarn.
+
+#### 2.2 Running commands
+
+Sequelize is a monorepo and uses `lerna` to run scripts in each of the packages. The syntax for the commands is: `yarn lerna run` followed by the script name. For example:
+
+```
+yarn lerna run test-unit
+```
+
+By default, the `yarn lerna run` command will run the script in all packages which have a matching script. By appending `--scope=package_name` to the command (where `package_name` is the name of the package you want to run the script on) you can select a specific package to run the script on. For example:
+
+```
+yarn lerna run test-unit --scope=@sequelize/core
+```
+
+Lerna caching is enabled and the following commands:
+
+- `yarn build`
+- `yarn test-typings`
+- `yarn test-unit`
+
+Currently the caching is configured to watch the `src` folder and `package.json` and `tsconfig.json` files in each package for production changes and all files in each package for default changes.
+
+This means that running the `yarn build` command and not making changes to the production files (see above), the output of the commands loaded from cache rather than the command executing. When running `yarn test-typings` or `yarn test-unit`, any changes in the package folder will cause command to run rather than the results loaded from cache.
+
+If you run into any issues with the cache, running the command `yarn dlx nx reset` will reset the cache.
+
+For more information about using `lerna` commands, use the [Lerna Documentation](https://lerna.js.org/docs/api-reference/commands).
+
+### 3. Prepare local databases to run tests
+
+If you're happy to run tests only against an SQLite database, you can skip this section.
+
+#### 3.1. With Docker (recommended)
+
+If you have Docker installed, use any of the following commands to start fresh local databases of the dialect of your choice:
+
+- `yarn start-mariadb-oldest` (for MariaDB 10.4) or `yarn start-mariadb-latest` (for MariaDB 11.3)
+- `yarn start-mysql-oldest` (for MySQL 8.0) or `yarn start-mysql-latest` (for MySQL 8.3)
+- `yarn start-postgres-oldest` (for Postgres 11) or `yarn start-postgres-latest` (for Postgres 15)
+- `yarn start-mssql-oldest` (for MSSQL 2017) or `yarn start-mssql-latest` (for MSSQL 2022)
+- `yarn start-db2-oldest` (for Db2 11.5.5.1) or `yarn start-db2-latest` (for Db2 11.5.9.0)
+
+_Note:_ if you're using Windows, make sure you run these from Git Bash (or another MinGW environment), since these commands will execute bash scripts. Recall that [it's very easy to include Git Bash as your default integrated terminal on Visual Studio Code](https://code.visualstudio.com/docs/editor/integrated-terminal).
+
+Each of these commands will start a Docker container with the corresponding database, ready to run Sequelize tests (or an SSCCE).
+
+You can run `yarn stop-X` to stop the servers once you're done.
+
+The docker containers retain storage in volumes to improve startup time. If you run into to any issues with a container, you can run `yarn reset-{dialect}` or `yarn reset-all` to remove the containers and volumes.
+
+##### Hint for Postgres
+
+You can also easily start a local [pgadmin4](https://www.pgadmin.org/docs/pgadmin4/latest/) instance at `localhost:8888` to inspect the contents of the test Postgres database as follows:
+
+```
+docker run -d --name pgadmin4 -p 8888:80 -e 'PGADMIN_DEFAULT_EMAIL=test@example.com' -e 'PGADMIN_DEFAULT_PASSWORD=sequelize_test' dpage/pgadmin4
+```
+
+#### 3.2. Without Docker
+
+You will have to manually install and configure each of database engines you want. Check the `dev/dialect-name` folder within this repository and look carefully at how it is defined via Docker and via the auxiliary bash script, and mimic that exactly (except for the database name, username, password, host and port, that you can customize via the `SEQ_DB`, `SEQ_USER`, `SEQ_PW`, `SEQ_HOST` and `SEQ_PORT` environment variables, respectively). Please refer to the [Version Policy](https://sequelize.org/releases/) for the oldest supported version of each database.
+
+### 4. Running tests
+
+Before starting any work, try to run the tests locally in order to be sure your setup is fine. Start by running the SQLite tests:
+
+```
+yarn lerna run test-sqlite3
+```
+
+Then, if you want to run tests for another dialect, assuming you've set it up as written on section 3, run the corresponding command:
+
+- `yarn lerna run test-mysql`
+- `yarn lerna run test-mariadb`
+- `yarn lerna run test-postgres`
+- `yarn lerna run test-mssql`
+- `yarn lerna run test-db2`
+
+There are also the `test-unit-*` and `test-integration-*` sets of scripts (for example, `test-integration-postgres`).
+
+_Note:_ when running these test, you will need to run `yarn build` after you have made changes to the source code for these changes to affect the tests. The `yarn lerna run test-{dialect}` command does this for you.
+
+#### 4.1. Running only some tests
+
+While you're developing, you may want to execute only a single test (or a few), instead of executing everything (which takes some time). You can easily achieve this by modifying the `.mocharc.jsonc` file inside the package's root directory (but don't commit those changes!) to use `spec` (and maybe `grep`) from Mocha to specify the desired tests. Then, from your terminal, navigate to the package's root directory and simply call `DIALECT=some-dialect yarn mocha` (example: `DIALECT=postgres yarn mocha`). The package root directory is where the package.json file for the package is located. For example with the @sequelize/core package, the package root directory is [packages/core](https://github.com/sequelize/sequelize/tree/main/packages/core).
+
+Hint: if you're creating a new test, you can execute only that test locally against all dialects by adapting the `spec` and `grep` options on `.mocharc.jsonc` and running the following from your terminal (assuming you already set up the database instances via the corresponding `yarn setup-*` calls, as explained on [Section 3a](https://github.com/sequelize/sequelize/blob/main/CONTRIBUTING.md#3a-with-docker-recommended) and you are in the package's root directory):
+
+```
+DIALECT=mariadb yarn mocha && DIALECT=mysql yarn mocha && DIALECT=postgres yarn mocha && DIALECT=sqlite3 yarn mocha && DIALECT=mssql yarn mocha && DIALECT=db2 yarn mocha
+```
+
+### 5. Running an SSCCE
+
+What is SSCCE? [find out here](http://www.sscce.org/).
+
+You can modify the `sscce.ts` file (at the root of the repository) to create an SSCCE.
+
+Run it for the dialect of your choice using one of the following commands:
+
+- `npm run sscce-mariadb` / `yarn sscce-mariadb`
+- `npm run sscce-mysql` / `yarn sscce-mysql`
+- `npm run sscce-postgres` / `yarn sscce-postgres`
+- `npm run sscce-sqlite3` / `yarn sscce-sqlite3`
+- `npm run sscce-mssql` / `yarn sscce-mssql`
+- `npm run sscce-db2` / `yarn sscce-db2`
+
+_Note:_ First, you need to set up (once) the database instance for corresponding dialect, as explained on [Section 3a](https://github.com/sequelize/sequelize/blob/main/CONTRIBUTING.md#3a-with-docker-recommended).
+
+#### 5.1. Debugging an SSCCE with Visual Studio Code
+
+If you open the `package.json` file with Visual Studio Code, you will find a small `debug` button rendered right above the `"scripts": {` line. By clicking it, a popup will appear where you can choose which script you want to debug. Select one of the `sscce-*` scripts (listed above) and VSCode will immediately launch your SSCCE in debug mode (meaning that it will stop on any breakpoints that you place within `sscce.ts` or any other Sequelize source code).
+
+### 6. Commit your modifications
+
+We squash all commits into a single one when we merge your PR.
+That means you don't have to follow any convention in your commit messages,
+but you will need to follow the [Conventional Commits Conventions](https://www.conventionalcommits.org/en/v1.0.0/) when writing the title of your PR.
+
+We will then use the title of your PR as the message of the Squash Commit. It will then be used to automatically generate a changelog and calculate the next [semver](https://semver.org/) version number.
+
+We use a simple conventional commits convention:
+
+- The allowed commit types are: `docs`, `feat`, `fix`, `meta`.
+- We allow the following commit scopes (they're the list of packages):
+  - `core`
+  - `utils`
+  - `cli`
+  - `validator.js`
+  - `postgres`
+  - `mysql`
+  - `mariadb`
+  - `sqlite3`
+  - `mssql`
+  - `db2`
+  - `ibmi`
+  - `snowflake`
+- If your changes impact more than one scope, simply omit the scope.
+
+Example:
+
+```
+feat(postgres): support specifying a custom name for enums
+```
+
+Happy hacking and thank you for contributing.
+
+# Coding guidelines
+
+Sequelize uses eslint and prettier to enforce a consistent coding style.
+We recommend configuring them in your IDE to automatically format your code on save.
+
+You can format your code at any point by running `yarn format`.
+Any issue not automatically fixed by this command will be printed to the console.
+
+# Contributing to the documentation
+
+For contribution guidelines for the documentation, see [CONTRIBUTING.DOCS.md](https://github.com/sequelize/sequelize/blob/main/CONTRIBUTING.DOCS.md).

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2014-present Sequelize Authors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 83 - 0
README.md

@@ -0,0 +1,83 @@
+<p align="center"><img src="logo.svg" width="100" alt="Sequelize logo" /></p>
+<h1 align="center" style="margin-top: 0;"><a href="https://sequelize.org">Sequelize</a></h1>
+
+[![npm version](https://badgen.net/npm/v/@sequelize/core)](https://www.npmjs.com/package/@sequelize/core)
+[![npm downloads](https://badgen.net/npm/dm/@sequelize/core)](https://www.npmjs.com/package/@sequelize/core)
+[![contributors](https://img.shields.io/github/contributors/sequelize/sequelize)](https://github.com/sequelize/sequelize/graphs/contributors)
+[![Open Collective](https://img.shields.io/opencollective/backers/sequelize)](https://opencollective.com/sequelize#section-contributors)
+[![sponsor](https://img.shields.io/opencollective/all/sequelize?label=sponsors)](https://opencollective.com/sequelize)
+[![Merged PRs](https://badgen.net/github/merged-prs/sequelize/sequelize)](https://github.com/sequelize/sequelize)
+[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)
+[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
+
+Sequelize is an easy-to-use and promise-based [Node.js](https://nodejs.org/en/about/) [ORM tool](https://en.wikipedia.org/wiki/Object-relational_mapping) for [Postgres](https://en.wikipedia.org/wiki/PostgreSQL), [MySQL](https://en.wikipedia.org/wiki/MySQL), [MariaDB](https://en.wikipedia.org/wiki/MariaDB), [SQLite](https://en.wikipedia.org/wiki/SQLite), [DB2](https://en.wikipedia.org/wiki/IBM_Db2_Family), [Microsoft SQL Server](https://en.wikipedia.org/wiki/Microsoft_SQL_Server), [Snowflake](https://www.snowflake.com/), [Oracle DB](https://www.oracle.com/database/) and [Db2 for IBM i](https://www.ibm.com/support/pages/db2-ibm-i). It features solid transaction support, relations, eager and lazy loading, read replication and more.
+
+Would you like to contribute? Read [our contribution guidelines](./CONTRIBUTING.md) to know more. There are many ways to help! 😃
+
+## 🚀 Seeking New Maintainers for Sequelize! 🚀
+
+We're looking for new maintainers to help finalize and release the next major version of Sequelize! If you're passionate about open-source and database ORMs, we'd love to have you onboard.
+
+### 💰 Funding Available
+
+We distribute **$2,500 per quarter** among maintainers and have additional funds for full-time contributions.
+
+### 🛠️ What You’ll Work On
+
+- Finalizing and releasing Sequelize’s next major version
+- Improving TypeScript support and database integrations
+- Fixing critical issues and shaping the ORM’s future
+
+### 🤝 How to Get Involved
+
+Interested? Join our Slack and reach out to **@WikiRik** or **@sdepold**:  
+➡️ **[sequelize.org/slack](https://sequelize.org/slack)**
+
+We’d love to have you on board! 🚀
+
+## :computer: Getting Started
+
+Ready to start using Sequelize? Head to [sequelize.org](https://sequelize.org) to begin!
+
+- [Our Getting Started guide for Sequelize 6 (stable)](https://sequelize.org/docs/v6/getting-started)
+- [Our Getting Started guide for Sequelize 7 (alpha)](https://sequelize.org/docs/v7/getting-started)
+
+## :money_with_wings: Supporting the project
+
+Do you like Sequelize and would like to give back to the engineering team behind it?
+
+We have recently created an [OpenCollective based money pool](https://opencollective.com/sequelize) which is shared amongst all core maintainers based on their contributions. Every support is wholeheartedly welcome. ❤️
+
+## :pencil: Major version changelog
+
+Please find upgrade information to major versions here:
+
+- [Upgrade from v5 to v6](https://sequelize.org/docs/v6/other-topics/upgrade-to-v6)
+- [Upgrade from v6 to v7](https://sequelize.org/docs/v7/other-topics/upgrade-to-v7)
+
+## :book: Resources
+
+- [Documentation](https://sequelize.org)
+- [Databases Compatibility Table](https://sequelize.org/releases/)
+- [Changelog](https://github.com/sequelize/sequelize/releases)
+- [Discussions](https://github.com/sequelize/sequelize/discussions)
+- [Slack](https://sequelize.org/slack)
+- [Stack Overflow](https://stackoverflow.com/questions/tagged/sequelize.js)
+
+### :wrench: Tools
+
+- [CLI](https://github.com/sequelize/cli)
+- [For GraphQL](https://github.com/mickhansen/graphql-sequelize)
+- [For CockroachDB](https://github.com/cockroachdb/sequelize-cockroachdb)
+- [Awesome Sequelize](https://sequelize.org/docs/v7/other-topics/resources/)
+- [For YugabyteDB](https://github.com/yugabyte/sequelize-yugabytedb)
+
+### :speech_balloon: Translations
+
+- [English](https://sequelize.org) (Official)
+- [中文文档](https://github.com/demopark/sequelize-docs-Zh-CN) (Unofficial)
+
+## :warning: Responsible disclosure
+
+If you have security issues to report, please refer to our
+[Responsible Disclosure Policy](./SECURITY.md) for more details.

+ 17 - 0
SECURITY.md

@@ -0,0 +1,17 @@
+# Security Policy
+
+## Supported versions
+
+The following table describes the versions of this project that are currently supported with security updates:
+
+| Version     | Supported          |
+| ----------- | ------------------ |
+| 7.x (alpha) | :heavy_check_mark: |
+| 6.x         | :heavy_check_mark: |
+
+## Responsible disclosure policy
+
+At Sequelize, we prioritize security issues and will try to fix them as soon as they are disclosed.
+
+If you discover a security vulnerability, please create a security advisory [here](https://github.com/sequelize/sequelize/security/advisories/new).
+Otherwise, contact the project maintainers privately. You can find related information in [CONTACT.md](./CONTACT.md).

+ 110 - 0
build-packages.mjs

@@ -0,0 +1,110 @@
+#!/usr/bin/env node
+
+/* eslint-disable unicorn/prefer-top-level-await */
+
+import { build } from 'esbuild';
+import glob from 'fast-glob';
+import childProcess from 'node:child_process';
+import fs from 'node:fs/promises';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { promisify } from 'node:util';
+
+// if this script is moved, this will need to be adjusted
+
+const exec = promisify(childProcess.exec);
+
+const rootDir = path.dirname(fileURLToPath(import.meta.url));
+const packages = await fs.readdir(`${rootDir}/packages`);
+
+const packageName = process.argv[2];
+if (!packageName || !packages.includes(packageName)) {
+  console.error(
+    `Please specify the name of the package to build: node build-packages.mjs <package-name> (one of ${packages.join(', ')})`,
+  );
+  process.exit(1);
+}
+
+console.info(`Compiling package ${packageName}`);
+
+const packageDir = `${rootDir}/packages/${packageName}`;
+const sourceDir = path.join(packageDir, 'src');
+const libDir = path.join(packageDir, 'lib');
+
+const [sourceFiles] = await Promise.all([
+  // Find all .js and .ts files from /src.
+  glob(`${glob.convertPathToPattern(sourceDir)}/**/*.{mjs,cjs,js,mts,cts,ts}`, {
+    onlyFiles: true,
+    absolute: false,
+  }),
+  // Delete /lib for a full rebuild.
+  rmDir(libDir),
+]);
+
+const filesToCompile = [];
+const filesToCopyToLib = [];
+
+for (const file of sourceFiles) {
+  // mjs files cannot be built as they would be compiled to commonjs
+  if (file.endsWith('.mjs') || file.endsWith('.d.ts')) {
+    filesToCopyToLib.push(file);
+  } else {
+    filesToCompile.push(file);
+  }
+}
+
+await Promise.all([
+  copyFiles(filesToCopyToLib, sourceDir, libDir),
+  build({
+    // Adds source mapping
+    sourcemap: true,
+    // The compiled code should be usable in node v18
+    target: 'node18',
+    // The source code's format is commonjs.
+    format: 'cjs',
+
+    outdir: libDir,
+    entryPoints: filesToCompile.map(file => path.resolve(file)),
+  }),
+
+  exec('tsc --emitDeclarationOnly', {
+    env: {
+      // binaries installed from modules have symlinks in
+      // <pkg root>/node_modules/.bin.
+      PATH: `${process.env.PATH || ''}:${path.join(rootDir, 'node_modules/.bin')}`,
+    },
+    cwd: packageDir,
+  }),
+]);
+
+const indexFiles = await glob(`${glob.convertPathToPattern(libDir)}/**/index.d.ts`, {
+  onlyFiles: true,
+  absolute: false,
+});
+
+// copy .d.ts files to .d.mts to provide typings for the ESM entrypoint
+await Promise.all(
+  indexFiles.map(async indexFile => {
+    await fs.copyFile(indexFile, indexFile.replace(/.d.ts$/, '.d.mts'));
+  }),
+);
+
+async function rmDir(dirName) {
+  try {
+    await fs.stat(dirName);
+    await fs.rm(dirName, { recursive: true });
+  } catch {
+    /* no-op */
+  }
+}
+
+async function copyFiles(files, fromFolder, toFolder) {
+  await Promise.all(
+    files.map(async file => {
+      const to = path.join(toFolder, path.relative(fromFolder, file));
+      const dir = path.dirname(to);
+      await fs.mkdir(dir, { recursive: true });
+      await fs.copyFile(file, to);
+    }),
+  );
+}

+ 12 - 0
dev/check-connection.ts

@@ -0,0 +1,12 @@
+import { createSequelizeInstance } from '../packages/core/test/support';
+
+const sequelize = createSequelizeInstance();
+
+(async () => {
+  await sequelize.authenticate();
+  await sequelize.close();
+
+  console.info(
+    `Connected to ${sequelize.dialect.name} ${sequelize.getDatabaseVersion()} successfully`,
+  );
+})();

+ 14 - 0
dev/db2/.env_list

@@ -0,0 +1,14 @@
+LICENSE=accept
+DB2INSTANCE=db2inst1
+DB2INST1_PASSWORD=password
+BLU=false
+ENABLE_ORACLE_COMPATIBILITY=false
+UPDATEAVAIL=NO
+TO_CREATE_SAMPLEDB=false
+REPODB=false
+IS_OSXFS=false
+PERSISTENT_HOME=false
+HADR_ENABLED=false
+ETCD_ENDPOINT=
+ETCD_USERNAME=
+ETCD_PASSWORD=

+ 26 - 0
dev/db2/latest/docker-compose.yml

@@ -0,0 +1,26 @@
+services:
+  db2-latest:
+    container_name: sequelize-db2-latest
+    image: icr.io/db2_community/db2:12.1.2.0
+    privileged: true
+    env_file: ../.env_list
+    environment:
+      DBNAME: testdb
+    ports:
+      - 50000:50000
+    volumes:
+      - db2-latest:/database
+    healthcheck:
+      test: su - db2inst1 -c "db2 connect to testdb; db2 select 1 from sysibm.sysdummy1" || exit 1
+      start_period: 15s
+      interval: 10s
+      timeout: 5s
+      retries: 10
+
+networks:
+  default:
+    name: sequelize-db2-latest-network
+
+volumes:
+  db2-latest:
+    name: sequelize-db2-latest-volume

+ 5 - 0
dev/db2/latest/reset.sh

@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-db2-latest down --remove-orphans --volumes

+ 10 - 0
dev/db2/latest/start.sh

@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-db2-latest down --remove-orphans
+docker compose -p sequelize-db2-latest up -d
+
+./../wait-until-healthy.sh sequelize-db2-latest
+
+DIALECT=db2 ts-node ../../check-connection.ts

+ 7 - 0
dev/db2/latest/stop.sh

@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-db2-latest down --remove-orphans
+
+echo "Local latest supported Db2 instance stopped (if it was running)."

+ 26 - 0
dev/db2/oldest/docker-compose.yml

@@ -0,0 +1,26 @@
+services:
+  db2-oldest:
+    container_name: sequelize-db2-oldest
+    image: icr.io/db2_community/db2:11.5.5.1
+    privileged: true
+    env_file: ../.env_list
+    environment:
+      DBNAME: testdb
+    ports:
+      - 50000:50000
+    volumes:
+      - db2-oldest:/database
+    healthcheck:
+      test: su - db2inst1 -c "db2 connect to testdb; db2 select 1 from sysibm.sysdummy1" || exit 1
+      start_period: 15s
+      interval: 10s
+      timeout: 5s
+      retries: 10
+
+networks:
+  default:
+    name: sequelize-db2-oldest-network
+
+volumes:
+  db2-oldest:
+    name: sequelize-db2-oldest-volume

+ 5 - 0
dev/db2/oldest/reset.sh

@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-db2-oldest down --remove-orphans --volumes

+ 10 - 0
dev/db2/oldest/start.sh

@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-db2-oldest down --remove-orphans
+docker compose -p sequelize-db2-oldest up -d
+
+./../wait-until-healthy.sh sequelize-db2-oldest
+
+DIALECT=db2 ts-node ../../check-connection.ts

+ 7 - 0
dev/db2/oldest/stop.sh

@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-db2-oldest down --remove-orphans
+
+echo "Local oldest supported Db2 instance stopped (if it was running)."

+ 21 - 0
dev/db2/wait-until-healthy.sh

@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+
+if [ "$#" -ne 1 ]; then
+  >&2 echo "Please provide the container name or hash"
+  exit 1
+fi
+
+for _ in {1..10}
+do
+  state=$(docker inspect -f '{{ .State.Health.Status }}' $1 2>&1)
+  return_code=$?
+  if [ ${return_code} -eq 0 ] && [ "$state" == "healthy" ]; then
+    echo "$1 is healthy!"
+    sleep 15
+    exit 0
+  fi
+  sleep 15
+done
+
+>&2 echo "Timeout of 150s exceeded when waiting for container to be healthy: $1"
+exit 1

+ 54 - 0
dev/delete-changelog.mjs

@@ -0,0 +1,54 @@
+import { execFile } from 'node:child_process';
+import fs from 'node:fs/promises';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
+
+const changelogPaths = [
+  path.resolve(__dirname, '../CHANGELOG.md'),
+  path.resolve(__dirname, '../packages/core/CHANGELOG.md'),
+  path.resolve(__dirname, '../packages/utils/CHANGELOG.md'),
+  path.resolve(__dirname, '../packages/validator-js/CHANGELOG.md'),
+];
+
+await Promise.all(
+  changelogPaths.map(async changelogPath => {
+    if (await tryAccess(changelogPath)) {
+      await fs.unlink(changelogPath);
+      const { stderr, stdout } = await execFileAsync(`git`, ['add', changelogPath]);
+
+      if (stdout) {
+        console.info(`stdout: ${stdout}`);
+      }
+
+      if (stderr) {
+        console.error(`stderr: ${stderr}`);
+      }
+
+      console.info(`Deleted ${changelogPath}`);
+    }
+  }),
+);
+
+async function tryAccess(filename) {
+  try {
+    await fs.access(filename);
+
+    return true;
+  } catch {
+    return false;
+  }
+}
+
+function execFileAsync(file, args) {
+  return new Promise((resolve, reject) => {
+    execFile(file, args, (error, stdout, stderr) => {
+      if (error) {
+        reject(error);
+      }
+
+      resolve({ stdout, stderr });
+    });
+  });
+}

+ 26 - 0
dev/mariadb/latest/docker-compose.yml

@@ -0,0 +1,26 @@
+services:
+  mariadb-latest:
+    container_name: sequelize-mariadb-latest
+    image: mariadb:11.6.2
+    environment:
+      MYSQL_DATABASE: sequelize_test
+      MYSQL_USER: sequelize_test
+      MYSQL_PASSWORD: sequelize_test
+      MYSQL_ROOT_PASSWORD: sequelize_test
+    ports:
+      - 21103:3306
+    volumes:
+      - mariadb-latest:/var/lib/mysql
+    healthcheck:
+      test: ['CMD', 'mariadb-admin', '-usequelize_test', '-psequelize_test', 'status']
+      interval: 3s
+      timeout: 1s
+      retries: 10
+
+networks:
+  default:
+    name: sequelize-mariadb-latest-network
+
+volumes:
+  mariadb-latest:
+    name: sequelize-mariadb-latest-volume

+ 5 - 0
dev/mariadb/latest/reset.sh

@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mariadb-latest down --remove-orphans --volumes

+ 13 - 0
dev/mariadb/latest/start.sh

@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mariadb-latest down --remove-orphans
+docker compose -p sequelize-mariadb-latest up -d
+
+./../../wait-until-healthy.sh sequelize-mariadb-latest
+
+docker exec sequelize-mariadb-latest \
+  mariadb --host 127.0.0.1 --port 3306 -uroot -psequelize_test -e "GRANT ALL ON *.* TO 'sequelize_test'@'%' with grant option; FLUSH PRIVILEGES;"
+
+DIALECT=mariadb ts-node ../../check-connection.ts

+ 7 - 0
dev/mariadb/latest/stop.sh

@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mariadb-latest down --remove-orphans
+
+echo "Local latest supported MariaDB instance stopped (if it was running)."

+ 26 - 0
dev/mariadb/oldest/docker-compose.yml

@@ -0,0 +1,26 @@
+services:
+  mariadb-oldest:
+    container_name: sequelize-mariadb-oldest
+    image: mariadb:10.4.30
+    environment:
+      MYSQL_DATABASE: sequelize_test
+      MYSQL_USER: sequelize_test
+      MYSQL_PASSWORD: sequelize_test
+      MYSQL_ROOT_PASSWORD: sequelize_test
+    ports:
+      - 21103:3306
+    volumes:
+      - mariadb-oldest:/var/lib/mysql
+    healthcheck:
+      test: ['CMD', 'mariadb-admin', '-usequelize_test', '-psequelize_test', 'status']
+      interval: 3s
+      timeout: 1s
+      retries: 10
+
+networks:
+  default:
+    name: sequelize-mariadb-oldest-network
+
+volumes:
+  mariadb-oldest:
+    name: sequelize-mariadb-oldest-volume

+ 5 - 0
dev/mariadb/oldest/reset.sh

@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mariadb-oldest down --remove-orphans --volumes

+ 13 - 0
dev/mariadb/oldest/start.sh

@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mariadb-oldest down --remove-orphans
+docker compose -p sequelize-mariadb-oldest up -d
+
+./../../wait-until-healthy.sh sequelize-mariadb-oldest
+
+docker exec sequelize-mariadb-oldest \
+  mariadb --host 127.0.0.1 --port 3306 -uroot -psequelize_test -e "GRANT ALL ON *.* TO 'sequelize_test'@'%' with grant option; FLUSH PRIVILEGES;"
+
+DIALECT=mariadb ts-node ../../check-connection.ts

+ 7 - 0
dev/mariadb/oldest/stop.sh

@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mariadb-oldest down --remove-orphans
+
+echo "Local oldest supported MariaDB instance stopped (if it was running)."

+ 40 - 0
dev/mssql/latest/docker-compose.yml

@@ -0,0 +1,40 @@
+services:
+  mssql-latest:
+    container_name: sequelize-mssql-latest
+    image: mcr.microsoft.com/mssql/server:2025-latest
+    environment:
+      ACCEPT_EULA: Y
+      MSSQL_PID: Developer
+      MSSQL_SA_PASSWORD: Password12!
+    ports:
+      - 22019:1433
+    volumes:
+      - mssql-latest:/var/opt/mssql
+    healthcheck:
+      test:
+        [
+          'CMD',
+          '/opt/mssql-tools18/bin/sqlcmd',
+          '-C',
+          '-S',
+          'localhost',
+          '-U',
+          'SA',
+          '-P',
+          'Password12!',
+          '-l',
+          '30',
+          '-Q',
+          'SELECT 1',
+        ]
+      interval: 3s
+      timeout: 1s
+      retries: 10
+
+networks:
+  default:
+    name: sequelize-mssql-latest-network
+
+volumes:
+  mssql-latest:
+    name: sequelize-mssql-latest-volume

+ 5 - 0
dev/mssql/latest/reset.sh

@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mssql-latest down --remove-orphans --volumes

+ 13 - 0
dev/mssql/latest/start.sh

@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mssql-latest down --remove-orphans
+docker compose -p sequelize-mssql-latest up -d
+
+./../../wait-until-healthy.sh sequelize-mssql-latest
+
+docker exec sequelize-mssql-latest \
+  /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U SA -P "Password12!" -Q "CREATE DATABASE sequelize_test; ALTER DATABASE sequelize_test SET READ_COMMITTED_SNAPSHOT ON;"
+
+DIALECT=mssql ts-node ../../check-connection.ts

+ 7 - 0
dev/mssql/latest/stop.sh

@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mssql-latest down --remove-orphans
+
+echo "Local latest supported MSSQL instance stopped (if it was running)."

+ 39 - 0
dev/mssql/oldest/docker-compose.yml

@@ -0,0 +1,39 @@
+services:
+  mssql-oldest:
+    container_name: sequelize-mssql-oldest
+    image: mcr.microsoft.com/mssql/server:2017-latest
+    environment:
+      ACCEPT_EULA: Y
+      MSSQL_PID: Developer
+      MSSQL_SA_PASSWORD: Password12!
+    ports:
+      - 22019:1433
+    volumes:
+      - mssql-oldest:/var/opt/mssql
+    healthcheck:
+      test:
+        [
+          'CMD',
+          '/opt/mssql-tools/bin/sqlcmd',
+          '-S',
+          'localhost',
+          '-U',
+          'SA',
+          '-P',
+          'Password12!',
+          '-l',
+          '30',
+          '-Q',
+          'SELECT 1',
+        ]
+      interval: 3s
+      timeout: 1s
+      retries: 10
+
+networks:
+  default:
+    name: sequelize-mssql-oldest-network
+
+volumes:
+  mssql-oldest:
+    name: sequelize-mssql-oldest-volume

+ 5 - 0
dev/mssql/oldest/reset.sh

@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mssql-oldest down --remove-orphans --volumes

+ 13 - 0
dev/mssql/oldest/start.sh

@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mssql-oldest down --remove-orphans
+docker compose -p sequelize-mssql-oldest up -d
+
+./../../wait-until-healthy.sh sequelize-mssql-oldest
+
+docker exec sequelize-mssql-oldest \
+  /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "Password12!" -Q "CREATE DATABASE sequelize_test; ALTER DATABASE sequelize_test SET READ_COMMITTED_SNAPSHOT ON;"
+
+DIALECT=mssql ts-node ../../check-connection.ts

+ 7 - 0
dev/mssql/oldest/stop.sh

@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mssql-oldest down --remove-orphans
+
+echo "Local oldest supported MSSQL instance stopped (if it was running)."

+ 26 - 0
dev/mysql/latest/docker-compose.yml

@@ -0,0 +1,26 @@
+services:
+  mysql-latest:
+    container_name: sequelize-mysql-latest
+    image: mysql:8.4.6
+    environment:
+      MYSQL_DATABASE: sequelize_test
+      MYSQL_USER: sequelize_test
+      MYSQL_PASSWORD: sequelize_test
+      MYSQL_ROOT_PASSWORD: sequelize_test
+    ports:
+      - 20057:3306
+    volumes:
+      - mysql-latest:/var/lib/mysql
+    healthcheck:
+      test: ['CMD', 'mysqladmin', '-usequelize_test', '-psequelize_test', 'status']
+      interval: 3s
+      timeout: 1s
+      retries: 10
+
+networks:
+  default:
+    name: sequelize-mysql-latest-network
+
+volumes:
+  mysql-latest:
+    name: sequelize-mysql-latest-volume

+ 5 - 0
dev/mysql/latest/reset.sh

@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mysql-latest down --remove-orphans --volumes

+ 15 - 0
dev/mysql/latest/start.sh

@@ -0,0 +1,15 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mysql-latest down --remove-orphans
+docker compose -p sequelize-mysql-latest up -d
+
+./../../wait-until-healthy.sh sequelize-mysql-latest
+
+sleep 5s
+
+docker exec sequelize-mysql-latest \
+  mysql --host 127.0.0.1 --port 3306 -uroot -psequelize_test -e "GRANT ALL ON *.* TO 'sequelize_test'@'%' with grant option; FLUSH PRIVILEGES;"
+
+DIALECT=mysql ts-node ../../check-connection.ts

+ 7 - 0
dev/mysql/latest/stop.sh

@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mysql-latest down --remove-orphans
+
+echo "Local latest supported MySQL instance stopped (if it was running)."

+ 26 - 0
dev/mysql/oldest/docker-compose.yml

@@ -0,0 +1,26 @@
+services:
+  mysql-oldest:
+    container_name: sequelize-mysql-oldest
+    image: mysql:8.0.19
+    environment:
+      MYSQL_DATABASE: sequelize_test
+      MYSQL_USER: sequelize_test
+      MYSQL_PASSWORD: sequelize_test
+      MYSQL_ROOT_PASSWORD: sequelize_test
+    ports:
+      - 20057:3306
+    volumes:
+      - mysql-oldest:/var/lib/mysql
+    healthcheck:
+      test: ['CMD', 'mysqladmin', '-usequelize_test', '-psequelize_test', 'status']
+      interval: 3s
+      timeout: 1s
+      retries: 10
+
+networks:
+  default:
+    name: sequelize-mysql-oldest-network
+
+volumes:
+  mysql-oldest:
+    name: sequelize-mysql-oldest-volume

+ 5 - 0
dev/mysql/oldest/reset.sh

@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mysql-oldest down --remove-orphans --volumes

+ 13 - 0
dev/mysql/oldest/start.sh

@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mysql-oldest down --remove-orphans
+docker compose -p sequelize-mysql-oldest up -d
+
+./../../wait-until-healthy.sh sequelize-mysql-oldest
+
+docker exec sequelize-mysql-oldest \
+  mysql --host 127.0.0.1 --port 3306 -uroot -psequelize_test -e "GRANT ALL ON *.* TO 'sequelize_test'@'%' with grant option; FLUSH PRIVILEGES;"
+
+DIALECT=mysql ts-node ../../check-connection.ts

+ 7 - 0
dev/mysql/oldest/stop.sh

@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-mysql-oldest down --remove-orphans
+
+echo "Local oldest supported MySQL instance stopped (if it was running)."

+ 25 - 0
dev/postgres/latest/docker-compose.yml

@@ -0,0 +1,25 @@
+services:
+  postgres-latest:
+    container_name: sequelize-postgres-latest
+    image: postgis/postgis:17-3.5
+    environment:
+      POSTGRES_USER: sequelize_test
+      POSTGRES_PASSWORD: sequelize_test
+      POSTGRES_DB: sequelize_test
+    ports:
+      - 23010:5432
+    volumes:
+      - postgres-latest:/var/lib/postgresql/data
+    healthcheck:
+      test: ['CMD', 'pg_isready', '-U', 'sequelize_test']
+      interval: 3s
+      timeout: 1s
+      retries: 10
+
+networks:
+  default:
+    name: sequelize-postgres-latest-network
+
+volumes:
+  postgres-latest:
+    name: sequelize-postgres-latest-volume

+ 5 - 0
dev/postgres/latest/reset.sh

@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-postgres-latest down --remove-orphans --volumes

+ 13 - 0
dev/postgres/latest/start.sh

@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-postgres-latest down --remove-orphans
+docker compose -p sequelize-postgres-latest up -d
+
+./../../wait-until-healthy.sh sequelize-postgres-latest
+
+DIALECT=postgres ts-node ../../check-connection.ts
+
+docker exec sequelize-postgres-latest \
+   bash -c "export PGPASSWORD=sequelize_test && psql -h localhost -p 5432 -U sequelize_test sequelize_test -c 'CREATE EXTENSION IF NOT EXISTS btree_gist; CREATE EXTENSION IF NOT EXISTS hstore; CREATE EXTENSION IF NOT EXISTS citext;'"

+ 7 - 0
dev/postgres/latest/stop.sh

@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-postgres-latest down --remove-orphans
+
+echo "Local latest supported Postgres instance with postgis stopped (if it was running)."

+ 25 - 0
dev/postgres/oldest/docker-compose.yml

@@ -0,0 +1,25 @@
+services:
+  postgres-oldest:
+    container_name: sequelize-postgres-oldest
+    image: postgis/postgis:11-2.5
+    environment:
+      POSTGRES_USER: sequelize_test
+      POSTGRES_PASSWORD: sequelize_test
+      POSTGRES_DB: sequelize_test
+    ports:
+      - 23010:5432
+    volumes:
+      - postgres-oldest:/var/lib/postgresql/data
+    healthcheck:
+      test: ['CMD', 'pg_isready', '-U', 'sequelize_test']
+      interval: 3s
+      timeout: 1s
+      retries: 10
+
+networks:
+  default:
+    name: sequelize-postgres-oldest-network
+
+volumes:
+  postgres-oldest:
+    name: sequelize-postgres-oldest-volume

+ 5 - 0
dev/postgres/oldest/reset.sh

@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-postgres-oldest down --remove-orphans --volumes

+ 13 - 0
dev/postgres/oldest/start.sh

@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-postgres-oldest down --remove-orphans
+docker compose -p sequelize-postgres-oldest up -d
+
+./../../wait-until-healthy.sh sequelize-postgres-oldest
+
+DIALECT=postgres ts-node ../../check-connection.ts
+
+docker exec sequelize-postgres-oldest \
+   bash -c "export PGPASSWORD=sequelize_test && psql -h localhost -p 5432 -U sequelize_test sequelize_test -c 'CREATE EXTENSION IF NOT EXISTS btree_gist; CREATE EXTENSION IF NOT EXISTS hstore; CREATE EXTENSION IF NOT EXISTS citext; CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\"'"

+ 7 - 0
dev/postgres/oldest/stop.sh

@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -Eeuxo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
+cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" # https://stackoverflow.com/a/17744637
+
+docker compose -p sequelize-postgres-oldest down --remove-orphans
+
+echo "Local oldest supported Postgres instance with postgis stopped (if it was running)."

+ 13 - 0
dev/sscce-helpers.ts

@@ -0,0 +1,13 @@
+import type { AbstractDialect } from '@sequelize/core';
+import type { Options, Sequelize } from '../packages/core';
+import * as Support from '../packages/core/test/support';
+
+export function createSequelizeInstance<Dialect extends AbstractDialect>(
+  options: Options<Dialect>,
+): Sequelize<Dialect> {
+  return Support.createSequelizeInstance({
+    logging: console.debug,
+    logQueryParameters: true,
+    ...options,
+  });
+}

+ 143 - 0
dev/sync-exports.mjs

@@ -0,0 +1,143 @@
+#!/usr/bin/env node
+
+import { EMPTY_OBJECT, arrayFromAsync, parallelForEach, pojo } from '@sequelize/utils';
+import { listDirectories, listFilesRecursive, readFileIfExists } from '@sequelize/utils/node';
+import isEqual from 'lodash/isEqual.js';
+import fs from 'node:fs/promises';
+import path from 'node:path';
+
+/**
+ * does not modify the contents of the file but exits with code 1 if outdated, 0 if not
+ */
+const checkOutdated = process.argv.includes('--check-outdated');
+
+/**
+ * The package contains multiple individual exports that each need their own index file
+ */
+const multipleEntryPoints = process.argv.includes('--multi-entry-points');
+
+const requestedSrcDir = process.argv[2];
+if (!requestedSrcDir) {
+  console.error('Please provide the path to the src folder to synchronize');
+}
+
+const srcDir = path.normalize(path.join(process.cwd(), requestedSrcDir));
+
+console.info(
+  `${checkOutdated ? 'Testing synchronization of' : 'Synchronizing'} exports of folder ${srcDir}`,
+);
+
+const folders = multipleEntryPoints
+  ? (await listDirectories(srcDir)).map(folder => path.join(srcDir, folder))
+  : [srcDir];
+
+const outdatedPaths = [];
+
+await parallelForEach(folders, async folder => {
+  const files = await arrayFromAsync(listFilesRecursive(folder));
+
+  const commonExports = [];
+
+  /**
+   * You can provide a browser-specific or node-specific implementation by adding ".browser" or ".node" to their filename
+   */
+  const browserExportOverrides = pojo();
+  const nodeExportOverrides = pojo();
+
+  files
+    .map(file => {
+      return path.relative(folder, file).replace(/\.ts$/, '.js');
+    })
+    .filter(pathname => {
+      return (
+        !/(^|\\)index\./.test(pathname) &&
+        !pathname.startsWith('.DS_Store') &&
+        !pathname.endsWith('.spec.js') &&
+        !pathname.endsWith('.test.js') &&
+        !pathname.includes('__tests__/') &&
+        !pathname.includes('_internal/') &&
+        !pathname.includes('.internal') &&
+        !pathname.endsWith('.d.js')
+      );
+    })
+    // eslint-disable-next-line unicorn/no-array-for-each -- clearer like this, perf doesn't matter
+    .forEach(pathname => {
+      if (pathname.includes('.node.')) {
+        nodeExportOverrides[pathname.replace('.node.', '.')] = pathname;
+      } else if (pathname.includes('.browser.')) {
+        browserExportOverrides[pathname.replace('.browser.', '.')] = pathname;
+      } else {
+        commonExports.push(pathname);
+      }
+    });
+
+  const baseExports = getExportsWithOverrides(commonExports, EMPTY_OBJECT);
+  const browserExports = getExportsWithOverrides(commonExports, browserExportOverrides);
+  const nodeExports = getExportsWithOverrides(commonExports, nodeExportOverrides);
+
+  const promises = [];
+  promises.push(outputExports(baseExports, path.join(folder, 'index.ts')));
+  if (!isEqual(browserExports, baseExports)) {
+    promises.push(outputExports(browserExports, path.join(folder, 'index.browser.ts')));
+  }
+
+  if (!isEqual(nodeExports, baseExports)) {
+    promises.push(outputExports(nodeExports, path.join(folder, 'index.node.ts')));
+  }
+
+  await Promise.all(promises);
+});
+
+async function outputExports(exports, indexPath) {
+  const imports = exports
+    .map(pathname => {
+      return `export * from './${pathname}';\n`;
+    })
+    .sort()
+    .join('');
+
+  const fileContents = `/** Generated File, do not modify directly. Run "yarn sync-exports" in the folder of the package instead */\n\n${imports}`;
+
+  const file = await readFileIfExists(indexPath, 'utf-8');
+  if (file === null || file !== fileContents) {
+    outdatedPaths.push(indexPath);
+  }
+
+  if (!checkOutdated) {
+    await fs.writeFile(indexPath, fileContents, 'utf-8');
+  }
+}
+
+function getExportsWithOverrides(commonExports, platformExportOverrides) {
+  const platformExportKeys = Object.keys(platformExportOverrides);
+  if (platformExportKeys.length === 0) {
+    return commonExports;
+  }
+
+  const platformExports = [];
+
+  /** Add exports that were not replaced by another */
+  for (const commonExport of commonExports) {
+    if (platformExportOverrides[commonExport]) {
+      continue;
+    }
+
+    platformExports.push(commonExport);
+  }
+
+  platformExports.push(...Object.values(platformExportOverrides));
+
+  return platformExports;
+}
+
+if (outdatedPaths.length === 0) {
+  console.info('All index files up-to-date');
+} else {
+  const fileListStr = outdatedPaths.map(pathname => `- ${pathname}\n`).join('');
+  if (checkOutdated) {
+    console.info(`Outdated files:\n${fileListStr}`);
+    process.exit(1);
+  } else {
+    console.info(`Updated files:\n${fileListStr}`);
+  }
+}

+ 70 - 0
dev/update-authors.js

@@ -0,0 +1,70 @@
+#!/usr/bin/env node
+// original comes from https://github.com/nodejs/node/blob/c18ca140a12b543a3f970ef379f384ebd3297c3d/tools/update-authors.js
+
+// Usage: dev/update-author.js [--dry]
+// Passing --dry will redirect output to stdout rather than write to 'AUTHORS'.
+'use strict';
+
+const { spawn } = require('node:child_process');
+const fs = require('node:fs');
+const readline = require('node:readline');
+
+const log = spawn(
+  'git',
+  // Inspect author name/email and body.
+  ['log', '--reverse', '--format=Author: %aN <%aE>\n%b'],
+  {
+    stdio: ['inherit', 'pipe', 'inherit'],
+  },
+);
+const rl = readline.createInterface({ input: log.stdout });
+
+let output;
+if (process.argv.includes('--dry')) {
+  output = process.stdout;
+} else {
+  output = fs.createWriteStream('AUTHORS');
+}
+
+output.write('# Authors ordered by first contribution.\n\n');
+
+const seen = new Set();
+
+// exclude emails from <ROOT>/AUTHORS file
+const excludeEmails = new Set([
+  '<bot@renovateapp.com>',
+  '<support@greenkeeper.io>',
+  '<mail@sequelizejs.com>',
+  '<bot@stepsecurity.io>',
+  '<support@r2c.dev>',
+  '<bot@sequelize.org>',
+]);
+
+// Support regular git author metadata, as well as `Author:` and
+// `Co-authored-by:` in the message body. Both have been used in the past
+// to indicate multiple authors per commit, with the latter standardized
+// by GitHub now.
+const authorRe = /(^Author:|^Co-authored-by:)\s+(?<author>[^<]+)\s+(?<email><[^>]+>)/i;
+
+rl.on('line', line => {
+  const match = line.match(authorRe);
+  if (!match) {
+    return;
+  }
+
+  const { author, email } = match.groups;
+
+  const botRegex = /bot@users.noreply.github.com/g;
+  const botEmail = email.replaceAll(/\[bot.*?\]/g, 'bot');
+
+  if (seen.has(email) || excludeEmails.has(email) || botRegex.test(botEmail)) {
+    return;
+  }
+
+  seen.add(email);
+  output.write(`${author} ${email}\n`);
+});
+
+rl.on('close', () => {
+  output.end('\n# Generated by dev/update-authors.js\n');
+});

+ 28 - 0
dev/wait-until-healthy.sh

@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+
+if [ "$#" -ne 1 ]; then
+  >&2 echo "Please provide the container name or hash"
+  exit 1
+fi
+
+for _ in {1..50}
+do
+  state=$(docker inspect -f '{{ .State.Health.Status }}' $1 2>&1)
+  echo -ne "$state.\r"
+  sleep 1
+  echo -ne "$state..\r"
+  sleep 1
+  echo -ne "$state...\r"
+  sleep 1
+  echo -ne '\033[K'
+
+  return_code=$?
+  if [ ${return_code} -eq 0 ] && [ "$state" == "healthy" ]; then
+    echo "$1 is healthy!"
+    exit 0
+  fi
+  sleep 0.4
+done
+
+>&2 echo "Timeout of 20s exceeded when waiting for container to be healthy: $1"
+exit 1

+ 4 - 0
lerna.json

@@ -0,0 +1,4 @@
+{
+  "$schema": "node_modules/lerna/schemas/lerna-schema.json",
+  "version": "7.0.0-alpha.46"
+}

+ 41 - 0
logo.svg

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" viewBox="0 0 90.688 104.58" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <metadata>
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g transform="matrix(.035278 0 0 -.035278 0 104.58)" fill-rule="evenodd">
+  <path d="m1285.3 2534.2 917.7-522.1 367.64 212.27-1282 740.14-1288.4-740.14 367.64-212.27 917.37 522.1" fill="#52b0e7"/>
+  <path d="m6.707 2220.4 370.97-214.16v-1059.7l907.66-524.19v-420.43l-1285.3 738.21 6.707 1480.3" fill="#3c76c3"/>
+  <path d="m929.73 1687.8 357.32-206.29v-420.38l-185.3 107.08-171.95 99.28-0.067 420.31" fill="#2e9d4d"/>
+  <path d="m1651 1691.7-363.93-210.09v-420.4l357.25 206.4 6.68 424.09" fill="#256f44"/>
+  <path d="m2564 2220.4-370.97-214.16v-1048l-443.79-267.87-463.87-268v-420.43l3.34-1.9297 1276.5 736.94-1.18 1483.5" fill="#2e3b69"/>
+  <path d="m1287 1481.6-357.32 206.29v2.52l357.32 206.32 4.41 2.55 180.86-104.44 178.66-103.13-363.93-210.11" fill="#9fd62b"/>
+  <path d="m475.34 1435.4 357.32-206.3v-420.38l-185.3 107.09-171.95 99.279-0.066 420.31" fill="#3c76c3"/>
+  <path d="m1190 1435.4-357.32-206.3v-420.38l357.28 206.39 0.04 420.29" fill="#2e3b69"/>
+  <path d="m832.66 1229.1-357.29 206.27 180.86 106.95 176.44 101.91 357.34-208.86-357.34-206.27" fill="#52b0e7"/>
+  <path d="m1394.9 1424.6 357.32-206.3v-420.38l-185.3 107.09-171.95 99.268-0.07 420.32" fill="#3c76c3"/>
+  <path d="m2109.6 1424.6-357.32-206.3v-420.38l357.27 206.38 0.05 420.3" fill="#2e3b69"/>
+  <path d="m1752.2 1218.3-357.3 206.28v2.52l180.86 104.43 176.44 101.9 357.34-208.85-357.34-206.28" fill="#52b0e7"/>
+  <path d="m944.16 1159.5 357.31-206.3v-420.37l-185.29 107.08-171.96 99.281-0.063 420.31" fill="#3c76c3"/>
+  <path d="m1658.8 1159.5-357.32-206.3v-420.37l357.28 206.38 0.04 420.29" fill="#2e3b69"/>
+  <path d="m1301.5 953.26-357.29 206.28v2.52l180.85 104.43 176.44 101.91 357.34-208.86-357.34-206.28" fill="#52b0e7"/>
+  <path d="m929.73 2249.9 357.32-206.3v-420.38l-185.3 107.09-171.95 99.27-0.067 420.32" fill="#3c76c3"/>
+  <path d="m1651 2253.7-363.93-210.09v-420.4l357.25 206.41 6.68 424.08" fill="#2e3b69"/>
+  <path d="m1287 2043.6-357.32 206.3v2.52l357.32 206.32 4.41 2.54 180.86-104.43 178.66-103.14-363.93-210.11" fill="#52b0e7"/>
+  <path d="m475.34 1997.4 357.32-206.29v-420.38l-185.3 107.08-171.95 99.28-0.066 420.31" fill="#3c76c3"/>
+  <path d="m1190 1997.4-357.32-206.29v-420.38l357.28 206.38 0.04 420.29" fill="#2e3b69"/>
+  <path d="m832.66 1791.1-357.29 206.27 180.86 106.95 176.44 101.92 357.34-208.87-357.34-206.27" fill="#52b0e7"/>
+  <path d="m1394.9 1986.6 357.32-206.3v-420.38l-185.3 107.09-171.95 99.28-0.07 420.31" fill="#3c76c3"/>
+  <path d="m2109.6 1986.6-357.32-206.3v-420.38l357.27 206.39 0.05 420.29" fill="#2e3b69"/>
+  <path d="m1752.2 1780.3-357.3 206.28v2.52l180.86 104.43 176.44 101.91 357.34-208.86-357.34-206.28" fill="#52b0e7"/>
+  <path d="m944.16 1721.5 357.31-206.29v-420.38l-185.29 107.08-171.96 99.28-0.063 420.31" fill="#3c76c3"/>
+  <path d="m1658.8 1721.5-357.32-206.29v-420.38l357.28 206.39 0.04 420.28" fill="#2e3b69"/>
+  <path d="m1301.5 1515.3-357.29 206.27v2.52l180.85 104.44 176.44 101.91 357.34-208.87-357.34-206.27" fill="#52b0e7"/>
+ </g>
+</svg>

+ 32 - 0
nx.json

@@ -0,0 +1,32 @@
+{
+  "$schema": "node_modules/nx/schemas/nx-schema.json",
+  "namedInputs": {
+    "default": ["{projectRoot}/**/*"],
+    "prod": [
+      "{projectRoot}/src/**/*",
+      "{projectRoot}/package.json",
+      "{projectRoot}/tsconfig.json",
+      "!{projectRoot}/src/**/*.test.ts"
+    ]
+  },
+  "targetDefaults": {
+    "build": {
+      "cache": true,
+      "dependsOn": ["^build"],
+      "inputs": ["prod", "^prod"],
+      "outputs": ["{projectRoot}/lib"]
+    },
+    "test-typings": {
+      "cache": true,
+      "inputs": ["default", "^prod"]
+    },
+    "test-unit": {
+      "cache": true,
+      "dependsOn": ["build"],
+      "inputs": ["default", "^prod"]
+    }
+  },
+  "workspaceLayout": {
+    "libsDir": "packages"
+  }
+}

+ 13 - 0
package-support.json

@@ -0,0 +1,13 @@
+{
+  "versions": [
+    {
+      "version": "*",
+      "target": {
+        "node": "supported"
+      },
+      "response": {
+        "type": "time-permitting"
+      }
+    }
+  ]
+}

+ 108 - 0
package.json

@@ -0,0 +1,108 @@
+{
+  "name": "@sequelize/monorepo",
+  "private": true,
+  "scripts": {
+    "prepare": "husky",
+    "publish-all": "lerna publish --conventional-commits --no-private --yes --create-release github",
+    "format": "npm run format:eslint && npm run format:prettier",
+    "format:eslint": "eslint . --fix --report-unused-disable-directives",
+    "format:prettier": "prettier --write .",
+    "test:format": "concurrently \"npm:test:format:*\"",
+    "test:format:eslint": "eslint . --quiet --report-unused-disable-directives",
+    "test:format:prettier": "prettier --check .",
+    "test-typings": "lerna run test-typings",
+    "test-exports": "lerna run test-exports",
+    "test-unit": "yarn test-unit-esm && lerna run test-unit",
+    "test-unit-esm": "mocha test/esm-named-exports.test.js",
+    "test-integration-mariadb": "yarn lerna run test-integration-mariadb",
+    "test-integration-mysql": "yarn lerna run test-integration-mysql",
+    "test-integration-postgres": "yarn lerna run test-integration-postgres",
+    "test-integration-postgres-native": "yarn lerna run test-integration-postgres-native",
+    "test-integration-sqlite3": "yarn lerna run test-integration-sqlite3",
+    "test-integration-mssql": "yarn lerna run test-integration-mssql",
+    "test-integration-db2": "yarn lerna run test-integration-db2",
+    "test-integration-ibmi": "yarn lerna run test-integration-ibmi",
+    "test-integration-snowflake": "yarn lerna run test-integration-snowflake",
+    "sync-exports": "lerna run sync-exports",
+    "build": "lerna run build",
+    "docs": "typedoc",
+    "delete-changelog": "node dev/delete-changelog.mjs",
+    "fix-commit": "export TMPFILE=$(mktemp) && grep -v '^#' $(git rev-parse --git-dir)/COMMIT_EDITMSG > $TMPFILE && git commit -e -F $TMPFILE",
+    "------------------------------------- local test dbs --------------------------------------": "",
+    "reset-mariadb": "bash dev/mariadb/oldest/reset.sh; bash dev/mariadb/latest/reset.sh",
+    "reset-mysql": "bash dev/mysql/oldest/reset.sh; bash dev/mysql/latest/reset.sh",
+    "reset-postgres": "bash dev/postgres/oldest/reset.sh; bash dev/postgres/latest/reset.sh",
+    "reset-mssql": "bash dev/mssql/oldest/reset.sh; bash dev/mssql/latest/reset.sh",
+    "reset-db2": "bash dev/db2/oldest/reset.sh; bash dev/db2/latest/reset.sh",
+    "reset-all": "concurrently \"npm:reset-*(!all)\"",
+    "start-mariadb-oldest": "bash dev/mariadb/oldest/start.sh",
+    "start-mariadb-latest": "bash dev/mariadb/latest/start.sh",
+    "start-mysql-oldest": "bash dev/mysql/oldest/start.sh",
+    "start-mysql-latest": "bash dev/mysql/latest/start.sh",
+    "start-postgres-oldest": "bash dev/postgres/oldest/start.sh",
+    "start-postgres-latest": "bash dev/postgres/latest/start.sh",
+    "start-mssql-oldest": "bash dev/mssql/oldest/start.sh",
+    "start-mssql-latest": "bash dev/mssql/latest/start.sh",
+    "start-db2-oldest": "bash dev/db2/oldest/start.sh",
+    "start-db2-latest": "bash dev/db2/latest/start.sh",
+    "start-oldest": "concurrently \"npm:start-*-oldest\"",
+    "start-latest": "concurrently \"npm:start-*-latest\"",
+    "stop-mariadb": "bash dev/mariadb/oldest/stop.sh; bash dev/mariadb/latest/stop.sh",
+    "stop-mysql": "bash dev/mysql/oldest/stop.sh; bash dev/mysql/latest/stop.sh",
+    "stop-postgres": "bash dev/postgres/oldest/stop.sh; bash dev/postgres/latest/stop.sh",
+    "stop-mssql": "bash dev/mssql/oldest/stop.sh; bash dev/mssql/latest/stop.sh",
+    "stop-db2": "bash dev/db2/oldest/stop.sh; bash dev/db2/latest/stop.sh",
+    "stop-all": "concurrently \"npm:stop-*(!all)\"",
+    "----------------------------------------- SSCCEs ------------------------------------------": "",
+    "sscce": "ts-node sscce.ts",
+    "sscce-mariadb": "cross-env DIALECT=mariadb yarn sscce",
+    "sscce-mysql": "cross-env DIALECT=mysql yarn sscce",
+    "sscce-postgres": "cross-env DIALECT=postgres yarn sscce",
+    "sscce-postgres-native": "cross-env DIALECT=postgres-native yarn sscce",
+    "sscce-sqlite3": "cross-env DIALECT=sqlite3 yarn sscce",
+    "sscce-mssql": "cross-env DIALECT=mssql yarn sscce",
+    "sscce-db2": "cross-env DIALECT=db2 yarn sscce"
+  },
+  "workspaces": [
+    "packages/*"
+  ],
+  "devDependencies": {
+    "@ephys/eslint-config-typescript": "20.1.4",
+    "@rushstack/eslint-patch": "1.12.0",
+    "@sequelize/utils": "workspace:*",
+    "@types/chai": "4.3.20",
+    "@types/lodash": "4.17.20",
+    "@types/mocha": "10.0.10",
+    "@types/node": "22.13.10",
+    "chai": "4.5.0",
+    "concurrently": "9.2.0",
+    "cross-env": "7.0.3",
+    "esbuild": "0.25.8",
+    "eslint": "8.57.1",
+    "eslint-plugin-jsdoc": "48.11.0",
+    "eslint-plugin-mocha": "10.5.0",
+    "fast-glob": "3.3.3",
+    "husky": "9.1.7",
+    "lerna": "8.2.3",
+    "lint-staged": "16.1.2",
+    "lodash": "4.17.21",
+    "markdownlint-cli": "0.45.0",
+    "mocha": "11.7.1",
+    "node-gyp": "11.2.0",
+    "node-hook": "1.0.0",
+    "nx": "21.3.9",
+    "prettier": "3.5.3",
+    "prettier-plugin-organize-imports": "4.1.0",
+    "source-map-support": "0.5.21",
+    "ts-node": "10.9.2",
+    "typedoc": "0.27.9",
+    "typedoc-plugin-mdn-links": "5.0.6",
+    "typedoc-plugin-missing-exports": "3.1.0",
+    "typescript": "5.8.3"
+  },
+  "packageManager": "yarn@4.9.2",
+  "lint-staged": {
+    "*.{js,mjs,cjs,ts,mts,cts}": "eslint --fix --report-unused-disable-directives",
+    "*": "prettier --write --ignore-unknown"
+  }
+}

+ 5 - 0
packages/cli/.eslintrc.cjs

@@ -0,0 +1,5 @@
+module.exports = {
+  parserOptions: {
+    project: [`${__dirname}/tsconfig.json`],
+  },
+};

+ 8 - 0
packages/cli/.gitignore

@@ -0,0 +1,8 @@
+/dist
+/lib
+/tmp
+node_modules
+oclif.lock
+oclif.manifest.json
+/migrations
+/seeds

+ 11 - 0
packages/cli/.mocharc.jsonc

@@ -0,0 +1,11 @@
+{
+  // Ideally this file should extend the root one and only set "check-leaks" to false
+  // but extends is broken: https://github.com/mochajs/mocha/issues/3916
+  "require": "ts-node/register",
+  "loader": "ts-node/esm",
+  "extensions": ["js", "ts"],
+  "watch-files": ["src"],
+  "timeout": 30000,
+  "reporter": "spec",
+  "exit": true
+}

+ 33 - 0
packages/cli/CHANGELOG.md

@@ -0,0 +1,33 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# [7.0.0-alpha.46](https://github.com/sequelize/sequelize/compare/v7.0.0-alpha.45...v7.0.0-alpha.46) (2025-03-22)
+
+**Note:** Version bump only for package @sequelize/cli
+
+# [7.0.0-alpha.44](https://github.com/sequelize/sequelize/compare/v7.0.0-alpha.43...v7.0.0-alpha.44) (2025-01-27)
+
+### Bug Fixes
+
+- update inquirer ([#17540](https://github.com/sequelize/sequelize/issues/17540)) ([e34acec](https://github.com/sequelize/sequelize/commit/e34acec96e7eed54300fad1aa6c2a543bf76ac91))
+
+# [7.0.0-alpha.43](https://github.com/sequelize/sequelize/compare/v7.0.0-alpha.42...v7.0.0-alpha.43) (2024-10-04)
+
+**Note:** Version bump only for package @sequelize/cli
+
+# [7.0.0-alpha.42](https://github.com/sequelize/sequelize/compare/v7.0.0-alpha.41...v7.0.0-alpha.42) (2024-09-13)
+
+**Note:** Version bump only for package @sequelize/cli
+
+# [7.0.0-alpha.41](https://github.com/sequelize/sequelize/compare/v7.0.0-alpha.40...v7.0.0-alpha.41) (2024-05-17)
+
+**Note:** Version bump only for package @sequelize/cli
+
+# [7.0.0-alpha.40](https://github.com/sequelize/sequelize/compare/v7.0.0-alpha.39...v7.0.0-alpha.40) (2024-04-11)
+
+### Features
+
+- **cli:** add `seed generate` command ([#17262](https://github.com/sequelize/sequelize/issues/17262)) ([b07ad40](https://github.com/sequelize/sequelize/commit/b07ad40f3f55a4a7bc7c924c3349b542b6e705d9))
+- create `@sequelize/cli` as a replacement for `sequelize-cli` ([#17195](https://github.com/sequelize/sequelize/issues/17195)) ([ec00aed](https://github.com/sequelize/sequelize/commit/ec00aed29674bb698445c2c7109b229215e96a0c))

+ 26 - 0
packages/cli/README.md

@@ -0,0 +1,26 @@
+<p align="center"><img src="https://raw.githubusercontent.com/sequelize/sequelize/ec80c6252ac500df9342816b7f49957f3974e882/logo.svg" width="100" alt="Sequelize logo" /></p>
+<h1 align="center" style="margin-top: 0;"><a href="https://sequelize.org">Sequelize</a></h1>
+
+## Installation
+
+Using npm:
+
+```sh
+npm install @sequelize/cli
+```
+
+Or using yarn:
+
+```sh
+yarn add @sequelize/cli
+```
+
+## Usage
+
+- If installed globally: `sequelize --help`
+- If installed locally using `yarn`: `yarn sequelize --help`
+- If installed locally using `npm`: `npx sequelize --help`
+
+## Documentation
+
+The documentation can be found at https://sequelize.org/docs/v7/cli/

+ 3 - 0
packages/cli/bin/dev.cmd

@@ -0,0 +1,3 @@
+@echo off
+
+node --loader ts-node/esm --no-warnings=ExperimentalWarning "%~dp0\dev" %*

+ 5 - 0
packages/cli/bin/dev.js

@@ -0,0 +1,5 @@
+#!/usr/bin/env -S node --loader ts-node/esm --no-warnings=ExperimentalWarning
+
+import { execute } from '@oclif/core';
+
+await execute({ development: true, dir: import.meta.url });

+ 3 - 0
packages/cli/bin/run.cmd

@@ -0,0 +1,3 @@
+@echo off
+
+node "%~dp0\run" %*

+ 5 - 0
packages/cli/bin/run.js

@@ -0,0 +1,5 @@
+#!/usr/bin/env node
+
+import { execute } from '@oclif/core';
+
+await execute({ dir: import.meta.url });

+ 79 - 0
packages/cli/package.json

@@ -0,0 +1,79 @@
+{
+  "bin": {
+    "sequelize": "./bin/run.js"
+  },
+  "bugs": "https://github.com/sequelize/sequelize/issues",
+  "dependencies": {
+    "@inquirer/checkbox": "^4.2.0",
+    "@inquirer/confirm": "^5.1.14",
+    "@inquirer/input": "^4.2.1",
+    "@inquirer/select": "^4.3.1",
+    "@oclif/core": "^4.5.2",
+    "@oclif/plugin-help": "^6.2.32",
+    "@sequelize/utils": "workspace:*",
+    "ansis": "^3.17.0",
+    "cosmiconfig": "^9.0.0",
+    "zod": "^4.0.10"
+  },
+  "description": "The Sequelize CLI\nDocumentation: https://sequelize.org/docs/v7/cli/",
+  "devDependencies": {
+    "@oclif/test": "4.1.13",
+    "@types/chai": "4.3.20",
+    "@types/mocha": "10.0.10",
+    "chai": "4.5.0",
+    "concurrently": "9.2.0",
+    "mocha": "11.7.1",
+    "oclif": "4.22.5",
+    "rimraf": "5.0.10"
+  },
+  "engines": {
+    "node": ">=18.20.8"
+  },
+  "exports": "./lib/index.js",
+  "files": [
+    "/bin",
+    "/lib",
+    "/static",
+    "/oclif.manifest.json"
+  ],
+  "homepage": "https://sequelize.org/docs/v7/cli/",
+  "keywords": [],
+  "license": "MIT",
+  "main": "lib/index.js",
+  "name": "@sequelize/cli",
+  "oclif": {
+    "bin": "sequelize",
+    "dirname": "sequelize",
+    "commands": "./lib/commands",
+    "plugins": [
+      "@oclif/plugin-help"
+    ],
+    "topicSeparator": " ",
+    "topics": {
+      "migration": {
+        "description": "Commands for managing database migrations"
+      },
+      "seed": {
+        "description": "Commands for managing database seeding"
+      }
+    }
+  },
+  "repository": "https://github.com/sequelize/sequelize",
+  "scripts": {
+    "build": "rimraf lib && tsc --project tsconfig.build.json",
+    "postpack": "rimraf oclif.manifest.json",
+    "prepack": "yarn build && oclif manifest && oclif readme",
+    "prepare": "yarn build",
+    "test": "concurrently \"npm:test-*\"",
+    "test-unit": "mocha ./**/*.test.ts",
+    "test-typings": "tsc --noEmit",
+    "test-exports": "../../dev/sync-exports.mjs ./src --check-outdated",
+    "sync-exports": "../../dev/sync-exports.mjs ./src"
+  },
+  "type": "module",
+  "types": "lib/index.d.ts",
+  "version": "7.0.0-alpha.46",
+  "publishConfig": {
+    "access": "public"
+  }
+}

Some files were not shown because too many files changed in this diff