From 65890209a0de6953aa5a1df0b244d7e2d024bc83 Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Wed, 6 Dec 2023 10:32:23 +0100 Subject: [PATCH 1/4] Delimiter style for interfaces --- .eslintrc | 18 +++++++++++++++++- .vscode/settings.json | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.eslintrc b/.eslintrc index b2d0778..6061016 100644 --- a/.eslintrc +++ b/.eslintrc @@ -25,7 +25,10 @@ "sourceType": "module" }, "rules": { - "comma-dangle": ["error", "never"], + "comma-dangle": [ + "error", + "never" + ], "@typescript-eslint/array-type": "error", "@typescript-eslint/consistent-type-imports": "error", "@typescript-eslint/method-signature-style": "error", @@ -86,6 +89,19 @@ "plugin:@typescript-eslint/stylistic-type-checked" ], "rules": { + "@typescript-eslint/member-delimiter-style": [ + "error", + { + "multiline": { + "delimiter": "none", + "requireLast": true + }, + "singleline": { + "delimiter": "comma", + "requireLast": false + } + } + ], "@typescript-eslint/consistent-type-exports": "error", "@typescript-eslint/explicit-function-return-type": "error", "@typescript-eslint/explicit-module-boundary-types": "error", diff --git a/.vscode/settings.json b/.vscode/settings.json index 22c01e6..4789b99 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -32,6 +32,7 @@ "npmignore", "parens", "rhysd", + "singleline", "sonarcloud", "sonarjs", "sonarsource", From 928edb59316886810497d3d3fbe55fc865eb68ba Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Wed, 6 Dec 2023 10:32:32 +0100 Subject: [PATCH 2/4] System files ignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index d0e90b2..09ead3f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +# System files +.DS_Store +Thumbs.db + # Dependency directory node_modules dist From f4f52273cac489737bc42378d294fec98d5d1043 Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Wed, 6 Dec 2023 10:34:00 +0100 Subject: [PATCH 3/4] ESM support --- bash/esm.sh | 19 ++++++ config/tsconfig.cjs.json | 3 +- config/tsconfig.esm.json | 3 +- package-lock.json | 136 +++++++++++++++++++-------------------- package.json | 17 ++--- tsconfig.json | 8 +-- 6 files changed, 102 insertions(+), 84 deletions(-) create mode 100755 bash/esm.sh diff --git a/bash/esm.sh b/bash/esm.sh new file mode 100755 index 0000000..2a8b391 --- /dev/null +++ b/bash/esm.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Define the directory to start the search +root_directory="dist/esm" + +echo "Adding .js extension to relative imports in files:" +# Find all JavaScript files and iterate through them and add the .js extension to relative imports +find "$root_directory" -type f -name "*.js" | while read -r file; do + if awk '!/export {};|\/\/# sourceMappingURL:|^[[:space:]]*\/\//' "$file" | grep -q "import .* from '[.]\{0,2\}\/[^']*'"; then + sed -i.bak -E "s/(import .* from '[.]{0,2}\/[^']*)'/\1.js'/g" "$file" && echo "- $file" + fi +done + +# Remove all backup files +find "$root_directory" -type f -name "*.bak" -exec rm {} + + +echo -e "\nCreating package.json file in $root_directory" +# Create a package.json file to indicate that this is an ESM package +echo '{ "type": "module" }' > "$root_directory/package.json" \ No newline at end of file diff --git a/config/tsconfig.cjs.json b/config/tsconfig.cjs.json index a8839b7..be9859c 100644 --- a/config/tsconfig.cjs.json +++ b/config/tsconfig.cjs.json @@ -4,7 +4,6 @@ "rootDir": "../src", "outDir": "../dist/cjs", "declarationDir": "../dist/cjs/types", - "module": "commonjs", - "moduleResolution": "node", + "module": "CommonJS" } } \ No newline at end of file diff --git a/config/tsconfig.esm.json b/config/tsconfig.esm.json index 963d73c..871f63a 100644 --- a/config/tsconfig.esm.json +++ b/config/tsconfig.esm.json @@ -4,7 +4,6 @@ "rootDir": "../src", "outDir": "../dist/esm", "declarationDir": "../dist/esm/types", - "module": "NodeNext", - "moduleResolution": "NodeNext", + "module": "ESNext" } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ea4431f..0177999 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,23 +13,23 @@ "lodash.isequal": "4.5.0" }, "devDependencies": { - "@swc/cli": "0.1.62", + "@swc/cli": "0.1.63", "@swc/helpers": "0.5.3", "@swc/jest": "0.2.29", - "@types/jest": "29.5.8", + "@types/jest": "29.5.11", "@types/lodash.clonedeep": "4.5.9", "@types/lodash.isequal": "4.5.8", "@types/node": "20", - "@typescript-eslint/eslint-plugin": "6.10.0", - "@typescript-eslint/parser": "6.10.0", - "eslint": "8.53.0", + "@typescript-eslint/eslint-plugin": "6.13.2", + "@typescript-eslint/parser": "6.13.2", + "eslint": "8.55.0", "eslint-plugin-jest": "27.6.0", "eslint-plugin-jest-formatting": "3.1.0", "eslint-plugin-sonarjs": "0.23.0", "jest": "29.7.0", "merge": "2.1.1", "open-cli": "7.2.0", - "typescript": "5.2.2" + "typescript": "5.3.2" }, "engines": { "node": ">=16" @@ -763,9 +763,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -786,9 +786,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1571,9 +1571,9 @@ } }, "node_modules/@swc/cli": { - "version": "0.1.62", - "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.62.tgz", - "integrity": "sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==", + "version": "0.1.63", + "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.63.tgz", + "integrity": "sha512-EM9oxxHzmmsprYRbGqsS2M4M/Gr5Gkcl0ROYYIdlUyTkhOiX822EQiRCpPCwdutdnzH2GyaTN7wc6i0Y+CKd3A==", "dev": true, "dependencies": { "@mole-inc/bin-wrapper": "^8.0.1", @@ -1974,9 +1974,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", + "version": "29.5.11", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", + "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -2080,16 +2080,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", - "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz", + "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/type-utils": "6.10.0", - "@typescript-eslint/utils": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/type-utils": "6.13.2", + "@typescript-eslint/utils": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -2115,15 +2115,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", - "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz", + "integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4" }, "engines": { @@ -2143,13 +2143,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", + "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -2160,13 +2160,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", - "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz", + "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/utils": "6.13.2", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -2187,9 +2187,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", + "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -2200,13 +2200,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", - "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", + "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2227,17 +2227,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", - "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz", + "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", "semver": "^7.5.4" }, "engines": { @@ -2252,12 +2252,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", + "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/types": "6.13.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3552,15 +3552,15 @@ } }, "node_modules/eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -7823,9 +7823,9 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index d323429..f8007d6 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ ".": { "import": { "types": "./dist/esm/types/rules.d.ts", - "default": "./dist/esm/rules.mjs" + "default": "./dist/esm/rules.js" }, "require": { "types": "./dist/cjs/types/rules.d.ts", @@ -57,6 +57,7 @@ } }, "main": "dist/cjs/rules.js", + "module": "dist/esm/rules.js", "types": "dist/cjs/types/rules.d.ts", "scripts": { "migrate": "node -r @swc/register src/bin.ts", @@ -67,7 +68,7 @@ "clean": "rm -rf ./dist", "build": "npm run clean && npm run build:cjs && npm run build:esm", "build:cjs": "tsc -p config/tsconfig.cjs.json", - "build:esm": "tsc -p config/tsconfig.esm.json && mv ./dist/esm/rules.js ./dist/esm/rules.mjs", + "build:esm": "tsc -p config/tsconfig.esm.json && bash/esm.sh", "release": "npm run lint && npm run build && np" }, "dependencies": { @@ -75,22 +76,22 @@ "lodash.isequal": "4.5.0" }, "devDependencies": { - "@swc/cli": "0.1.62", + "@swc/cli": "0.1.63", "@swc/helpers": "0.5.3", "@swc/jest": "0.2.29", - "@types/jest": "29.5.8", + "@types/jest": "29.5.11", "@types/node": "20", "@types/lodash.clonedeep": "4.5.9", "@types/lodash.isequal": "4.5.8", - "@typescript-eslint/eslint-plugin": "6.10.0", - "@typescript-eslint/parser": "6.10.0", - "eslint": "8.53.0", + "@typescript-eslint/eslint-plugin": "6.13.2", + "@typescript-eslint/parser": "6.13.2", + "eslint": "8.55.0", "eslint-plugin-jest": "27.6.0", "eslint-plugin-jest-formatting": "3.1.0", "eslint-plugin-sonarjs": "0.23.0", "jest": "29.7.0", "merge": "2.1.1", "open-cli": "7.2.0", - "typescript": "5.2.2" + "typescript": "5.3.2" } } diff --git a/tsconfig.json b/tsconfig.json index 25053a3..43c38b8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,11 @@ { "compilerOptions": { - "target": "es2021", + "target": "ES2021", "lib": [ - "es2021" + "ES2021" ], - "module": "commonjs", - "moduleResolution": "node", + "module": "CommonJS", + "moduleResolution": "Node", "outDir": "dist", "strict": true, "allowSyntheticDefaultImports": true, From 01a0314d0693f46a40178ff4958a3dd233099efc Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Wed, 6 Dec 2023 10:37:43 +0100 Subject: [PATCH 4/4] Doc --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 668d867..9ea4337 100755 --- a/README.md +++ b/README.md @@ -15,11 +15,30 @@ Lightweight rule engine, written in typescript [![npm](https://nodei.co/npm/ts-rule-engine.png)](https://www.npmjs.com/package/ts-rule-engine) +## Supports and tested with + +```json +{ + "node": "16.x || 18.x || 20.x", +} +``` + +## Features + +- [x] Structure for rule definition +- [x] Rerun rules after fact is updated +- [x] Stop rule engine on any rule from executing further +- [x] Infinite loop prevention with max iterations limit +- [x] One time rule execution in sequence +- [x] Rule weight for priority +- [x] Supports ESM and CommonJS + ## Installation ```bash npm install ts-rule-engine yarn add ts-rule-engine +pnpm add ts-rule-engine ``` ### 1. Defining a Rule