Skip to content

Commit

Permalink
eslint rule to check we only use the /slim import
Browse files Browse the repository at this point in the history
  • Loading branch information
alexjg committed Jun 26, 2024
1 parent 1832812 commit 57fbbd0
Show file tree
Hide file tree
Showing 5 changed files with 551 additions and 382 deletions.
56 changes: 0 additions & 56 deletions .eslintrc.cjs

This file was deleted.

150 changes: 150 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
import typescriptEslint from "@typescript-eslint/eslint-plugin"
import globals from "globals"
import tsParser from "@typescript-eslint/parser"
import path from "node:path"
import { fileURLToPath } from "node:url"
import js from "@eslint/js"
import { FlatCompat } from "@eslint/eslintrc"

// Necessary so that we can use `FlatCompat` for configs which haven't been
// migrated to eslint 9 yet. See https://eslint.org/docs/latest/use/configure/migration-guide#using-eslintrc-configs-in-flat-config
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all,
})

const automergeSlimImportRule = {
meta: {
name: "enforce-automerge-slim-import",
},
create(context) {
return {
ImportDeclaration(node) {
let isAutomergeProblem = false
if (node.source.value === "@automerge/automerge") {
isAutomergeProblem = true
} else if (
node.source.value.startsWith("@automerge/automerge/") &&
!node.source.value.startsWith("@automerge/automerge/slim")
) {
isAutomergeProblem = true
}
if (isAutomergeProblem) {
context.report({
node,
message:
"Import from @automerge/automerge/slim instead of @automerge/automerge",
})
}

let isAutomergeRepoProblem = false
if (node.source.value === "@automerge/automerge-repo") {
isAutomergeRepoProblem = true
} else if (
node.source.value.startsWith("@automerge/automerge-repo/") &&
!node.source.value.startsWith("@automerge/automerge-repo/slim")
) {
isAutomergeRepoProblem = true
}
if (isAutomergeRepoProblem) {
context.report({
node,
message:
"Import from @automerge/automerge-repo/slim instead of @automerge/automerge-repo",
})
}
},
}
},
}

export default [
{
ignores: [
"**/*.d.ts",
"**/*.config.ts",
"**/fuzz.ts",
"examples/**/*",
"**/test/*",
"**/dist/*",
"**/node_modules/*",
"**/.eslintrc.cjs",
"packages/create-vite-app/**/*",
"testSetup.ts",
],
},
js.configs.recommended,
...compat.extends(
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended"
),
{
ignores: [
"packages/create-repo-node-app/postbuild.js",
"eslint.config.mjs",
],
plugins: {
"@typescript-eslint": typescriptEslint,
"automerge-slimport": {
rules: {
"enforce-automerge-slim-import": automergeSlimImportRule,
},
},
},

languageOptions: {
globals: {
...globals.browser,
...globals.node,
},

parser: tsParser,
ecmaVersion: "latest",
sourceType: "module",

parserOptions: {
project: ["./packages/*/tsconfig.json"],
},
},

rules: {
semi: [2, "never"],
"import/extensions": 0,
"lines-between-class-members": 0,
"@typescript-eslint/no-floating-promises": 2,
"@typescript-eslint/no-empty-function": 0,
"no-param-reassign": 0,
"no-use-before-define": 0,
"@typescript-eslint/no-non-null-assertion": 0,
"@typescript-eslint/no-explicit-any": 0,

"@typescript-eslint/no-unused-vars": [
2,
{
varsIgnorePattern: "^_",
argsIgnorePattern: "^_",
},
],
"automerge-slimport/enforce-automerge-slim-import": 2,
},
},
{
files: [
"packages/create-repo-node-app/postbuild.js",
"packages/create-vite-app/postbuild.js",
"packages/create-vite-app/test.js",
],

languageOptions: {
globals: {
...globals.node,
},

ecmaVersion: 5,
sourceType: "commonjs",
},
},
]
11 changes: 6 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"preinstall": "npx only-allow pnpm",
"repocheck": "manypkg check",
"format": "prettier --write . | dev-null",
"lint": "prettier --check . && eslint --ext .ts .",
"lint": "prettier --check . && eslint .",
"test": "vitest",
"test:log": "cross-env DEBUG='automerge-repo:*' vitest",
"test:coverage": "vitest --coverage",
Expand All @@ -44,21 +44,22 @@
"@types/react-dom": "^18.2.22",
"@types/uuid": "^8.3.4",
"@types/ws": "^8.5.10",
"@typescript-eslint/eslint-plugin": "^7.3.1",
"@typescript-eslint/parser": "^7.3.1",
"@vitejs/plugin-react": "^3.1.0",
"@typescript-eslint/eslint-plugin": "^7.13.1",
"@typescript-eslint/parser": "^7.13.1",
"@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^1.4.0",
"@vitest/ui": "^1.4.0",
"c8": "^7.14.0",
"cross-env": "^7.0.3",
"dev-null-cli": "^2.0.0",
"eslint": "^8.57.0",
"eslint": "^9.5.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-react": "^7.34.1",
"eslint-plugin-react-hooks": "^4.6.0",
"globals": "^15.6.0",
"lerna": "^6.6.2",
"npm-run-all": "^4.1.5",
"npm-watch": "^0.11.0",
Expand Down
11 changes: 8 additions & 3 deletions packages/automerge-repo/src/entrypoints/fullfat.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
export * from "../index.js"
// This triggers the various mechanisms in @automerge/automerge which attempt
// to figure out what kind of environment we are in and initialize the wasm
// blob correspondingly

// The following import triggers the various mechanisms in @automerge/automerge
// which attempt to figure out what kind of environment we are in and
// initialize the wasm blob correspondingly. Note that we have a custom eslint
// rule which would complain about the non-slim import here which we have to
// disable
//
// eslint-disable-next-line automerge-slimport/enforce-automerge-slim-import
import { next as Am } from "@automerge/automerge"
Am.init()
Loading

0 comments on commit 57fbbd0

Please sign in to comment.