Skip to content

Commit

Permalink
feat: ESLlint rules for drizzle-orm (#1785)
Browse files Browse the repository at this point in the history
Co-authored-by: Julius Marminge <julius0216@outlook.com>
  • Loading branch information
thecmdrunner and juliusmarminge committed Mar 7, 2024
1 parent 8e3f56d commit 57dc6ab
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 23 deletions.
5 changes: 5 additions & 0 deletions .changeset/gentle-actors-think.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"create-t3-app": minor
---

Include ESLlint rules for `drizzle-orm`.
6 changes: 0 additions & 6 deletions cli/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,12 +83,6 @@ const main = async () => {
await installDependencies({ projectDir });
}

// Rename _eslintrc.json to .eslintrc.json - we use _eslintrc.json to avoid conflicts with the monorepos linter
fs.renameSync(
path.join(projectDir, "_eslintrc.cjs"),
path.join(projectDir, ".eslintrc.cjs")
);

if (!noGit) {
await initializeGit(projectDir);
}
Expand Down
1 change: 1 addition & 0 deletions cli/src/installers/dependencyVersionMap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export const dependencyVersionMap = {
// Drizzle
"drizzle-orm": "^0.29.4",
"drizzle-kit": "^0.20.14",
"eslint-plugin-drizzle": "^0.2.3",
mysql2: "^3.9.1",
"@planetscale/database": "^1.16.0",
postgres: "^3.4.3",
Expand Down
5 changes: 4 additions & 1 deletion cli/src/installers/drizzle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ export const drizzleInstaller: Installer = ({
scopedAppName,
databaseProvider,
}) => {
const devPackages: AvailableDependencies[] = ["drizzle-kit"];
const devPackages: AvailableDependencies[] = [
"drizzle-kit",
"eslint-plugin-drizzle",
];
if (databaseProvider === "planetscale") devPackages.push("mysql2");
if (databaseProvider === "sqlite") devPackages.push("@types/better-sqlite3");
if (databaseProvider === "postgres") devPackages.push("pg");
Expand Down
36 changes: 36 additions & 0 deletions cli/src/installers/eslint.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import path from "path";
import fs from "fs-extra";

import { _initialConfig } from "~/../template/extras/config/_eslint.js";
import { type Installer } from "~/installers/index.js";

export const dynamicEslintInstaller: Installer = ({ projectDir, packages }) => {
const usingDrizzle = !!packages?.drizzle?.inUse;

const eslintConfig = getEslintConfig({ usingDrizzle });

// Convert config from _eslint.config.json to .eslintrc.cjs
const eslintrcFileContents = [
'/** @type {import("eslint").Linter.Config} */',
`const config = ${JSON.stringify(eslintConfig, null, 2)}`,
"module.exports = config;",
].join("\n");

const eslintConfigDest = path.join(projectDir, ".eslintrc.cjs");
fs.writeFileSync(eslintConfigDest, eslintrcFileContents, "utf-8");
};

const getEslintConfig = ({ usingDrizzle }: { usingDrizzle: boolean }) => {
const eslintConfig = _initialConfig;

if (usingDrizzle) {
eslintConfig.plugins = [...(eslintConfig.plugins ?? []), "drizzle"];

eslintConfig.rules = {
...eslintConfig.rules,
"drizzle/enforce-delete-with-where": "error",
"drizzle/enforce-update-with-where": "error",
};
}
return eslintConfig;
};
6 changes: 6 additions & 0 deletions cli/src/installers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { trpcInstaller } from "~/installers/trpc.js";
import { type PackageManager } from "~/utils/getUserPkgManager.js";
import { dbContainerInstaller } from "./dbContainer.js";
import { drizzleInstaller } from "./drizzle.js";
import { dynamicEslintInstaller } from "./eslint.js";

// Turning this into a const allows the list to be iterated over for programatically creating prompt options
// Should increase extensability in the future
Expand All @@ -16,6 +17,7 @@ export const availablePackages = [
"tailwind",
"trpc",
"envVariables",
"eslint",
"dbContainer",
] as const;
export type AvailablePackages = (typeof availablePackages)[number];
Expand Down Expand Up @@ -80,4 +82,8 @@ export const buildPkgInstallerMap = (
inUse: true,
installer: envVariablesInstaller,
},
eslint: {
inUse: true,
installer: dynamicEslintInstaller,
},
});
Original file line number Diff line number Diff line change
@@ -1,37 +1,25 @@
/** @type {import("eslint").Linter.Config} */
const config = {
export const _initialConfig = {
parser: "@typescript-eslint/parser",
parserOptions: {
project: true,
},
parserOptions: { project: true },
plugins: ["@typescript-eslint"],
extends: [
"next/core-web-vitals",
"plugin:@typescript-eslint/recommended-type-checked",
"plugin:@typescript-eslint/stylistic-type-checked",
],
rules: {
// These opinionated rules are enabled in stylistic-type-checked above.
// Feel free to reconfigure them to your own preference.
"@typescript-eslint/array-type": "off",
"@typescript-eslint/consistent-type-definitions": "off",

"@typescript-eslint/consistent-type-imports": [
"warn",
{
prefer: "type-imports",
fixStyle: "inline-type-imports",
},
{ prefer: "type-imports", fixStyle: "inline-type-imports" },
],
"@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_" }],
"@typescript-eslint/require-await": "off",
"@typescript-eslint/no-misused-promises": [
"error",
{
checksVoidReturn: { attributes: false },
},
{ checksVoidReturn: { attributes: false } },
],
},
};

module.exports = config;

0 comments on commit 57dc6ab

Please sign in to comment.